form.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  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"><el-icon>
  8. <Document />
  9. </el-icon>
  10. 合同信息</span>
  11. <el-button-group>
  12. <el-button v-if="editStatus" type="primary" size="small" icon="Finished" @click="submitForm">保存</el-button>
  13. <el-button v-else-if="form.verifyStatus == 0" type="warning" size="small" icon="Edit"
  14. @click="editStatus = true">修改</el-button>
  15. <el-button v-if="form.id && editStatus" type="info" size="small" icon="Close"
  16. @click="editStatus = false">取消修改</el-button>
  17. <el-button v-if="form.id" type="success" size="small" @click="getForm">
  18. <i class="fa fa-refresh" aria-hidden="true" /> 刷新
  19. </el-button>
  20. <el-button v-show="form.id && !editStatus && form.verifyStatus == 0"
  21. v-hasPermi="['business:archive:order:verify']" type="warning" size="small"
  22. @click="verifyHandler">审核通过</el-button>
  23. <el-button v-show="form.id && !editStatus && form.verifyStatus == 0"
  24. v-hasPermi="['business:archive:order:verify']" type="danger" size="small"
  25. @click="rejectHandler">驳回</el-button>
  26. </el-button-group>
  27. <div class="screen-btn" @click="handleScreen">
  28. <template v-if="!isFullscreen">
  29. <i class="fa fa-window-maximize" aria-hidden="true" />
  30. <!-- <span>全屏</span> -->
  31. </template>
  32. <template v-else>
  33. <i class="fa fa-window-restore" aria-hidden="true" />
  34. <!-- <span>还原</span> -->
  35. </template>
  36. </div>
  37. <div class="close-btn" @click="cancel">
  38. <i class="fa fa-times" aria-hidden="true" />
  39. <!-- <span>关闭</span> -->
  40. </div>
  41. </div>
  42. <div class="Y-scrollbar" style="
  43. position: absolute;
  44. top: 32px;
  45. bottom: 0;
  46. width: 100%;
  47. overflow: auto;
  48. "></div>
  49. <el-form ref="orderRef" class="master-container" size="small" :model="form" :rules="rules" label-width="100px">
  50. <el-row :gutter="30">
  51. <el-col :span="6">
  52. <el-form-item label="收款流水号:">
  53. <el-input v-if="editStatus" style="width: 100%" v-model.trim="form.flowNo" readonly size="small"
  54. type="text" placeholder="收款流水号" :clearable="true" />
  55. <span v-else>{{ form.flowNo }}</span>
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="6">
  59. <el-form-item label="收款账户:" prop="subsidiaryName">
  60. <el-autocomplete v-if="editStatus" style="width: 100%" :fetch-suggestions="querySearchAccountAsync"
  61. :trigger-on-focus="true" v-model="form.subsidiaryName" placeholder="请输入收款账户"
  62. popper-class="my-autocomplete" @select="handleSelectAccount">
  63. <template #default="{ item }">
  64. <div style="
  65. display: flex;
  66. flex-direction: row;
  67. justify-content: space-between;
  68. ">
  69. <div class="name" style="font-size: 12px">
  70. {{ item.name }}
  71. </div>
  72. <span class="code" style="font-size: 10px; color: darkgrey">{{ item.code }}</span>
  73. </div>
  74. </template>
  75. </el-autocomplete>
  76. <span v-else>{{ form.subsidiaryName }}</span>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="6">
  80. <el-form-item label="收款开户行:" prop="subsidiaryBankName">
  81. <el-input v-if="editStatus" style="width: 100%" v-model.trim="form.subsidiaryBankName" size="small"
  82. type="text" placeholder="开户行" :clearable="true" :readonly="true" />
  83. <span v-else>{{ form.subsidiaryBankName }}</span>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="6">
  87. <el-form-item label="收款账号:" prop="subsidiaryBankAccount">
  88. <el-input v-if="editStatus" style="width: 100%" v-model.trim="form.subsidiaryBankAccount" size="small"
  89. type="text" placeholder="账号" :clearable="true" :readonly="true" />
  90. <span v-else>{{ form.subsidiaryBankAccount }}</span>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="6">
  94. <el-form-item label="付款名称:" prop="applyName">
  95. <el-input v-if="editStatus" style="width: 100%" v-model.trim="form.applyName" size="small" type="text"
  96. placeholder="付款名称" :clearable="true" />
  97. <span v-else>{{ form.applyName }}</span>
  98. </el-form-item>
  99. </el-col>
  100. <el-col :span="6">
  101. <el-form-item label="付款账号:" prop="appyAccount">
  102. <el-input v-if="editStatus" style="width: 100%" v-model.trim="form.appyAccount" size="small" type="text"
  103. placeholder="付款账号" :clearable="true" />
  104. <span v-else>{{ form.appyAccount }}</span>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="6">
  108. <el-form-item label="到账日期:" prop="arriveDate">
  109. <el-date-picker v-if="editStatus" style="width: 100%" v-model.trim="form.arriveDate" size="small"
  110. :clearable="true" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" align="center" type="date"
  111. placeholder="到账日期" />
  112. <span v-else>{{ form.arriveDate }}</span>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="6">
  116. <el-form-item label="到账时间:" prop="arriveTime">
  117. <el-time-select v-if="editStatus" style="width: 100%" v-model.trim="form.arriveTime"
  118. :picker-options="timeOptions" placeholder="选择时间" />
  119. <span v-else>{{ form.arriveTime }}</span>
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="6">
  123. <el-form-item label="客户名称:" prop="companyName">
  124. <span>{{ form.companyName }}</span>
  125. </el-form-item>
  126. </el-col>
  127. <el-col :span="6">
  128. <el-form-item label="合同编号:" prop="remark">
  129. <span>{{ form.contractNo }}</span>
  130. </el-form-item>
  131. </el-col>
  132. <el-col :span="6">
  133. <el-form-item label="应收款金额:" prop="remark">
  134. <span>{{ rowNum(form.contractAmount) }}</span>
  135. </el-form-item>
  136. </el-col>
  137. <el-col :span="6">
  138. <el-form-item label="未收款金额:" prop="remark">
  139. <span>{{ rowNum(form.nonpaymentAmount) }}</span>
  140. </el-form-item>
  141. </el-col>
  142. <el-col :span="6">
  143. <el-form-item label="收款金额:" required>
  144. <el-input-number v-if="editStatus" style="width: 100%" v-model.trim="form.arriveAmount" size="small"
  145. placeholder="收款金额" :clearable="true" :precision="2" controls-position="right" :controls="false"
  146. @change="amountChange" disabled />
  147. <span v-else>{{ form.arriveAmount }}</span>
  148. </el-form-item>
  149. </el-col>
  150. <el-col :span="6">
  151. <el-form-item label="签单类型" prop="isNew">
  152. <el-radio-group v-model="form.isNew" disabled>
  153. <el-radio :label="0">新签</el-radio>
  154. <el-radio :label="1">续签</el-radio>
  155. </el-radio-group>
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="6">
  159. <el-form-item label="是否为项目" prop="isProject">
  160. <el-radio-group v-model="form.isProject">
  161. <el-radio :label="0">项目</el-radio>
  162. <el-radio :label="1">非项目</el-radio>
  163. </el-radio-group>
  164. </el-form-item>
  165. </el-col>
  166. <el-col :span="6">
  167. <el-form-item label="项目编号" prop="projectNo">
  168. <el-input style="width: 100%" v-model.trim="form.projectNo" size="small" placeholder="项目编号"
  169. :clearable="true" />
  170. </el-form-item>
  171. </el-col>
  172. <el-col :span="6">
  173. <el-form-item label="项目名称" prop="projectName">
  174. <el-input style="width: 100%" v-model.trim="form.projectName" size="small" placeholder="项目名称"
  175. :clearable="true" />
  176. </el-form-item>
  177. </el-col>
  178. <el-col :span="6">
  179. <el-form-item label="项目主体名称" prop="projectMainName">
  180. <el-input style="width: 100%" v-model.trim="form.projectMainName" size="small" placeholder="项目主体名称"
  181. :clearable="true" />
  182. </el-form-item>
  183. </el-col>
  184. <el-col :span="12">
  185. <el-form-item label="备注:">
  186. <el-input v-if="editStatus" style="width: 100%" v-model.trim="form.remark" size="small" type="text"
  187. placeholder="备注" :clearable="true" />
  188. <span v-else style="word-break: break-all">{{
  189. form.remark
  190. }}</span>
  191. </el-form-item>
  192. </el-col>
  193. </el-row>
  194. </el-form>
  195. <div class="details-container">
  196. <el-row :gutter="2" style="height: 100%">
  197. <el-col :span="18">
  198. <div class="details-head">
  199. <div class="title">
  200. <i class="fa fa-th-list" aria-hidden="true" /> 收款明细
  201. </div>
  202. </div>
  203. <div class="details-body">
  204. <el-table ref="filesTable" :data="form.details" size="small" height="100%" border
  205. header-row-class-name="list-header-row" highlight-current-row>
  206. <el-table-column type="index" label="序号" width="47" align="center" />
  207. <el-table-column label="任务名称" prop="taskTypeName" align="center" show-overflow-tooltip>
  208. </el-table-column>
  209. <el-table-column label="服务金额" prop="amount" width="150" align="center">
  210. <template #default="scope">
  211. <span>{{ rowNum(scope.row.amount) }}</span>
  212. </template>
  213. </el-table-column>
  214. <el-table-column label="本次付款金额" prop="arriveAmount" width="150" align="center">
  215. <template #default="scope">
  216. <template v-if="editStatus">
  217. <el-input-number v-model="scope.row.arriveAmount" size="small" :min="0.0" placeholder="本次付款金额"
  218. :precision="2" :controls="false" style="width: 100%" @change="
  219. (arg) =>
  220. amountChangeHandler(
  221. arg,
  222. scope.row,
  223. 'arriveAmount'
  224. )
  225. " />
  226. </template>
  227. <template v-else>{{ scope.row.arriveAmount }}</template>
  228. </template>
  229. </el-table-column>
  230. <el-table-column label="已付款金额" prop="arrived" width="150" align="center">
  231. <template #default="scope">
  232. <span>{{ rowNum(scope.row.arrived) }}</span>
  233. </template>
  234. </el-table-column>
  235. <el-table-column label="备注" prop="remark" width="250" align="center">
  236. <template #default="scope">
  237. <template v-if="editStatus">
  238. <el-input v-model="scope.row.remark" placeholder="备注" size="small" />
  239. </template>
  240. <template v-else>{{ scope.row.remark }}</template>
  241. </template>
  242. </el-table-column>
  243. </el-table>
  244. </div>
  245. </el-col>
  246. <el-col :span="6">
  247. <div class="details-head">
  248. <div class="title">
  249. <i class="fa fa-th-list" aria-hidden="true" /> 附件
  250. <i style="color: red">*</i>
  251. </div>
  252. <el-upload v-if="editStatus" action="#" :http-request="upload" :with-credentials="true"
  253. :show-file-list="false" multiple>
  254. <el-button size="small" type="primary" icon="Upload">点击上传</el-button>
  255. </el-upload>
  256. </div>
  257. <div class="details-body">
  258. <el-table ref="filesTable" :data="form.files" size="small" height="100%" border
  259. header-row-class-name="list-header-row" highlight-current-row>
  260. <el-table-column type="index" label="序号" width="47" align="center" />
  261. <el-table-column label="文件名" prop="originalFileName" align="center" show-overflow-tooltip>
  262. <template #default="scope">
  263. <el-button size="small" type="primary" link @click="openFile(scope.row)">{{
  264. scope.row.originalFileName }}</el-button>
  265. </template>
  266. </el-table-column>
  267. <el-table-column label="操作" width="50" align="center">
  268. <template #default="scope">
  269. <div v-if="editStatus">
  270. <el-button size="small" link type="danger"
  271. @click="handlerDelAttach(scope.row, scope.$index)">删除</el-button>
  272. </div>
  273. </template>
  274. </el-table-column>
  275. </el-table>
  276. </div>
  277. </el-col>
  278. </el-row>
  279. <span style="font-size: 14px; margin-top: 10px;">申请人:{{ form.applierName }}</span> <br />
  280. <span style="font-size: 14px;">制单时间:{{ form.createTime }}</span> <br />
  281. </div>
  282. </div>
  283. </el-drawer>
  284. <el-dialog title="驳回详情" v-model="rejectOpen" width="500px" append-to-body draggable>
  285. <el-form ref="dictRef" :model="form" label-width="100">
  286. <el-form-item label="驳回原因" :prop="verifyRemark">
  287. <el-input v-model.trim="form.verifyRemark" type="textarea" :rows="3" placeholder="请输入驳回原因" />
  288. </el-form-item>
  289. </el-form>
  290. <template #footer>
  291. <div class="dialog-footer">
  292. <el-button type="primary" @click="verifyUpload(4)">确 定</el-button>
  293. <el-button @click="rejectCancel">取 消</el-button>
  294. </div>
  295. </template>
  296. </el-dialog>
  297. </div>
  298. </template>
  299. <script setup>
  300. import { uploadFile } from "@/api/tool/file";
  301. import {
  302. listAccount,
  303. listContract,
  304. getCollection,
  305. getCollectionByContract,
  306. getCollectionDetail,
  307. saveCollection,
  308. setCollectionStatus,
  309. } from "@/api/business/financial/collection";
  310. import { listSource } from "@/api/settings/source";
  311. import { listCompany } from "@/api/business/crm/company";
  312. import { listUser } from "@/api/system/user";
  313. import CustomerFormCom from "@/components/CustomerFormCom";
  314. import { formatDate } from "@/utils/index";
  315. import { ref } from "vue";
  316. import match from "@/utils/match";
  317. import useUserStore from "@/store/modules/user";
  318. const { proxy } = getCurrentInstance();
  319. const baseUrl = import.meta.env.VITE_APP_BASE_API;
  320. /** 父组件传参 */
  321. const props = defineProps({
  322. getList: {
  323. type: Function,
  324. default: () => { },
  325. },
  326. });
  327. const { getList } = toRefs(props);
  328. /** 字典数组区 */
  329. const { virtual_address } = proxy.useDict("virtual_address");
  330. /** 表单抽屉 页变量 */
  331. const title = ref("");
  332. const loading = ref(false);
  333. const multiple = ref(true);
  334. const visible = ref(false);
  335. const editStatus = ref(false);
  336. const loopTasks = ref([]);
  337. const onceTasks = ref([]);
  338. const sourceCategories = ref([]);
  339. const loops = ref([]);
  340. const onces = ref([]);
  341. const type = ref("");
  342. const rejectOpen = ref(false);
  343. // 循环任务明细
  344. const loopDetails = ref([]);
  345. // 单次任务明细
  346. const onceDetails = ref([]);
  347. const detailEmpty = {
  348. id: null,
  349. taskTypeName: "",
  350. taskTypeId: null,
  351. serviceNum: undefined,
  352. freeNum: undefined,
  353. price: undefined,
  354. amount: undefined,
  355. addressStyle: undefined,
  356. address: undefined,
  357. fictionAddressId: undefined,
  358. tenantId: undefined,
  359. province: "",
  360. city: "",
  361. district: "",
  362. addressStyle: 1,
  363. provinceId: undefined,
  364. processes: [],
  365. defaultProcesses: [],
  366. };
  367. const provinces = ref(proxy.region.getProvinces());
  368. provinces.value.unshift({ code: "", name: "全部" });
  369. const cities = ref([]);
  370. const districts = ref([]);
  371. const archiveInput = ref({});
  372. const contractEmpty = {
  373. serviceType: 1,
  374. contractType: 0,
  375. formDate: formatDate(new Date(), "yyyy-MM-dd"),
  376. signerId: useUserStore().user.userId,
  377. signerName: useUserStore().user.nickName,
  378. files: [],
  379. };
  380. const isFullscreen = ref(false);
  381. const webHost = import.meta.env.VITE_APP_BASE_API;
  382. const data = reactive({
  383. form: reactive({}),
  384. rules: {},
  385. timeOptions: { start: "08:30", step: "00:15", end: "18:30" },
  386. });
  387. const { form, rules, timeOptions } = toRefs(data);
  388. /*********************** 方法区 ****************************/
  389. /** 打开抽屉 */
  390. function open(row) {
  391. reset();
  392. archiveInput.value = row;
  393. visible.value = true;
  394. getCollectionByContract(row).then((res) => {
  395. form.value = res.data;
  396. editStatus.value = true;
  397. });
  398. }
  399. // 数字格式化
  400. function rowNum(num) {
  401. if (!num) {
  402. return;
  403. }
  404. num = num.toLocaleString(); // 3,000
  405. if (num.indexOf(".") == -1) {
  406. num = num + ".00"; //3,000.00
  407. } else if (num.charAt(num.indexOf(".") == num.length - 2)) {
  408. num = num + "0";
  409. }
  410. return num;
  411. }
  412. /** 取消按钮 */
  413. function cancel() {
  414. visible.value = false;
  415. reset();
  416. }
  417. /** 表单重置 */
  418. function reset() {
  419. form.value = JSON.parse(JSON.stringify(contractEmpty));
  420. loops.value = [];
  421. onces.value = [];
  422. loopDetails.value = [];
  423. onceDetails.value = [];
  424. type.value = "";
  425. }
  426. /** 全屏缩放 */
  427. function handleScreen() {
  428. const dom = document.querySelector(
  429. ".list-container > .el-drawer__wrapper > .el-overlay"
  430. );
  431. isFullscreen.value = !isFullscreen.value;
  432. dom.style.position = isFullscreen.value ? "fixed" : "absolute";
  433. }
  434. /** 提交按钮 */
  435. async function submitForm() {
  436. // 应收款金额 和明细比较 如果大于应收内容 提示 当前的合同提过的收款申请总金额超过当前合同金额,不可提交,如有需要请跟财务人员联系
  437. const res = await getCollectionDetail(form.value.contractId);
  438. if (res.data == null || res.data.length == 0) {
  439. const amount = form.value.arriveAmount;
  440. if (amount > form.value.contractAmount) {
  441. proxy.$modal.msgError("当前的合同提过的收款申请总金额超过当前合同金额,不可提交,请联系财务人员。");
  442. return false;
  443. }
  444. for (let i = 0; i < form.value.details.length; i++) {
  445. let item = form.value.details[i];
  446. let countAmount = 0;
  447. for (let j = 0; j < res.data.length; j++) {
  448. let match = res.data[j];
  449. if (item.taskTypeId == match.taskTypeId) {
  450. countAmount += match.arriveAmount;
  451. }
  452. }
  453. if (item.amount < countAmount) {
  454. proxy.$modal.msgError("当前的" + item.taskTypeName + "收款申请总金额超过当前服务金额,不可提交,请联系财务人员。");
  455. return false;
  456. }
  457. }
  458. } else {
  459. const countAmount = res.data.map((item) => item.arriveAmount).reduce((total, number) => {
  460. return total + number;
  461. });
  462. const amount = countAmount + form.value.arriveAmount;
  463. if (amount > form.value.contractAmount) {
  464. proxy.$modal.msgError("当前的合同提过的收款申请总金额超过当前合同金额,不可提交,请联系财务人员。");
  465. return false;
  466. }
  467. // form.value.details.forEach(item => {
  468. // let countAmount = 0;
  469. // res.data.forEach(match => {
  470. // if (item.taskTypeId == match.taskTypeId) {
  471. // countAmount += match.arriveAmount;
  472. // }
  473. // })
  474. // if (item.amount < match.add(item.arriveAmount,countAmount)) {
  475. // proxy.$modal.msgError("当前的" + item.taskTypeName + "收款申请总金额超过当前服务金额,不可提交,请联系财务人员。");
  476. // console.log(2323);
  477. // return false;
  478. // }
  479. // });
  480. for (let i = 0; i < form.value.details.length; i++) {
  481. let item = form.value.details[i];
  482. let countAmount = 0;
  483. for (let j = 0; j < res.data.length; j++) {
  484. let match = res.data[j];
  485. if (item.taskTypeId == match.taskTypeId) {
  486. countAmount += match.arriveAmount;
  487. }
  488. }
  489. if (item.amount < match.add(item.arriveAmount,countAmount)) {
  490. proxy.$modal.msgError("当前的" + item.taskTypeName + "收款申请总金额超过当前服务金额,不可提交,请联系财务人员。");
  491. console.log(2323);
  492. return false;
  493. }
  494. }
  495. }
  496. if (form.value.arriveAmount > form.value.contractAmount) {
  497. proxy.$modal.msgError("实际收款金额不能大于合同收款金额");
  498. return;
  499. }
  500. proxy.$refs["orderRef"].validate((valid) => {
  501. if (valid && detailValid()) {
  502. const formValue = form.value;
  503. saveCollection(formValue).then((res) => {
  504. if (res.code === 200) {
  505. archiveInput.value.collectionStatus = 1;
  506. setCollectionStatus(archiveInput.value);
  507. proxy.$message.success("保存成功");
  508. }
  509. cancel();
  510. getList.value();
  511. });
  512. }
  513. });
  514. }
  515. function detailValid() {
  516. // if (form.value.files.length === 0) {
  517. // proxy.$modal.msgError("收款附件为空");
  518. // return false;
  519. // }
  520. return true;
  521. }
  522. /** 查询表单信息 */
  523. function getForm() {
  524. loading.value = true;
  525. getOrder(form.value.id).then((response) => {
  526. loading.value = false;
  527. form.value = response.data;
  528. });
  529. }
  530. function handleServiceTypeClick(tab) {
  531. computedService();
  532. }
  533. function verifyHandler() {
  534. proxy.$modal
  535. .confirm("是否确认审核?")
  536. .then((_) => {
  537. verifyUpload(1);
  538. })
  539. .catch((_) => {
  540. proxy.$modal.msg("取消审核");
  541. });
  542. }
  543. function rejectHandler() {
  544. rejectOpen.value = true;
  545. }
  546. function rejectCancel() {
  547. rejectOpen.value = false;
  548. }
  549. function rejectSubmitHandler() {
  550. if (form.value.verifyRemark === "" || form.value.verifyRemark == null) {
  551. proxy.$modal.msgError("请填写驳回原因");
  552. return;
  553. }
  554. }
  555. function verifyUpload(status) {
  556. const formValue = proxy.deepClone(form.value);
  557. formValue.verifyStatus = status;
  558. formValue.status = status;
  559. verifyOrder(formValue).then((res) => {
  560. getForm();
  561. getList.value();
  562. rejectCancel();
  563. proxy.$modal.msg("保存成功");
  564. });
  565. }
  566. /** 文件上传 */
  567. function upload(param) {
  568. const fileForm = new FormData();
  569. fileForm.append("file", param.file);
  570. uploadFile(fileForm).then((res) => {
  571. if (res.code === 200) {
  572. const file = {};
  573. file.fileName = res.newFileName;
  574. file.url = res.url;
  575. file.originalFileName = res.originalFilename;
  576. file.fileUrl = res.fileName;
  577. form.value.files.push(file);
  578. }
  579. });
  580. }
  581. function handleDelFile(index) {
  582. form.value.files.splice(index, 1);
  583. }
  584. function amountChangeHandler(arg, row, field) {
  585. computeTotalAmount();
  586. }
  587. function computeTotalAmount() {
  588. let amount = 0;
  589. for (let index = 0; index < form.value.details.length; index++) {
  590. const element = form.value.details[index];
  591. amount += element.arriveAmount == null ? 0 : element.arriveAmount;
  592. }
  593. form.value.arriveAmount = amount;
  594. }
  595. function amountChange() {
  596. let amount = 0;
  597. if (form.value.details.length > 0) {
  598. for (let i = 0; i < form.value.details.length; i++) {
  599. amount = amount + form.value.details[i].arriveAmount;
  600. }
  601. nextTick(() => {
  602. form.value.arriveAmount = amount;
  603. })
  604. }
  605. }
  606. function openFile(row) {
  607. window.open(`${baseUrl}${row.fileUrl}`);
  608. }
  609. function handlerDelAttach(row, index) {
  610. proxy.$modal
  611. .confirm("确认删除该项么?")
  612. .then((_) => {
  613. form.value.files.splice(index, 1);
  614. })
  615. .catch((err) => {
  616. proxy.$modal.msgError("取消删除");
  617. });
  618. }
  619. function querySearchAccountAsync(queryString, cb) {
  620. const query =
  621. queryString.length > 0
  622. ? { keyword: queryString, pageSize: 20, pageNum: 1 }
  623. : { pageSize: 20, pageNum: 1 };
  624. listAccount(query).then((res) => {
  625. cb(res.rows);
  626. });
  627. }
  628. function handleSelectAccount(item) {
  629. form.value.subsidiaryName = item.name;
  630. form.value.subsidiaryBankName = item.accountOpen;
  631. form.value.subsidiaryBankAccount = item.accountNum;
  632. }
  633. /** 暴露给父组件的方法 */
  634. defineExpose({
  635. open,
  636. });
  637. </script>