form.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  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. <template
  14. v-if="
  15. checkPermission(['business:payment:edit', 'business:payment:add'])
  16. "
  17. >
  18. <el-button
  19. v-if="editStatus"
  20. type="primary"
  21. size="small"
  22. icon="Finished"
  23. @click="submitForm"
  24. >保存</el-button
  25. >
  26. <el-button
  27. v-else-if="form.verifyStatus === 0"
  28. type="warning"
  29. size="small"
  30. icon="Edit"
  31. @click="editStatus = true"
  32. >修改</el-button
  33. >
  34. <el-button
  35. v-if="form.id && editStatus"
  36. size="small"
  37. icon="Close"
  38. @click="editStatus = false"
  39. >取消修改</el-button
  40. >
  41. </template>
  42. <el-button
  43. v-show="form.id && !editStatus && form.verifyStatus === 0"
  44. v-hasPermi="['business:payment:financialVerify']"
  45. type="primary"
  46. size="small"
  47. icon="Check"
  48. @click="verifyHandler"
  49. >财务审核</el-button
  50. >
  51. <el-button
  52. v-show="form.id && !editStatus && form.verifyStatus === 1"
  53. v-hasPermi="['business:payment:cashierVerify']"
  54. type="primary"
  55. size="small"
  56. icon="Check"
  57. @click="cashierVerifyHandler"
  58. >出纳审核</el-button
  59. >
  60. <div class="screen-btn" @click="handleScreen">
  61. <template v-if="!isFullscreen">
  62. <i class="fa fa-window-maximize" aria-hidden="true" />
  63. <!-- <span>全屏</span> -->
  64. </template>
  65. <template v-else>
  66. <i class="fa fa-window-restore" aria-hidden="true" />
  67. <!-- <span>还原</span> -->
  68. </template>
  69. </div>
  70. <div class="close-btn" @click="cancel">
  71. <i class="fa fa-times" aria-hidden="true" />
  72. <!-- <span>关闭</span> -->
  73. </div>
  74. </div>
  75. <div
  76. class="Y-scrollbar"
  77. style="
  78. position: absolute;
  79. top: 32px;
  80. bottom: 0;
  81. width: 100%;
  82. overflow: auto;
  83. "
  84. ></div>
  85. <el-form
  86. ref="orderRef"
  87. class="master-container"
  88. size="small"
  89. :model="form"
  90. :rules="rules"
  91. label-width="100px"
  92. >
  93. <el-row :gutter="30">
  94. <el-col :span="6">
  95. <el-form-item label="支出流水号:">
  96. <el-input
  97. v-if="editStatus"
  98. style="width: 100%"
  99. v-model.trim="form.flowNo"
  100. readonly
  101. size="small"
  102. type="text"
  103. placeholder="支出流水号"
  104. :clearable="true"
  105. />
  106. <span v-else>{{ form.flowNo }}</span>
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="6">
  110. <el-form-item label="申请日期" prop="formDate" required>
  111. <el-date-picker
  112. v-if="editStatus"
  113. style="width: 100%"
  114. v-model="form.formDate"
  115. size="small"
  116. :clearable="true"
  117. format="YYYY-MM-DD"
  118. value-format="YYYY-MM-DD"
  119. align="center"
  120. type="date"
  121. placeholder="申请日期"
  122. />
  123. <span v-else>{{ form.formDate }}</span>
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="6">
  127. <el-form-item label="支出类目:">
  128. <el-select
  129. v-if="editStatus"
  130. style="width: 100%"
  131. v-model.trim="form.paymentCauseId"
  132. placeholder="支出类目"
  133. size="small"
  134. :clearable="true"
  135. @change="paymentCauseChange"
  136. >
  137. <el-option
  138. v-for="item in paymentTypes"
  139. :key="item.id"
  140. :label="item.name"
  141. :value="item.id"
  142. />
  143. </el-select>
  144. <span v-else>{{ form.paymentCause }}</span>
  145. </el-form-item>
  146. </el-col>
  147. <el-col :span="6">
  148. <el-form-item label="支出科目:">
  149. <el-select
  150. v-if="editStatus"
  151. style="width: 100%"
  152. v-model.trim="form.paymentSubjectId"
  153. placeholder="支出科目"
  154. size="small"
  155. :clearable="true"
  156. @change="paymentSubjectChange"
  157. >
  158. <el-option
  159. v-for="item in paymentSubjects"
  160. :key="item.id"
  161. :label="item.name"
  162. :value="item.id"
  163. />
  164. </el-select>
  165. <span v-else>{{ form.paymentSubject }}</span>
  166. </el-form-item>
  167. </el-col>
  168. <el-col :span="6">
  169. <el-form-item label="收款账户名:">
  170. <el-input
  171. v-if="editStatus"
  172. style="width: 100%"
  173. v-model.trim="form.acceptAccount"
  174. size="small"
  175. type="text"
  176. placeholder="收款账户名"
  177. :clearable="true"
  178. />
  179. <span v-else>{{ form.acceptAccount }}</span>
  180. </el-form-item>
  181. </el-col>
  182. <el-col :span="6">
  183. <el-form-item label="收款账号:">
  184. <template v-if="editStatus">
  185. <el-input
  186. v-model.trim="form.acceptAccountNo"
  187. size="small"
  188. type="text"
  189. style="width: 100%"
  190. placeholder="收款账号"
  191. :clearable="true"
  192. />
  193. </template>
  194. <span v-else
  195. >{{ form.acceptAccountType }} -
  196. {{ form.acceptAccountNo }}</span
  197. >
  198. </el-form-item>
  199. </el-col>
  200. <el-col :span="6">
  201. <el-form-item label="收款账户开户银行:" label-width="120px">
  202. <template v-if="editStatus">
  203. <el-input
  204. v-model.trim="form.bankNo"
  205. size="small"
  206. type="text"
  207. style="width: 100%"
  208. placeholder="收款账户开户银行"
  209. :clearable="true"
  210. />
  211. </template>
  212. <span v-else>{{ form.bankNo }}</span>
  213. </el-form-item>
  214. </el-col>
  215. <el-col :span="6">
  216. <el-form-item label="客户名称:" prop="companyName" required>
  217. <el-autocomplete
  218. v-if="editStatus"
  219. style="width: 100%"
  220. :fetch-suggestions="querySearchCompanyAsync"
  221. :trigger-on-focus="true"
  222. v-model="form.companyName"
  223. placeholder="请输入客户名称"
  224. popper-class="my-autocomplete"
  225. @select="handleSelectCompany"
  226. >
  227. <template #default="{ item }">
  228. <div
  229. style="
  230. display: flex;
  231. flex-direction: row;
  232. justify-content: space-between;
  233. "
  234. >
  235. <div class="name" style="font-size: 12px">
  236. {{ item.name }}
  237. </div>
  238. <!-- <span class="code" style="font-size: 10px; color: darkgrey">{{ item.code }}</span> -->
  239. </div>
  240. </template>
  241. </el-autocomplete>
  242. <span v-else>{{ form.companyName }}</span>
  243. </el-form-item>
  244. </el-col>
  245. <el-col :span="6">
  246. <el-form-item label="合同编号:" required>
  247. <el-input
  248. v-if="editStatus"
  249. style="width: 100%"
  250. v-model.trim="form.contractNo"
  251. size="small"
  252. type="text"
  253. placeholder="请选择"
  254. :clearable="true"
  255. >
  256. <template #append>
  257. <el-button
  258. icon="Search"
  259. @click="() => contractChoiceHandler()"
  260. />
  261. </template>
  262. </el-input>
  263. <span v-else style="width: 100%">
  264. <el-tooltip :content="form.contractNo">
  265. <!-- <el-button class="text-overflow" type="primary" link @click="(showContractDialog(currentContract.contractId))">{{ currentContract.formNo }}</el-button> -->
  266. {{ form.contractNo }}
  267. </el-tooltip>
  268. </span>
  269. </el-form-item>
  270. </el-col>
  271. <el-col :span="6">
  272. <el-form-item label="应收款金额:" prop="remark">
  273. <span>{{ rowNum(form.contractAmount) }}</span>
  274. </el-form-item>
  275. </el-col>
  276. <el-col :span="6">
  277. <el-form-item label="已支出金额:" prop="remark">
  278. <span>{{ rowNum(form.payedAmount) }}</span>
  279. </el-form-item>
  280. </el-col>
  281. <el-col :span="6">
  282. <el-form-item label="支出金额:" required>
  283. <el-input-number
  284. v-if="editStatus"
  285. v-model.trim="form.amount"
  286. size="small"
  287. readonly
  288. placeholder="支出金额"
  289. :clearable="true"
  290. :precision="2"
  291. controls-position="right"
  292. :controls="false"
  293. @change="amountChange"
  294. />
  295. <span v-else>{{ rowNum(form.amount) }}</span>
  296. </el-form-item>
  297. </el-col>
  298. <el-col
  299. v-if="form.verifyStatus === 2 || form.verifyStatus === 4"
  300. :span="6"
  301. >
  302. <el-form-item label="驳回原因:" required>
  303. <span>{{ form.verifyComment }}</span>
  304. </el-form-item>
  305. </el-col>
  306. <el-col :span="12">
  307. <el-form-item label="备注:">
  308. <el-input
  309. v-if="editStatus"
  310. v-model.trim="form.remark"
  311. size="small"
  312. type="text"
  313. placeholder="备注"
  314. :clearable="true"
  315. />
  316. <span v-else style="word-break: break-all">{{
  317. form.remark
  318. }}</span>
  319. </el-form-item>
  320. </el-col>
  321. </el-row>
  322. </el-form>
  323. <div class="details-container">
  324. <el-row :gutter="2" style="height: 100%">
  325. <el-col :span="18">
  326. <div class="details-head">
  327. <div class="title">
  328. <i class="fa fa-th-list" aria-hidden="true" /> 收款明细
  329. </div>
  330. </div>
  331. <div class="details-body">
  332. <el-table
  333. ref="filesTable"
  334. :data="form.details"
  335. size="small"
  336. height="100%"
  337. border
  338. header-row-class-name="list-header-row"
  339. highlight-current-row
  340. >
  341. <el-table-column
  342. type="index"
  343. label="序号"
  344. width="47"
  345. align="center"
  346. />
  347. <el-table-column
  348. label="任务名称"
  349. prop="taskTypeName"
  350. align="center"
  351. show-overflow-tooltip
  352. >
  353. </el-table-column>
  354. <el-table-column
  355. label="任务金额"
  356. prop="amount"
  357. width="100"
  358. align="center"
  359. >
  360. <template #default="scope">
  361. <span>{{ rowNum(scope.row.amount) }}</span>
  362. </template>
  363. </el-table-column>
  364. <el-table-column
  365. label="已收款金额"
  366. prop="reallyAmount"
  367. width="100"
  368. align="center"
  369. >
  370. <template #default="scope">
  371. <span>{{ rowNum(scope.row.reallyAmount) }}</span>
  372. </template>
  373. </el-table-column>
  374. <el-table-column
  375. label="本次支出金额"
  376. prop="paymentAmount"
  377. width="100"
  378. align="center"
  379. >
  380. <template #default="scope">
  381. <template v-if="editStatus">
  382. <el-input-number
  383. v-model="scope.row.paymentAmount"
  384. size="small"
  385. placeholder="本次支出金额"
  386. :precision="2"
  387. :controls="false"
  388. style="width: 100%"
  389. @change="
  390. (arg) =>
  391. amountChangeHandler(
  392. arg,
  393. scope.row,
  394. 'paymentAmount'
  395. )
  396. "
  397. />
  398. </template>
  399. <template v-else>{{
  400. rowNum(scope.row.paymentAmount)
  401. }}</template>
  402. </template>
  403. </el-table-column>
  404. <el-table-column
  405. label="已支付金额"
  406. prop="payment"
  407. width="100"
  408. align="center"
  409. >
  410. <template #default="scope">
  411. <span>{{ rowNum(scope.row.payment) }}</span>
  412. </template>
  413. </el-table-column>
  414. </el-table>
  415. </div>
  416. </el-col>
  417. <el-col :span="6">
  418. <div class="details-head">
  419. <div class="title">
  420. <i class="fa fa-th-list" aria-hidden="true" /> 附件
  421. <i style="color: red">*</i>
  422. </div>
  423. <el-upload
  424. v-if="editStatus"
  425. action="#"
  426. :http-request="upload"
  427. :with-credentials="true"
  428. :show-file-list="false"
  429. multiple
  430. >
  431. <el-button size="small" type="primary" icon="Upload"
  432. >点击上传</el-button
  433. >
  434. </el-upload>
  435. </div>
  436. <div class="details-body">
  437. <el-table
  438. ref="filesTable"
  439. :data="form.files"
  440. size="small"
  441. height="100%"
  442. border
  443. header-row-class-name="list-header-row"
  444. highlight-current-row
  445. >
  446. <el-table-column
  447. type="index"
  448. label="序号"
  449. width="47"
  450. align="center"
  451. />
  452. <el-table-column
  453. label="文件名"
  454. prop="originalFileName"
  455. align="center"
  456. show-overflow-tooltip
  457. >
  458. <template #default="scope">
  459. <el-button
  460. size="small"
  461. type="primary"
  462. link
  463. @click="openFile(scope.row)"
  464. >{{ scope.row.originalFileName }}</el-button
  465. >
  466. </template>
  467. </el-table-column>
  468. <el-table-column label="操作" width="50" align="center">
  469. <template #default="scope">
  470. <div v-if="editStatus">
  471. <el-button
  472. size="small"
  473. link
  474. type="danger"
  475. @click="handlerDelAttach(scope.row, scope.$index)"
  476. >删除</el-button
  477. >
  478. </div>
  479. </template>
  480. </el-table-column>
  481. </el-table>
  482. </div>
  483. </el-col>
  484. </el-row>
  485. </div>
  486. </div>
  487. </el-drawer>
  488. <el-dialog
  489. title="财务审核详情"
  490. v-model="rejectOpen"
  491. width="500px"
  492. append-to-body
  493. draggable
  494. :close-on-click-modal = "false"
  495. >
  496. <el-form ref="dictRef" :model="rejectForm" label-width="100" size="small">
  497. <el-form-item label="审核状态">
  498. <el-select
  499. v-model.trim="rejectForm.verifyStatus"
  500. placeholder="请选择"
  501. size="small"
  502. >
  503. <el-option
  504. v-for="i in verified"
  505. :key="i.value"
  506. :label="i.label"
  507. :value="i.value"
  508. />
  509. </el-select>
  510. </el-form-item>
  511. <el-form-item
  512. :label="rejectForm.verifyStatus == 2 ? '驳回原因' : '审核意见'"
  513. :prop="verifyRemark"
  514. >
  515. <el-input
  516. v-model.trim="rejectForm.verifyComment"
  517. type="textarea"
  518. maxlength="200"
  519. show-word-limit
  520. :rows="3"
  521. placeholder="请输入审核意见"
  522. />
  523. </el-form-item>
  524. <el-form-item label="附件" required>
  525. <el-upload
  526. action="#"
  527. :http-request="upload2"
  528. :with-credentials="true"
  529. :show-file-list="false"
  530. multiple
  531. :limit="5"
  532. >
  533. <el-button size="small" type="primary" icon="Upload"
  534. >点击上传</el-button
  535. >
  536. </el-upload>
  537. <el-table
  538. ref="dbTable"
  539. :data="rejectForm.evidenceFiles"
  540. size="small"
  541. border
  542. header-row-class-name="list-header-row"
  543. row-class-name="list-row"
  544. >
  545. <el-table-column
  546. label="文件名"
  547. prop="originalFileName"
  548. align="center"
  549. show-overflow-tooltip
  550. >
  551. <template #default="scope">
  552. <el-button
  553. size="small"
  554. type="text"
  555. @click="openFile(scope.row)"
  556. >{{
  557. scope.row.originalFileName == ""
  558. ? "打开文件"
  559. : scope.row.originalFileName
  560. }}</el-button
  561. >
  562. </template>
  563. </el-table-column>
  564. <el-table-column
  565. label="操作"
  566. width="80"
  567. prop="fileType"
  568. align="center"
  569. >
  570. <template #default="scope">
  571. <el-button
  572. size="small"
  573. link
  574. type="danger"
  575. @click="handlerEportFilesDel(scope.row, scope.$index)"
  576. >删除</el-button
  577. >
  578. </template>
  579. </el-table-column>
  580. </el-table>
  581. </el-form-item>
  582. </el-form>
  583. <template #footer>
  584. <div class="dialog-footer">
  585. <el-button
  586. type="primary"
  587. icon="Finished"
  588. size="small"
  589. @click="verifyUpload()"
  590. >确 定</el-button
  591. >
  592. <el-button icon="close" size="small" @click="rejectCancel"
  593. >取 消</el-button
  594. >
  595. </div>
  596. </template>
  597. </el-dialog>
  598. <el-dialog
  599. title="出纳审核详情"
  600. v-model="cashierOpen"
  601. width="500px"
  602. append-to-body
  603. draggable
  604. >
  605. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  606. <el-form-item label="审核状态">
  607. <el-select
  608. v-model.trim="cashierForm.verifyStatus"
  609. placeholder="请选择"
  610. size="small"
  611. >
  612. <el-option
  613. v-for="i in cashierVerified"
  614. :key="i.value"
  615. :label="i.label"
  616. :value="i.value"
  617. />
  618. </el-select>
  619. </el-form-item>
  620. <el-form-item label="实际支出时间" required>
  621. <el-date-picker
  622. v-model.trim="cashierForm.actuallyDate"
  623. size="small"
  624. :clearable="true"
  625. format="YYYY-MM-DD HH:mm:ss"
  626. value-format="YYYY-MM-DD HH:mm:ss"
  627. align="center"
  628. type="datetime"
  629. placeholder="实际付款时间"
  630. />
  631. </el-form-item>
  632. <!-- <el-form-item label="支出附件上传" required>
  633. </el-form-item> -->
  634. <el-form-item
  635. :label="cashierForm.verifyStatus == 4 ? '驳回原因' : '审核意见'"
  636. :prop="verifyComment"
  637. >
  638. <el-input
  639. v-model.trim="cashierForm.verifyComment"
  640. type="textarea"
  641. maxlength="200"
  642. show-word-limit
  643. :rows="3"
  644. placeholder="请输入审核意见"
  645. />
  646. </el-form-item>
  647. <el-form-item label="附件" required>
  648. <el-upload
  649. action="#"
  650. :http-request="upload3"
  651. :with-credentials="true"
  652. :show-file-list="false"
  653. multiple
  654. :limit="5"
  655. >
  656. <el-button size="small" type="primary" icon="Upload"
  657. >点击上传</el-button
  658. >
  659. </el-upload>
  660. <el-table
  661. ref="dbTable"
  662. :data="cashierForm.evidenceFiles"
  663. size="small"
  664. border
  665. header-row-class-name="list-header-row"
  666. row-class-name="list-row"
  667. >
  668. <el-table-column
  669. label="文件名"
  670. prop="originalFileName"
  671. align="center"
  672. show-overflow-tooltip
  673. >
  674. <template #default="scope">
  675. <el-button
  676. size="small"
  677. type="text"
  678. @click="openFile(scope.row)"
  679. >{{
  680. scope.row.originalFileName == ""
  681. ? "打开文件"
  682. : scope.row.originalFileName
  683. }}</el-button
  684. >
  685. </template>
  686. </el-table-column>
  687. <el-table-column
  688. label="操作"
  689. width="80"
  690. prop="fileType"
  691. align="center"
  692. >
  693. <template #default="scope">
  694. <el-button
  695. size="small"
  696. link
  697. type="danger"
  698. @click="handlerEportFilesDel(scope.row, scope.$index)"
  699. >删除</el-button
  700. >
  701. </template>
  702. </el-table-column>
  703. </el-table>
  704. </el-form-item>
  705. </el-form>
  706. <template #footer>
  707. <div class="dialog-footer">
  708. <el-button
  709. type="primary"
  710. icon="Finished"
  711. size="small"
  712. @click="cashierVerifyUpload()"
  713. >确 定</el-button
  714. >
  715. <el-button icon="close" size="small" @click="cashierVerifyCancel"
  716. >取 消</el-button
  717. >
  718. </div>
  719. </template>
  720. </el-dialog>
  721. <dialog-contract-choice
  722. ref="contractChoiceRef"
  723. @choice="contractChoiceHandle"
  724. />
  725. </div>
  726. </template>
  727. <script setup>
  728. import { uploadFile } from "@/api/tool/file";
  729. // import {
  730. // getOrder,
  731. // initTaskTypes,
  732. // addOrder,
  733. // updateOrder,
  734. // verifyOrder,
  735. // alterOrder,
  736. // dissolutionOrder,
  737. // } from "@/api/business/crm/contract";
  738. import {
  739. listCompany,
  740. getPayment,
  741. savePayment,
  742. listTypes,
  743. listContractDetail,
  744. verifyPayment,
  745. } from "@/api/business/financial/payment";
  746. import { listSource } from "@/api/settings/source";
  747. import { listUser } from "@/api/system/user";
  748. import CustomerFormCom from "@/components/CustomerFormCom";
  749. import DialogContractChoice from "@/views/dialog/DialogContractChoice.vue";
  750. import { formatDate, rowNum } from "@/utils/index";
  751. import { ref } from "vue";
  752. import useUserStore from "@/store/modules/user";
  753. const { proxy } = getCurrentInstance();
  754. const baseUrl = import.meta.env.VITE_APP_BASE_API;
  755. /** 父组件传参 */
  756. const props = defineProps({
  757. getList: {
  758. type: Function,
  759. default: () => {},
  760. },
  761. });
  762. const { getList } = toRefs(props);
  763. /** 字典数组区 */
  764. const { virtual_address } = proxy.useDict("virtual_address");
  765. /** 表单抽屉 页变量 */
  766. const title = ref("");
  767. const loading = ref(false);
  768. const multiple = ref(true);
  769. const visible = ref(false);
  770. const editStatus = ref(false);
  771. const sourceCategories = ref([]);
  772. const type = ref("");
  773. const rejectOpen = ref(false);
  774. const rejectForm = ref({});
  775. const cashierForm = ref({});
  776. const detailEmpty = {
  777. id: null,
  778. taskTypeName: "",
  779. taskTypeId: null,
  780. serviceNum: undefined,
  781. freeNum: undefined,
  782. price: undefined,
  783. amount: undefined,
  784. addressStyle: undefined,
  785. address: undefined,
  786. fictionAddressId: undefined,
  787. tenantId: undefined,
  788. province: "",
  789. city: "",
  790. district: "",
  791. addressStyle: 1,
  792. provinceId: undefined,
  793. processes: [],
  794. defaultProcesses: [],
  795. };
  796. const provinces = ref(proxy.region.getProvinces());
  797. provinces.value.unshift({ code: "", name: "全部" });
  798. const cities = ref([]);
  799. const districts = ref([]);
  800. const paymentTypes = ref([]);
  801. const paymentSubjects = ref([]);
  802. const paymentEmpty = {
  803. id: null,
  804. flowNo: "",
  805. paymentCauseId: null,
  806. paymentSubjectId: null,
  807. acceptAccountTypeId: null,
  808. subsidiaryId: null,
  809. subsidiary: null,
  810. subsidiaryName: "",
  811. subsidiaryBankAccount: "",
  812. subsidiaryBankName: "",
  813. companyId: null,
  814. companyName: "",
  815. amount: 0,
  816. verifyStatus: 0,
  817. acceptAccount: "",
  818. accountBank: "",
  819. applierId: useUserStore().user.userId,
  820. applierName: "",
  821. creatorName: useUserStore().user.nickName,
  822. details: [],
  823. files: [],
  824. };
  825. const isFullscreen = ref(false);
  826. const webHost = import.meta.env.VITE_APP_BASE_API;
  827. const data = reactive({
  828. form: {},
  829. rules: {
  830. companyName: [
  831. { required: true, message: "客户名称不能为空", trigger: "blur" },
  832. ],
  833. formDate: [
  834. { required: true, message: "支出日期不能为空", trigger: "blur" },
  835. ],
  836. },
  837. timeOptions: { start: "08:30", step: "00:15", end: "18:30" },
  838. verified: [
  839. {
  840. value: 0,
  841. label: "未审核",
  842. },
  843. {
  844. value: 1,
  845. label: "通过",
  846. },
  847. {
  848. value: 2,
  849. label: "驳回",
  850. },
  851. ],
  852. cashierVerified: [
  853. {
  854. value: 1,
  855. label: "未审核",
  856. },
  857. {
  858. value: 3,
  859. label: "通过",
  860. },
  861. {
  862. value: 4,
  863. label: "驳回",
  864. },
  865. ],
  866. cashierOpen: false,
  867. });
  868. const { form, rules, timeOptions, verified, cashierVerified, cashierOpen } =
  869. toRefs(data);
  870. /*********************** 方法区 ****************************/
  871. /** 打开抽屉 */
  872. function open(id) {
  873. reset();
  874. visible.value = true;
  875. editStatus.value = true;
  876. if (id != null) {
  877. getPayment(id).then((res) => {
  878. form.value = res.data;
  879. editStatus.value = false;
  880. paymentCauseChange(form.value.paymentCauseId);
  881. paymentSubjectChange(form.value.paymentSubjectId);
  882. });
  883. }
  884. }
  885. function init() {
  886. Promise.all([listTypes()]).then((res) => {
  887. paymentTypes.value = res[0].rows;
  888. });
  889. }
  890. /** 取消按钮 */
  891. function cancel() {
  892. visible.value = false;
  893. reset();
  894. }
  895. /** 表单重置 */
  896. function reset() {
  897. form.value = JSON.parse(JSON.stringify(paymentEmpty));
  898. paymentSubjects.value = [];
  899. }
  900. /** 全屏缩放 */
  901. function handleScreen() {
  902. const dom = document.querySelector(
  903. ".list-container > .el-drawer__wrapper > .el-overlay"
  904. );
  905. isFullscreen.value = !isFullscreen.value;
  906. dom.style.position = isFullscreen.value ? "fixed" : "absolute";
  907. }
  908. /** 提交按钮 */
  909. function submitForm() {
  910. if (form.value.contractId === 0 || form.value.contractId == null) {
  911. proxy.$modal.msgError("请输入合同");
  912. return;
  913. }
  914. if (form.value.amount == null || form.value.amount === 0) {
  915. proxy.$modal.msgError("请输入支出金额");
  916. return;
  917. }
  918. if (form.value.amount > form.value.contractAmount - form.value.payedAmount) {
  919. proxy.$modal.msgError("支出金额大于合同金额");
  920. return;
  921. }
  922. proxy.$refs["orderRef"].validate((valid) => {
  923. if (valid && detailValid()) {
  924. const formValue = form.value;
  925. savePayment(formValue).then((res) => {
  926. open(res.data.id);
  927. getList.value();
  928. });
  929. }
  930. });
  931. }
  932. function detailValid() {
  933. if (form.value.files.length === 0) {
  934. proxy.$modal.msgError("收款附件为空");
  935. return false;
  936. }
  937. return true;
  938. }
  939. /** 查询表单信息 */
  940. function getForm() {
  941. loading.value = true;
  942. getOrder(form.value.id).then((response) => {
  943. loading.value = false;
  944. form.value = response.data;
  945. });
  946. }
  947. function handleServiceTypeClick(tab) {
  948. computedService();
  949. }
  950. function verifyHandler() {
  951. rejectHandler();
  952. }
  953. function cashierVerifyHandler() {
  954. cashierOpen.value = true;
  955. cashierForm.value = proxy.deepClone(form.value);
  956. }
  957. function rejectHandler() {
  958. rejectOpen.value = true;
  959. rejectForm.value = proxy.deepClone(form.value);
  960. }
  961. function rejectCancel() {
  962. rejectOpen.value = false;
  963. rejectForm.value = {};
  964. }
  965. function cashierVerifyCancel() {
  966. cashierOpen.value = false;
  967. cashierForm.value = {};
  968. }
  969. function upload2(param) {
  970. const formData = new FormData();
  971. formData.append("file", param.file);
  972. uploadFile(formData).then((res) => {
  973. if (res.code === 200) {
  974. const file = {};
  975. file.fileName = res.newFileName;
  976. file.url = res.url;
  977. file.fileType =
  978. res.newFileName.split(".")[res.newFileName.split(".").length - 1];
  979. file.originalFileName = res.originalFilename;
  980. file.fileUrl = res.fileName;
  981. console.log(11212,file);
  982. if(rejectForm.value.evidenceFiles == null){
  983. rejectForm.value.evidenceFiles = [];
  984. }
  985. rejectForm.value.evidenceFiles.push(file);
  986. }
  987. });
  988. }
  989. function upload3(param) {
  990. const formData = new FormData();
  991. formData.append("file", param.file);
  992. uploadFile(formData).then((res) => {
  993. if (res.code === 200) {
  994. const file = {};
  995. file.fileName = res.newFileName;
  996. file.url = res.url;
  997. file.fileType =
  998. res.newFileName.split(".")[res.newFileName.split(".").length - 1];
  999. file.originalFileName = res.originalFilename;
  1000. file.fileUrl = res.fileName;
  1001. console.log(11212,file);
  1002. if(cashierForm.value.evidenceFiles == null){
  1003. cashierForm.value.evidenceFiles = [];
  1004. }
  1005. cashierForm.value.evidenceFiles.push(file);
  1006. }
  1007. });
  1008. }
  1009. function handleDelFile2(index) {
  1010. rejectForm.value.files.splice(index, 1);
  1011. }
  1012. function rejectSubmitHandler() {
  1013. if (form.value.verifyRemark === "" || form.value.verifyRemark == null) {
  1014. proxy.$modal.msgError("请填写驳回原因");
  1015. return;
  1016. }
  1017. }
  1018. function verifyUpload() {
  1019. if (rejectForm.value.verifyStatus === 0) {
  1020. proxy.$modal.msgError("请选择审核结果");
  1021. return;
  1022. }
  1023. if (
  1024. rejectForm.value.verifyStatus === 2 &&
  1025. (rejectForm.value.verifyComment == null ||
  1026. rejectForm.value.verifyComment === "")
  1027. ) {
  1028. proxy.$modal.msgError("请输入审核意见");
  1029. return;
  1030. }
  1031. if (
  1032. rejectForm.value.evidenceFiles == null ||
  1033. rejectForm.value.evidenceFiles.length === 0 || rejectForm.value.evidenceFiles.length>5
  1034. ) {
  1035. proxy.$modal.msgError("请上传附件并至多上传5个");
  1036. return;
  1037. }
  1038. verifyPayment(rejectForm.value).then((res) => {
  1039. open(form.value.id);
  1040. getList.value();
  1041. rejectCancel();
  1042. proxy.$modal.msgSuccess("保存成功");
  1043. });
  1044. }
  1045. function cashierVerifyUpload() {
  1046. if (cashierForm.value.verifyStatus === 1) {
  1047. proxy.$modal.msgError("请选择审核结果");
  1048. return;
  1049. }
  1050. if (
  1051. cashierForm.value.actuallyDate == null ||
  1052. cashierForm.value.actuallyDate === ""
  1053. ) {
  1054. proxy.$modal.msgError("请选择支出时间");
  1055. return;
  1056. }
  1057. if (
  1058. cashierForm.value.evidenceFiles == null ||
  1059. cashierForm.value.evidenceFiles.length === 0 || cashierForm.value.evidenceFiles.length>5
  1060. ) {
  1061. proxy.$modal.msgError("请上传附件并至多上传5个");
  1062. return;
  1063. }
  1064. if (
  1065. cashierForm.value.verifyStatus === 4 &&
  1066. (cashierForm.value.verifyComment == null ||
  1067. cashierForm.value.verifyComment === "")
  1068. ) {
  1069. proxy.$modal.msgError("请输入审核意见");
  1070. return;
  1071. }
  1072. cashierForm.value.paymentStatus =
  1073. cashierForm.value.verifyStatus === 3 ? 1 : 0;
  1074. verifyPayment(cashierForm.value).then((res) => {
  1075. open(cashierForm.value.id);
  1076. getList.value();
  1077. cashierVerifyCancel();
  1078. proxy.$modal.msgSuccess("保存成功");
  1079. });
  1080. }
  1081. /** 文件上传 */
  1082. function upload(param) {
  1083. const fileForm = new FormData();
  1084. fileForm.append("file", param.file);
  1085. uploadFile(fileForm).then((res) => {
  1086. if (res.code === 200) {
  1087. const file = {};
  1088. file.fileName = res.newFileName;
  1089. file.url = res.url;
  1090. file.originalFileName = res.originalFilename;
  1091. file.fileUrl = res.fileName;
  1092. form.value.files.push(file);
  1093. }
  1094. });
  1095. }
  1096. function handleDelFile(index) {
  1097. form.value.files.splice(index, 1);
  1098. }
  1099. function amountChangeHandler(arg, row, field) {
  1100. computeTotalAmount();
  1101. }
  1102. function computeTotalAmount() {
  1103. let amount = 0;
  1104. for (let index = 0; index < form.value.details.length; index++) {
  1105. const element = form.value.details[index];
  1106. amount += element.paymentAmount == null ? 0 : element.paymentAmount;
  1107. }
  1108. form.value.amount = amount;
  1109. }
  1110. function handlerEportFilesDel(row, index) {
  1111. proxy.$modal
  1112. .confirm("确定删除吗?")
  1113. .then((_) => {
  1114. rejectForm.value.evidenceFiles.splice(index, 1);
  1115. })
  1116. .catch((_) => {
  1117. proxy.$modal.msg("已取消删除");
  1118. });
  1119. }
  1120. function handlerEportFilesDel2(row, index) {
  1121. proxy.$modal
  1122. .confirm("确定删除吗?")
  1123. .then((_) => {
  1124. cashierForm.value.evidenceFiles.splice(index, 1);
  1125. })
  1126. .catch((_) => {
  1127. proxy.$modal.msg("已取消删除");
  1128. });
  1129. }
  1130. function amountChange() {
  1131. let amount = 0;
  1132. if (form.value.details.length > 0) {
  1133. for (let i = 0; i < form.value.details.length; i++) {
  1134. amount = amount + form.value.details[i].paymentAmount;
  1135. }
  1136. // 判断到款状态
  1137. form.value.amount = amount;
  1138. if (form.value.payedAmount > 0)
  1139. form.value.arriveStatus =
  1140. form.value.payedAmount === form.value.amount ? 1 : 2;
  1141. else form.value.arriveStatus = 0;
  1142. }
  1143. }
  1144. function openFile(row) {
  1145. window.open(`${baseUrl}${row.fileUrl}`);
  1146. }
  1147. function querySearchCompanyAsync(queryString, cb) {
  1148. const query =
  1149. queryString.length > 0
  1150. ? {
  1151. keyword: queryString,
  1152. pageSize: 50,
  1153. pageNum: 1,
  1154. orderByColumn: "create_time",
  1155. }
  1156. : { pageSize: 50, pageNum: 1, orderByColumn: "create_time" };
  1157. listCompany(query).then((res) => {
  1158. cb(res.rows);
  1159. });
  1160. }
  1161. function handleSelectCompany(item) {
  1162. form.value.companyName = item.name;
  1163. form.value.companyId = item.id;
  1164. }
  1165. function paymentCauseChange(arg) {
  1166. const index = paymentTypes.value.findIndex((v) => v.id === arg);
  1167. if (index >= 0) {
  1168. paymentSubjects.value = [{ id: "0", name: "请选择" }].concat(
  1169. paymentTypes.value[index].bizPaymentSubjectList
  1170. );
  1171. form.value.paymentCause = paymentTypes.value[index].name;
  1172. if (
  1173. paymentSubjects.value.findIndex(
  1174. (v) => v.id === form.value.paymentSubjectId
  1175. ) < 0
  1176. ) {
  1177. form.value.paymentSubjectId = null;
  1178. form.value.paymentSubject = "";
  1179. }
  1180. }
  1181. }
  1182. function contractChoiceHandler() {
  1183. if (form.value.companyId == null || form.value.companyId === "") {
  1184. proxy.$modal.msgError("请选择客户");
  1185. return;
  1186. }
  1187. proxy.$refs.contractChoiceRef.open({ companyId: form.value.companyId });
  1188. }
  1189. function contractChoiceHandle(info) {
  1190. form.value.details = []
  1191. form.value.contractId = info.id;
  1192. form.value.contractNo = info.contractNo;
  1193. form.value.contractAmount = info.trueAmount;
  1194. form.value.payedAmount = info.paidAmount;
  1195. listContractDetail({ contractId: info.id }).then((res) => {
  1196. const rows = res.rows;
  1197. rows.forEach((item) => {
  1198. const detail = {
  1199. contractId: item.contractId,
  1200. contractDetailId: item.id,
  1201. companyId: form.value.companyId,
  1202. taskTypeId: item.taskTypeId,
  1203. amount: item.amount,
  1204. taskTypeName: item.taskTypeName,
  1205. payment: item.payment,
  1206. reallyAmount:item.reallyAmount,
  1207. };
  1208. form.value.details.push(detail);
  1209. });
  1210. });
  1211. }
  1212. function handlerDelAttach(row, index) {
  1213. proxy.$modal
  1214. .confirm("确认删除该项么?")
  1215. .then((_) => {
  1216. form.value.files.splice(index, 1);
  1217. })
  1218. .catch((err) => {
  1219. proxy.$modal.msgError("取消删除");
  1220. });
  1221. }
  1222. function paymentSubjectChange(id) {
  1223. const index = paymentSubjects.value.findIndex((v) => v.id === id);
  1224. if (index >= 0) {
  1225. form.value.paymentSubjectId = paymentSubjects.value[index].id;
  1226. }
  1227. }
  1228. function checkPermission(templatePermission) {
  1229. const all_permission = "*:*:*";
  1230. const permissions = useUserStore().permissions;
  1231. const hasPermissions = permissions.some((permission) => {
  1232. return (
  1233. all_permission === permission || templatePermission.includes(permission)
  1234. );
  1235. });
  1236. return hasPermissions;
  1237. }
  1238. init();
  1239. /** 暴露给父组件的方法 */
  1240. defineExpose({
  1241. open,
  1242. });
  1243. </script>