form.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  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>{{
  353. rowNum(scope.row.arriveAmount)
  354. }}</template>
  355. </template>
  356. </el-table-column>
  357. <el-table-column
  358. label="已付款金额"
  359. prop="arrived"
  360. width="100"
  361. align="right"
  362. header-align="center"
  363. >
  364. <template #default="scope">
  365. <span>{{ rowNum(scope.row.arrived) }}</span>
  366. </template>
  367. </el-table-column>
  368. </el-table>
  369. </div>
  370. </el-col>
  371. <el-col :span="6">
  372. <div class="details-head">
  373. <div class="title">
  374. <i class="fa fa-th-list" aria-hidden="true" /> 附件
  375. <span style="color: red"><i style="color: red" /> *</span>
  376. </div>
  377. <el-upload
  378. v-if="editStatus"
  379. action="#"
  380. :http-request="upload"
  381. :with-credentials="true"
  382. :show-file-list="false"
  383. multiple
  384. >
  385. <el-button size="small" type="primary" icon="Upload"
  386. >点击上传</el-button
  387. >
  388. </el-upload>
  389. </div>
  390. <div class="details-body">
  391. <el-table
  392. ref="filesTable"
  393. :data="form.files"
  394. size="small"
  395. height="100%"
  396. border
  397. header-row-class-name="list-header-row"
  398. highlight-current-row
  399. >
  400. <el-table-column
  401. type="index"
  402. label="序号"
  403. width="47"
  404. align="center"
  405. />
  406. <el-table-column
  407. label="文件名"
  408. prop="originalFileName"
  409. align="center"
  410. min-width="200"
  411. show-overflow-tooltip
  412. >
  413. <template #default="scope">
  414. <el-button
  415. size="small"
  416. type="primary"
  417. link
  418. @click="openFile(scope.row)"
  419. >{{ scope.row.originalFileName }}</el-button
  420. >
  421. </template>
  422. </el-table-column>
  423. <el-table-column label="操作" min-width="60" align="center">
  424. <template #default="scope">
  425. <div v-if="editStatus">
  426. <el-button
  427. size="small"
  428. link
  429. type="danger"
  430. @click="handlerDelAttach(scope.row, scope.$index)"
  431. >删除</el-button
  432. >
  433. </div>
  434. </template>
  435. </el-table-column>
  436. </el-table>
  437. </div>
  438. </el-col>
  439. </el-row>
  440. </div>
  441. </div>
  442. </el-drawer>
  443. <el-dialog
  444. title="审核详情"
  445. v-model="rejectOpen"
  446. width="500px"
  447. append-to-body
  448. draggable
  449. >
  450. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  451. <el-form-item label="审核状态">
  452. <el-select
  453. v-model.trim="form.status"
  454. placeholder="请选择"
  455. size="small"
  456. >
  457. <el-option
  458. v-for="i in verified"
  459. :key="i.value"
  460. :label="i.label"
  461. :value="i.value"
  462. />
  463. </el-select>
  464. </el-form-item>
  465. <el-form-item label="实际付款时间" required>
  466. <el-date-picker
  467. v-model.trim="form.actuallyDate"
  468. size="small"
  469. :clearable="true"
  470. format="YYYY-MM-DD HH:mm:ss"
  471. value-format="YYYY-MM-DD HH:mm:ss"
  472. align="center"
  473. type="datetime"
  474. placeholder="实际付款时间"
  475. />
  476. </el-form-item>
  477. <el-form-item
  478. :label="form.status == 2 ? '驳回原因' : '审核意见'"
  479. :prop="verifyComment"
  480. >
  481. <el-input
  482. type="textarea"
  483. maxlength="200"
  484. show-word-limit
  485. v-model.trim="form.verifyComment"
  486. :rows="3"
  487. placeholder="请输入审核意见"
  488. />
  489. </el-form-item>
  490. </el-form>
  491. <template #footer>
  492. <div class="dialog-footer">
  493. <el-button
  494. type="primary"
  495. icon="Finished"
  496. size="small"
  497. @click="verifyUpload()"
  498. >确 定</el-button
  499. >
  500. <el-button icon="Close" size="small" @click="rejectCancel"
  501. >取 消</el-button
  502. >
  503. </div>
  504. </template>
  505. </el-dialog>
  506. </div>
  507. </template>
  508. <script setup>
  509. import { uploadFile } from "@/api/tool/file";
  510. // import {
  511. // getOrder,
  512. // initTaskTypes,
  513. // addOrder,
  514. // updateOrder,
  515. // verifyOrder,
  516. // alterOrder,
  517. // dissolutionOrder,
  518. // } from "@/api/business/crm/contract";
  519. import {
  520. listContract,
  521. listAccount,
  522. getCollection,
  523. getCollectionByContract,
  524. saveCollection,
  525. verifyCollection,
  526. } from "@/api/business/financial/collection";
  527. import { listSource } from "@/api/settings/source";
  528. import { listCompany } from "@/api/business/crm/company";
  529. import { listUser } from "@/api/system/user";
  530. import CustomerFormCom from "@/components/CustomerFormCom";
  531. import { formatDate } from "@/utils/index";
  532. import { ref } from "vue";
  533. import useUserStore from "@/store/modules/user";
  534. const { proxy } = getCurrentInstance();
  535. const baseUrl = import.meta.env.VITE_APP_BASE_API;
  536. /** 父组件传参 */
  537. const props = defineProps({
  538. getList: {
  539. type: Function,
  540. default: () => {},
  541. },
  542. });
  543. const { getList } = toRefs(props);
  544. /** 字典数组区 */
  545. const { virtual_address } = proxy.useDict("virtual_address");
  546. /** 表单抽屉 页变量 */
  547. const title = ref("");
  548. const loading = ref(false);
  549. const multiple = ref(true);
  550. const visible = ref(false);
  551. const editStatus = ref(false);
  552. const sourceCategories = ref([]);
  553. const type = ref("");
  554. const rejectOpen = ref(false);
  555. const detailEmpty = {
  556. id: null,
  557. taskTypeName: "",
  558. taskTypeId: null,
  559. serviceNum: undefined,
  560. freeNum: undefined,
  561. price: undefined,
  562. amount: undefined,
  563. addressStyle: undefined,
  564. address: undefined,
  565. fictionAddressId: undefined,
  566. tenantId: undefined,
  567. province: "",
  568. city: "",
  569. district: "",
  570. addressStyle: 1,
  571. provinceId: undefined,
  572. processes: [],
  573. defaultProcesses: [],
  574. };
  575. const provinces = ref(proxy.region.getProvinces());
  576. provinces.value.unshift({ code: "", name: "全部" });
  577. const cities = ref([]);
  578. const districts = ref([]);
  579. const contractEmpty = {
  580. serviceType: 1,
  581. contractType: 0,
  582. formDate: formatDate(new Date(), "YYYY-MM-DD"),
  583. signerId: useUserStore().user.userId,
  584. signerName: useUserStore().user.nickName,
  585. files: [],
  586. };
  587. const isFullscreen = ref(false);
  588. const webHost = import.meta.env.VITE_APP_BASE_API;
  589. const data = reactive({
  590. form: {},
  591. rules: {},
  592. timeOptions: { start: "08:30", step: "00:15", end: "18:30" },
  593. verified: [
  594. {
  595. value: 0,
  596. label: "未审核",
  597. },
  598. {
  599. value: 1,
  600. label: "通过",
  601. },
  602. {
  603. value: 2,
  604. label: "不通过",
  605. },
  606. ],
  607. });
  608. const { form, rules, timeOptions, verified } = toRefs(data);
  609. /*********************** 方法区 ****************************/
  610. /** 打开抽屉 */
  611. function open(id) {
  612. reset();
  613. visible.value = true;
  614. editStatus.value = true;
  615. // console.log(virtual_address.value)
  616. getCollection(id).then((res) => {
  617. form.value = res.data;
  618. editStatus.value = false;
  619. // editStatus.value = true
  620. });
  621. }
  622. /** 取消按钮 */
  623. function cancel() {
  624. visible.value = false;
  625. reset();
  626. }
  627. // 数字格式化
  628. function rowNum(num) {
  629. if (!num) {
  630. return;
  631. }
  632. num = num.toLocaleString(); // 3,000
  633. if (num.indexOf(".") == -1) {
  634. num = num + ".00"; //3,000.00
  635. } else if (num.charAt(num.indexOf(".") == num.length - 2)) {
  636. num = num + "0";
  637. }
  638. return num;
  639. }
  640. /** 表单重置 */
  641. function reset() {
  642. form.value = JSON.parse(JSON.stringify(contractEmpty));
  643. console.log("重置表单", form.value);
  644. type.value = "";
  645. // console.log(form)
  646. // proxy.resetForm("orderRef");
  647. }
  648. /** 全屏缩放 */
  649. function handleScreen() {
  650. const dom = document.querySelector(
  651. ".list-container > .el-drawer__wrapper > .el-overlay"
  652. );
  653. isFullscreen.value = !isFullscreen.value;
  654. dom.style.position = isFullscreen.value ? "fixed" : "absolute";
  655. }
  656. /** 提交按钮 */
  657. function submitForm() {
  658. proxy.$refs["orderRef"].validate((valid) => {
  659. if (valid && detailValid()) {
  660. const formValue = form.value;
  661. saveCollection(formValue).then((res) => {
  662. open(form.value.id);
  663. getList.value();
  664. });
  665. }
  666. });
  667. }
  668. function detailValid() {
  669. // 20240109 暂时附件非必填。
  670. // if (form.value.files.length === 0) {
  671. // proxy.$modal.msgError("收款附件为空");
  672. // return false;
  673. // }
  674. return true;
  675. }
  676. /** 查询表单信息 */
  677. function getForm() {
  678. loading.value = true;
  679. getOrder(form.value.id).then((response) => {
  680. loading.value = false;
  681. form.value = response.data;
  682. });
  683. }
  684. function handleServiceTypeClick(tab) {
  685. computedService();
  686. }
  687. function verifyHandler() {
  688. // proxy.$modal
  689. // .confirm("是否确认审核?")
  690. // .then((_) => {
  691. // verifyUpload(1);
  692. // })
  693. // .catch((_) => {
  694. // proxy.$modal.msg("取消审核");
  695. // });
  696. rejectOpen.value = true;
  697. }
  698. function rejectHandler() {
  699. rejectOpen.value = true;
  700. }
  701. function rejectCancel() {
  702. rejectOpen.value = false;
  703. rejectReset();
  704. }
  705. function rejectReset() {}
  706. function rejectSubmitHandler() {
  707. if (form.value.verifyRemark === "" || form.value.verifyRemark == null) {
  708. proxy.$modal.msgError("请填写驳回原因");
  709. return;
  710. }
  711. }
  712. function verifyUpload() {
  713. // const formValue = proxy.deepClone(form.value);
  714. // formValue.verifyStatus = status;
  715. // formValue.status = status;
  716. if (form.value.status === 0) {
  717. proxy.$modal.msgError("请选择审核结果");
  718. return;
  719. }
  720. if (form.value.actuallyDate == null || form.value.actuallyDate === "") {
  721. proxy.$modal.msgError("请输入实际付款时间");
  722. return;
  723. }
  724. if (
  725. form.value.status === 2 &&
  726. (form.value.verifyComment == null || form.value.verifyComment === "")
  727. ) {
  728. proxy.$modal.msgError("请输入审核意见");
  729. return;
  730. }
  731. form.value.arriveStatus = form.value.status === 1 ? 1 : 0;
  732. verifyCollection(form.value).then((res) => {
  733. open(form.value.id);
  734. getList.value();
  735. rejectCancel();
  736. proxy.$modal.mseSuccess("保存成功");
  737. });
  738. }
  739. /** 文件上传 */
  740. function upload(param) {
  741. const fileForm = new FormData();
  742. fileForm.append("file", param.file);
  743. uploadFile(fileForm).then((res) => {
  744. if (res.code === 200) {
  745. const file = {};
  746. file.fileName = res.newFileName;
  747. file.url = res.url;
  748. file.originalFileName = res.originalFilename;
  749. file.fileUrl = res.fileName;
  750. form.value.files.push(file);
  751. }
  752. });
  753. }
  754. function handleDelFile(index) {
  755. form.value.files.splice(index, 1);
  756. }
  757. function amountChangeHandler(arg, row, field) {
  758. computeTotalAmount();
  759. }
  760. function computeTotalAmount() {
  761. let amount = 0;
  762. for (let index = 0; index < form.value.details.length; index++) {
  763. const element = form.value.details[index];
  764. amount += element.arriveAmount == null ? 0 : element.arriveAmount;
  765. }
  766. form.value.arriveAmount = amount;
  767. }
  768. function amountChange() {
  769. let amount = 0;
  770. if (form.value.details.length > 0) {
  771. for (let i = 0; i < form.value.details.length; i++) {
  772. amount = amount + form.value.details[i].arriveAmount;
  773. }
  774. // 判断到款状态
  775. form.value.arriveAmount = amount;
  776. if (form.value.arriveAmount > 0)
  777. form.value.arriveStatus =
  778. form.value.arriveAmount === form.value.amount ? 1 : 2;
  779. else form.value.arriveStatus = 0;
  780. }
  781. }
  782. function querySearchAccountAsync(queryString, cb) {
  783. const query =
  784. queryString.length > 0
  785. ? { keyword: queryString, pageSize: 20, pageNum: 1 }
  786. : { pageSize: 20, pageNum: 1 };
  787. listAccount(query).then((res) => {
  788. cb(res.rows);
  789. });
  790. }
  791. function handleSelectAccount(item) {
  792. form.value.subsidiaryName = item.name;
  793. form.value.subsidiaryBankName = item.accountOpen;
  794. form.value.subsidiaryBankAccount = item.accountNum;
  795. }
  796. function openFile(row) {
  797. window.open(`${baseUrl}${row.fileUrl}`);
  798. }
  799. function handlerDelAttach(row, index) {
  800. proxy.$modal
  801. .confirm("确认删除该项么?")
  802. .then((_) => {
  803. form.value.files.splice(index, 1);
  804. })
  805. .catch((err) => {
  806. proxy.$modal.msgError("取消删除");
  807. });
  808. }
  809. /** 暴露给父组件的方法 */
  810. defineExpose({
  811. open,
  812. });
  813. </script>