form.vue 29 KB

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