form.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. <template>
  2. <!-- 添加或修改项目信息对话框 -->
  3. <div class="el-drawer__wrapper">
  4. <el-drawer :title="title" v-model="visible" direction="rtl" size="100%">
  5. <div class="page-container form-container">
  6. <div class="form-btns-container">
  7. <span class="title-label"
  8. ><el-icon>
  9. <Document />
  10. </el-icon>
  11. 付款信息</span
  12. >
  13. <el-button
  14. v-if="editStatus"
  15. type="primary"
  16. size="small"
  17. icon="Finished"
  18. @click="submitForm"
  19. >保存</el-button
  20. >
  21. <el-button
  22. v-show="!editStatus && form.verifyDate == null"
  23. type="warning"
  24. size="small"
  25. icon="Edit"
  26. v-hasPermi="['business:collection:edit']"
  27. @click="editStatus = true"
  28. >修改</el-button
  29. >
  30. <el-button
  31. v-if="form.id && editStatus"
  32. type="info"
  33. size="small"
  34. icon="Close"
  35. @click="editStatus = false"
  36. >取消修改</el-button
  37. >
  38. <!-- <el-button v-if="form.id" type="success" size="small" @click="getForm">
  39. <i class="fa fa-refresh" aria-hidden="true" /> 刷新
  40. </el-button> -->
  41. <!-- <el-button v-if="form.id && !editStatus && form.verifyStatus == 0"
  42. v-hasPermi="['business:archive:order:verify']" type="warning" size="small"
  43. @click="verifyHandler">审核通过</el-button>
  44. <el-button v-if="form.id && !editStatus && form.verifyStatus == 0"
  45. v-hasPermi="['business:archive:order:verify']" type="danger" size="small"
  46. @click="rejectHandler">驳回</el-button> -->
  47. <el-button
  48. v-show="form.id && !editStatus && form.verifyDate == null"
  49. v-hasPermi="['business:collection:verify']"
  50. type="primary"
  51. size="small"
  52. icon="Check"
  53. @click="verifyHandler"
  54. >收款审核</el-button
  55. >
  56. <div class="screen-btn" @click="handleScreen">
  57. <template v-if="!isFullscreen">
  58. <i class="fa fa-window-maximize" aria-hidden="true" />
  59. <!-- <span>全屏</span> -->
  60. </template>
  61. <template v-else>
  62. <i class="fa fa-window-restore" aria-hidden="true" />
  63. <!-- <span>还原</span> -->
  64. </template>
  65. </div>
  66. <div class="close-btn" @click="cancel">
  67. <i class="fa fa-times" aria-hidden="true" />
  68. <!-- <span>关闭</span> -->
  69. </div>
  70. </div>
  71. <div
  72. class="Y-scrollbar"
  73. style="
  74. position: absolute;
  75. top: 32px;
  76. bottom: 0;
  77. width: 100%;
  78. overflow: auto;
  79. "
  80. ></div>
  81. <el-form
  82. ref="orderRef"
  83. class="master-container"
  84. size="small"
  85. :model="form"
  86. :rules="rules"
  87. label-width="100px"
  88. >
  89. <el-row :gutter="30">
  90. <el-col :span="6">
  91. <el-form-item label="收款流水号:">
  92. <el-input
  93. v-if="editStatus"
  94. v-model.trim="form.flowNo"
  95. readonly
  96. size="small"
  97. type="text"
  98. placeholder="收款流水号"
  99. :clearable="true"
  100. />
  101. <span v-else>{{ form.flowNo }}</span>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="6">
  105. <el-form-item label="收款账户:" prop="subsidiaryName">
  106. <el-autocomplete
  107. v-if="editStatus"
  108. :fetch-suggestions="querySearchAccountAsync"
  109. :trigger-on-focus="true"
  110. v-model="form.subsidiaryName"
  111. placeholder="请输入收款账户"
  112. style="width: 100%"
  113. popper-class="my-autocomplete"
  114. @select="handleSelectAccount"
  115. >
  116. <template #default="{ item }">
  117. <div
  118. style="
  119. display: flex;
  120. flex-direction: row;
  121. justify-content: space-between;
  122. "
  123. >
  124. <div class="name" style="font-size: 12px">
  125. {{ item.name }}
  126. </div>
  127. <span
  128. class="code"
  129. style="font-size: 10px; color: darkgrey"
  130. >{{ item.code }}</span
  131. >
  132. </div>
  133. </template>
  134. </el-autocomplete>
  135. <span v-else>{{ form.subsidiaryName }}</span>
  136. </el-form-item>
  137. </el-col>
  138. <el-col :span="6">
  139. <el-form-item label="收款开户行:" prop="subsidiaryBankName">
  140. <el-input
  141. v-if="editStatus"
  142. v-model.trim="form.subsidiaryBankName"
  143. size="small"
  144. type="text"
  145. placeholder="开户行"
  146. :clearable="true"
  147. :readonly="true"
  148. />
  149. <span v-else>{{ form.subsidiaryBankName }}</span>
  150. </el-form-item>
  151. </el-col>
  152. <el-col :span="6">
  153. <el-form-item label="收款账号:" prop="subsidiaryBankAccount">
  154. <el-input
  155. v-if="editStatus"
  156. v-model.trim="form.subsidiaryBankAccount"
  157. size="small"
  158. type="text"
  159. placeholder="账号"
  160. :clearable="true"
  161. :readonly="true"
  162. />
  163. <span v-else>{{ form.subsidiaryBankAccount }}</span>
  164. </el-form-item>
  165. </el-col>
  166. <el-col :span="6">
  167. <el-form-item label="付款名称:" prop="applyName">
  168. <el-input
  169. v-if="editStatus"
  170. v-model.trim="form.applyName"
  171. size="small"
  172. type="text"
  173. placeholder="付款名称"
  174. :clearable="true"
  175. />
  176. <span v-else>{{ form.applyName }}</span>
  177. </el-form-item>
  178. </el-col>
  179. <el-col :span="6">
  180. <el-form-item label="付款账号:" prop="appyAccount">
  181. <el-input
  182. v-if="editStatus"
  183. v-model.trim="form.appyAccount"
  184. size="small"
  185. type="text"
  186. placeholder="付款账号"
  187. :clearable="true"
  188. />
  189. <span v-else>{{ form.appyAccount }}</span>
  190. </el-form-item>
  191. </el-col>
  192. <el-col :span="6">
  193. <el-form-item label="到账日期:" prop="arriveDate">
  194. <el-date-picker
  195. v-if="editStatus"
  196. v-model.trim="form.arriveDate"
  197. size="small"
  198. :clearable="true"
  199. style="width: 100%"
  200. format="YYYY-MM-DD"
  201. value-format="YYYY-MM-DD HH:mm:ss"
  202. align="center"
  203. type="date"
  204. placeholder="到账日期"
  205. />
  206. <span v-else>{{ form.arriveDate }}</span>
  207. </el-form-item>
  208. </el-col>
  209. <el-col :span="6">
  210. <el-form-item label="到账时间:" prop="arriveTime">
  211. <el-time-select
  212. v-if="editStatus"
  213. style="width: 100%"
  214. v-model.trim="form.arriveTime"
  215. :picker-options="timeOptions"
  216. placeholder="选择时间"
  217. />
  218. <span v-else>{{ form.arriveTime }}</span>
  219. </el-form-item>
  220. </el-col>
  221. <el-col :span="6">
  222. <el-form-item label="客户名称:" prop="companyName">
  223. <span>{{ form.companyName }}</span>
  224. </el-form-item>
  225. </el-col>
  226. <el-col :span="6">
  227. <el-form-item label="合同编号:" prop="remark">
  228. <span>{{ form.contractNo }}</span>
  229. </el-form-item>
  230. </el-col>
  231. <el-col :span="6">
  232. <el-form-item label="应收款金额:" prop="remark">
  233. <span>{{ rowNum(form.contractAmount) }}</span>
  234. </el-form-item>
  235. </el-col>
  236. <el-col :span="6">
  237. <el-form-item label="未收款金额:" prop="remark">
  238. <span>{{ rowNum(form.nonpaymentAmount) }}</span>
  239. </el-form-item>
  240. </el-col>
  241. <el-col :span="6">
  242. <el-form-item label="收款金额:" required>
  243. <el-input-number
  244. v-if="editStatus"
  245. v-model.trim="form.arriveAmount"
  246. size="small"
  247. placeholder="收款金额"
  248. :clearable="true"
  249. :precision="2"
  250. controls-position="right"
  251. :controls="false"
  252. @change="amountChange"
  253. />
  254. <span>{{ rowNum(form.arriveAmount) }}</span>
  255. </el-form-item>
  256. </el-col>
  257. <el-col v-if="form.status === 1" :span="6">
  258. <el-form-item label="审核意见:" required>
  259. <span>{{ form.verifyComment }}</span>
  260. </el-form-item>
  261. </el-col>
  262. <el-col v-if="form.status === 2" :span="6">
  263. <el-form-item label="驳回原因:" required>
  264. <span>{{ form.verifyComment }}</span>
  265. </el-form-item>
  266. </el-col>
  267. <el-col :span="12">
  268. <el-form-item label="备注:">
  269. <el-input
  270. v-if="editStatus"
  271. v-model.trim="form.remark"
  272. size="small"
  273. type="text"
  274. placeholder="备注"
  275. :clearable="true"
  276. />
  277. <span v-else style="word-break: break-all">{{
  278. form.remark
  279. }}</span>
  280. </el-form-item>
  281. </el-col>
  282. </el-row>
  283. </el-form>
  284. <div class="details-container">
  285. <el-row :gutter="2" style="height: 100%">
  286. <el-col :span="18">
  287. <div class="details-head">
  288. <div class="title">
  289. <i class="fa fa-th-list" aria-hidden="true" /> 收款明细
  290. </div>
  291. </div>
  292. <div class="details-body">
  293. <el-table
  294. ref="filesTable"
  295. :data="form.details"
  296. size="small"
  297. height="100%"
  298. border
  299. header-row-class-name="list-header-row"
  300. highlight-current-row
  301. >
  302. <el-table-column
  303. type="index"
  304. label="序号"
  305. width="47"
  306. align="center"
  307. />
  308. <el-table-column
  309. label="任务名称"
  310. prop="taskTypeName"
  311. align="center"
  312. show-overflow-tooltip
  313. >
  314. </el-table-column>
  315. <el-table-column
  316. label="任务金额"
  317. prop="amount"
  318. width="100"
  319. header-align="center"
  320. align="right"
  321. >
  322. <template #default="scope">
  323. <span>{{ rowNum(scope.row.amount) }}</span>
  324. </template>
  325. </el-table-column>
  326. <el-table-column
  327. label="本次付款金额"
  328. prop="arriveAmount"
  329. width="100"
  330. header-align="center"
  331. align="right"
  332. >
  333. <template #default="scope">
  334. <template v-if="editStatus">
  335. <el-input-number
  336. v-model="scope.row.arriveAmount"
  337. size="small"
  338. placeholder="本次付款金额"
  339. :precision="2"
  340. :controls="false"
  341. style="width: 100%"
  342. @change="
  343. (arg) =>
  344. amountChangeHandler(
  345. arg,
  346. scope.row,
  347. 'arriveAmount'
  348. )
  349. "
  350. />
  351. </template>
  352. <template v-else>{{ rowNum(scope.row.amount) }}</template>
  353. </template>
  354. </el-table-column>
  355. <el-table-column
  356. label="已付款金额"
  357. prop="arrived"
  358. width="100"
  359. align="right"
  360. header-align="center"
  361. >
  362. <template #default="scope">
  363. <span>{{ rowNum(scope.row.amount) }}</span>
  364. </template>
  365. </el-table-column>
  366. </el-table>
  367. </div>
  368. </el-col>
  369. <el-col :span="6">
  370. <div class="details-head">
  371. <div class="title">
  372. <i class="fa fa-th-list" aria-hidden="true" /> 附件
  373. <span style="color: red"><i style="color: red" /> *</span>
  374. </div>
  375. <el-upload
  376. v-if="editStatus"
  377. action="#"
  378. :http-request="upload"
  379. :with-credentials="true"
  380. :show-file-list="false"
  381. multiple
  382. >
  383. <el-button size="small" type="primary" icon="Upload"
  384. >点击上传</el-button
  385. >
  386. </el-upload>
  387. </div>
  388. <div class="details-body">
  389. <el-table
  390. ref="filesTable"
  391. :data="form.files"
  392. size="small"
  393. height="100%"
  394. border
  395. header-row-class-name="list-header-row"
  396. highlight-current-row
  397. >
  398. <el-table-column
  399. type="index"
  400. label="序号"
  401. width="47"
  402. align="center"
  403. />
  404. <el-table-column
  405. label="文件名"
  406. prop="originalFileName"
  407. align="center"
  408. min-width="200"
  409. show-overflow-tooltip
  410. >
  411. <template #default="scope">
  412. <el-button
  413. size="small"
  414. type="primary"
  415. link
  416. @click="openFile(scope.row)"
  417. >{{ scope.row.originalFileName }}</el-button
  418. >
  419. </template>
  420. </el-table-column>
  421. <el-table-column label="操作" min-width="60" align="center">
  422. <template #default="scope">
  423. <div v-if="editStatus">
  424. <el-button
  425. size="small"
  426. link
  427. type="danger"
  428. @click="handlerDelAttach(scope.row, scope.$index)"
  429. >删除</el-button
  430. >
  431. </div>
  432. </template>
  433. </el-table-column>
  434. </el-table>
  435. </div>
  436. </el-col>
  437. </el-row>
  438. </div>
  439. </div>
  440. </el-drawer>
  441. <el-dialog
  442. title="审核详情"
  443. v-model="rejectOpen"
  444. width="500px"
  445. append-to-body
  446. draggable
  447. >
  448. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  449. <el-form-item label="审核状态">
  450. <el-select
  451. v-model.trim="form.status"
  452. placeholder="请选择"
  453. size="small"
  454. >
  455. <el-option
  456. v-for="i in verified"
  457. :key="i.value"
  458. :label="i.label"
  459. :value="i.value"
  460. />
  461. </el-select>
  462. </el-form-item>
  463. <el-form-item label="实际付款时间" required>
  464. <el-date-picker
  465. v-model.trim="form.actuallyDate"
  466. size="small"
  467. :clearable="true"
  468. format="YYYY-MM-DD HH:mm:ss"
  469. value-format="YYYY-MM-DD HH:mm:ss"
  470. align="center"
  471. type="datetime"
  472. placeholder="实际付款时间"
  473. />
  474. </el-form-item>
  475. <el-form-item
  476. :label="form.status == 2 ? '驳回原因' : '审核意见'"
  477. :prop="verifyComment"
  478. >
  479. <el-input
  480. type="textarea"
  481. maxlength="200"
  482. show-word-limit
  483. v-model.trim="form.verifyComment"
  484. :rows="3"
  485. placeholder="请输入审核意见"
  486. />
  487. </el-form-item>
  488. </el-form>
  489. <template #footer>
  490. <div class="dialog-footer">
  491. <el-button
  492. type="primary"
  493. icon="Finished"
  494. size="small"
  495. @click="verifyUpload()"
  496. >确 定</el-button
  497. >
  498. <el-button icon="Close" size="small" @click="rejectCancel"
  499. >取 消</el-button
  500. >
  501. </div>
  502. </template>
  503. </el-dialog>
  504. </div>
  505. </template>
  506. <script setup>
  507. import { uploadFile } from "@/api/tool/file";
  508. // import {
  509. // getOrder,
  510. // initTaskTypes,
  511. // addOrder,
  512. // updateOrder,
  513. // verifyOrder,
  514. // alterOrder,
  515. // dissolutionOrder,
  516. // } from "@/api/business/crm/contract";
  517. import {
  518. listContract,
  519. listAccount,
  520. getCollection,
  521. getCollectionByContract,
  522. saveCollection,
  523. verifyCollection,
  524. } from "@/api/business/financial/collection";
  525. import { listSource } from "@/api/settings/source";
  526. import { listCompany } from "@/api/business/crm/company";
  527. import { listUser } from "@/api/system/user";
  528. import CustomerFormCom from "@/components/CustomerFormCom";
  529. import { formatDate } from "@/utils/index";
  530. import { ref } from "vue";
  531. import useUserStore from "@/store/modules/user";
  532. const { proxy } = getCurrentInstance();
  533. const baseUrl = import.meta.env.VITE_APP_BASE_API;
  534. /** 父组件传参 */
  535. const props = defineProps({
  536. getList: {
  537. type: Function,
  538. default: () => {},
  539. },
  540. });
  541. const { getList } = toRefs(props);
  542. /** 字典数组区 */
  543. const { virtual_address } = proxy.useDict("virtual_address");
  544. /** 表单抽屉 页变量 */
  545. const title = ref("");
  546. const loading = ref(false);
  547. const multiple = ref(true);
  548. const visible = ref(false);
  549. const editStatus = ref(false);
  550. const sourceCategories = ref([]);
  551. const type = ref("");
  552. const rejectOpen = ref(false);
  553. const detailEmpty = {
  554. id: null,
  555. taskTypeName: "",
  556. taskTypeId: null,
  557. serviceNum: undefined,
  558. freeNum: undefined,
  559. price: undefined,
  560. amount: undefined,
  561. addressStyle: undefined,
  562. address: undefined,
  563. fictionAddressId: undefined,
  564. tenantId: undefined,
  565. province: "",
  566. city: "",
  567. district: "",
  568. addressStyle: 1,
  569. provinceId: undefined,
  570. processes: [],
  571. defaultProcesses: [],
  572. };
  573. const provinces = ref(proxy.region.getProvinces());
  574. provinces.value.unshift({ code: "", name: "全部" });
  575. const cities = ref([]);
  576. const districts = ref([]);
  577. const contractEmpty = {
  578. serviceType: 1,
  579. contractType: 0,
  580. formDate: formatDate(new Date(), "YYYY-MM-DD"),
  581. signerId: useUserStore().user.userId,
  582. signerName: useUserStore().user.nickName,
  583. files: [],
  584. };
  585. const isFullscreen = ref(false);
  586. const webHost = import.meta.env.VITE_APP_BASE_API;
  587. const data = reactive({
  588. form: {},
  589. rules: {},
  590. timeOptions: { start: "08:30", step: "00:15", end: "18:30" },
  591. verified: [
  592. {
  593. value: 0,
  594. label: "未审核",
  595. },
  596. {
  597. value: 1,
  598. label: "通过",
  599. },
  600. {
  601. value: 2,
  602. label: "不通过",
  603. },
  604. ],
  605. });
  606. const { form, rules, timeOptions, verified } = toRefs(data);
  607. /*********************** 方法区 ****************************/
  608. /** 打开抽屉 */
  609. function open(id) {
  610. reset();
  611. visible.value = true;
  612. editStatus.value = true;
  613. // console.log(virtual_address.value)
  614. getCollection(id).then((res) => {
  615. form.value = res.data;
  616. editStatus.value = false;
  617. // editStatus.value = true
  618. });
  619. }
  620. /** 取消按钮 */
  621. function cancel() {
  622. visible.value = false;
  623. reset();
  624. }
  625. // 数字格式化
  626. function rowNum(num) {
  627. if (!num) {
  628. return;
  629. }
  630. num = num.toLocaleString(); // 3,000
  631. if (num.indexOf(".") == -1) {
  632. num = num + ".00"; //3,000.00
  633. } else if (num.charAt(num.indexOf(".") == num.length - 2)) {
  634. num = num + "0";
  635. }
  636. return num;
  637. }
  638. /** 表单重置 */
  639. function reset() {
  640. form.value = JSON.parse(JSON.stringify(contractEmpty));
  641. console.log("重置表单", form.value);
  642. type.value = "";
  643. // console.log(form)
  644. // proxy.resetForm("orderRef");
  645. }
  646. /** 全屏缩放 */
  647. function handleScreen() {
  648. const dom = document.querySelector(
  649. ".list-container > .el-drawer__wrapper > .el-overlay"
  650. );
  651. isFullscreen.value = !isFullscreen.value;
  652. dom.style.position = isFullscreen.value ? "fixed" : "absolute";
  653. }
  654. /** 提交按钮 */
  655. function submitForm() {
  656. proxy.$refs["orderRef"].validate((valid) => {
  657. if (valid && detailValid()) {
  658. const formValue = form.value;
  659. saveCollection(formValue).then((res) => {
  660. open(form.value.id);
  661. getList.value();
  662. });
  663. }
  664. });
  665. }
  666. function detailValid() {
  667. // 20240109 暂时附件非必填。
  668. // if (form.value.files.length === 0) {
  669. // proxy.$modal.msgError("收款附件为空");
  670. // return false;
  671. // }
  672. return true;
  673. }
  674. /** 查询表单信息 */
  675. function getForm() {
  676. loading.value = true;
  677. getOrder(form.value.id).then((response) => {
  678. loading.value = false;
  679. form.value = response.data;
  680. });
  681. }
  682. function handleServiceTypeClick(tab) {
  683. computedService();
  684. }
  685. function verifyHandler() {
  686. // proxy.$modal
  687. // .confirm("是否确认审核?")
  688. // .then((_) => {
  689. // verifyUpload(1);
  690. // })
  691. // .catch((_) => {
  692. // proxy.$modal.msg("取消审核");
  693. // });
  694. rejectOpen.value = true;
  695. }
  696. function rejectHandler() {
  697. rejectOpen.value = true;
  698. }
  699. function rejectCancel() {
  700. rejectOpen.value = false;
  701. rejectReset();
  702. }
  703. function rejectReset() {}
  704. function rejectSubmitHandler() {
  705. if (form.value.verifyRemark === "" || form.value.verifyRemark == null) {
  706. proxy.$modal.msgError("请填写驳回原因");
  707. return;
  708. }
  709. }
  710. function verifyUpload() {
  711. // const formValue = proxy.deepClone(form.value);
  712. // formValue.verifyStatus = status;
  713. // formValue.status = status;
  714. if (form.value.status === 0) {
  715. proxy.$modal.msgError("请选择审核结果");
  716. return;
  717. }
  718. if (form.value.actuallyDate == null || form.value.actuallyDate === "") {
  719. proxy.$modal.msgError("请输入实际付款时间");
  720. return;
  721. }
  722. if (
  723. form.value.status === 2 &&
  724. (form.value.verifyComment == null || form.value.verifyComment === "")
  725. ) {
  726. proxy.$modal.msgError("请输入审核意见");
  727. return;
  728. }
  729. form.value.arriveStatus = form.value.status === 1 ? 1 : 0;
  730. verifyCollection(form.value).then((res) => {
  731. open(form.value.id);
  732. getList.value();
  733. rejectCancel();
  734. proxy.$modal.mseSuccess("保存成功");
  735. });
  736. }
  737. /** 文件上传 */
  738. function upload(param) {
  739. const fileForm = new FormData();
  740. fileForm.append("file", param.file);
  741. uploadFile(fileForm).then((res) => {
  742. if (res.code === 200) {
  743. const file = {};
  744. file.fileName = res.newFileName;
  745. file.url = res.url;
  746. file.originalFileName = res.originalFilename;
  747. file.fileUrl = res.fileName;
  748. form.value.files.push(file);
  749. }
  750. });
  751. }
  752. function handleDelFile(index) {
  753. form.value.files.splice(index, 1);
  754. }
  755. function amountChangeHandler(arg, row, field) {
  756. computeTotalAmount();
  757. }
  758. function computeTotalAmount() {
  759. let amount = 0;
  760. for (let index = 0; index < form.value.details.length; index++) {
  761. const element = form.value.details[index];
  762. amount += element.arriveAmount == null ? 0 : element.arriveAmount;
  763. }
  764. form.value.arriveAmount = amount;
  765. }
  766. function amountChange() {
  767. let amount = 0;
  768. if (form.value.details.length > 0) {
  769. for (let i = 0; i < form.value.details.length; i++) {
  770. amount = amount + form.value.details[i].arriveAmount;
  771. }
  772. // 判断到款状态
  773. form.value.arriveAmount = amount;
  774. if (form.value.arriveAmount > 0)
  775. form.value.arriveStatus =
  776. form.value.arriveAmount === form.value.amount ? 1 : 2;
  777. else form.value.arriveStatus = 0;
  778. }
  779. }
  780. function querySearchAccountAsync(queryString, cb) {
  781. const query =
  782. queryString.length > 0
  783. ? { keyword: queryString, pageSize: 20, pageNum: 1 }
  784. : { pageSize: 20, pageNum: 1 };
  785. listAccount(query).then((res) => {
  786. cb(res.rows);
  787. });
  788. }
  789. function handleSelectAccount(item) {
  790. form.value.subsidiaryName = item.name;
  791. form.value.subsidiaryBankName = item.accountOpen;
  792. form.value.subsidiaryBankAccount = item.accountNum;
  793. }
  794. function openFile(row) {
  795. window.open(`${baseUrl}${row.fileUrl}`);
  796. }
  797. function handlerDelAttach(row, index) {
  798. proxy.$modal
  799. .confirm("确认删除该项么?")
  800. .then((_) => {
  801. form.value.files.splice(index, 1);
  802. })
  803. .catch((err) => {
  804. proxy.$modal.msgError("取消删除");
  805. });
  806. }
  807. /** 暴露给父组件的方法 */
  808. defineExpose({
  809. open,
  810. });
  811. </script>