autogenerateDialog.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <template>
  2. <ele-modal
  3. custom-class="ele-dialog-form long-dialog-form"
  4. :centered="true"
  5. :visible="autogenerateDialogFlag"
  6. v-if="autogenerateDialogFlag"
  7. title="生成采购计划"
  8. append-to-body
  9. :close-on-click-modal="false"
  10. :width="isAuto ? '30%' : '50%'"
  11. :before-close="cancel"
  12. >
  13. <el-form ref="form" :model="form" class="el-form-box" v-if="!isAuto">
  14. <el-row>
  15. <!-- <headerTitle title="生成采购计划"></headerTitle>-->
  16. <el-col :span="24">
  17. <ele-pro-table
  18. ref="table"
  19. :needPage="false"
  20. :columns="generatePurchaseColumns"
  21. :max-height="300"
  22. :selection.sync="selection"
  23. :datasource="form.generatePurchaseTable"
  24. cache-key="generatePurchaseListTable17"
  25. class="time-form"
  26. >
  27. <!-- 表头工具栏 -->
  28. <!-- <template v-slot:toolbar>-->
  29. <!-- <el-form-item-->
  30. <!-- label="选择产品:"-->
  31. <!-- prop="generatePurchase"-->
  32. <!-- style="margin-bottom: 0"-->
  33. <!-- >-->
  34. <!-- <el-select-->
  35. <!-- v-model="generatePurchaseList"-->
  36. <!-- multiple-->
  37. <!-- clearable-->
  38. <!-- filterable-->
  39. <!-- collapse-tags-->
  40. <!-- placeholder="请选择"-->
  41. <!-- >-->
  42. <!-- <el-option-->
  43. <!-- v-for="item in commitData.productList"-->
  44. <!-- :key="item.productCode"-->
  45. <!-- :label="item.productName"-->
  46. <!-- :value="item.productCode"-->
  47. <!-- ></el-option>-->
  48. <!-- </el-select>-->
  49. <!-- </el-form-item>-->
  50. <!-- </template>-->
  51. <template v-slot:produceCycle="scope">
  52. <el-form-item
  53. :prop="
  54. 'generatePurchaseTable.' + scope.$index + '.produceCycle'
  55. "
  56. >
  57. <el-date-picker
  58. style="width: 100%"
  59. v-model="scope.row.produceCycle"
  60. type="date"
  61. disabled
  62. placeholder="选择日期"
  63. >
  64. </el-date-picker>
  65. </el-form-item>
  66. </template>
  67. <template v-slot:productionDays="scope">
  68. <el-form-item
  69. :prop="
  70. 'generatePurchaseTable.' + scope.$index + '.productionDays'
  71. "
  72. :rules="{
  73. required: true,
  74. pattern: positiveIntegerReg(),
  75. message: '请正确输入数量',
  76. trigger: ['blur', 'change']
  77. }"
  78. >
  79. <el-input
  80. @change="handleProduceDays(scope.row, scope.$index)"
  81. type="number"
  82. :min="1"
  83. disabled
  84. v-model="scope.row.productionDays"
  85. style="width: 100%"
  86. >
  87. <span slot="append">天</span>
  88. </el-input>
  89. </el-form-item>
  90. </template>
  91. <template v-slot:headerRequired="{ column }">
  92. <span class="is-required">{{ column.label }}</span>
  93. </template>
  94. </ele-pro-table>
  95. </el-col>
  96. </el-row>
  97. <!-- <el-row>-->
  98. <!-- <headerTitle title="生成生产计划"></headerTitle>-->
  99. <!-- <el-col :span="24">-->
  100. <!-- <el-form-item label="自动生成生产计划:" prop="generateProduce">-->
  101. <!-- <el-select-->
  102. <!-- v-model="generateProduceList"-->
  103. <!-- multiple-->
  104. <!-- clearable-->
  105. <!-- filterable-->
  106. <!-- collapse-tags-->
  107. <!-- placeholder="请选择"-->
  108. <!-- >-->
  109. <!-- <el-option-->
  110. <!-- v-for="item in commitData.productList"-->
  111. <!-- :key="item.productCode"-->
  112. <!-- :label="item.productName"-->
  113. <!-- :value="item.productCode"-->
  114. <!-- ></el-option>-->
  115. <!-- </el-select>-->
  116. <!-- </el-form-item>-->
  117. <!-- </el-col>-->
  118. <!-- </el-row>-->
  119. <!-- <el-row>-->
  120. <!-- <headerTitle title="生成项目立项"></headerTitle>-->
  121. <!-- <el-col :span="24">-->
  122. <!-- <el-form-item label="自动生成项目立项:" prop="generateProject">-->
  123. <!-- <el-select-->
  124. <!-- v-model="generateProjectList"-->
  125. <!-- multiple-->
  126. <!-- clearable-->
  127. <!-- filterable-->
  128. <!-- collapse-tags-->
  129. <!-- placeholder="请选择"-->
  130. <!-- >-->
  131. <!-- <el-option-->
  132. <!-- v-for="item in commitData.productList"-->
  133. <!-- :key="item.productCode"-->
  134. <!-- :label="item.productName"-->
  135. <!-- :value="item.productCode"-->
  136. <!-- ></el-option>-->
  137. <!-- </el-select>-->
  138. <!-- </el-form-item>-->
  139. <!-- </el-col>-->
  140. <!-- </el-row>-->
  141. </el-form>
  142. <div slot="footer" v-if="!isAuto">
  143. <el-button type="primary" @click="save">确定</el-button>
  144. <el-button @click="cancel">关闭</el-button>
  145. </div>
  146. <el-form
  147. ref="form"
  148. :model="form"
  149. :rules="rules"
  150. label-width="160px"
  151. class="el-form-box"
  152. v-if="isAuto"
  153. >
  154. <el-row>
  155. <el-col :span="24">
  156. <el-form-item label="自动生成采购计划:" prop="generatePurchase">
  157. <el-radio-group
  158. v-model="form.generatePurchase"
  159. @change="handleChange"
  160. >
  161. <el-radio :label="1">是</el-radio>
  162. <el-radio :label="0">否</el-radio>
  163. </el-radio-group>
  164. </el-form-item>
  165. </el-col>
  166. <el-col :span="24">
  167. <el-form-item label="自动生成生产计划:" prop="generateProduce">
  168. <el-radio-group v-model="form.generateProduce">
  169. <el-radio :label="1">是</el-radio>
  170. <el-radio :label="0">否</el-radio>
  171. </el-radio-group>
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="24">
  175. <el-form-item label="自动生成项目立项:" prop="generateProject">
  176. <el-radio-group v-model="form.generateProject">
  177. <el-radio :label="1">是</el-radio>
  178. <el-radio :label="0">否</el-radio>
  179. </el-radio-group>
  180. </el-form-item>
  181. </el-col>
  182. </el-row>
  183. </el-form>
  184. <div slot="footer" v-if="isAuto">
  185. <el-button type="primary" @click="save">确定</el-button>
  186. <el-button @click="cancel">关闭</el-button>
  187. </div>
  188. </ele-modal>
  189. </template>
  190. <script>
  191. import {
  192. saleOrderCheckCBomAPI,
  193. saleOrderGeneratePlanAPI
  194. } from '@/api/saleOrder';
  195. import { getSaleOrderDetail } from '@/api/saleManage/saleorder';
  196. import { positiveIntegerReg } from 'ele-admin';
  197. export default {
  198. name: 'autogenerateDialog',
  199. components: {},
  200. data() {
  201. return {
  202. form: {
  203. generatePurchase: 0,
  204. generateProduce: 0,
  205. generateProject: 0,
  206. generatePurchaseTable: [],
  207. generateProduceTable: [],
  208. generateProjectTable: []
  209. },
  210. generatePurchaseList: [],
  211. generateProduceList: [],
  212. generateProjectList: [],
  213. selection: [],
  214. commitData: {},
  215. isAuto: false,
  216. autogenerateDialogFlag: false,
  217. rules: {}
  218. };
  219. },
  220. watch: {
  221. generatePurchaseList: {
  222. handler(newVal, oldVal) {
  223. if (!newVal.length) {
  224. return (this.form.generatePurchaseTable = []);
  225. }
  226. if (newVal.length > oldVal.length) {
  227. const set1 = new Set(oldVal);
  228. let data = newVal.filter((item) => !set1.has(item));
  229. data.forEach((item) => {
  230. let find =
  231. this.commitData?.productList?.find(
  232. (i) => i.productCode === item
  233. ) || {};
  234. find.generatePurchase = 1;
  235. find.productionDays = find.productionDays || undefined;
  236. find.produceCycle = '';
  237. this.form.generatePurchaseTable.push(find);
  238. });
  239. } else {
  240. const set1 = new Set(newVal);
  241. this.form.generatePurchaseTable =
  242. this.form.generatePurchaseTable.filter((item) =>
  243. set1.has(item.productCode)
  244. );
  245. }
  246. },
  247. deep: true
  248. },
  249. generateProduceList: {
  250. handler(newVal, oldVal) {
  251. if (!newVal.length) {
  252. return (this.form.generateProduceTable = []);
  253. }
  254. if (newVal.length > oldVal.length) {
  255. const set1 = new Set(oldVal);
  256. let data = newVal.filter((item) => !set1.has(item));
  257. data.forEach((item) => {
  258. let find =
  259. this.commitData?.productList?.find(
  260. (i) => i.productCode === item
  261. ) || {};
  262. find.generateProduce = 1;
  263. this.form.generateProduceTable.push(find);
  264. });
  265. } else {
  266. const set1 = new Set(newVal);
  267. this.form.generateProduceTable =
  268. this.form.generateProduceTable.filter((item) =>
  269. set1.has(item.productCode)
  270. );
  271. }
  272. },
  273. deep: true
  274. },
  275. generateProjectList: {
  276. handler(newVal, oldVal) {
  277. if (!newVal.length) {
  278. return (this.form.generateProjectTable = []);
  279. }
  280. if (newVal.length > oldVal.length) {
  281. const set1 = new Set(oldVal);
  282. let data = newVal.filter((item) => !set1.has(item));
  283. data.forEach((item) => {
  284. let find =
  285. this.commitData?.productList?.find(
  286. (i) => i.productCode === item
  287. ) || {};
  288. find.generateProject = 1;
  289. this.form.generateProjectTable.push(find);
  290. });
  291. } else {
  292. const set1 = new Set(newVal);
  293. this.form.generateProjectTable =
  294. this.form.generateProjectTable.filter((item) =>
  295. set1.has(item.productCode)
  296. );
  297. }
  298. },
  299. deep: true
  300. }
  301. },
  302. computed: {
  303. generatePurchaseColumns() {
  304. return [
  305. {
  306. width: 45,
  307. type: 'selection',
  308. columnKey: 'selection',
  309. align: 'center'
  310. },
  311. {
  312. minWidth: 150,
  313. prop: 'productName',
  314. label: '名称',
  315. slot: 'productName',
  316. headerSlot: 'headerProductName',
  317. align: 'center'
  318. },
  319. {
  320. minWidth: 150,
  321. prop: 'productCode',
  322. label: '编码',
  323. slot: 'productName',
  324. align: 'center'
  325. },
  326. {
  327. minWidth: 150,
  328. prop: 'productionDays',
  329. label: '生产周期',
  330. slot: 'productionDays',
  331. headerSlot: 'headerRequired',
  332. align: 'center'
  333. },
  334. {
  335. minWidth: 170,
  336. prop: 'produceCycle',
  337. label: '到货时间',
  338. slot: 'produceCycle',
  339. headerSlot: 'headerRequired',
  340. align: 'center'
  341. },
  342. {
  343. width: 140,
  344. prop: 'customerExpectDeliveryDeadline',
  345. label: '客户期望交期',
  346. align: 'center'
  347. },
  348. {
  349. width: 140,
  350. prop: 'produceDeliveryDeadline',
  351. label: '生产交付交期',
  352. align: 'center'
  353. }
  354. ];
  355. }
  356. },
  357. methods: {
  358. positiveIntegerReg() {
  359. return positiveIntegerReg;
  360. },
  361. init(orderId, isAuto = false) {
  362. this.isAuto = isAuto;
  363. this.autogenerateDialogFlag = true;
  364. this.$nextTick(() => {
  365. this.getSaleOrderDetail(orderId);
  366. });
  367. },
  368. //获取订单详情
  369. async getSaleOrderDetail(id) {
  370. this.commitData = await getSaleOrderDetail(id);
  371. this.form.generatePurchaseTable = this.commitData.productList;
  372. this.form.generatePurchaseTable.forEach((item, index) => {
  373. this.handleProduceDays(item, index);
  374. });
  375. },
  376. handleProduceDays(row, index) {
  377. let newDate = new Date(row.customerExpectDeliveryDeadline);
  378. newDate.setDate(newDate.getDate() - row.productionDays);
  379. newDate = newDate.toISOString().split('T')[0];
  380. this.$set(
  381. this.form.generatePurchaseTable[index],
  382. 'produceCycle',
  383. newDate
  384. );
  385. },
  386. // async save() {
  387. // let saleOrderProductUpdatePOList = [
  388. // ...this.form.generatePurchaseTable,
  389. // ...this.form.generateProjectTable,
  390. // ...this.form.generateProduceTable
  391. // ];
  392. // if (!saleOrderProductUpdatePOList.length)
  393. // return this.$message.error('请选择生成数据');
  394. // if (
  395. // this.form.generatePurchaseTable.length > 0 &&
  396. // this.form.generatePurchaseTable.some(
  397. // (item) => !!item.productionDays == 0 || !item.produceCycle
  398. // )
  399. // )
  400. // return this.$message.error('生产周期和到货时间不能为空');
  401. // saleOrderProductUpdatePOList = saleOrderProductUpdatePOList.reduce(
  402. // (acc, curr) => {
  403. // const found = acc.find(
  404. // (item) => item.productCode === curr.productCode
  405. // );
  406. // if (!found) {
  407. // acc.push(curr);
  408. // }
  409. // return acc;
  410. // },
  411. // []
  412. // );
  413. // saleOrderProductUpdatePOList.forEach((item) => {
  414. // //合并生成采购计划
  415. // let generatePurchaseObj =
  416. // this.form.generatePurchaseTable.find(
  417. // (i) => i.productCode === item.productCode
  418. // ) || {};
  419. // item.generatePurchase = generatePurchaseObj.generatePurchase || 0;
  420. // //合并生成生产计划计划
  421. // let generateProduceObj =
  422. // this.form.generateProduceTable.find(
  423. // (i) => i.productCode === item.productCode
  424. // ) || {};
  425. // item.generateProduce = generateProduceObj.generateProduce || 0;
  426. // //合并生成项目数据
  427. // let generateProjectObj =
  428. // this.form.generateProjectTable.find(
  429. // (i) => i.productCode === item.productCode
  430. // ) || {};
  431. // item.generateProject = generateProjectObj.generateProject || 0;
  432. // });
  433. // let params = {
  434. // orderId: this.commitData.id,
  435. // saleOrderProductUpdatePOList
  436. // };
  437. // await saleOrderGeneratePlanAPI(params);
  438. // this.$message.success('操作成功');
  439. // this.cancel();
  440. // },
  441. async handleChange(val) {
  442. if (val == 1) {
  443. let ids = this.commitData.productList.map((i) => i.productId);
  444. try {
  445. await saleOrderCheckCBomAPI(ids);
  446. } catch (e) {
  447. return (this.form.generatePurchase = 0);
  448. }
  449. }
  450. if (
  451. val == 1 &&
  452. this.commitData.productList.some((item) => !item.productionDays)
  453. ) {
  454. this.$message.warning('生成采购计划生产周期不能为空,请在主数据维护');
  455. }
  456. },
  457. async save() {
  458. if (this.isAuto) {
  459. let isHaveProductionDays = true;
  460. this.commitData.productList.forEach((item) => {
  461. if (!item.productionDays && this.form.generatePurchase) {
  462. isHaveProductionDays = false;
  463. }
  464. item.generatePurchase = this.form.generatePurchase ? 1 : 0;
  465. item.generateProduce = this.form.generateProduce ? 1 : 0;
  466. item.generateProject = this.form.generateProject ? 1 : 0;
  467. });
  468. this.selection = this.commitData.productList;
  469. if (!isHaveProductionDays)
  470. return this.$message.error(
  471. '生成采购计划生产周期不能为空,请在主数据维护'
  472. );
  473. } else {
  474. if (!this.selection.length) {
  475. return this.$message.error('请选择需要生成采购计划的数据');
  476. }
  477. if (
  478. this.selection.some(
  479. (item) => !!item.productionDays == 0 || !item.produceCycle
  480. )
  481. )
  482. return this.$message.error('生产周期不能为空,请在主数据维护');
  483. this.selection.forEach((item) => {
  484. item.generatePurchase = 1;
  485. });
  486. }
  487. let params = {
  488. orderId: this.commitData.id,
  489. saleOrderProductUpdatePOList: this.selection
  490. };
  491. await saleOrderGeneratePlanAPI(params);
  492. if (this.isAuto) {
  493. this.$emit('handleSubmit', this.commitData.id);
  494. } else {
  495. this.$message.success('操作成功');
  496. this.$emit('reload');
  497. }
  498. this.cancel();
  499. },
  500. cancel() {
  501. this.autogenerateDialogFlag = false;
  502. this.form = {
  503. generatePurchase: 0,
  504. generateProduce: 0,
  505. generateProject: 0,
  506. generatePurchaseTable: [],
  507. generateProduceTable: [],
  508. generateProjectTable: []
  509. };
  510. this.generatePurchaseList = [];
  511. this.generateProduceList = [];
  512. this.generateProjectList = [];
  513. this.selection = [];
  514. this.commitData = {};
  515. }
  516. }
  517. };
  518. </script>
  519. <style scoped lang="scss"></style>