form.vue 29 KB

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