index.vue 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover">
  6. <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px" class="drawer-form">
  7. <el-form-item label="伙伴商编号" prop="partnerNo">
  8. <el-input v-model="queryParams.partnerNo" placeholder="请输入" clearable @keyup.enter="handleQuery" />
  9. </el-form-item>
  10. <el-form-item label="伙伴商名称" prop="partnerName">
  11. <el-input v-model="queryParams.partnerName" placeholder="请输入" clearable @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item>
  14. <el-button type="primary" @click="handleQuery">搜索</el-button>
  15. <el-button @click="resetQuery">重置</el-button>
  16. </el-form-item>
  17. </el-form>
  18. </el-card>
  19. </div>
  20. </transition>
  21. <el-card shadow="hover">
  22. <template #header>
  23. <el-row :gutter="10">
  24. <el-col :span="1.5">
  25. <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
  26. </el-col>
  27. <el-col :span="1.5">
  28. <el-button type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">修改</el-button>
  29. </el-col>
  30. <el-col :span="1.5">
  31. <el-button type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()">删除</el-button>
  32. </el-col>
  33. <el-col :span="1.5">
  34. <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
  35. </el-col>
  36. <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
  37. </el-row>
  38. </template>
  39. <el-table v-loading="loading" border :data="merchantList" @selection-change="handleSelectionChange">
  40. <el-table-column type="selection" width="55" align="center" />
  41. <el-table-column label="伙伴商编号" align="center" prop="partnerNo" min-width="120" />
  42. <el-table-column label="伙伴商名称" align="center" prop="partnerName" :show-overflow-tooltip="true" min-width="150" />
  43. <el-table-column label="公司简称" align="center" prop="company" min-width="100" />
  44. <el-table-column label="合作型态" align="center" prop="partnerCooperateType" min-width="100">
  45. <template #default="scope">
  46. <span v-if="scope.row.partnerCooperateType === 0">伙伴商</span>
  47. <span v-else-if="scope.row.partnerCooperateType === 1">经销商</span>
  48. <span v-else-if="scope.row.partnerCooperateType === 2">代理商</span>
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="法人代表" align="center" prop="legal" min-width="100" />
  52. <el-table-column label="固定电话" align="center" prop="telephone" min-width="120" />
  53. <el-table-column label="传真号码" align="center" prop="fax" min-width="120" />
  54. <el-table-column label="公司注册地址" align="center" prop="registerAddress" :show-overflow-tooltip="true" min-width="150" />
  55. <el-table-column label="分司注册地址" align="center" prop="operatingAddress" :show-overflow-tooltip="true" min-width="150" />
  56. <el-table-column label="操作" align="center" width="120" fixed="right" class-name="small-padding fixed-width">
  57. <template #default="scope">
  58. <el-button link type="primary" @click="handleUpdate(scope.row)">详情</el-button>
  59. <el-button link type="primary" @click="handleDelete(scope.row)">删除</el-button>
  60. </template>
  61. </el-table-column>
  62. </el-table>
  63. <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
  64. </el-card>
  65. <el-drawer v-model="dialog.visible" :title="dialog.title" direction="rtl" size="60%" :before-close="handleDrawerClose">
  66. <div class="drawer-tabs-wrapper">
  67. <el-tabs v-model="activeTab" class="drawer-tabs">
  68. <el-tab-pane label="基本信息" name="basic" />
  69. <el-tab-pane label="资质管理" name="qualification" />
  70. <el-tab-pane label="银行账户" name="bank" />
  71. <el-tab-pane label="联系人" name="contact" />
  72. <el-tab-pane label="合同管理" name="contract" />
  73. <el-tab-pane label="用户账号" name="user" />
  74. <el-tab-pane label="仓库管理" name="warehouse" />
  75. </el-tabs>
  76. </div>
  77. <div class="drawer-content">
  78. <div v-show="activeTab === 'basic'" class="tab-panel">
  79. <el-form ref="merchantFormRef" :model="form" :rules="rules" label-width="120px" class="drawer-form">
  80. <el-row :gutter="20">
  81. <el-col :span="12">
  82. <el-form-item label="伙伴商全称" prop="partnerName">
  83. <el-input v-model="form.partnerName" placeholder="请输入" />
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="12">
  87. <el-form-item label="伙伴商编号" prop="partnerNo">
  88. <el-input v-model="form.partnerNo" placeholder="请输入" />
  89. </el-form-item>
  90. </el-col>
  91. </el-row>
  92. <el-row :gutter="20">
  93. <el-col :span="12">
  94. <el-form-item label="公司简称" prop="company">
  95. <el-input v-model="form.company" placeholder="请输入" />
  96. </el-form-item>
  97. </el-col>
  98. <el-col :span="12">
  99. <el-form-item label="合作型态" prop="partnerCooperateType">
  100. <el-select v-model="form.partnerCooperateType" placeholder="请选择">
  101. <el-option label="伙伴商" :value="0" />
  102. <el-option label="经销商" :value="1" />
  103. <el-option label="代理商" :value="2" />
  104. </el-select>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. <el-row :gutter="20">
  109. <el-col :span="12">
  110. <el-form-item label="法人代表" prop="legal">
  111. <el-input v-model="form.legal" placeholder="请输入" />
  112. </el-form-item>
  113. </el-col>
  114. <el-col :span="12">
  115. <el-form-item label="固定电话" prop="telephone">
  116. <el-input v-model="form.telephone" placeholder="请输入" />
  117. </el-form-item>
  118. </el-col>
  119. </el-row>
  120. <el-row :gutter="20">
  121. <el-col :span="24">
  122. <el-form-item label="传真号码" prop="fax">
  123. <el-input v-model="form.fax" placeholder="请输入" />
  124. </el-form-item>
  125. </el-col>
  126. </el-row>
  127. <el-row :gutter="20">
  128. <el-col :span="24">
  129. <el-form-item label="公司注册地址" prop="registerAddress">
  130. <el-input v-model="form.registerAddress" placeholder="请输入" />
  131. </el-form-item>
  132. </el-col>
  133. </el-row>
  134. <el-row :gutter="20">
  135. <el-col :span="24">
  136. <el-form-item label="分司注册地址" prop="operatingAddress">
  137. <el-input v-model="form.operatingAddress" placeholder="请输入" />
  138. </el-form-item>
  139. </el-col>
  140. </el-row>
  141. <el-row :gutter="20">
  142. <el-col :span="24">
  143. <el-form-item label="备注" prop="remark">
  144. <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入" />
  145. </el-form-item>
  146. </el-col>
  147. </el-row>
  148. </el-form>
  149. </div>
  150. <div v-show="activeTab === 'qualification'" class="tab-panel">
  151. <div class="tab-content">
  152. <div class="mb-2">
  153. <el-button type="primary" size="small" @click="handleAddQualification">新增资质</el-button>
  154. </div>
  155. <el-table :data="qualificationList" border>
  156. <el-table-column label="序号" type="index" width="60" />
  157. <el-table-column label="资质编号" prop="qualificationNo" />
  158. <el-table-column label="资质类型" prop="qualificationType">
  159. <template #default="scope">
  160. <span v-if="scope.row.qualificationType === 1">营业执照</span>
  161. <span v-else-if="scope.row.qualificationType === 2">资质证书</span>
  162. <span v-else-if="scope.row.qualificationType === 3">其他</span>
  163. <span v-else>{{ scope.row.qualificationType }}</span>
  164. </template>
  165. </el-table-column>
  166. <el-table-column label="签发机构" prop="authority" />
  167. <el-table-column label="截止日期" prop="deadline" />
  168. <el-table-column label="操作" width="150">
  169. <template #default="scope">
  170. <el-button link type="primary" @click="handleDeleteQualification(scope.row)">删除</el-button>
  171. <el-button link type="primary" @click="handleEditQualification(scope.row)">修改</el-button>
  172. </template>
  173. </el-table-column>
  174. </el-table>
  175. </div>
  176. </div>
  177. <div v-show="activeTab === 'bank'" class="tab-panel">
  178. <div class="tab-content">
  179. <div class="mb-2">
  180. <el-button type="primary" size="small" @click="handleAddBank">新增银行账户</el-button>
  181. </div>
  182. <el-table :data="bankList" border>
  183. <el-table-column label="序号" type="index" width="60" />
  184. <el-table-column label="开户名称" prop="account" />
  185. <el-table-column label="财务登记号" prop="registrationNumber" />
  186. <el-table-column label="开户银行名称" prop="accountBankName" />
  187. <el-table-column label="银行账号" prop="bankNumber" />
  188. <el-table-column label="银行联行号" prop="bankInterbankNumber" />
  189. <el-table-column label="操作" width="150">
  190. <template #default="scope">
  191. <el-button link type="primary" @click="handleDeleteBank(scope.row)">删除</el-button>
  192. <el-button link type="primary" @click="handleEditBank(scope.row)">修改</el-button>
  193. </template>
  194. </el-table-column>
  195. </el-table>
  196. </div>
  197. </div>
  198. <div v-show="activeTab === 'user'" class="tab-panel">
  199. <div class="tab-content">
  200. <div class="mb-2">
  201. <el-button type="primary" size="small" @click="handleAddUser">新增用户账号</el-button>
  202. </div>
  203. <el-table :data="userList" border>
  204. <el-table-column label="序号" type="index" width="60" />
  205. <el-table-column label="登录账号" prop="loginUser" />
  206. <el-table-column label="用户姓名" prop="name" />
  207. <el-table-column label="电子邮件" prop="email" />
  208. <el-table-column label="电话" prop="phone" />
  209. <el-table-column label="职务" prop="duties" />
  210. <el-table-column label="操作" width="150">
  211. <template #default="scope">
  212. <el-button link type="primary" @click="handleDeleteUser(scope.row)">删除</el-button>
  213. <el-button link type="primary" @click="handleEditUser(scope.row)">修改</el-button>
  214. </template>
  215. </el-table-column>
  216. </el-table>
  217. </div>
  218. </div>
  219. <div v-show="activeTab === 'contact'" class="tab-panel">
  220. <div class="tab-content">
  221. <div class="mb-2">
  222. <el-button type="primary" size="small" @click="handleAddContact">新增联系人</el-button>
  223. </div>
  224. <el-table :data="contactList" border>
  225. <el-table-column label="序号" type="index" width="60" />
  226. <el-table-column label="姓名" prop="name" />
  227. <el-table-column label="电话" prop="phone" />
  228. <el-table-column label="电子邮件" prop="email" />
  229. <el-table-column label="联系人地址" prop="address" />
  230. <el-table-column label="操作" width="150">
  231. <template #default="scope">
  232. <el-button link type="primary" @click="handleDeleteContact(scope.row)">删除</el-button>
  233. <el-button link type="primary" @click="handleEditContact(scope.row)">修改</el-button>
  234. </template>
  235. </el-table-column>
  236. </el-table>
  237. </div>
  238. </div>
  239. <div v-show="activeTab === 'contract'" class="tab-panel">
  240. <div class="tab-content">
  241. <div class="mb-2">
  242. <el-button type="primary" size="small" @click="handleAddContract">新增合同</el-button>
  243. </div>
  244. <el-table :data="contractList" border>
  245. <el-table-column label="序号" type="index" width="60" />
  246. <el-table-column label="合同编号" prop="contractNo" />
  247. <el-table-column label="合作项目名称" prop="cooperativeName" />
  248. <el-table-column label="合同类型" prop="contractType" />
  249. <el-table-column label="合同状态" prop="contractStatus" />
  250. <el-table-column label="合作区域" prop="area" />
  251. <el-table-column label="操作" width="150">
  252. <template #default="scope">
  253. <el-button link type="primary" @click="handleDeleteContract(scope.row)">删除</el-button>
  254. <el-button link type="primary" @click="handleEditContract(scope.row)">修改</el-button>
  255. </template>
  256. </el-table-column>
  257. </el-table>
  258. </div>
  259. </div>
  260. <div v-show="activeTab === 'warehouse'" class="tab-panel">
  261. <div class="tab-content">
  262. <div class="mb-2">
  263. <el-button type="primary" size="small" @click="handleAddWarehouse">新增仓库</el-button>
  264. </div>
  265. <el-table :data="warehouseList" border>
  266. <el-table-column label="序号" type="index" width="60" />
  267. <el-table-column label="仓库名称" prop="name" />
  268. <el-table-column label="仓库性质" prop="warehouseNature">
  269. <template #default="scope">
  270. {{ scope.row.warehouseNature === 1 ? '自有仓库' : scope.row.warehouseNature === 2 ? '租赁仓库' : '' }}
  271. </template>
  272. </el-table-column>
  273. <el-table-column label="所在地区" prop="warehouseLocation" />
  274. <el-table-column label="所在地址" prop="warehouseAddress" />
  275. <el-table-column label="仓库面积" prop="warehouseArea" />
  276. <el-table-column label="操作" width="150">
  277. <template #default="scope">
  278. <el-button link type="primary" @click="handleDeleteWarehouse(scope.row)">删除</el-button>
  279. <el-button link type="primary" @click="handleEditWarehouse(scope.row)">修改</el-button>
  280. </template>
  281. </el-table-column>
  282. </el-table>
  283. </div>
  284. </div>
  285. </div>
  286. <template #footer>
  287. <div class="drawer-footer">
  288. <el-button @click="cancel">取消</el-button>
  289. <el-button type="primary" @click="submitForm">保存</el-button>
  290. </div>
  291. </template>
  292. </el-drawer>
  293. <!-- 资质管理对话框组件 -->
  294. <QualificationDialog v-model:visible="qualificationDialog.visible" v-model:form-data="qualificationForm" @submit="handleQualificationSubmit" />
  295. <!-- 银行账户对话框组件 -->
  296. <BankDialog v-model:visible="financialDialog.visible" v-model:form-data="bankForm" @submit="handleBankSubmit" />
  297. <!-- 用户账号对话框组件 -->
  298. <UserDialog v-model:visible="accountDialog.visible" v-model:form-data="userForm" @submit="handleUserSubmit" />
  299. <!-- 联系人对话框组件 -->
  300. <ContactDialog v-model:visible="contactDialog.visible" v-model:form-data="contactForm" @submit="handleContactSubmit" />
  301. <!-- 合同对话框组件 -->
  302. <ContractDialog v-model:visible="companyDialog.visible" v-model:form-data="contractForm" @submit="handleContractSubmit" />
  303. <!-- 仓库管理对话框组件 -->
  304. <WarehouseDialog v-model:visible="financeDialog.visible" v-model:form-data="warehouseForm" @submit="handleWarehouseSubmit" />
  305. </div>
  306. </template>
  307. <script setup name="PartnerMerchant" lang="ts">
  308. import { PartnerMerchantVO, PartnerMerchantForm, PartnerMerchantQuery } from '@/api/partner/merchant/types';
  309. import {
  310. listPartnerMerchant,
  311. getPartnerMerchant,
  312. addPartnerMerchant,
  313. updatePartnerMerchant,
  314. delPartnerMerchant,
  315. exportPartnerMerchant
  316. } from '@/api/partner/merchant';
  317. import WarehouseDialog from './components/WarehouseDialog.vue';
  318. import QualificationDialog from './components/QualificationDialog.vue';
  319. import BankDialog from './components/BankDialog.vue';
  320. import ContactDialog from './components/ContactDialog.vue';
  321. import UserDialog from './components/UserDialog.vue';
  322. import ContractDialog from './components/ContractDialog.vue';
  323. import { PartnerQualificationVO, PartnerQualificationForm } from '@/api/partner/qualification/types';
  324. import { listPartnerQualification, addPartnerQualification, updatePartnerQualification, delPartnerQualification } from '@/api/partner/qualification';
  325. import { PartnerBankVO, PartnerBankForm } from '@/api/partner/bank/types';
  326. import { listPartnerBank, addPartnerBank, updatePartnerBank, delPartnerBank } from '@/api/partner/bank';
  327. import { PartnerContactsVO, PartnerContactsForm } from '@/api/partner/contacts/types';
  328. import { listPartnerContacts, addPartnerContacts, updatePartnerContacts, delPartnerContacts } from '@/api/partner/contacts';
  329. import { PartnerContractVO, PartnerContractForm } from '@/api/partner/contract/types';
  330. import { listPartnerContract, addPartnerContract, updatePartnerContract, delPartnerContract } from '@/api/partner/contract';
  331. import { PartnerUserVO, PartnerUserForm } from '@/api/partner/user/types';
  332. import { listPartnerUser, addPartnerUser, updatePartnerUser, delPartnerUser } from '@/api/partner/user';
  333. import { PartnerWarehouseVO, PartnerWarehouseForm } from '@/api/partner/warehouse/types';
  334. import { listPartnerWarehouse, addPartnerWarehouse, updatePartnerWarehouse, delPartnerWarehouse } from '@/api/partner/warehouse';
  335. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  336. const merchantList = ref<PartnerMerchantVO[]>([]);
  337. const loading = ref(false);
  338. const showSearch = ref(true);
  339. const ids = ref<Array<string | number>>([]);
  340. const single = ref(true);
  341. const multiple = ref(true);
  342. const total = ref(0);
  343. const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
  344. const merchantFormRef = ref<ElFormInstance>();
  345. const queryFormRef = ref<ElFormInstance>();
  346. const warehouseFormRef = ref<ElFormInstance>();
  347. const dialog = reactive<DialogOption>({
  348. visible: false,
  349. title: ''
  350. });
  351. const activeTab = ref('basic');
  352. // 监听标签页切换,实现懒加载
  353. watch(activeTab, (newTab) => {
  354. if (!currentPartnerId.value) return;
  355. switch (newTab) {
  356. case 'qualification':
  357. if (qualificationList.value.length === 0) loadQualificationList();
  358. break;
  359. case 'bank':
  360. if (bankList.value.length === 0) loadBankList();
  361. break;
  362. case 'contact':
  363. if (contactList.value.length === 0) loadContactList();
  364. break;
  365. case 'contract':
  366. if (contractList.value.length === 0) loadContractList();
  367. break;
  368. case 'user':
  369. if (userList.value.length === 0) loadUserList();
  370. break;
  371. case 'warehouse':
  372. if (warehouseList.value.length === 0) loadWarehouseList();
  373. break;
  374. }
  375. });
  376. const qualificationList = ref<PartnerQualificationVO[]>([]);
  377. const bankList = ref<PartnerBankVO[]>([]);
  378. const contactList = ref<PartnerContactsVO[]>([]);
  379. const contractList = ref<PartnerContractVO[]>([]);
  380. const userList = ref<PartnerUserVO[]>([]);
  381. const warehouseList = ref<PartnerWarehouseVO[]>([]);
  382. const currentPartnerId = ref<number | string>();
  383. // 各个子项弹窗状态
  384. const qualificationDialog = reactive({ visible: false });
  385. const financialDialog = reactive({ visible: false });
  386. const accountDialog = reactive({ visible: false });
  387. const contactDialog = reactive({ visible: false });
  388. const companyDialog = reactive({ visible: false });
  389. const financeDialog = reactive({ visible: false });
  390. // 各个子项表单初始值
  391. const initQualificationForm: PartnerQualificationForm = {
  392. partnerId: 0,
  393. qualificationNo: '',
  394. qualificationType: 1,
  395. authority: '',
  396. deadline: '',
  397. annex: '',
  398. status: '',
  399. remark: ''
  400. };
  401. const initBankForm: PartnerBankForm = {
  402. partnerId: 0,
  403. account: '',
  404. registrationNumber: '',
  405. accountBankName: '',
  406. bankNumber: '',
  407. bankLocation: '',
  408. bankInterbankNumber: '',
  409. phone: '',
  410. address: '',
  411. status: '',
  412. remark: ''
  413. };
  414. const initUserForm: PartnerUserForm = {
  415. partnerId: 0,
  416. loginUser: '',
  417. name: '',
  418. email: '',
  419. phone: '',
  420. duties: '',
  421. roleName: '',
  422. roleId: 0,
  423. password: '',
  424. status: '',
  425. remark: ''
  426. };
  427. const initContactForm: PartnerContactsForm = {
  428. partnerId: 0,
  429. name: '',
  430. phone: '',
  431. email: '',
  432. contactType: 1,
  433. status: '',
  434. remark: ''
  435. };
  436. const initContractForm: PartnerContractForm = {
  437. partnerId: 0,
  438. contractNo: '',
  439. cooperativeName: '',
  440. cooperationId: 0,
  441. startTime: '',
  442. endTime: '',
  443. categories: '',
  444. fee: 0,
  445. contractType: 1,
  446. settlementCycle: '',
  447. salesTarget: 0,
  448. area: '',
  449. contacts: '',
  450. phone: '',
  451. annex: '',
  452. importantTerms: '',
  453. contractStatus: 0,
  454. rejectInfo: '',
  455. status: '',
  456. remark: ''
  457. };
  458. const initWarehouseForm: PartnerWarehouseForm = {
  459. partnerId: 0,
  460. name: '',
  461. warehouseNature: 1,
  462. warehouseLocation: '',
  463. warehouseAddress: '',
  464. warehouseArea: '',
  465. warehouseContacts: '',
  466. phone: '',
  467. annex: '',
  468. status: '',
  469. remark: ''
  470. };
  471. // 各个子项表单数据
  472. const qualificationForm = ref<PartnerQualificationForm>({ ...initQualificationForm });
  473. const bankForm = ref<PartnerBankForm>({ ...initBankForm });
  474. const userForm = ref<PartnerUserForm>({ ...initUserForm });
  475. const contactForm = ref<PartnerContactsForm>({ ...initContactForm });
  476. const contractForm = ref<PartnerContractForm>({ ...initContractForm });
  477. const warehouseForm = ref<PartnerWarehouseForm>({ ...initWarehouseForm });
  478. // 保留旧的弹窗变量名以兼容模板
  479. const financialForm = bankForm;
  480. const accountForm = userForm;
  481. const companyForm = contractForm;
  482. const financeForm = warehouseForm;
  483. const initFormData: PartnerMerchantForm = {
  484. id: undefined,
  485. partnerNo: '',
  486. partnerName: '',
  487. company: '',
  488. partnerCooperateType: undefined,
  489. legal: '',
  490. telephone: '',
  491. fax: '',
  492. registerAddress: '',
  493. operatingAddress: '',
  494. remark: '',
  495. status: '0'
  496. };
  497. const data = reactive<PageData<PartnerMerchantForm, PartnerMerchantQuery>>({
  498. form: { ...initFormData },
  499. queryParams: {
  500. pageNum: 1,
  501. pageSize: 10,
  502. partnerNo: '',
  503. partnerName: ''
  504. },
  505. rules: {
  506. partnerName: [{ required: true, message: '伙伴商名称不能为空', trigger: 'blur' }]
  507. }
  508. });
  509. const { queryParams, form, rules } = toRefs(data);
  510. // 仓库表单验证规则
  511. const warehouseRules = {
  512. name: [{ required: true, message: '仓库名称不能为空', trigger: 'blur' }]
  513. };
  514. const getList = () => {
  515. loading.value = true;
  516. listPartnerMerchant(queryParams.value)
  517. .then((response: any) => {
  518. console.log('列表数据返回:', response);
  519. merchantList.value = response.rows || [];
  520. total.value = response.total || 0;
  521. loading.value = false;
  522. })
  523. .catch((error) => {
  524. console.error('获取列表失败:', error);
  525. loading.value = false;
  526. });
  527. };
  528. const cancel = () => {
  529. reset();
  530. dialog.visible = false;
  531. activeTab.value = 'basic';
  532. };
  533. const handleDrawerClose = (done: () => void) => {
  534. proxy?.$modal
  535. .confirm('确认关闭?')
  536. .then(() => {
  537. cancel();
  538. done();
  539. })
  540. .catch(() => {
  541. // 取消关闭
  542. });
  543. };
  544. const reset = () => {
  545. form.value = { ...initFormData };
  546. merchantFormRef.value?.resetFields();
  547. // 清空所有子项列表
  548. qualificationList.value = [];
  549. bankList.value = [];
  550. contactList.value = [];
  551. contractList.value = [];
  552. userList.value = [];
  553. warehouseList.value = [];
  554. // 重置当前伙伴商ID
  555. currentPartnerId.value = undefined;
  556. };
  557. const handleQuery = () => {
  558. queryParams.value.pageNum = 1;
  559. getList();
  560. };
  561. const resetQuery = () => {
  562. dateRange.value = ['', ''];
  563. queryFormRef.value?.resetFields();
  564. handleQuery();
  565. };
  566. const handleAdd = () => {
  567. reset();
  568. dialog.visible = true;
  569. dialog.title = '添加伙伴商';
  570. };
  571. const handleSelectionChange = (selection: PartnerMerchantVO[]) => {
  572. ids.value = selection.map((item) => item.id);
  573. single.value = selection.length != 1;
  574. multiple.value = !selection.length;
  575. };
  576. const handleUpdate = async (row?: PartnerMerchantVO) => {
  577. const id = row?.id || ids.value[0];
  578. if (!id) {
  579. proxy?.$modal.msgError('请选择要修改的数据');
  580. return;
  581. }
  582. try {
  583. const response: any = await getPartnerMerchant(id);
  584. const responseData = response.data || response.rows?.[0] || response;
  585. if (!responseData) {
  586. throw new Error('未获取到数据');
  587. }
  588. // 先设置标签页为基本信息(在打开抽屉之前)
  589. activeTab.value = 'basic';
  590. // 设置表单数据
  591. form.value = {
  592. id: responseData.id,
  593. partnerNo: responseData.partnerNo || '',
  594. partnerName: responseData.partnerName || '',
  595. company: responseData.company || '',
  596. partnerCooperateType: responseData.partnerCooperateType,
  597. legal: responseData.legal || '',
  598. telephone: responseData.telephone || '',
  599. fax: responseData.fax || '',
  600. registerAddress: responseData.registerAddress || '',
  601. operatingAddress: responseData.operatingAddress || '',
  602. remark: responseData.remark || '',
  603. status: responseData.status || '0'
  604. };
  605. currentPartnerId.value = responseData.id;
  606. // 清空所有子项列表,确保数据干净
  607. qualificationList.value = [];
  608. bankList.value = [];
  609. contactList.value = [];
  610. contractList.value = [];
  611. userList.value = [];
  612. warehouseList.value = [];
  613. // 打开抽屉
  614. dialog.visible = true;
  615. dialog.title = '修改伙伴商';
  616. // 使用nextTick确保DOM更新后再加载基本信息标签页的数据(如果需要)
  617. await nextTick();
  618. // 不再一次性加载所有子项数据,改为在切换标签页时按需加载
  619. } catch (error) {
  620. console.error('获取详情失败:', error);
  621. proxy?.$modal.msgError('获取详情失败');
  622. dialog.visible = false;
  623. }
  624. };
  625. const submitForm = () => {
  626. merchantFormRef.value?.validate(async (valid: boolean) => {
  627. if (valid) {
  628. try {
  629. // 先保存伙伴商基本信息
  630. if (form.value.id) {
  631. await updatePartnerMerchant(form.value);
  632. } else {
  633. await addPartnerMerchant(form.value);
  634. }
  635. // 保存所有子项数据(新增和修改)
  636. const savePromises = [];
  637. // 保存资质数据
  638. for (const item of qualificationList.value) {
  639. const itemAny = item as any;
  640. console.log('资质数据:', item, 'id类型:', typeof item.id);
  641. // 判断是新增还是修改:只有以temp_开头的ID才是新增,其他都是修改
  642. if (String(item.id).startsWith('temp_')) {
  643. // 新增数据:删除临时ID
  644. const data: any = {
  645. partnerId: currentPartnerId.value,
  646. qualificationNo: itemAny.qualificationNo,
  647. qualificationType: itemAny.qualificationType,
  648. authority: itemAny.authority,
  649. deadline: itemAny.deadline,
  650. annex: itemAny.annex,
  651. status: itemAny.status,
  652. remark: itemAny.remark
  653. };
  654. console.log('调用新增接口:', data);
  655. savePromises.push(addPartnerQualification(data));
  656. } else {
  657. // 修改数据:保留ID
  658. const data: any = {
  659. id: item.id,
  660. partnerId: currentPartnerId.value,
  661. qualificationNo: itemAny.qualificationNo,
  662. qualificationType: itemAny.qualificationType,
  663. authority: itemAny.authority,
  664. deadline: itemAny.deadline,
  665. annex: itemAny.annex,
  666. status: itemAny.status,
  667. remark: itemAny.remark
  668. };
  669. console.log('调用更新接口:', data);
  670. savePromises.push(updatePartnerQualification(data));
  671. }
  672. }
  673. // 保存银行账户数据
  674. for (const item of bankList.value) {
  675. const itemAny = item as any;
  676. if (String(item.id).startsWith('temp_')) {
  677. const data: any = {
  678. partnerId: currentPartnerId.value,
  679. account: itemAny.account,
  680. registrationNumber: itemAny.registrationNumber,
  681. bankId: itemAny.bankId,
  682. accountBankName: itemAny.accountBankName,
  683. bankNumber: itemAny.bankNumber,
  684. bankLocation: itemAny.bankLocation,
  685. bankInterbankNumber: itemAny.bankInterbankNumber,
  686. phone: itemAny.phone,
  687. address: itemAny.address,
  688. status: itemAny.status,
  689. remark: itemAny.remark
  690. };
  691. savePromises.push(addPartnerBank(data));
  692. } else {
  693. const data: any = {
  694. id: item.id,
  695. partnerId: currentPartnerId.value,
  696. account: itemAny.account,
  697. registrationNumber: itemAny.registrationNumber,
  698. bankId: itemAny.bankId,
  699. accountBankName: itemAny.accountBankName,
  700. bankNumber: itemAny.bankNumber,
  701. bankLocation: itemAny.bankLocation,
  702. bankInterbankNumber: itemAny.bankInterbankNumber,
  703. phone: itemAny.phone,
  704. address: itemAny.address,
  705. status: itemAny.status,
  706. remark: itemAny.remark
  707. };
  708. savePromises.push(updatePartnerBank(data));
  709. }
  710. }
  711. // 保存联系人数据
  712. for (const item of contactList.value) {
  713. const itemAny = item as any;
  714. if (String(item.id).startsWith('temp_')) {
  715. const data: any = {
  716. partnerId: currentPartnerId.value,
  717. name: itemAny.name,
  718. phone: itemAny.phone,
  719. email: itemAny.email,
  720. contactType: itemAny.contactType,
  721. status: itemAny.status,
  722. remark: itemAny.remark
  723. };
  724. savePromises.push(addPartnerContacts(data));
  725. } else {
  726. const data: any = {
  727. id: item.id,
  728. partnerId: currentPartnerId.value,
  729. name: itemAny.name,
  730. phone: itemAny.phone,
  731. email: itemAny.email,
  732. contactType: itemAny.contactType,
  733. status: itemAny.status,
  734. remark: itemAny.remark
  735. };
  736. savePromises.push(updatePartnerContacts(data));
  737. }
  738. }
  739. // 保存合同数据
  740. for (const item of contractList.value) {
  741. const itemAny = item as any;
  742. if (String(item.id).startsWith('temp_')) {
  743. const data: any = {
  744. partnerId: currentPartnerId.value,
  745. contractNo: itemAny.contractNo,
  746. cooperativeName: itemAny.cooperativeName,
  747. cooperationId: itemAny.cooperationId,
  748. startTime: itemAny.startTime,
  749. endTime: itemAny.endTime,
  750. categories: itemAny.categories,
  751. fee: itemAny.fee,
  752. contractType: itemAny.contractType,
  753. settlementCycle: itemAny.settlementCycle,
  754. salesTarget: itemAny.salesTarget,
  755. area: itemAny.area,
  756. contacts: itemAny.contacts,
  757. phone: itemAny.phone,
  758. annex: itemAny.annex,
  759. importantTerms: itemAny.importantTerms,
  760. contractStatus: itemAny.contractStatus,
  761. rejectInfo: itemAny.rejectInfo,
  762. status: itemAny.status,
  763. remark: itemAny.remark
  764. };
  765. savePromises.push(addPartnerContract(data));
  766. } else {
  767. const data: any = {
  768. id: item.id,
  769. partnerId: currentPartnerId.value,
  770. contractNo: itemAny.contractNo,
  771. cooperativeName: itemAny.cooperativeName,
  772. cooperationId: itemAny.cooperationId,
  773. startTime: itemAny.startTime,
  774. endTime: itemAny.endTime,
  775. categories: itemAny.categories,
  776. fee: itemAny.fee,
  777. contractType: itemAny.contractType,
  778. settlementCycle: itemAny.settlementCycle,
  779. salesTarget: itemAny.salesTarget,
  780. area: itemAny.area,
  781. contacts: itemAny.contacts,
  782. phone: itemAny.phone,
  783. annex: itemAny.annex,
  784. importantTerms: itemAny.importantTerms,
  785. contractStatus: itemAny.contractStatus,
  786. rejectInfo: itemAny.rejectInfo,
  787. status: itemAny.status,
  788. remark: itemAny.remark
  789. };
  790. savePromises.push(updatePartnerContract(data));
  791. }
  792. }
  793. // 保存用户账号数据
  794. for (const item of userList.value) {
  795. const itemAny = item as any;
  796. if (String(item.id).startsWith('temp_')) {
  797. const data: any = {
  798. partnerId: currentPartnerId.value,
  799. loginUser: itemAny.loginUser,
  800. name: itemAny.name,
  801. email: itemAny.email,
  802. phone: itemAny.phone,
  803. duties: itemAny.duties,
  804. roleName: itemAny.roleName,
  805. roleId: itemAny.roleId,
  806. password: itemAny.password,
  807. status: itemAny.status,
  808. remark: itemAny.remark
  809. };
  810. savePromises.push(addPartnerUser(data));
  811. } else {
  812. const data: any = {
  813. id: item.id,
  814. partnerId: currentPartnerId.value,
  815. loginUser: itemAny.loginUser,
  816. name: itemAny.name,
  817. email: itemAny.email,
  818. phone: itemAny.phone,
  819. duties: itemAny.duties,
  820. roleName: itemAny.roleName,
  821. roleId: itemAny.roleId,
  822. password: itemAny.password,
  823. status: itemAny.status,
  824. remark: itemAny.remark
  825. };
  826. savePromises.push(updatePartnerUser(data));
  827. }
  828. }
  829. // 保存仓库数据
  830. for (const item of warehouseList.value) {
  831. const itemAny = item as any;
  832. if (String(item.id).startsWith('temp_')) {
  833. const data: any = {
  834. partnerId: currentPartnerId.value,
  835. name: itemAny.name,
  836. warehouseNature: itemAny.warehouseNature,
  837. warehouseLocation: itemAny.warehouseLocation,
  838. warehouseAddress: itemAny.warehouseAddress,
  839. warehouseArea: itemAny.warehouseArea,
  840. warehouseContacts: itemAny.warehouseContacts,
  841. phone: itemAny.phone,
  842. annex: itemAny.annex,
  843. status: itemAny.status,
  844. remark: itemAny.remark
  845. };
  846. savePromises.push(addPartnerWarehouse(data));
  847. } else {
  848. const data: any = {
  849. id: item.id,
  850. partnerId: currentPartnerId.value,
  851. name: itemAny.name,
  852. warehouseNature: itemAny.warehouseNature,
  853. warehouseLocation: itemAny.warehouseLocation,
  854. warehouseAddress: itemAny.warehouseAddress,
  855. warehouseArea: itemAny.warehouseArea,
  856. warehouseContacts: itemAny.warehouseContacts,
  857. phone: itemAny.phone,
  858. annex: itemAny.annex,
  859. status: itemAny.status,
  860. remark: itemAny.remark
  861. };
  862. savePromises.push(updatePartnerWarehouse(data));
  863. }
  864. }
  865. // 等待所有子项保存完成
  866. if (savePromises.length > 0) {
  867. await Promise.all(savePromises);
  868. proxy?.$modal.msgSuccess(`保存成功,共保存${savePromises.length}条子项数据`);
  869. } else {
  870. proxy?.$modal.msgSuccess(form.value.id ? '修改成功' : '新增成功');
  871. }
  872. cancel();
  873. if (!form.value.id) {
  874. queryParams.value.pageNum = 1;
  875. }
  876. getList();
  877. } catch (error) {
  878. console.error('保存失败:', error);
  879. proxy?.$modal.msgError('保存失败,请重试');
  880. }
  881. }
  882. });
  883. };
  884. const handleDelete = async (row?: PartnerMerchantVO) => {
  885. const deleteIds = row?.id || ids.value;
  886. await proxy?.$modal.confirm('是否确认删除选中的伙伴商数据?');
  887. delPartnerMerchant(deleteIds).then(() => {
  888. proxy?.$modal.msgSuccess('删除成功');
  889. getList();
  890. });
  891. };
  892. const handleExport = () => {
  893. proxy?.$modal
  894. .confirm('是否确认导出所有伙伴商数据?')
  895. .then(() => {
  896. return exportPartnerMerchant(queryParams.value);
  897. })
  898. .then(() => {
  899. proxy?.$modal.msgSuccess('导出成功');
  900. });
  901. };
  902. // 通用子项提交函数
  903. const submitSubItem = <T extends { id?: string | number; partnerId?: string | number }>(
  904. list: Ref<T[]>,
  905. form: Ref<T>,
  906. dialog: { visible: boolean },
  907. formReset: T,
  908. itemName: string = '数据',
  909. formRef?: Ref<any>
  910. ) => {
  911. if (!currentPartnerId.value) {
  912. proxy?.$modal.msgError('请先选择伙伴商');
  913. return;
  914. }
  915. // 如果提供了formRef,先进行表单验证
  916. const doSubmit = () => {
  917. const existingIndex = list.value.findIndex((item) => item.id === form.value.id);
  918. if (existingIndex !== -1) {
  919. // 编辑模式
  920. const updatedItem: any = { ...form.value };
  921. updatedItem.partnerId = currentPartnerId.value;
  922. if (typeof updatedItem.id === 'number') {
  923. updatedItem._isModified = true;
  924. }
  925. list.value.splice(existingIndex, 1, updatedItem);
  926. proxy?.$modal.msgSuccess(`修改成功,请点击保存按钮保存到数据库`);
  927. } else {
  928. // 新增模式
  929. const newItem: any = { ...form.value };
  930. newItem.partnerId = currentPartnerId.value;
  931. newItem.id = 'temp_' + Date.now();
  932. newItem._isNew = true;
  933. list.value.push(newItem);
  934. proxy?.$modal.msgSuccess(`添加成功,请点击保存按钮保存到数据库`);
  935. }
  936. dialog.visible = false;
  937. form.value = { ...formReset };
  938. };
  939. if (formRef?.value) {
  940. formRef.value.validate((valid: boolean) => {
  941. if (valid) {
  942. doSubmit();
  943. }
  944. });
  945. } else {
  946. doSubmit();
  947. }
  948. };
  949. // 加载子项数据(带错误处理)
  950. const loadQualificationList = () => {
  951. if (!currentPartnerId.value) return;
  952. listPartnerQualification({ partnerId: currentPartnerId.value })
  953. .then((res: any) => {
  954. qualificationList.value = res.rows || [];
  955. })
  956. .catch((error) => {
  957. console.error('加载资质列表失败:', error);
  958. proxy?.$modal.msgError('加载资质列表失败');
  959. });
  960. };
  961. const loadBankList = () => {
  962. if (!currentPartnerId.value) return;
  963. listPartnerBank({ partnerId: currentPartnerId.value })
  964. .then((res: any) => {
  965. bankList.value = res.rows || [];
  966. })
  967. .catch((error) => {
  968. console.error('加载银行账户列表失败:', error);
  969. proxy?.$modal.msgError('加载银行账户列表失败');
  970. });
  971. };
  972. const loadContactList = () => {
  973. if (!currentPartnerId.value) return;
  974. listPartnerContacts({ partnerId: currentPartnerId.value })
  975. .then((res: any) => {
  976. contactList.value = res.rows || [];
  977. })
  978. .catch((error) => {
  979. console.error('加载联系人列表失败:', error);
  980. proxy?.$modal.msgError('加载联系人列表失败');
  981. });
  982. };
  983. const loadContractList = () => {
  984. if (!currentPartnerId.value) return;
  985. listPartnerContract({ partnerId: currentPartnerId.value })
  986. .then((res: any) => {
  987. contractList.value = res.rows || [];
  988. })
  989. .catch((error) => {
  990. console.error('加载合同列表失败:', error);
  991. proxy?.$modal.msgError('加载合同列表失败');
  992. });
  993. };
  994. const loadUserList = () => {
  995. if (!currentPartnerId.value) return;
  996. listPartnerUser({ partnerId: currentPartnerId.value })
  997. .then((res: any) => {
  998. userList.value = res.rows || [];
  999. })
  1000. .catch((error) => {
  1001. console.error('加载用户列表失败:', error);
  1002. proxy?.$modal.msgError('加载用户列表失败');
  1003. });
  1004. };
  1005. const loadWarehouseList = () => {
  1006. if (!currentPartnerId.value) return;
  1007. listPartnerWarehouse({ partnerId: currentPartnerId.value })
  1008. .then((res: any) => {
  1009. warehouseList.value = res.rows || [];
  1010. })
  1011. .catch((error) => {
  1012. console.error('加载仓库列表失败:', error);
  1013. proxy?.$modal.msgError('加载仓库列表失败');
  1014. });
  1015. };
  1016. const handleAddQualification = () => {
  1017. qualificationForm.value = {
  1018. partnerId: 0,
  1019. qualificationNo: '',
  1020. qualificationType: 1,
  1021. authority: '',
  1022. deadline: '',
  1023. annex: '',
  1024. status: '',
  1025. remark: ''
  1026. };
  1027. qualificationDialog.visible = true;
  1028. };
  1029. const handleAddBank = () => {
  1030. bankForm.value = {
  1031. partnerId: 0,
  1032. account: '',
  1033. registrationNumber: '',
  1034. bankId: null,
  1035. accountBankName: '',
  1036. bankNumber: '',
  1037. bankLocation: '',
  1038. bankInterbankNumber: '',
  1039. phone: '',
  1040. address: '',
  1041. status: '',
  1042. remark: ''
  1043. };
  1044. financialDialog.visible = true;
  1045. };
  1046. const handleAddUser = () => {
  1047. userForm.value = {
  1048. partnerId: 0,
  1049. loginUser: '',
  1050. name: '',
  1051. email: '',
  1052. phone: '',
  1053. duties: '',
  1054. roleName: '',
  1055. roleId: 0,
  1056. password: '',
  1057. status: '',
  1058. remark: ''
  1059. };
  1060. accountDialog.visible = true;
  1061. };
  1062. const handleAddContact = () => {
  1063. contactForm.value = {
  1064. partnerId: 0,
  1065. name: '',
  1066. phone: '',
  1067. email: '',
  1068. contactType: 1,
  1069. status: '',
  1070. remark: ''
  1071. };
  1072. contactDialog.visible = true;
  1073. };
  1074. const handleAddContract = () => {
  1075. contractForm.value = {
  1076. partnerId: 0,
  1077. contractNo: '',
  1078. cooperativeName: '',
  1079. cooperationId: 0,
  1080. startTime: '',
  1081. endTime: '',
  1082. categories: '',
  1083. fee: 0,
  1084. contractType: 1,
  1085. settlementCycle: '',
  1086. salesTarget: 0,
  1087. area: '',
  1088. contacts: '',
  1089. phone: '',
  1090. annex: '',
  1091. importantTerms: '',
  1092. contractStatus: 0,
  1093. rejectInfo: '',
  1094. status: '',
  1095. remark: ''
  1096. };
  1097. companyDialog.visible = true;
  1098. };
  1099. const handleAddWarehouse = () => {
  1100. warehouseForm.value = {
  1101. partnerId: 0,
  1102. name: '',
  1103. warehouseNature: 1,
  1104. warehouseLocation: '',
  1105. warehouseAddress: '',
  1106. warehouseArea: '',
  1107. warehouseContacts: '',
  1108. phone: '',
  1109. annex: '',
  1110. status: '',
  1111. remark: ''
  1112. };
  1113. financeDialog.visible = true;
  1114. };
  1115. // 编辑和删除处理函数
  1116. const handleEditQualification = (row: PartnerQualificationVO) => {
  1117. qualificationForm.value = { ...row } as any;
  1118. qualificationDialog.visible = true;
  1119. };
  1120. const handleDeleteQualification = async (row: PartnerQualificationVO) => {
  1121. const index = qualificationList.value.findIndex((item) => item.id === row.id);
  1122. if (index !== -1) {
  1123. // 如果是新增的数据(临时ID),直接从列表中删除
  1124. if ((row as any)._isNew) {
  1125. qualificationList.value.splice(index, 1);
  1126. proxy?.$modal.msgSuccess('删除成功');
  1127. } else {
  1128. // 如果是已存在的数据,调用后端删除接口
  1129. await proxy?.$modal.confirm('是否确认删除该资质数据?');
  1130. await delPartnerQualification(row.id);
  1131. qualificationList.value.splice(index, 1);
  1132. proxy?.$modal.msgSuccess('删除成功');
  1133. }
  1134. }
  1135. };
  1136. const handleEditBank = (row: PartnerBankVO) => {
  1137. bankForm.value = { ...row } as any;
  1138. financialDialog.visible = true;
  1139. };
  1140. const handleDeleteBank = async (row: PartnerBankVO) => {
  1141. const index = bankList.value.findIndex((item) => item.id === row.id);
  1142. if (index !== -1) {
  1143. if ((row as any)._isNew) {
  1144. bankList.value.splice(index, 1);
  1145. proxy?.$modal.msgSuccess('删除成功');
  1146. } else {
  1147. await proxy?.$modal.confirm('是否确认删除该银行账户数据?');
  1148. await delPartnerBank(row.id);
  1149. bankList.value.splice(index, 1);
  1150. proxy?.$modal.msgSuccess('删除成功');
  1151. }
  1152. }
  1153. };
  1154. const handleEditUser = (row: PartnerUserVO) => {
  1155. userForm.value = { ...row } as any;
  1156. accountDialog.visible = true;
  1157. };
  1158. const handleDeleteUser = async (row: PartnerUserVO) => {
  1159. const index = userList.value.findIndex((item) => item.id === row.id);
  1160. if (index !== -1) {
  1161. if ((row as any)._isNew) {
  1162. userList.value.splice(index, 1);
  1163. proxy?.$modal.msgSuccess('删除成功');
  1164. } else {
  1165. await proxy?.$modal.confirm('是否确认删除该用户账号数据?');
  1166. await delPartnerUser(row.id);
  1167. userList.value.splice(index, 1);
  1168. proxy?.$modal.msgSuccess('删除成功');
  1169. }
  1170. }
  1171. };
  1172. const handleEditContact = (row: PartnerContactsVO) => {
  1173. contactForm.value = { ...row } as any;
  1174. contactDialog.visible = true;
  1175. };
  1176. const handleDeleteContact = async (row: PartnerContactsVO) => {
  1177. const index = contactList.value.findIndex((item) => item.id === row.id);
  1178. if (index !== -1) {
  1179. if ((row as any)._isNew) {
  1180. contactList.value.splice(index, 1);
  1181. proxy?.$modal.msgSuccess('删除成功');
  1182. } else {
  1183. await proxy?.$modal.confirm('是否确认删除该联系人数据?');
  1184. await delPartnerContacts(row.id);
  1185. contactList.value.splice(index, 1);
  1186. proxy?.$modal.msgSuccess('删除成功');
  1187. }
  1188. }
  1189. };
  1190. const handleEditContract = (row: PartnerContractVO) => {
  1191. contractForm.value = { ...row } as any;
  1192. companyDialog.visible = true;
  1193. };
  1194. const handleDeleteContract = async (row: PartnerContractVO) => {
  1195. const index = contractList.value.findIndex((item) => item.id === row.id);
  1196. if (index !== -1) {
  1197. if ((row as any)._isNew) {
  1198. contractList.value.splice(index, 1);
  1199. proxy?.$modal.msgSuccess('删除成功');
  1200. } else {
  1201. await proxy?.$modal.confirm('是否确认删除该合同数据?');
  1202. await delPartnerContract(row.id);
  1203. contractList.value.splice(index, 1);
  1204. proxy?.$modal.msgSuccess('删除成功');
  1205. }
  1206. }
  1207. };
  1208. const handleEditWarehouse = (row: PartnerWarehouseVO) => {
  1209. warehouseForm.value = { ...row } as any;
  1210. financeDialog.visible = true;
  1211. };
  1212. const handleDeleteWarehouse = async (row: PartnerWarehouseVO) => {
  1213. const index = warehouseList.value.findIndex((item) => item.id === row.id);
  1214. if (index !== -1) {
  1215. if ((row as any)._isNew) {
  1216. warehouseList.value.splice(index, 1);
  1217. proxy?.$modal.msgSuccess('删除成功');
  1218. } else {
  1219. await proxy?.$modal.confirm('是否确认删除该仓库数据?');
  1220. await delPartnerWarehouse(row.id);
  1221. warehouseList.value.splice(index, 1);
  1222. proxy?.$modal.msgSuccess('删除成功');
  1223. }
  1224. }
  1225. };
  1226. const handleQualificationSubmit = (formData: PartnerQualificationForm) => {
  1227. if (!currentPartnerId.value) {
  1228. proxy?.$modal.msgError('请先选择伙伴商');
  1229. return;
  1230. }
  1231. const existingIndex = qualificationList.value.findIndex((item) => item.id === formData.id);
  1232. if (existingIndex !== -1) {
  1233. const updatedItem: any = { ...formData };
  1234. updatedItem.partnerId = currentPartnerId.value;
  1235. if (typeof updatedItem.id === 'number') {
  1236. updatedItem._isModified = true;
  1237. }
  1238. qualificationList.value.splice(existingIndex, 1, updatedItem);
  1239. proxy?.$modal.msgSuccess('修改成功,请点击保存按钮保存到数据库');
  1240. } else {
  1241. const newItem: any = { ...formData };
  1242. newItem.partnerId = currentPartnerId.value;
  1243. newItem.id = 'temp_' + Date.now();
  1244. newItem._isNew = true;
  1245. qualificationList.value.push(newItem);
  1246. proxy?.$modal.msgSuccess('添加成功,请点击保存按钮保存到数据库');
  1247. }
  1248. qualificationDialog.visible = false;
  1249. qualificationForm.value = { ...initQualificationForm };
  1250. };
  1251. const handleBankSubmit = (formData: PartnerBankForm) => {
  1252. if (!currentPartnerId.value) {
  1253. proxy?.$modal.msgError('请先选择伙伴商');
  1254. return;
  1255. }
  1256. const existingIndex = bankList.value.findIndex((item) => item.id === formData.id);
  1257. if (existingIndex !== -1) {
  1258. const updatedItem: any = { ...formData };
  1259. updatedItem.partnerId = currentPartnerId.value;
  1260. if (typeof updatedItem.id === 'number') {
  1261. updatedItem._isModified = true;
  1262. }
  1263. bankList.value.splice(existingIndex, 1, updatedItem);
  1264. proxy?.$modal.msgSuccess('修改成功,请点击保存按钮保存到数据库');
  1265. } else {
  1266. const newItem: any = { ...formData };
  1267. newItem.partnerId = currentPartnerId.value;
  1268. newItem.id = 'temp_' + Date.now();
  1269. newItem._isNew = true;
  1270. bankList.value.push(newItem);
  1271. proxy?.$modal.msgSuccess('添加成功,请点击保存按钮保存到数据库');
  1272. }
  1273. financialDialog.visible = false;
  1274. bankForm.value = { ...initBankForm };
  1275. };
  1276. const handleUserSubmit = (formData: PartnerUserForm) => {
  1277. if (!currentPartnerId.value) {
  1278. proxy?.$modal.msgError('请先选择伙伴商');
  1279. return;
  1280. }
  1281. const existingIndex = userList.value.findIndex((item) => item.id === formData.id);
  1282. if (existingIndex !== -1) {
  1283. const updatedItem: any = { ...formData };
  1284. updatedItem.partnerId = currentPartnerId.value;
  1285. if (typeof updatedItem.id === 'number') {
  1286. updatedItem._isModified = true;
  1287. }
  1288. userList.value.splice(existingIndex, 1, updatedItem);
  1289. proxy?.$modal.msgSuccess('修改成功,请点击保存按钮保存到数据库');
  1290. } else {
  1291. const newItem: any = { ...formData };
  1292. newItem.partnerId = currentPartnerId.value;
  1293. newItem.id = 'temp_' + Date.now();
  1294. newItem._isNew = true;
  1295. userList.value.push(newItem);
  1296. proxy?.$modal.msgSuccess('添加成功,请点击保存按钮保存到数据库');
  1297. }
  1298. accountDialog.visible = false;
  1299. userForm.value = { ...initUserForm };
  1300. };
  1301. const handleContactSubmit = (formData: PartnerContactsForm) => {
  1302. if (!currentPartnerId.value) {
  1303. proxy?.$modal.msgError('请先选择伙伴商');
  1304. return;
  1305. }
  1306. const existingIndex = contactList.value.findIndex((item) => item.id === formData.id);
  1307. if (existingIndex !== -1) {
  1308. const updatedItem: any = { ...formData };
  1309. updatedItem.partnerId = currentPartnerId.value;
  1310. if (typeof updatedItem.id === 'number') {
  1311. updatedItem._isModified = true;
  1312. }
  1313. contactList.value.splice(existingIndex, 1, updatedItem);
  1314. proxy?.$modal.msgSuccess('修改成功,请点击保存按钮保存到数据库');
  1315. } else {
  1316. const newItem: any = { ...formData };
  1317. newItem.partnerId = currentPartnerId.value;
  1318. newItem.id = 'temp_' + Date.now();
  1319. newItem._isNew = true;
  1320. contactList.value.push(newItem);
  1321. proxy?.$modal.msgSuccess('添加成功,请点击保存按钮保存到数据库');
  1322. }
  1323. contactDialog.visible = false;
  1324. contactForm.value = { ...initContactForm };
  1325. };
  1326. const handleContractSubmit = (formData: PartnerContractForm) => {
  1327. if (!currentPartnerId.value) {
  1328. proxy?.$modal.msgError('请先选择伙伴商');
  1329. return;
  1330. }
  1331. const existingIndex = contractList.value.findIndex((item) => item.id === formData.id);
  1332. if (existingIndex !== -1) {
  1333. const updatedItem: any = { ...formData };
  1334. updatedItem.partnerId = currentPartnerId.value;
  1335. if (typeof updatedItem.id === 'number') {
  1336. updatedItem._isModified = true;
  1337. }
  1338. contractList.value.splice(existingIndex, 1, updatedItem);
  1339. proxy?.$modal.msgSuccess('修改成功,请点击保存按钮保存到数据库');
  1340. } else {
  1341. const newItem: any = { ...formData };
  1342. newItem.partnerId = currentPartnerId.value;
  1343. newItem.id = 'temp_' + Date.now();
  1344. newItem._isNew = true;
  1345. contractList.value.push(newItem);
  1346. proxy?.$modal.msgSuccess('添加成功,请点击保存按钮保存到数据库');
  1347. }
  1348. companyDialog.visible = false;
  1349. contractForm.value = { ...initContractForm };
  1350. };
  1351. // 仓库提交处理(组件方式)
  1352. const handleWarehouseSubmit = (formData: PartnerWarehouseForm) => {
  1353. if (!currentPartnerId.value) {
  1354. proxy?.$modal.msgError('请先选择伙伴商');
  1355. return;
  1356. }
  1357. const existingIndex = warehouseList.value.findIndex((item) => item.id === formData.id);
  1358. if (existingIndex !== -1) {
  1359. // 编辑模式
  1360. const updatedItem: any = { ...formData };
  1361. updatedItem.partnerId = currentPartnerId.value;
  1362. if (typeof updatedItem.id === 'number') {
  1363. updatedItem._isModified = true;
  1364. }
  1365. warehouseList.value.splice(existingIndex, 1, updatedItem);
  1366. proxy?.$modal.msgSuccess('修改成功,请点击保存按钮保存到数据库');
  1367. } else {
  1368. // 新增模式
  1369. const newItem: any = { ...formData };
  1370. newItem.partnerId = currentPartnerId.value;
  1371. newItem.id = 'temp_' + Date.now();
  1372. newItem._isNew = true;
  1373. warehouseList.value.push(newItem);
  1374. proxy?.$modal.msgSuccess('添加成功,请点击保存按钮保存到数据库');
  1375. }
  1376. // 关闭对话框
  1377. financeDialog.visible = false;
  1378. // 重置表单
  1379. warehouseForm.value = { ...initWarehouseForm };
  1380. };
  1381. onMounted(() => {
  1382. getList();
  1383. });
  1384. </script>
  1385. <style scoped lang="scss">
  1386. .drawer-tabs-wrapper {
  1387. border-bottom: 1px solid var(--el-border-color);
  1388. background-color: #fff;
  1389. }
  1390. .drawer-tabs {
  1391. :deep(.el-tabs__header) {
  1392. margin: 0;
  1393. padding: 0 20px;
  1394. background-color: #f5f7fa;
  1395. }
  1396. :deep(.el-tabs__nav-wrap) {
  1397. padding: 0;
  1398. }
  1399. :deep(.el-tabs__content) {
  1400. display: none;
  1401. }
  1402. }
  1403. .drawer-content {
  1404. flex: 1;
  1405. overflow-y: auto;
  1406. padding: 20px;
  1407. }
  1408. .tab-panel {
  1409. min-height: 100%;
  1410. }
  1411. .drawer-form {
  1412. padding: 0;
  1413. }
  1414. .tab-content {
  1415. padding: 0;
  1416. }
  1417. .drawer-footer {
  1418. display: flex;
  1419. justify-content: flex-end;
  1420. gap: 10px;
  1421. padding: 20px;
  1422. border-top: 1px solid var(--el-border-color);
  1423. background-color: #fff;
  1424. }
  1425. :deep(.el-drawer__header) {
  1426. margin-bottom: 0;
  1427. padding: 20px;
  1428. border-bottom: 1px solid var(--el-border-color);
  1429. }
  1430. :deep(.el-drawer__body) {
  1431. padding: 0;
  1432. display: flex;
  1433. flex-direction: column;
  1434. overflow: hidden;
  1435. }
  1436. .mb-2 {
  1437. margin-bottom: 10px;
  1438. }
  1439. </style>