autogenerateDialog.vue 18 KB

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