addDialog.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. <template>
  2. <ele-modal
  3. custom-class="ele-dialog-form long-dialog-form"
  4. :centered="true"
  5. v-if="visible"
  6. :visible.sync="visible"
  7. :title="title"
  8. :close-on-click-modal="false"
  9. width="80%"
  10. :maxable="true"
  11. :resizable="true"
  12. @close="cancel"
  13. >
  14. <el-form
  15. ref="form"
  16. :model="form"
  17. :rules="rules"
  18. class="el-form-box"
  19. label-width="120px"
  20. >
  21. <headerTitle title="基本信息"></headerTitle>
  22. <el-row>
  23. <el-col :span="12">
  24. <el-form-item label="需求类型" prop="sourceType">
  25. <el-select
  26. v-model="form.sourceType"
  27. placeholder="请选择"
  28. style="width: 100%"
  29. clearable
  30. @change="handleSourceType"
  31. >
  32. <el-option
  33. v-for="item in requirementSourceType"
  34. :key="item.value"
  35. :label="item.label"
  36. :value="item.value"
  37. >
  38. </el-option>
  39. </el-select>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="12">
  43. <el-form-item label="需求单名称" prop="requirementName">
  44. <el-input
  45. v-model="form.requirementName"
  46. placeholder="请输入"
  47. ></el-input>
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="12">
  51. <el-form-item label="需求部门" prop="requireDeptId">
  52. <ele-tree-select
  53. clearable
  54. :data="groupTreeData"
  55. v-model="form.requireDeptId"
  56. valueKey="id"
  57. labelKey="name"
  58. placeholder="请选择"
  59. @change="change_principalDep"
  60. default-expand-all
  61. />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form-item label="需求人" prop="requireUserId">
  66. <personSelect
  67. ref="directorRef"
  68. v-model="form.requireUserId"
  69. @selfChange="salesmanChange"
  70. :init="false"
  71. />
  72. </el-form-item>
  73. </el-col>
  74. <!-- v-if="form.sourceType==1"-->
  75. <el-col v-if="form.sourceType == 1" :span="12">
  76. <el-form-item label="销售合同">
  77. <el-input
  78. clearable
  79. v-model="form.saleContractName"
  80. @click.native="handleContractBtn"
  81. @clear="clearContrcat"
  82. placeholder="请选择"
  83. />
  84. </el-form-item>
  85. </el-col>
  86. <el-col v-if="form.sourceType == 1" :span="12">
  87. <el-form-item label="销售订单">
  88. <el-input
  89. clearable
  90. v-model="form.saleOrderNo"
  91. @click.native="handleOrderBtn"
  92. placeholder="请输入"
  93. @clear="clearSaleOrder"
  94. />
  95. </el-form-item>
  96. </el-col>
  97. <el-col :span="12">
  98. <el-form-item prop="remark" label="是否接受拆单" label-width="120px">
  99. <el-select
  100. v-model="form.acceptUnpack"
  101. placeholder="请选择"
  102. clearable
  103. style="width: 100%"
  104. >
  105. <el-option
  106. v-for="item in acceptUnpackList"
  107. :key="item.value"
  108. :label="item.label"
  109. :value="item.value"
  110. >
  111. </el-option>
  112. </el-select>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="12">
  116. <el-form-item label="用途" prop="useTo">
  117. <el-input
  118. type="textarea"
  119. resize="none"
  120. v-model="form.useTo"
  121. :rows="2"
  122. placeholder="请输入"
  123. size="small"
  124. maxlength="200"
  125. ></el-input>
  126. </el-form-item>
  127. </el-col>
  128. <el-col :span="12">
  129. <el-form-item prop="remark" label="备注">
  130. <el-input
  131. type="textarea"
  132. resize="none"
  133. v-model="form.remark"
  134. :rows="2"
  135. placeholder="请输入"
  136. size="small"
  137. maxlength="200"
  138. ></el-input>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="12">
  142. <el-form-item prop="files" label="附件">
  143. <fileMain v-model="form.fileId"></fileMain>
  144. <!-- <fileUpload
  145. v-model="form.files"
  146. module="main"
  147. :showLib="false"
  148. :limit="1"
  149. /> -->
  150. </el-form-item>
  151. </el-col>
  152. </el-row>
  153. </el-form>
  154. <div slot="footer" class="footer">
  155. <el-button type="primary" @click="save" v-click-once>保存</el-button>
  156. <el-button type="primary" @click="save('sub')" v-click-once
  157. >提交</el-button
  158. >
  159. <el-button @click="cancel">返回</el-button>
  160. </div>
  161. <headerTitle title="需求清单"></headerTitle>
  162. <inventoryTable
  163. ref="inventoryTable"
  164. :delDetailIds="delDetailIds"
  165. ></inventoryTable>
  166. <contractListDialog
  167. ref="selectContractRef"
  168. @changeParent="changeContract"
  169. :hasGeneratedOrder="''"
  170. :isAdd="true"
  171. ></contractListDialog>
  172. <orderListDialog
  173. ref="orderListDialogRef"
  174. @changeParent="changeOrder"
  175. ></orderListDialog>
  176. <process-submit-dialog
  177. api-fun-name="purchaserequirementStatusAPI"
  178. :processSubmitDialogFlag.sync="processSubmitDialogFlag"
  179. v-if="processSubmitDialogFlag"
  180. ref="processSubmitDialogRef"
  181. @reload="reload"
  182. ></process-submit-dialog>
  183. </ele-modal>
  184. </template>
  185. <script>
  186. import inventoryTable from './inventoryTable.vue';
  187. import fileUpload from '@/components/upload/fileUpload';
  188. import dictMixins from '@/mixins/dictMixins';
  189. import deptSelect from '@/components/CommomSelect/dept-select.vue';
  190. import personSelect from '@/components/CommomSelect/person-select.vue';
  191. import parentList from '@/views/saleManage/contact/components/parentList.vue';
  192. import {
  193. addPurchaseNeedManage,
  194. getDetail,
  195. UpdateInformation,
  196. submit
  197. } from '@/api/purchasingManage/purchaseNeedManage';
  198. import headList from '@/BIZComponents/user-select/user-select.vue';
  199. import { copyObj } from '@/utils/util';
  200. import { listOrganizations } from '@/api/system/organization';
  201. import contractListDialog from '@/views/saleManage/saleOrder/components/contractListDialog.vue';
  202. import orderListDialog from '@/views/saleManage/saleOrder/invoice/components/orderListDialog.vue';
  203. import { getTableList as getSaleOrderListAPI } from '@/api/saleManage/saleorder';
  204. // import fileMain from '@/components/addDoc/index';
  205. import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
  206. import { getSaleOrderDetail } from '@/api/saleManage/saleorder';
  207. import { requirementSourceType } from '@/enum/dict.js';
  208. export default {
  209. props: {
  210. categoryTreeList: Array
  211. },
  212. mixins: [dictMixins],
  213. components: {
  214. processSubmitDialog,
  215. orderListDialog,
  216. contractListDialog,
  217. fileUpload,
  218. headList,
  219. inventoryTable,
  220. deptSelect,
  221. parentList,
  222. personSelect
  223. // fileMain,
  224. },
  225. data() {
  226. let formDef = {
  227. id: '',
  228. receiveDate: null,
  229. remark: null,
  230. requireDeptId: '',
  231. requireDeptName: '',
  232. requireUserId: '',
  233. requireUserName: '',
  234. sourceCode: '',
  235. sourceId: '',
  236. sourceType: '',
  237. requirementName: '',
  238. saleContractName: '',
  239. saleContractNo: '',
  240. saleContractId: '',
  241. saleOrderId: '',
  242. saleOrderNo: '',
  243. files: [],
  244. acceptUnpack: 1,
  245. fileId: [] //附件集合
  246. };
  247. return {
  248. clearing: false, //是否清除合同
  249. visible: false,
  250. processSubmitDialogFlag: false,
  251. fullscreen: false,
  252. title: '',
  253. requirementSourceType,
  254. delDetailIds: [],
  255. formDef,
  256. form: copyObj(formDef),
  257. acceptUnpackList: [
  258. {
  259. label: '接受',
  260. value: 1
  261. },
  262. {
  263. label: '不接受',
  264. value: 0
  265. }
  266. ],
  267. rules: {
  268. requireDeptId: [
  269. { required: true, message: '请选择需求部门', trigger: 'change' }
  270. ],
  271. requirementName: [
  272. { required: true, message: '请输入需求单名称', trigger: 'blur' }
  273. ],
  274. requireUserId: [
  275. { required: true, message: '请选择需求人', trigger: 'change' }
  276. ],
  277. useTo: [{ required: true, message: '请输入用途', trigger: 'change' }],
  278. sourceType: [
  279. { required: true, message: '请选择订单类型', trigger: 'change' }
  280. ]
  281. },
  282. // 提交状态
  283. loading: false,
  284. // 是否是修改
  285. isUpdate: false,
  286. // 组织机构树形结构数据
  287. groupTreeData: [],
  288. // 组织机构平铺数据
  289. groupData: [],
  290. businessId: ''
  291. };
  292. },
  293. created() {
  294. this.getGroupAll();
  295. },
  296. methods: {
  297. listFormatte(data) {
  298. return data;
  299. // return data.filter((item) => item.dictCode != 1);
  300. },
  301. // 获取公司数据
  302. getGroupAll() {
  303. listOrganizations().then((list) => {
  304. this.groupData = list;
  305. this.groupTreeData = this.$util.toTreeData({
  306. data: list,
  307. idField: 'id',
  308. parentIdField: 'parentId'
  309. });
  310. });
  311. },
  312. // 选择负责人部门
  313. change_principalDep(id) {
  314. const info = this.groupData.find((e) => e.id == id);
  315. console.log(info);
  316. this.form.requireDeptName = info.name;
  317. this.form.requireUserId = '';
  318. this.form.requireUserName = '';
  319. // 根据部门获取人员
  320. this.$nextTick(() => {});
  321. this.getrequireUser(id);
  322. },
  323. // //选择需求类型
  324. // chaengSource(data) {
  325. // this.form.sourceType = data?.dictValue;
  326. // },
  327. getrequireUser(groupId) {
  328. if (groupId) {
  329. this.$refs.directorRef.getList({ groupId });
  330. }
  331. },
  332. salesmanChange(val, info) {
  333. this.form.requireUserName = info.name;
  334. },
  335. //获取详情
  336. async getDetailData(id) {
  337. this.businessId = id;
  338. this.loading = true;
  339. const data = await getDetail(id);
  340. this.loading = false;
  341. if (data) {
  342. this.form = data;
  343. this.$nextTick(() => {
  344. // if (data.files !== '') {
  345. // this.$set(this.form, 'files', data?.files);
  346. // }
  347. // 根据部门获取人员
  348. if (this.form.fileId) {
  349. this.form.fileId = JSON.parse(this.form.fileId);
  350. }
  351. this.$refs.inventoryTable &&
  352. this.$refs.inventoryTable.putTableValue(data.detailList);
  353. this.getrequireUser(this.form.requireDeptId);
  354. });
  355. }
  356. },
  357. async open(type, row, contactCategoryId) {
  358. this.title = type === 'add' ? '新增' : '修改';
  359. this.row = row;
  360. this.visible = true;
  361. if (type == 'add') {
  362. this.isUpdate = false;
  363. this.$nextTick(() => {
  364. this.form.requireDeptId = this.$store.getters.user.info.groupId;
  365. this.form.requireUserId = this.$store.getters.user.info.userId;
  366. this.form.requireDeptName = this.$store.getters.user.info.groupName;
  367. this.form.requireUserName = this.$store.getters.user.info.name;
  368. console.log(this.$store.getters.user.info.groupName);
  369. this.getrequireUser(this.form.requireDeptId);
  370. });
  371. } else {
  372. this.isUpdate = true;
  373. await this.getDetailData(row.id);
  374. }
  375. },
  376. //选择合同弹框
  377. handleContractBtn() {
  378. if (this.clearing) return;
  379. let item = {
  380. id: this.form.saleContractId
  381. };
  382. this.$refs.selectContractRef.open(item);
  383. },
  384. //选择合同回调
  385. changeContract(obj) {
  386. this.form = Object.assign({}, this.form, {
  387. saleContractId: obj.id,
  388. saleContractName: obj.contractName,
  389. saleContractNo: obj.contractNo
  390. });
  391. this.getSaleOrderList(this.form.saleContractId);
  392. },
  393. /* 表格数据源 */
  394. async getSaleOrderList(contractId) {
  395. let res = await getSaleOrderListAPI({
  396. pageNum: 1,
  397. size: 10,
  398. contractId
  399. });
  400. this.form.saleOrderId = res.list[0]?.id;
  401. this.form.saleOrderNo = res.list[0]?.orderNo;
  402. this.getSaleOrderDetail(this.form.saleOrderId);
  403. },
  404. //清除合同
  405. clearContrcat() {
  406. this.clearing = true;
  407. this.form.saleContractNo = '';
  408. this.form.saleContractId = '';
  409. this.form.saleContractName = '';
  410. setTimeout(() => {
  411. this.clearing = false;
  412. }, 500);
  413. },
  414. handleSourceType() {
  415. this.form.saleOrderId = '';
  416. this.form.saleOrderNo = '';
  417. this.form.saleContractNo = '';
  418. this.form.saleContractId = '';
  419. this.form.saleContractName = '';
  420. },
  421. //选择订单弹框
  422. handleOrderBtn() {
  423. if (this.clearing) return;
  424. let item = {
  425. id: this.form.saleOrderId
  426. };
  427. this.$refs.orderListDialogRef.open(item);
  428. },
  429. //选择订单回调
  430. async changeOrder(obj) {
  431. this.form = Object.assign({}, this.form, {
  432. saleOrderId: obj.id,
  433. saleOrderNo: obj.orderNo,
  434. saleContractId: obj.contractId,
  435. saleContractName: obj.contractName,
  436. saleContractNo: obj.contractNo
  437. });
  438. this.getSaleOrderDetail(obj.id);
  439. },
  440. async getSaleOrderDetail(id) {
  441. const data = await getSaleOrderDetail(id);
  442. data.productList.forEach((item) => {
  443. item.expectReceiveDate = item.produceDeliveryDeadline;
  444. item.arrivalWay = 1;
  445. });
  446. this.$nextTick(() => {
  447. this.$refs.inventoryTable.putTableValue(data.productList);
  448. });
  449. },
  450. //清除订单
  451. clearSaleOrder() {
  452. this.clearing = true;
  453. this.form.saleOrderId = '';
  454. this.form.saleOrderNo = '';
  455. setTimeout(() => {
  456. this.clearing = false;
  457. }, 500);
  458. },
  459. getValidate() {
  460. return Promise.all([
  461. new Promise((resolve, reject) => {
  462. this.$refs.form.validate((valid) => {
  463. if (!valid) {
  464. reject(false);
  465. } else {
  466. resolve(true);
  467. }
  468. });
  469. }),
  470. new Promise((resolve, reject) => {
  471. this.$refs.inventoryTable.validateForm((valid) => {
  472. if (!valid) {
  473. reject(false);
  474. } else {
  475. resolve(true);
  476. }
  477. });
  478. })
  479. ]);
  480. },
  481. async save(type) {
  482. try {
  483. await this.getValidate();
  484. // 表单验证通过,执行保存操作
  485. this.loading = true;
  486. let isArrivalBatch = false;
  487. let detailList = this.$refs.inventoryTable.getTableValue();
  488. if (!this.isUpdate) {
  489. delete this.form.id;
  490. }
  491. if (detailList.length == 0) {
  492. this.$message.warning('需求清单不能为空');
  493. return;
  494. }
  495. detailList.forEach((v) => {
  496. if (
  497. v.arrivalWay == 2 &&
  498. (!v.arrivalBatch || v.arrivalBatch.length == 0)
  499. ) {
  500. isArrivalBatch = true;
  501. }
  502. });
  503. if (isArrivalBatch) {
  504. this.$message.warning('请设置分批时间');
  505. return;
  506. }
  507. this.form.files = this.form.files || [];
  508. this.form.sourceTypeName = this.requirementSourceType.find(
  509. (val) => val.value == this.form.sourceType
  510. )?.label;
  511. if (this.form.fileId) {
  512. this.form.fileId = JSON.stringify(this.form.fileId);
  513. }
  514. let commitData = Object.assign({}, this.form, {
  515. detailList
  516. });
  517. if (this.isUpdate) {
  518. UpdateInformation(commitData)
  519. .then((res) => {
  520. this.loading = false;
  521. this.$message.success('修改成功');
  522. if (type === 'sub') {
  523. this.saleOrderSubmit(res);
  524. return;
  525. }
  526. this.cancel();
  527. this.$emit('done');
  528. })
  529. .catch((e) => {
  530. //this.loading = false;
  531. });
  532. } else {
  533. addPurchaseNeedManage(commitData)
  534. .then((res) => {
  535. this.loading = false;
  536. this.$message.success('新增成功');
  537. if (type === 'sub') {
  538. this.saleOrderSubmit(res);
  539. return;
  540. }
  541. this.cancel();
  542. this.$emit('done');
  543. })
  544. .catch((e) => {
  545. //this.loading = false;
  546. });
  547. }
  548. } catch (error) {
  549. console.log(error);
  550. // 表单验证未通过,不执行保存操作
  551. }
  552. },
  553. async saleOrderSubmit(res) {
  554. console.log('getDetail~~~', this.businessId, res);
  555. const data = await getDetail(this.businessId || res);
  556. this.processSubmitDialogFlag = true;
  557. this.$nextTick(() => {
  558. let params = {
  559. businessId: data.id,
  560. businessKey: 'purchase_requirement_approve_tg',
  561. formCreateUserId: data.createUserId,
  562. variables: {
  563. businessCode: data.requirementCode,
  564. businessName: data.requirementName,
  565. businessType: data.sourceTypeName
  566. }
  567. // callBackMethodType : '1',
  568. // callBackMethod : 'proTargetPlanApproveApiImpl.updatePlanApprovalStatus',
  569. // pcHandle : '/bpm/handleTask/components/project-manage/plan-manage/submit.vue',
  570. // pcView : '/bpm/handleTask/components/project-manage/plan-manage/detailDialog.vue',
  571. // miniHandle : '',
  572. // miniView : '',
  573. };
  574. this.$refs.processSubmitDialogRef.init(params);
  575. });
  576. // submit({
  577. // businessId: this.businessId || res
  578. // // productionSupervisorId
  579. // }).then((res) => {
  580. // this.cancel();
  581. // this.$emit('done');
  582. // });
  583. },
  584. reload() {
  585. this.cancel();
  586. this.$emit('done');
  587. },
  588. cancel() {
  589. this.$nextTick(() => {
  590. this.activeName = 'base';
  591. // 关闭后,销毁所有的表单数据
  592. this.$refs['otherForm'] && this.$refs['otherForm'].resetFields();
  593. this.$refs['formRef'] && this.$refs['formRef'].resetFields();
  594. this.form = copyObj(this.formDef);
  595. this.visible = false;
  596. });
  597. }
  598. }
  599. };
  600. </script>
  601. <style scoped lang="scss">
  602. .TotalAmount {
  603. font-size: 16px;
  604. padding-right: 30px;
  605. }
  606. </style>