PurchasePayment.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. <template>
  2. <div style="width: 100%; padding: 0px 15px">
  3. <byForm
  4. :formConfig="formConfig"
  5. :formOption="formOption"
  6. v-model="formData.data"
  7. :rules="rules"
  8. ref="submit"
  9. >
  10. <template #deadline>
  11. <div style="width: 100%">
  12. <el-date-picker
  13. v-model="formData.data.deadline"
  14. type="date"
  15. placeholder="请选择付款期限"
  16. value-format="YYYY-MM-DD"
  17. style="width: 100%"
  18. />
  19. </div>
  20. </template>
  21. <template #receiptsNum>
  22. <div style="width: 100%">
  23. <el-input-number
  24. onmousewheel="return false;"
  25. v-model="formData.data.receiptsNum"
  26. placeholder="请输入单据数量"
  27. :min="0"
  28. :precision="0"
  29. :controls="false"
  30. style="width: 100%"
  31. />
  32. </div>
  33. </template>
  34. <template #rate>
  35. <div style="width: 100%">
  36. <el-input-number
  37. onmousewheel="return false;"
  38. v-model="formData.data.rate"
  39. placeholder="请输入税率"
  40. :min="0"
  41. :max="100"
  42. :precision="2"
  43. :controls="false"
  44. style="width: 100%"
  45. />
  46. </div>
  47. </template>
  48. <template #fileList>
  49. <div style="width: 100%">
  50. <el-upload
  51. v-model:fileList="fileList"
  52. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  53. multiple
  54. :data="uploadData"
  55. :before-upload="uploadFile"
  56. :on-preview="onPreviewFile"
  57. >
  58. <el-button>选择</el-button>
  59. </el-upload>
  60. </div>
  61. </template>
  62. <template #payDetailList>
  63. <div style="width: 100%">
  64. <el-button type="primary" @click="clickAdd()">添加行</el-button>
  65. <el-table
  66. :data="formData.data.payDetailList"
  67. style="width: 100%; margin-top: 16px"
  68. >
  69. <el-table-column label="采购合同" width="220">
  70. <template #default="{ row, $index }">
  71. <div style="width: 100%">
  72. <el-form-item
  73. :prop="'payDetailList.' + $index + '.purchaseId'"
  74. :rules="rules.purchaseId"
  75. :inline-message="true"
  76. >
  77. <el-select
  78. v-model="row.purchaseId"
  79. placeholder="请选择采购合同"
  80. style="width: 100%"
  81. @change="changePurchaseId(row, true)"
  82. >
  83. <el-option
  84. v-for="item in contractList"
  85. :key="item.value"
  86. :label="item.label"
  87. :value="item.value"
  88. />
  89. </el-select>
  90. </el-form-item>
  91. </div>
  92. </template>
  93. </el-table-column>
  94. <el-table-column prop="amount" label="合同金额" width="140" />
  95. <el-table-column
  96. prop="sumPayMoney"
  97. label="已付款金额"
  98. width="140"
  99. />
  100. <el-table-column
  101. prop="sumInvoiceMoney"
  102. label="已收发票金额"
  103. width="140"
  104. />
  105. <el-table-column label="款项说明">
  106. <template #default="{ row, $index }">
  107. <div style="width: 100%">
  108. <el-form-item
  109. :prop="'payDetailList.' + $index + '.remark'"
  110. :rules="rules.remark"
  111. :inline-message="true"
  112. >
  113. <el-input
  114. v-model="row.remark"
  115. placeholder="请输入款项说明"
  116. style="width: 100%"
  117. />
  118. </el-form-item>
  119. </div>
  120. </template>
  121. </el-table-column>
  122. <el-table-column label="付款金额" width="180">
  123. <template #default="{ row, $index }">
  124. <div style="width: 100%">
  125. <el-form-item
  126. :prop="'payDetailList.' + $index + '.money'"
  127. :rules="rules.money"
  128. :inline-message="true"
  129. >
  130. <el-input-number
  131. onmousewheel="return false;"
  132. v-model="row.money"
  133. placeholder="请输入金额"
  134. style="width: 100%"
  135. :precision="2"
  136. :controls="false"
  137. :min="0"
  138. :disabled="row.id"
  139. @change="changeMoney()"
  140. />
  141. </el-form-item>
  142. </div>
  143. </template>
  144. </el-table-column>
  145. <el-table-column label="操作" width="80">
  146. <template #default="{ row, $index }">
  147. <el-button type="primary" link @click="handleRemove($index)"
  148. >删除</el-button
  149. >
  150. </template>
  151. </el-table-column>
  152. </el-table>
  153. <br />
  154. </div>
  155. </template>
  156. </byForm>
  157. </div>
  158. </template>
  159. <script setup>
  160. import byForm from "@/components/byForm/index";
  161. import { ElMessage } from "element-plus";
  162. import useUserStore from "@/store/modules/user";
  163. import { useRoute } from "vue-router";
  164. const route = useRoute();
  165. const { proxy } = getCurrentInstance();
  166. const supplierList = ref([]);
  167. const invoiceType = ref([]);
  168. const fundsPaymentMethod = ref([]);
  169. const accountList = ref([]);
  170. const contractList = ref([]);
  171. let formData = reactive({
  172. data: {
  173. supplyId: "",
  174. amount: "",
  175. invoiceType: "",
  176. remark: "",
  177. deadline: "",
  178. receiptsNum: undefined,
  179. payType: "",
  180. currency: "",
  181. accountManagementId: "",
  182. userName: "",
  183. payDetailList: [],
  184. fileList: [],
  185. advanceCode: "",
  186. type: "",
  187. rate: undefined,
  188. },
  189. });
  190. const submit = ref(null);
  191. const judgeStatus = () => {
  192. if (route.query.processType == 20 || route.query.processType == 10) {
  193. return true;
  194. }
  195. if (props.queryData.recordList && props.queryData.recordList.length > 0) {
  196. let data = props.queryData.recordList.filter(
  197. (item) => item.status === 2 && item.nodeType !== 1
  198. );
  199. if (data && data.length > 0) {
  200. return true;
  201. }
  202. }
  203. return false;
  204. };
  205. const payMethod = ref([]);
  206. const formOption = reactive({
  207. inline: true,
  208. labelWidth: 100,
  209. itemWidth: 100,
  210. rules: [],
  211. disabled: false,
  212. });
  213. const formConfig = computed(() => {
  214. return [
  215. {
  216. type: "title",
  217. title: "基础信息",
  218. label: "",
  219. },
  220. {
  221. type: "select",
  222. label: "归属公司",
  223. prop: "corporationId",
  224. data: companyData.value,
  225. itemWidth: 33,
  226. style: "width: 100%",
  227. },
  228. {
  229. type: "select",
  230. label: "供应商",
  231. prop: "supplyId",
  232. data: supplierList.value,
  233. fn: (val) => {
  234. changeSupply(val);
  235. },
  236. itemWidth: 35,
  237. style: "width: 94%",
  238. },
  239. {
  240. type: "slot",
  241. prop: "deadline",
  242. slotName: "deadline",
  243. label: "付款期限",
  244. itemWidth: 33,
  245. },
  246. {
  247. type: "select",
  248. label: "付款类型",
  249. prop: "type",
  250. data: payMethod.value,
  251. itemWidth: 33,
  252. style: "width: 100%",
  253. fn: () => {
  254. formData.data.advanceCode = "";
  255. },
  256. },
  257. // {
  258. // type: "select",
  259. // label: "预付款单号",
  260. // prop: "advanceCode",
  261. // data: advanceCode.value,
  262. // itemWidth: 34,
  263. // style: "width: 100%",
  264. // isShow: formData.data.type == "1",
  265. // },
  266. {
  267. type: "input",
  268. prop: "remark",
  269. label: "付款说明",
  270. itemType: "textarea",
  271. },
  272. {
  273. type: "slot",
  274. prop: "receiptsNum",
  275. slotName: "receiptsNum",
  276. label: "单据数量",
  277. itemWidth: 33,
  278. },
  279. {
  280. type: "select",
  281. label: "发票类型",
  282. prop: "invoiceType",
  283. data: invoiceType.value,
  284. itemWidth: 33,
  285. style: "width: 100%",
  286. fn: (val) => {
  287. if (val == "1") {
  288. formData.data.rate = 13;
  289. } else if (val == "2") {
  290. formData.data.rate = 6;
  291. } else {
  292. formData.data.rate = undefined;
  293. }
  294. },
  295. },
  296. {
  297. type: "slot",
  298. prop: "rate",
  299. slotName: "rate",
  300. label: "税率 (%)",
  301. itemWidth: 34,
  302. isShow:
  303. formData.data.invoiceType == "1" || formData.data.invoiceType == "2",
  304. },
  305. {
  306. type: "slot",
  307. prop: "fileList",
  308. slotName: "fileList",
  309. label: "上传附件",
  310. },
  311. {
  312. type: "slot",
  313. prop: "payDetailList",
  314. slotName: "payDetailList",
  315. label: "付款明细",
  316. },
  317. {
  318. type: "input",
  319. prop: "amount",
  320. label: "付款总额",
  321. required: true,
  322. itemType: "text",
  323. disabled: true,
  324. itemWidth: 50,
  325. },
  326. {
  327. label: "收款信息",
  328. },
  329. {
  330. type: "select",
  331. label: "付款方式",
  332. prop: "payType",
  333. data: fundsPaymentMethod.value,
  334. itemWidth: 50,
  335. },
  336. {
  337. type: "select",
  338. label: "付款账户",
  339. prop: "accountManagementId",
  340. data: accountList.value,
  341. itemWidth: 50,
  342. fn: (val) => {
  343. changeAccount(val);
  344. },
  345. },
  346. {
  347. type: "input",
  348. prop: "name",
  349. label: "户名",
  350. required: true,
  351. itemType: "text",
  352. itemWidth: 50,
  353. },
  354. {
  355. type: "input",
  356. prop: "accountOpening",
  357. label: "银行账号",
  358. required: true,
  359. itemType: "text",
  360. itemWidth: 50,
  361. },
  362. {
  363. type: "input",
  364. prop: "openingBank",
  365. label: "开户银行",
  366. required: true,
  367. itemType: "text",
  368. itemWidth: 50,
  369. },
  370. {
  371. type: "input",
  372. prop: "interbankNumber",
  373. label: "联行号",
  374. required: true,
  375. itemType: "text",
  376. itemWidth: 50,
  377. },
  378. ];
  379. });
  380. const rules = ref({
  381. supplyId: [{ required: true, message: "请选择供应商", trigger: "change" }],
  382. invoiceType: [
  383. { required: true, message: "请选择发票类型", trigger: "change" },
  384. ],
  385. payType: [{ required: true, message: "请选择付款方式", trigger: "change" }],
  386. // accountManagementId: [{ required: true, message: "请选择付款账户", trigger: "change" }],
  387. purchaseId: [
  388. { required: true, message: "请选择采购合同", trigger: "change" },
  389. ],
  390. money: [{ required: true, message: "请输入付款金额", trigger: "blur" }],
  391. name: [{ required: true, message: "请输入户名", trigger: "blur" }],
  392. advanceCode: [
  393. { required: true, message: "请选择预付款单号", trigger: "change" },
  394. ],
  395. type: [{ required: true, message: "请选择付款类型", trigger: "change" }],
  396. rate: [{ required: true, message: "请输入税率", trigger: "blur" }],
  397. corporationId: [
  398. { required: true, message: "请选择归属公司", trigger: "change" },
  399. ],
  400. });
  401. const fileList = ref([]);
  402. const uploadData = ref({});
  403. const companyData = ref([]);
  404. const getDict = () => {
  405. proxy
  406. .post("/corporation/page", { pageNum: 1, pageSize: 9999 })
  407. .then((res) => {
  408. companyData.value = res.rows.map((x) => ({
  409. ...x,
  410. label: x.name,
  411. value: x.id,
  412. }));
  413. });
  414. proxy
  415. .post("/dictTenantData/page", {
  416. pageNum: 1,
  417. pageSize: 999,
  418. dictCode: "invoice_type",
  419. tenantId: useUserStore().user.tenantId,
  420. })
  421. .then((res) => {
  422. if (res.rows && res.rows.length > 0) {
  423. invoiceType.value = res.rows.map((item) => {
  424. return {
  425. label: item.dictValue,
  426. value: item.dictKey,
  427. };
  428. });
  429. }
  430. });
  431. proxy
  432. .post("/dictTenantData/page", {
  433. pageNum: 1,
  434. pageSize: 999,
  435. dictCode: "funds_payment_method",
  436. tenantId: useUserStore().user.tenantId,
  437. })
  438. .then((res) => {
  439. if (res.rows && res.rows.length > 0) {
  440. fundsPaymentMethod.value = res.rows.map((item) => {
  441. return {
  442. label: item.dictValue,
  443. value: item.dictKey,
  444. };
  445. });
  446. }
  447. });
  448. proxy
  449. .post("/dictTenantData/page", {
  450. pageNum: 1,
  451. pageSize: 999,
  452. dictCode: "pay_method",
  453. tenantId: useUserStore().user.tenantId,
  454. })
  455. .then((res) => {
  456. if (res.rows && res.rows.length > 0) {
  457. payMethod.value = res.rows.map((item) => {
  458. return {
  459. label: item.dictValue,
  460. value: item.dictKey,
  461. };
  462. });
  463. }
  464. });
  465. proxy
  466. .post("/supplierInfo/page", { pageNum: 1, pageSize: 999 })
  467. .then((res) => {
  468. if (res.rows && res.rows.length > 0) {
  469. supplierList.value = res.rows.map((item) => {
  470. return {
  471. label: item.name,
  472. value: item.id,
  473. };
  474. });
  475. }
  476. });
  477. proxy
  478. .post("/accountManagement/page", { pageNum: 1, pageSize: 999 })
  479. .then((res) => {
  480. accountList.value = res.rows.map((item) => {
  481. return {
  482. bankName: item.name,
  483. accountOpening: item.accountOpening,
  484. openingBank: item.openingBank,
  485. interbankNumber: item.interbankNumber,
  486. label: item.alias,
  487. value: item.id,
  488. };
  489. });
  490. });
  491. };
  492. getDict();
  493. const uploadFile = async (file) => {
  494. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  495. uploadData.value = res.uploadBody;
  496. file.id = res.id;
  497. file.fileName = res.fileName;
  498. file.fileUrl = res.fileUrl;
  499. return true;
  500. };
  501. const onPreviewFile = (file) => {
  502. window.open(file.raw.fileUrl, "_blank");
  503. };
  504. const changeSupply = async (val) => {
  505. if (val) {
  506. await proxy
  507. .get("/purchase/getListBySupplyId", { supplyId: val })
  508. .then((res) => {
  509. if (res.data && res.data.length > 0) {
  510. contractList.value = res.data.map((item) => {
  511. return {
  512. value: item.id,
  513. label: item.code,
  514. amount: item.amount,
  515. sumPayMoney: item.sumPayMoney,
  516. sumInvoiceMoney: item.sumInvoiceMoney,
  517. };
  518. });
  519. } else {
  520. contractList.value = [];
  521. }
  522. });
  523. } else {
  524. contractList.value = [];
  525. }
  526. formData.data.payDetailList = [];
  527. getDecisionAids();
  528. };
  529. const clickAdd = () => {
  530. if (formData.data.payDetailList && formData.data.payDetailList.length > 0) {
  531. formData.data.payDetailList.push({
  532. purchaseId: "",
  533. money: undefined,
  534. remark: "",
  535. });
  536. } else {
  537. formData.data.payDetailList = [
  538. { purchaseId: "", money: undefined, remark: "" },
  539. ];
  540. }
  541. };
  542. const handleRemove = (index) => {
  543. formData.data.payDetailList.splice(index, 1);
  544. getDecisionAids();
  545. };
  546. const changeAccount = (val) => {
  547. if (val) {
  548. let data = accountList.value.filter((item) => item.value === val);
  549. if (data && data.length > 0) {
  550. formData.data.bankName = data[0].bankName;
  551. formData.data.accountOpening = data[0].accountOpening;
  552. formData.data.openingBank = data[0].openingBank;
  553. formData.data.interbankNumber = data[0].interbankNumber;
  554. }
  555. }
  556. };
  557. const changePurchaseId = (row, status) => {
  558. let data = contractList.value.filter((item) => item.value === row.purchaseId);
  559. if (data && data.length > 0) {
  560. row.amount = data[0].amount;
  561. row.sumPayMoney = data[0].sumPayMoney;
  562. row.sumInvoiceMoney = data[0].sumInvoiceMoney;
  563. } else {
  564. row.amount = "";
  565. row.sumPayMoney = "";
  566. row.sumInvoiceMoney = "";
  567. }
  568. if (status) {
  569. getDecisionAids();
  570. }
  571. };
  572. const changeMoney = () => {
  573. let money = 0;
  574. for (let i = 0; i < formData.data.payDetailList.length; i++) {
  575. if (formData.data.payDetailList[i].money) {
  576. money = parseFloat(
  577. Number(money) + Number(formData.data.payDetailList[i].money)
  578. ).toFixed(2);
  579. }
  580. }
  581. formData.data.amount = money;
  582. };
  583. const handleSubmit = async () => {
  584. let status = await submit.value.handleSubmit(() => {});
  585. if (status) {
  586. if (formData.data.payDetailList && formData.data.payDetailList.length > 0) {
  587. if (fileList.value && fileList.value.length > 0) {
  588. formData.data.fileList = fileList.value.map((item) => {
  589. return {
  590. id: item.raw.id,
  591. fileName: item.raw.fileName,
  592. fileUrl: item.raw.fileUrl,
  593. };
  594. });
  595. }
  596. return true;
  597. } else {
  598. ElMessage("请添加至少一条付款明细");
  599. }
  600. return false;
  601. }
  602. return status;
  603. };
  604. // 接收父组件的传值
  605. const props = defineProps({
  606. queryData: Object,
  607. });
  608. watch(
  609. props.queryData,
  610. () => {
  611. formOption.disabled = judgeStatus();
  612. if (
  613. props.queryData &&
  614. ["10", "20", "30"].includes(route.query.processType)
  615. ) {
  616. for (var text in props.queryData) {
  617. formData.data[text] = props.queryData[text];
  618. }
  619. if (formData.data.fileList && formData.data.fileList.length > 0) {
  620. fileList.value = formData.data.fileList.map((item) => {
  621. return {
  622. raw: item,
  623. name: item.fileName,
  624. url: item.fileUrl,
  625. };
  626. });
  627. } else {
  628. fileList.value = [];
  629. }
  630. if (
  631. route.query.processType !== "30" &&
  632. formData.data.payDetailList &&
  633. formData.data.payDetailList.length
  634. ) {
  635. let ids = formData.data.payDetailList.map((item) => item.purchaseId);
  636. if (ids && ids.length > 0) {
  637. proxy.post("/purchase/getListInId", ids).then((res) => {
  638. if (res && res.length > 0) {
  639. contractList.value = res.map((item) => {
  640. return {
  641. value: item.id,
  642. label: item.code,
  643. };
  644. });
  645. } else {
  646. contractList.value = [];
  647. }
  648. });
  649. }
  650. }
  651. getDecisionAids();
  652. }
  653. },
  654. {
  655. deep: true,
  656. }
  657. );
  658. onMounted(async () => {
  659. if (props.queryData.supplyIdTwo) {
  660. formData.data.supplyIdTwo = props.queryData.supplyIdTwo;
  661. await changeSupply(formData.data.supplyIdTwo);
  662. if (props.queryData.ids) {
  663. let ids = props.queryData.ids.split(",");
  664. if (ids && ids.length > 0) {
  665. for (let i = 0; i < ids.length; i++) {
  666. if (contractList.value && contractList.value.length > 0) {
  667. let data = contractList.value.filter(
  668. (item) => item.value === ids[i]
  669. );
  670. if (data && data.length > 0) {
  671. if (
  672. formData.data.payDetailList &&
  673. formData.data.payDetailList.length > 0
  674. ) {
  675. formData.data.payDetailList.push({
  676. purchaseId: ids[i],
  677. money: undefined,
  678. remark: "",
  679. });
  680. } else {
  681. formData.data.payDetailList = [
  682. { purchaseId: ids[i], money: undefined, remark: "" },
  683. ];
  684. }
  685. }
  686. }
  687. }
  688. if (
  689. formData.data.payDetailList &&
  690. formData.data.payDetailList.length > 0
  691. ) {
  692. for (let i = 0; i < formData.data.payDetailList.length; i++) {
  693. changePurchaseId(formData.data.payDetailList[i]);
  694. }
  695. getDecisionAids();
  696. }
  697. }
  698. }
  699. }
  700. });
  701. // 判断当前用户有无销售合同页面权限
  702. const isHave = ref(false);
  703. if (
  704. useUserStore().permissions &&
  705. useUserStore().permissions.includes("contract")
  706. ) {
  707. isHave.value = true;
  708. }
  709. // 判断当前用户有无采购合同页面权限
  710. const isHavePurchase = ref(false);
  711. if (
  712. useUserStore().permissions &&
  713. useUserStore().permissions.includes("alreadyPurchase")
  714. ) {
  715. isHavePurchase.value = true;
  716. }
  717. const getFormData = () => {
  718. return proxy.deepClone(formData.data);
  719. };
  720. // 向父组件暴露
  721. defineExpose({
  722. getFormData,
  723. handleSubmit,
  724. });
  725. let auxiliaryData = ref([
  726. {
  727. label: "关联销售合同",
  728. data: [],
  729. },
  730. {
  731. label: "到货数据",
  732. data: [],
  733. },
  734. {
  735. label: "质检数据",
  736. data: [],
  737. },
  738. ]);
  739. const emit = defineEmits(["auxiliaryChange"]);
  740. const getDecisionAids = () => {
  741. let data = {
  742. purchaseIdList: [],
  743. };
  744. if (formData.data.payDetailList && formData.data.payDetailList.length > 0) {
  745. data.purchaseIdList = formData.data.payDetailList.map(
  746. (item) => item.purchaseId
  747. );
  748. }
  749. proxy.post("/contract/payDecisionAid", data).then((res) => {
  750. if (res.contractList && res.contractList.length > 0) {
  751. auxiliaryData.value[0].data = res.contractList.map((item) => {
  752. return [
  753. {
  754. label: "合同编号",
  755. value: item.code,
  756. style: {
  757. color: "#0084FF",
  758. cursor: isHave.value ? "pointer" : "revert",
  759. },
  760. fn: isHave.value ? handlePushRoute : () => {},
  761. id: item.id,
  762. num: 1,
  763. },
  764. {
  765. label: "下单日期",
  766. value: item.createTime,
  767. id: item.id,
  768. num: 1,
  769. },
  770. ];
  771. });
  772. } else {
  773. auxiliaryData.value[0].data = [];
  774. }
  775. if (res.purchaseInfoList && res.purchaseInfoList.length > 0) {
  776. auxiliaryData.value[1].data = res.purchaseInfoList.map((item) => {
  777. return [
  778. {
  779. label: "合同编号",
  780. value: item.purchaseCode,
  781. style: {
  782. color: "#0084FF",
  783. cursor: isHavePurchase.value ? "pointer" : "revert",
  784. },
  785. fn: isHavePurchase.value ? handlePushRouteOne : () => {},
  786. id: item.purchaseId,
  787. num: 1,
  788. },
  789. {
  790. label: "物品编码",
  791. value: item.productCode,
  792. id: item.productId,
  793. num: 1,
  794. },
  795. {
  796. label: "物品名称",
  797. value: item.productName,
  798. id: item.productId,
  799. num: 1,
  800. },
  801. {
  802. label: "采购数量",
  803. value: item.purchaseQuantity,
  804. id: item.productId,
  805. num: 1,
  806. },
  807. {
  808. label: "到货数量",
  809. value: item.invoiceQuantity,
  810. id: item.productId,
  811. num: 1,
  812. },
  813. ];
  814. });
  815. auxiliaryData.value[2].data = res.purchaseInfoList.map((item) => {
  816. let odds = 0;
  817. if (item.invoiceQuantity && item.qualifiedCount) {
  818. odds = parseFloat(
  819. (Number(item.qualifiedCount) / Number(item.invoiceQuantity)) * 100
  820. ).toFixed(2);
  821. }
  822. return [
  823. {
  824. label: "合同编号",
  825. value: item.purchaseCode,
  826. style: {
  827. color: "#0084FF",
  828. cursor: isHavePurchase.value ? "pointer" : "revert",
  829. },
  830. fn: isHavePurchase.value ? handlePushRouteOne : () => {},
  831. id: item.purchaseId,
  832. num: 1,
  833. },
  834. {
  835. label: "物品编码",
  836. value: item.productCode,
  837. id: item.productId,
  838. num: 1,
  839. },
  840. {
  841. label: "物品名称",
  842. value: item.productName,
  843. id: item.productId,
  844. num: 1,
  845. },
  846. {
  847. label: "到货数量",
  848. value: item.invoiceQuantity,
  849. id: item.productId,
  850. num: 1,
  851. },
  852. {
  853. label: "合格率",
  854. value: odds + "%",
  855. id: item.productId,
  856. num: 1,
  857. },
  858. ];
  859. });
  860. } else {
  861. auxiliaryData.value[1].data = [];
  862. auxiliaryData.value[2].data = [];
  863. }
  864. let list = proxy.deepClone(auxiliaryData.value);
  865. if (!(list[0].data && list[0].data.length > 0)) {
  866. list.splice(0, 1);
  867. }
  868. emit("auxiliaryChange", list);
  869. });
  870. };
  871. const handlePushRoute = (row) => {
  872. proxy.$router.push({
  873. name: "Contract",
  874. query: {
  875. code: row.value,
  876. },
  877. });
  878. };
  879. const handlePushRouteOne = (row) => {
  880. proxy.$router.push({
  881. name: "AlreadyPurchase",
  882. query: {
  883. code: row.value,
  884. },
  885. });
  886. };
  887. </script>
  888. <style lang="scss" scoped>
  889. ::v-deep(.el-input-number .el-input__inner) {
  890. text-align: left;
  891. }
  892. </style>