addDialog.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. <!-- 预收款新增/编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="70%"
  5. :visible="visible"
  6. :maxable="true"
  7. :append-to-body="true"
  8. :close-on-click-modal="false"
  9. custom-class="ele-dialog-form"
  10. :title="isDetail ? '预收款详情' : isUpdate ? '修改预收款' : '新增预收款'"
  11. @update:visible="updateVisible"
  12. >
  13. <!-- <div class="switch_left" v-if="isDetail">
  14. <ul>
  15. <li
  16. v-for="item in tabOptions"
  17. :key="item.key"
  18. :class="{ active: activeComp == item.key }"
  19. @click="activeComp = item.key"
  20. >
  21. {{ item.name }}
  22. </li>
  23. </ul>
  24. </div> -->
  25. <el-form
  26. ref="form"
  27. :model="form"
  28. :rules="rules"
  29. label-width="120px"
  30. v-show="activeComp == 'main'"
  31. >
  32. <!-- 基本信息 -->
  33. <headerTitle title="基本信息" size="16px"></headerTitle>
  34. <el-row :gutter="20">
  35. <el-col :span="8">
  36. <el-form-item label="预收日期:" prop="advanceDate">
  37. <el-date-picker
  38. v-model="form.advanceDate"
  39. type="date"
  40. placeholder="请选择"
  41. value-format="yyyy-MM-dd"
  42. style="width: 100%"
  43. :disabled="isDetail"
  44. />
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="预收金额:" prop="advanceTotalPrice">
  49. <el-input
  50. v-model="form.advanceTotalPrice"
  51. placeholder="请输入"
  52. :disabled="isDetail"
  53. >
  54. <template slot="append">元</template>
  55. </el-input>
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="8">
  59. <el-form-item label="会计科目:" prop="accountingSubjectId">
  60. <ele-tree-select
  61. clearable
  62. :disabled="isDetail"
  63. filterable
  64. ref="treeSelect"
  65. :data="accountingSubjectList"
  66. v-model="form.accountingSubjectId"
  67. valueKey="id"
  68. labelKey="name"
  69. placeholder="请选择"
  70. @change="changeSubjectInfo"
  71. default-expand-all
  72. />
  73. </el-form-item>
  74. </el-col>
  75. </el-row>
  76. <el-row :gutter="20">
  77. <el-col :span="8">
  78. <el-form-item label="客户名称:" prop="contactName">
  79. <el-input
  80. clearable
  81. v-model="form.contactName"
  82. @click.native="$refs.parentRef.open()"
  83. placeholder="请选择"
  84. readonly
  85. :disabled="isDetail"
  86. />
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="8">
  90. <el-form-item label="来源类型:" prop="sourceType">
  91. <el-select
  92. v-model="form.sourceType"
  93. placeholder="请选择"
  94. style="width: 100%"
  95. :disabled="isDetail"
  96. >
  97. <el-option label="销售订单" :value="3"></el-option>
  98. <el-option label="合同" :value="2"></el-option>
  99. </el-select>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="8">
  103. <el-form-item label="来源编码:" prop="sourceCode">
  104. <el-input
  105. clearable
  106. v-model="form.sourceCode"
  107. @click.native="openSource"
  108. placeholder="请选择"
  109. :disabled="isDetail"
  110. readonly
  111. />
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. <el-row :gutter="20">
  116. <el-col :span="8">
  117. <el-form-item label="款项类型:" prop="fundType">
  118. <DictSelection
  119. dictName="预收款款项类型"
  120. clearable
  121. v-model="form.fundType"
  122. :disabled="isDetail"
  123. >
  124. </DictSelection>
  125. </el-form-item>
  126. </el-col>
  127. <el-col :span="8">
  128. <el-form-item label="收款条件:" prop="collectionConditionName">
  129. <!-- <el-select
  130. v-model="form.collectionConditionId"
  131. placeholder="请选择"
  132. style="width: 100%"
  133. :disabled="isDetail"
  134. >
  135. <el-option
  136. v-for="item in collectionTermsOptions"
  137. :key="item.value"
  138. :label="item.label"
  139. :value="item.value"
  140. />
  141. </el-select> -->
  142. <el-input
  143. clearable
  144. v-model="form.collectionConditionName"
  145. @click.native="openReceiveTerms"
  146. placeholder="请选择"
  147. :disabled="isDetail"
  148. readonly
  149. />
  150. </el-form-item>
  151. </el-col>
  152. </el-row>
  153. <el-row :gutter="20">
  154. <el-col :span="8">
  155. <el-form-item label="备注:" prop="remark">
  156. <el-input
  157. v-model="form.remark"
  158. placeholder="请输入"
  159. :disabled="isDetail"
  160. />
  161. </el-form-item>
  162. </el-col>
  163. <el-col :span="8">
  164. <el-form-item label="附件:" prop="files">
  165. <fileMain
  166. v-model="form.files"
  167. :type="isDetail ? 'view' : 'add'"
  168. ></fileMain>
  169. </el-form-item>
  170. </el-col>
  171. </el-row>
  172. <!-- 物品清单 -->
  173. <headerTitle
  174. title="物品清单"
  175. size="16px"
  176. style="margin-top: 20px"
  177. ></headerTitle>
  178. <inventoryTableDetails
  179. ref="inventoryTableDetailsRef"
  180. :isAllPrice="false"
  181. :showSummary="true"
  182. :isSelected="false"
  183. cacheKeyUrl="eos-advanceReceipt-inventoryTableDetails"
  184. ></inventoryTableDetails>
  185. <!-- 收款信息 -->
  186. <div style="margin-top: 20px" v-if="isDetail">
  187. <headerTitle title="收款信息"></headerTitle>
  188. <div style="margin: 10px 0; font-size: 14px; color: #606266">
  189. <span>预收金额:{{ form.advanceTotalPrice || 0 }} 元</span>
  190. <span style="margin-left: 20px"
  191. >已收金额:{{ receivedAmount }} 元</span
  192. >
  193. <span style="margin-left: 20px"
  194. >未收金额:{{ unreceivedAmount }} 元</span
  195. >
  196. </div>
  197. <ele-pro-table
  198. ref="table"
  199. :needPage="false"
  200. :columns="columns"
  201. :datasource="form.detailList"
  202. :toolkit="[]"
  203. >
  204. <template v-slot:files="{ row: r }">
  205. <fileMain v-model="r.files" type="view"></fileMain>
  206. </template>
  207. </ele-pro-table>
  208. </div>
  209. </el-form>
  210. <template v-slot:footer>
  211. <template v-if="isDetail">
  212. <el-button @click="updateVisible(false)">关闭</el-button>
  213. </template>
  214. <template v-else>
  215. <el-button type="primary" :loading="loading" @click="save(0)">
  216. 保存
  217. </el-button>
  218. <el-button type="primary" :loading="loading" @click="save(1)">
  219. 提交
  220. </el-button>
  221. <el-button @click="updateVisible(false)">取消</el-button>
  222. </template>
  223. </template>
  224. <parentList ref="parentRef" @changeParent="changeParent"></parentList>
  225. <contractListDialog
  226. ref="selectContractRef"
  227. @changeParent="changeContract"
  228. :isChange="true"
  229. :contactData="{
  230. id: form.contactId
  231. }"
  232. ></contractListDialog>
  233. <!-- 销售订单 -->
  234. <saleOrderListDialog
  235. ref="saleOrderListDialogRef"
  236. :contactData="{
  237. id: form.contactId
  238. }"
  239. @changeParent="changeOrder"
  240. ></saleOrderListDialog>
  241. <!-- 收款条件 -->
  242. <receiveTermsDialog ref="receiveTermsDialogRef" conditionType="rules" @changeParent="changeReceiveTerms"></receiveTermsDialog>
  243. <bpmDetail
  244. v-if="activeComp === 'bpm' && form.processInstanceId"
  245. :id="form.processInstanceId"
  246. ></bpmDetail>
  247. </ele-modal>
  248. </template>
  249. <script>
  250. import headerTitle from '@/components/header-title';
  251. import inventoryTableDetails from '@/BIZComponents/inventoryTableDetails.vue';
  252. import bpmDetail from '@/views/bpm/processInstance/detail.vue';
  253. import { getDetail } from '@/api/contractManage/contractBook';
  254. import {
  255. addAdvanceReceipt,
  256. updateAdvanceReceipt,
  257. getAdvanceReceiptInfo,
  258. submit
  259. } from '@/api/financialManage/advanceReceipt';
  260. import { getTreeByPid } from '@/api/classifyManage';
  261. import parentList from '@/views/saleManage/contact/components/parentList.vue';
  262. import contractListDialog from '@/views/saleManage/saleOrder/components/contractListDialog.vue';
  263. import saleOrderListDialog from '@/views/saleManage/saleOrder/invoice/components/orderListDialog.vue'; //销售订单
  264. import { getSaleOrderDetail } from '@/api/saleManage/saleorder';
  265. import receiveTermsDialog from './receiveTermsDialog.vue';
  266. export default {
  267. components: {
  268. headerTitle,
  269. inventoryTableDetails,
  270. contractListDialog,
  271. saleOrderListDialog,
  272. parentList,
  273. bpmDetail,
  274. receiveTermsDialog
  275. },
  276. data() {
  277. return {
  278. activeComp: 'main',
  279. businessId: '',
  280. tabOptions: [
  281. { key: 'main', name: '预收款项' },
  282. { key: 'bpm', name: '流程详情' }
  283. ],
  284. columns: [
  285. {
  286. type: 'index',
  287. label: '序号',
  288. width: 55,
  289. align: 'center',
  290. fixed: 'left'
  291. },
  292. {
  293. prop: 'receivedDate',
  294. label: '收款时间',
  295. align: 'center',
  296. minWidth: 160,
  297. },
  298. {
  299. prop: 'receivedTotalPrice',
  300. label: '已收金额',
  301. align: 'center',
  302. minWidth: 140,
  303. slot: 'receivedTotalPrice'
  304. },
  305. {
  306. prop: 'paymentTypeName',
  307. label: '支付类型',
  308. align: 'center',
  309. minWidth: 140,
  310. },
  311. {
  312. prop: 'files',
  313. label: '附件',
  314. align: 'center',
  315. minWidth: 120,
  316. slot: 'files'
  317. },
  318. {
  319. prop: 'remark',
  320. label: '备注',
  321. align: 'center',
  322. minWidth: 140,
  323. slot: 'remark'
  324. }
  325. ],
  326. visible: false,
  327. loading: false,
  328. isUpdate: false,
  329. isDetail: false,
  330. customerOptions: [],
  331. sourceCodeOptions: [],
  332. collectionTermsOptions: [],
  333. accountingSubjectList: [],
  334. form: {
  335. id: null,
  336. code: '',
  337. advanceDate: '',
  338. advanceTotalPrice: '',
  339. accountingSubjectId: '1779719367139792005',
  340. accountingSubjectCode: '2203',
  341. accountingSubjectName: '预收账款',
  342. contactName: '',
  343. contactId: '',
  344. sourceType: 3,
  345. sourceCode: '',
  346. fundType: 1,
  347. collectionConditionId: '',
  348. collectionConditionName: '',
  349. remark: '',
  350. files: [],
  351. detailList: []
  352. },
  353. rules: {
  354. advanceDate: [
  355. { required: true, message: '请选择预收日期', trigger: 'change' }
  356. ],
  357. advanceTotalPrice: [
  358. { required: true, message: '请输入预收金额', trigger: 'blur' }
  359. ],
  360. accountingSubjectId: [
  361. { required: true, message: '请选择会计科目', trigger: 'change' }
  362. ],
  363. contactName: [
  364. { required: true, message: '请选择客户名称', trigger: 'change' }
  365. ],
  366. sourceType: [
  367. { required: true, message: '请选择来源类型', trigger: 'change' }
  368. ],
  369. sourceCode: [
  370. { required: true, message: '请选择来源编码', trigger: 'change' }
  371. ],
  372. fundType: [
  373. { required: true, message: '请选择款项类型', trigger: 'change' }
  374. ]
  375. }
  376. };
  377. },
  378. computed: {
  379. receivedAmount() {
  380. const list = this.form.detailList || [];
  381. return list
  382. .reduce((sum, item) => {
  383. const val = parseFloat(item.receivedTotalPrice);
  384. return sum + (isNaN(val) ? 0 : val);
  385. }, 0)
  386. .toFixed(2);
  387. },
  388. unreceivedAmount() {
  389. const total = parseFloat(this.form.advanceTotalPrice) || 0;
  390. const received = parseFloat(this.receivedAmount) || 0;
  391. return (total - received).toFixed(2);
  392. }
  393. },
  394. methods: {
  395. changeReceiveTerms(row, index) {
  396. console.log('changeReceiveTerms~~~', row)
  397. this.form.collectionConditionId = row.id;
  398. this.form.collectionConditionName = row.name;
  399. console.log('changeReceiveTerms!!!', this.form)
  400. this.$forceUpdate()
  401. },
  402. generateCode() {
  403. const now = new Date();
  404. const year = now.getFullYear();
  405. const month = String(now.getMonth() + 1).padStart(2, '0');
  406. const day = String(now.getDate()).padStart(2, '0');
  407. const random = String(Math.floor(Math.random() * 900) + 100);
  408. this.form.code = `YSK${year}${month}${day}${random}`;
  409. },
  410. async open(type, row) {
  411. this.visible = true;
  412. this.activeComp = 'main';
  413. await this.getClassifyList(24, 'accountingSubjectList');
  414. this.isUpdate = type === 'edit';
  415. this.isDetail = type === 'detail';
  416. if ((this.isUpdate || this.isDetail) && row) {
  417. this.form = await getAdvanceReceiptInfo(row.id);
  418. this.businessId = row.id;
  419. this.$nextTick(() => {
  420. this.$refs.inventoryTableDetailsRef &&
  421. this.$refs.inventoryTableDetailsRef.putTableValue(
  422. this.form || []
  423. );
  424. });
  425. } else {
  426. this.resetForm();
  427. // this.generateCode();
  428. this.$nextTick(() => {
  429. this.$refs.inventoryTableDetailsRef &&
  430. this.$refs.inventoryTableDetailsRef.putTableValue([]);
  431. });
  432. this.form.accountingSubjectId = '1779719367139792005';
  433. this.form.accountingSubjectCode = '2203';
  434. this.form.accountingSubjectName = '预收账款';
  435. }
  436. this.$nextTick(() => {
  437. this.$refs.form && this.$refs.form.clearValidate();
  438. });
  439. },
  440. changeSubjectInfo(val) {
  441. const { code, name } = this.$refs.treeSelect.getNodeByValue(val);
  442. this.form.accountingSubjectCode = code;
  443. this.form.accountingSubjectName = name;
  444. },
  445. //获取分类管理中的数据
  446. async getClassifyList(id, listName) {
  447. let res = await getTreeByPid(id);
  448. this[listName] = res.data;
  449. },
  450. async changeParent(obj) {
  451. this.form.contactName = obj.name;
  452. this.form.contactId = obj.id;
  453. },
  454. openSource() {
  455. if (!this.form.contactName) {
  456. this.$message.error('请选择客户');
  457. return;
  458. }
  459. if (!this.form.sourceType) {
  460. this.$message.error('请选择来源类型');
  461. return;
  462. }
  463. if (this.form.sourceType == 3) {
  464. this.$refs.saleOrderListDialogRef.open();
  465. } else {
  466. this.$refs.selectContractRef.open();
  467. }
  468. },
  469. openReceiveTerms() {
  470. this.$refs.receiveTermsDialogRef.open();
  471. },
  472. async changeOrder(row) {
  473. this.form.sourceCode = row.orderNo;
  474. this.form.sourceId = row.id;
  475. const { productList, receiptPaymentList, payAmount } =
  476. await getSaleOrderDetail(row.id);
  477. this.$refs.inventoryTableDetailsRef.putTableValue({ productList });
  478. this.form.advanceTotalPrice = payAmount;
  479. },
  480. async changeContract(row) {
  481. console.log(row, 'dadas');
  482. this.form.sourceCode = row.contractNumber;
  483. this.form.sourceId = row.id;
  484. const { productList, receiptPaymentList, contractVO } = await getDetail(
  485. row.id
  486. );
  487. this.$refs.inventoryTableDetailsRef.putTableValue({ productList });
  488. this.form.advanceTotalPrice = contractVO.discountTotalPrice;
  489. },
  490. resetForm() {
  491. this.form = {
  492. id: null,
  493. code: '',
  494. advanceDate: '',
  495. advanceTotalPrice: '',
  496. accountingSubjectId: '1779719367139792005',
  497. accountingSubjectCode: '2203',
  498. accountingSubjectName: '预收账款',
  499. contactName: '',
  500. contactId: '',
  501. sourceType: 3,
  502. sourceCode: '',
  503. sourceId: '',
  504. fundType: 1,
  505. collectionConditionId: '',
  506. collectionConditionName: '',
  507. remark: '',
  508. files: [],
  509. detailList: []
  510. };
  511. },
  512. save(type) {
  513. this.$refs.form.validate((valid) => {
  514. if (!valid) return;
  515. this.loading = true;
  516. const saveOrUpdate = this.isUpdate
  517. ? updateAdvanceReceipt
  518. : addAdvanceReceipt;
  519. saveOrUpdate(this.form)
  520. .then((res) => {
  521. this.loading = false;
  522. this.$message.success(this.isUpdate ? '修改成功' : '新增成功');
  523. if(type === 1) {
  524. this.sub(res);
  525. }
  526. this.$emit('done');
  527. })
  528. .catch(() => {
  529. this.loading = false;
  530. });
  531. });
  532. },
  533. async sub(res) {
  534. const data = await getAdvanceReceiptInfo(
  535. this.businessId || res
  536. );
  537. submit(data.id).then(() => {
  538. this.$message.success('提交成功');
  539. })
  540. },
  541. updateVisible(value) {
  542. this.visible = value;
  543. if (!value) {
  544. this.resetForm();
  545. }
  546. }
  547. }
  548. };
  549. </script>