index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <script setup lang="ts">
  2. import AForm from '@/components/AForm/index.vue'
  3. import { FormConfigType } from '@/components/AForm/type'
  4. import { ToolbarConfigType } from '@/components/AToolbar/type'
  5. import { ColumnConfigType } from '@/components/ATable/type'
  6. import { StrAnyObj, StrAnyObjArr } from '@/typings'
  7. import { useHandleData } from '@/utils/useHandleData'
  8. import { getPageApi, getDetailApi, addApi, editApi, deleteApi } from '@/api/business/contract/info'
  9. const queryRef = ref<InstanceType<typeof AForm>>()
  10. const formRef = ref<InstanceType<typeof AForm>>()
  11. const showQuery = ref<boolean>(true)
  12. const selectKeys = ref<string[]>([])
  13. const pageTotal = ref<number>(0)
  14. const queryData = ref<StrAnyObj>({ pageNum: 1, pageSize: 10 })
  15. const tableData = ref<StrAnyObjArr>([])
  16. const formData = ref<StrAnyObj>({})
  17. const dialogTitle = ref<string>('')
  18. const dialogVisible = ref<boolean>(false)
  19. const queryConfig: FormConfigType[] = [
  20. {
  21. type: 'input',
  22. prop: 'contractNo',
  23. label: '合同编号'
  24. }
  25. ]
  26. const toolbarConfig: ToolbarConfigType[] = [
  27. {
  28. common: 'search',
  29. click() {
  30. queryData.value.pageNum = 1
  31. getPage()
  32. }
  33. },
  34. {
  35. common: 'reset',
  36. click() {
  37. queryRef.value?.resetFields()
  38. getPage()
  39. }
  40. }
  41. ]
  42. const columnConfig: ColumnConfigType[] = [
  43. {
  44. prop: 'contractNo',
  45. label: '合同编号'
  46. },
  47. {
  48. prop: 'signingDate',
  49. label: '签订日期'
  50. },
  51. {
  52. prop: 'startDate',
  53. label: '开始日期'
  54. },
  55. {
  56. prop: 'endDate',
  57. label: '结束日期'
  58. },
  59. {
  60. prop: 'currency',
  61. label: '币种'
  62. },
  63. {
  64. prop: 'exchangeRate',
  65. label: '汇率'
  66. },
  67. {
  68. prop: 'freightPrice',
  69. label: '运费'
  70. },
  71. {
  72. prop: 'insurance',
  73. label: '保险费'
  74. },
  75. {
  76. prop: 'amount',
  77. label: '金额'
  78. },
  79. {
  80. width: 250,
  81. handleConfig: [
  82. {
  83. common: 'update',
  84. click(row) {
  85. dialogVisible.value = true
  86. dialogTitle.value = '编辑'
  87. getDetailApi({ id: row.id }).then((resp: StrAnyObj) => {
  88. formData.value = resp
  89. })
  90. }
  91. },
  92. {
  93. common: 'delete',
  94. click(row) {
  95. handleRemove([row.id])
  96. }
  97. }
  98. ]
  99. }
  100. ]
  101. const formConfig: FormConfigType[] = [
  102. {
  103. type: 'input',
  104. prop: 'contractNo',
  105. label: '合同编号',
  106. rule: [{ required: true, message: '合同编号不能为空', trigger: 'blur' }]
  107. },
  108. {
  109. type: 'input',
  110. prop: 'type',
  111. label: '合同类型 1-三梵合同,2-佰易来合同',
  112. rule: [{ required: true, message: '合同类型 1-三梵合同,2-佰易来合同不能为空', trigger: 'blur' }]
  113. },
  114. {
  115. type: 'input',
  116. prop: 'contractSubjectId',
  117. label: '合同主体id',
  118. rule: [{ required: true, message: '合同主体id不能为空', trigger: 'blur' }]
  119. },
  120. {
  121. type: 'input',
  122. prop: 'purchaseType',
  123. label: '采购类型 1-一件商品,2-批单商品',
  124. rule: [{ required: true, message: '采购类型 1-一件商品,2-批单商品不能为空', trigger: 'blur' }]
  125. },
  126. {
  127. type: 'input',
  128. prop: 'isTax',
  129. label: '是否含税(1是 0否)',
  130. rule: [{ required: true, message: '是否含税(1是 0否)不能为空', trigger: 'blur' }]
  131. },
  132. {
  133. type: 'input',
  134. prop: 'rankId',
  135. label: '等级id',
  136. rule: [{ required: true, message: '等级id不能为空', trigger: 'blur' }]
  137. },
  138. {
  139. type: 'input',
  140. prop: 'status',
  141. label: '合同状态 10进行中 20已完成',
  142. rule: [{ required: true, message: '合同状态 10进行中 20已完成不能为空', trigger: 'blur' }]
  143. },
  144. {
  145. type: 'input',
  146. prop: 'packingStatus',
  147. label: '包装状态 0未包装 1已包装',
  148. rule: [{ required: true, message: '包装状态 0未包装 1已包装不能为空', trigger: 'blur' }]
  149. },
  150. {
  151. type: 'input',
  152. prop: 'paymentType',
  153. label: '支付类型 1银行卡支付 2支付宝支付',
  154. rule: [{ required: true, message: '支付类型 1银行卡支付 2支付宝支付不能为空', trigger: 'blur' }]
  155. },
  156. {
  157. type: 'input',
  158. prop: 'sellAccountName',
  159. label: '卖家账户名',
  160. rule: [{ required: true, message: '卖家账户名不能为空', trigger: 'blur' }]
  161. },
  162. {
  163. type: 'input',
  164. prop: 'sellBankName',
  165. label: '卖家开户银行',
  166. rule: [{ required: true, message: '卖家开户银行不能为空', trigger: 'blur' }]
  167. },
  168. {
  169. type: 'input',
  170. prop: 'sellBankAccount',
  171. label: '卖家银行账号',
  172. rule: [{ required: true, message: '卖家银行账号不能为空', trigger: 'blur' }]
  173. },
  174. {
  175. type: 'input',
  176. prop: 'sellBankCnapsCode',
  177. label: '卖家联行号',
  178. rule: [{ required: true, message: '卖家联行号不能为空', trigger: 'blur' }]
  179. },
  180. {
  181. type: 'input',
  182. prop: 'sellBeneficiaryName',
  183. label: '卖家账户名称(外汇信息)',
  184. rule: [{ required: true, message: '卖家账户名称(外汇信息)不能为空', trigger: 'blur' }]
  185. },
  186. {
  187. type: 'input',
  188. prop: 'sellBeneficiaryBank',
  189. label: '卖家开户银行(外汇信息)',
  190. rule: [{ required: true, message: '卖家开户银行(外汇信息)不能为空', trigger: 'blur' }]
  191. },
  192. {
  193. type: 'input',
  194. prop: 'sellBeneficiaryBankAccount',
  195. label: '卖家账号(外汇信息)',
  196. rule: [{ required: true, message: '卖家账号(外汇信息)不能为空', trigger: 'blur' }]
  197. },
  198. {
  199. type: 'input',
  200. prop: 'sellBeneficiaryBankAddress',
  201. label: '卖家开户银行地址(外汇信息)',
  202. rule: [{ required: true, message: '卖家开户银行地址(外汇信息)不能为空', trigger: 'blur' }]
  203. },
  204. {
  205. type: 'input',
  206. prop: 'sellSwiftCode',
  207. label: '卖家银行代码(外汇信息)',
  208. rule: [{ required: true, message: '卖家银行代码(外汇信息)不能为空', trigger: 'blur' }]
  209. },
  210. {
  211. type: 'input',
  212. prop: 'sellBeneficiaryAddress',
  213. label: '卖家收款人地址(外汇信息)',
  214. rule: [{ required: true, message: '卖家收款人地址(外汇信息)不能为空', trigger: 'blur' }]
  215. },
  216. {
  217. type: 'input',
  218. prop: 'sellAlipayAccount',
  219. label: '卖家支付宝账号',
  220. rule: [{ required: true, message: '卖家支付宝账号不能为空', trigger: 'blur' }]
  221. },
  222. {
  223. type: 'input',
  224. prop: 'signingDate',
  225. label: '签订日期',
  226. rule: [{ required: true, message: '签订日期不能为空', trigger: 'blur' }]
  227. },
  228. {
  229. type: 'input',
  230. prop: 'startDate',
  231. label: '开始日期',
  232. rule: [{ required: true, message: '开始日期不能为空', trigger: 'blur' }]
  233. },
  234. {
  235. type: 'input',
  236. prop: 'endDate',
  237. label: '结束日期',
  238. rule: [{ required: true, message: '结束日期不能为空', trigger: 'blur' }]
  239. },
  240. {
  241. type: 'input',
  242. prop: 'validityDate',
  243. label: '报价有效期(天)',
  244. rule: [{ required: true, message: '报价有效期(天)不能为空', trigger: 'blur' }]
  245. },
  246. {
  247. type: 'input',
  248. prop: 'customerId',
  249. label: '客户id',
  250. rule: [{ required: true, message: '客户id不能为空', trigger: 'blur' }]
  251. },
  252. {
  253. type: 'input',
  254. prop: 'customerName',
  255. label: '客户名称',
  256. rule: [{ required: true, message: '客户名称不能为空', trigger: 'blur' }]
  257. },
  258. {
  259. type: 'input',
  260. prop: 'customerTelNum',
  261. label: '客户联系电话',
  262. rule: [{ required: true, message: '客户联系电话不能为空', trigger: 'blur' }]
  263. },
  264. {
  265. type: 'input',
  266. prop: 'customerCountry',
  267. label: '客户国家',
  268. rule: [{ required: true, message: '客户国家不能为空', trigger: 'blur' }]
  269. },
  270. {
  271. type: 'input',
  272. prop: 'customerAddress',
  273. label: '客户地址',
  274. rule: [{ required: true, message: '客户地址不能为空', trigger: 'blur' }]
  275. },
  276. {
  277. type: 'input',
  278. prop: 'destination',
  279. label: '目的地',
  280. rule: [{ required: true, message: '目的地不能为空', trigger: 'blur' }]
  281. },
  282. {
  283. type: 'input',
  284. prop: 'shippingMethod',
  285. label: '货运方式',
  286. rule: [{ required: true, message: '货运方式不能为空', trigger: 'blur' }]
  287. },
  288. {
  289. type: 'input',
  290. prop: 'deliveryTerms',
  291. label: '交货条款',
  292. rule: [{ required: true, message: '交货条款不能为空', trigger: 'blur' }]
  293. },
  294. {
  295. type: 'input',
  296. prop: 'deliveryTime',
  297. label: '交货时间(天)',
  298. rule: [{ required: true, message: '交货时间(天)不能为空', trigger: 'blur' }]
  299. },
  300. {
  301. type: 'input',
  302. prop: 'paymentTerms',
  303. label: '付款条件',
  304. rule: [{ required: true, message: '付款条件不能为空', trigger: 'blur' }]
  305. },
  306. {
  307. type: 'input',
  308. prop: 'warrantyPeriod',
  309. label: '保修时间(天)',
  310. rule: [{ required: true, message: '保修时间(天)不能为空', trigger: 'blur' }]
  311. },
  312. {
  313. type: 'input',
  314. prop: 'currency',
  315. label: '币种',
  316. rule: [{ required: true, message: '币种不能为空', trigger: 'blur' }]
  317. },
  318. {
  319. type: 'input',
  320. prop: 'exchangeRate',
  321. label: '汇率',
  322. rule: [{ required: true, message: '汇率不能为空', trigger: 'blur' }]
  323. },
  324. {
  325. type: 'input',
  326. prop: 'freightPrice',
  327. label: '运费',
  328. rule: [{ required: true, message: '运费不能为空', trigger: 'blur' }]
  329. },
  330. {
  331. type: 'input',
  332. prop: 'insurance',
  333. label: '保险费',
  334. rule: [{ required: true, message: '保险费不能为空', trigger: 'blur' }]
  335. },
  336. {
  337. type: 'input',
  338. prop: 'amount',
  339. label: '金额',
  340. rule: [{ required: true, message: '金额不能为空', trigger: 'blur' }]
  341. },
  342. {
  343. type: 'input',
  344. prop: 'remark',
  345. label: '备注',
  346. rule: [{ required: true, message: '备注不能为空', trigger: 'blur' }]
  347. },
  348. {
  349. type: 'input',
  350. prop: 'createBy',
  351. label: '创建者',
  352. rule: [{ required: true, message: '创建者不能为空', trigger: 'blur' }]
  353. },
  354. {
  355. type: 'input',
  356. prop: 'createTime',
  357. label: '创建时间',
  358. rule: [{ required: true, message: '创建时间不能为空', trigger: 'blur' }]
  359. },
  360. {
  361. type: 'input',
  362. prop: 'updateBy',
  363. label: '更新者',
  364. rule: [{ required: true, message: '更新者不能为空', trigger: 'blur' }]
  365. },
  366. {
  367. type: 'input',
  368. prop: 'updateTime',
  369. label: '最后更新时间',
  370. rule: [{ required: true, message: '最后更新时间不能为空', trigger: 'blur' }]
  371. },
  372. {
  373. type: 'input',
  374. prop: 'delFlag',
  375. label: '删除标志(0代表存在 1代表删除)',
  376. rule: [{ required: true, message: '删除标志(0代表存在 1代表删除)不能为空', trigger: 'blur' }]
  377. },
  378. {
  379. type: 'input',
  380. prop: 'tenantId',
  381. label: '租户id',
  382. rule: [{ required: true, message: '租户id不能为空', trigger: 'blur' }]
  383. },
  384. ]
  385. onMounted(() => {
  386. getPage()
  387. })
  388. function getPage() {
  389. getPageApi(queryData.value).then((resp) => {
  390. tableData.value = resp.records
  391. pageTotal.value = resp.total
  392. })
  393. }
  394. function tableSelectionChange(item: StrAnyObjArr) {
  395. selectKeys.value = item.map((item) => item.id)
  396. }
  397. function formSubmit() {
  398. formRef.value?.validate(() => {
  399. if (formData.value.id) {
  400. editApi(formData.value).then(() => {
  401. dialogVisible.value = false
  402. ElMessage.success('修改成功')
  403. getPage()
  404. })
  405. } else {
  406. addApi(formData.value).then(() => {
  407. dialogVisible.value = false
  408. ElMessage.success('新增成功')
  409. getPage()
  410. })
  411. }
  412. })
  413. }
  414. function formClosed() {
  415. formRef.value?.resetFields()
  416. }
  417. function handleRemove(idList: string[]) {
  418. useHandleData('是否确认删除?', () => {
  419. deleteApi({ idList }).then(() => {
  420. ElMessage.success('删除成功')
  421. getPage()
  422. })
  423. })
  424. }
  425. </script>
  426. <template>
  427. <div>
  428. <el-card v-if="showQuery">
  429. <a-form ref="queryRef" v-model="queryData" :config="queryConfig" :span="6"> </a-form>
  430. </el-card>
  431. <a-table
  432. :data="tableData"
  433. :page-total="pageTotal"
  434. :toolbar-config="toolbarConfig"
  435. :column-config="columnConfig"
  436. v-model:showQuery="showQuery"
  437. v-model:page-num="queryData.pageNum"
  438. v-model:page-size="queryData.pageSize"
  439. @page-num-change="getPage"
  440. @page-size-change="getPage"
  441. @selection-change="tableSelectionChange"
  442. >
  443. </a-table>
  444. <a-dialog
  445. v-model="dialogVisible"
  446. :title="dialogTitle"
  447. @submit="formSubmit"
  448. @closed="formClosed"
  449. >
  450. <a-form ref="formRef" v-model="formData" :config="formConfig" :span="24"> </a-form>
  451. </a-dialog>
  452. </div>
  453. </template>