unpackDialog.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <template>
  2. <ele-modal
  3. width="60vw"
  4. :visible.sync="visible"
  5. :close-on-click-modal="false"
  6. custom-class="ele-dialog-form"
  7. :title="'拆分计划'"
  8. >
  9. <div class="form-wrapper">
  10. <el-form :model="requestData" label-width="0" :show-message="false">
  11. <el-descriptions title="" :column="2" border>
  12. <el-descriptions-item label="计划编号">
  13. {{ formData.joinPlanCode }}</el-descriptions-item
  14. >
  15. <el-descriptions-item label="产品编码">{{
  16. formData.productCode
  17. }}</el-descriptions-item>
  18. <el-descriptions-item label="产品名称">{{
  19. formData.productName
  20. }}</el-descriptions-item>
  21. <el-descriptions-item label="牌号|型号">
  22. {{ formData.brandNo }}|{{ formData.model }}</el-descriptions-item
  23. >
  24. <el-descriptions-item label="批次号">{{
  25. formData.batchNo
  26. }}</el-descriptions-item>
  27. <el-descriptions-item label="工艺路线">{{
  28. formData.produceRoutingName
  29. }}</el-descriptions-item>
  30. <el-descriptions-item label="要求生产数量">{{
  31. formData.requiredFormingNum
  32. }}</el-descriptions-item>
  33. <el-descriptions-item label="要求生产日期">{{
  34. formData.reqMoldTime
  35. }}</el-descriptions-item>
  36. </el-descriptions>
  37. </el-form>
  38. <headerTitle title="剩余拆单" class="mt20"> </headerTitle>
  39. <el-form ref="form" :model="form" :rules="rules">
  40. <ele-pro-table
  41. ref="table"
  42. :needPage="false"
  43. :columns="columns"
  44. :datasource="form.surplusUnpack"
  45. >
  46. <template v-slot:toolbar>
  47. <el-button
  48. size="small"
  49. type="primary"
  50. icon="el-icon-plus"
  51. class="ele-btn-icon"
  52. :disabled="requiredFormingNum == 0 ? true : false"
  53. @click="openUnpack"
  54. >
  55. 拆单
  56. </el-button>
  57. </template>
  58. <template v-slot:requiredFormingNum="scope">
  59. <el-form-item
  60. v-if="requiredFormingNum != 0"
  61. :prop="'surplusUnpack.' + scope.$index + '.requiredFormingNum'"
  62. :rules="[
  63. {
  64. required: true,
  65. message: '请输入要求生产数量',
  66. trigger: 'change'
  67. },
  68. {
  69. pattern: /^\d+(\.{0,1}\d+){0,1}$/,
  70. message: '拆单数超过生产数量',
  71. trigger: ['blur', 'change']
  72. }
  73. ]"
  74. >
  75. <el-input
  76. disabled
  77. v-model="requiredFormingNum"
  78. placeholder="请输入"
  79. ></el-input>
  80. </el-form-item>
  81. <el-form-item v-else> 工单已全部拆完 </el-form-item>
  82. </template>
  83. <template v-slot:reqMoldTime="scope">
  84. <el-form-item
  85. v-if="requiredFormingNum != 0"
  86. :prop="'surplusUnpack.' + scope.$index + '.reqMoldTime'"
  87. :rules="{
  88. required: true,
  89. message: '请选择开始计划时间',
  90. trigger: 'change'
  91. }"
  92. >
  93. <el-date-picker
  94. class="w100"
  95. v-model="scope.row.reqMoldTime"
  96. type="date"
  97. value-format="yyyy-MM-dd"
  98. ></el-date-picker>
  99. </el-form-item>
  100. </template>
  101. </ele-pro-table>
  102. <headerTitle title="拆单" class="mt20"> </headerTitle>
  103. <ele-pro-table
  104. ref="table"
  105. :needPage="false"
  106. :columns="columns2"
  107. :datasource="form.unpackList"
  108. >
  109. <template v-slot:requiredFormingNum="scope">
  110. <el-form-item
  111. :prop="'unpackList.' + scope.$index + '.requiredFormingNum'"
  112. :rules="{
  113. required: true,
  114. message: '请输入要求生产数量',
  115. trigger: 'change'
  116. }"
  117. >
  118. <el-input-number
  119. type="number"
  120. @change="changeNum(scope.$index)"
  121. :min="0"
  122. v-model="scope.row.requiredFormingNum"
  123. placeholder="请输入"
  124. ></el-input-number>
  125. </el-form-item>
  126. </template>
  127. <template v-slot:reqMoldTime="scope">
  128. <el-form-item
  129. :prop="'unpackList.' + scope.$index + '.reqMoldTime'"
  130. :rules="{
  131. required: true,
  132. message: '请选择开始计划时间',
  133. trigger: 'change'
  134. }"
  135. >
  136. <el-date-picker
  137. class="w100"
  138. v-model="scope.row.reqMoldTime"
  139. type="date"
  140. value-format="yyyy-MM-dd"
  141. ></el-date-picker>
  142. </el-form-item>
  143. </template>
  144. <template v-slot:action="{ $index }">
  145. <el-popconfirm
  146. class="ele-action"
  147. title="确定要删除此子单吗?"
  148. @confirm="remove($index)"
  149. >
  150. <template v-slot:reference>
  151. <el-link type="danger" :underline="false" icon="el-icon-delete">
  152. 删除
  153. </el-link>
  154. </template>
  155. </el-popconfirm>
  156. </template>
  157. </ele-pro-table>
  158. </el-form>
  159. </div>
  160. <div slot="footer">
  161. <el-button plain @click="cancel">取消</el-button>
  162. <el-button type="primary" @click="confirm">确定</el-button>
  163. </div>
  164. </ele-modal>
  165. </template>
  166. <script>
  167. import { deepClone } from '@/utils';
  168. import { splitWork } from '@/api/productionPlan/index.js';
  169. export default {
  170. components: {},
  171. data() {
  172. return {
  173. visible: false,
  174. formData: {},
  175. requestData: {
  176. deviceCode: '',
  177. deviceName: '',
  178. deviceId: ''
  179. },
  180. requiredFormingNum: 0,
  181. form: {
  182. surplusUnpack: [],
  183. unpackList: []
  184. },
  185. rules: {},
  186. columns: [
  187. {
  188. prop: 'batchNo',
  189. label: '批次号',
  190. align: 'center',
  191. minWidth: 100,
  192. showOverflowTooltip: true
  193. },
  194. {
  195. prop: 'joinPlanCode',
  196. label: '计划编号',
  197. align: 'center',
  198. minWidth: 200
  199. },
  200. {
  201. prop: 'requiredFormingNum',
  202. label: '要求生产数量',
  203. align: 'center',
  204. slot: 'requiredFormingNum',
  205. minWidth: 200
  206. },
  207. {
  208. prop: 'reqMoldTime',
  209. label: '要求生产日期',
  210. align: 'center',
  211. slot: 'reqMoldTime',
  212. minWidth: 200
  213. }
  214. ],
  215. columns2: [
  216. {
  217. prop: 'batchNo',
  218. label: '批次号',
  219. align: 'center',
  220. minWidth: 100,
  221. showOverflowTooltip: true
  222. },
  223. {
  224. prop: 'joinPlanCode',
  225. label: '计划编号',
  226. align: 'center',
  227. minWidth: 200
  228. },
  229. {
  230. prop: 'requiredFormingNum',
  231. label: '要求生产数量',
  232. align: 'center',
  233. slot: 'requiredFormingNum',
  234. minWidth: 200
  235. },
  236. {
  237. prop: 'reqMoldTime',
  238. label: '要求生产日期',
  239. align: 'center',
  240. slot: 'reqMoldTime',
  241. minWidth: 200
  242. },
  243. {
  244. columnKey: 'action',
  245. label: '操作',
  246. width: 160,
  247. align: 'center',
  248. resizable: false,
  249. fixed: 'right',
  250. slot: 'action',
  251. showOverflowTooltip: true
  252. }
  253. ]
  254. };
  255. },
  256. methods: {
  257. open(row) {
  258. this.visible = true;
  259. this.formData = deepClone(row);
  260. this.requiredFormingNum = this.formData.requiredFormingNum;
  261. this.form.surplusUnpack = [];
  262. this.form.unpackList = [];
  263. this.setSurplus();
  264. },
  265. setSurplus() {
  266. this.form.surplusUnpack.push({
  267. joinPlanCode: this.formData.code,
  268. requiredFormingNum: this.formData.requiredFormingNum,
  269. batchNo: this.formData.batchNo,
  270. reqMoldTime: '',
  271. isCopy: 1
  272. });
  273. },
  274. openUnpack() {
  275. this.form.unpackList.push({
  276. joinPlanCode: this.formData.code,
  277. batchNo: this.formData.batchNo,
  278. requiredFormingNum: '',
  279. reqMoldTime: ''
  280. });
  281. },
  282. changeNum(index) {
  283. let num = this.formData.requiredFormingNum;
  284. this.form.unpackList.forEach((e) => {
  285. if (
  286. e.requiredFormingNum != null &&
  287. e.requiredFormingNum != undefined
  288. ) {
  289. num = num - Number(e.requiredFormingNum);
  290. if (num >= 0) {
  291. this.requiredFormingNum = num;
  292. } else {
  293. this.$nextTick(() => {
  294. this.$set(this.form.unpackList[index], 'requiredFormingNum', 0);
  295. });
  296. this.$message.error('拆单数超过生产数量');
  297. return;
  298. }
  299. }
  300. });
  301. },
  302. remove(index) {
  303. this.form.unpackList.splice(index, 1);
  304. if (this.form.unpackList.length == 0) {
  305. this.requiredFormingNum = this.formData.requiredFormingNum;
  306. } else {
  307. this.changeNum(index);
  308. }
  309. },
  310. cancel() {
  311. this.formData = {};
  312. this.visible = false;
  313. this.$refs.form.resetFields();
  314. },
  315. confirm() {
  316. this.$refs.form.validate(async (value) => {
  317. if (value) {
  318. if (
  319. this.form.unpackList.length == 1 &&
  320. this.form.unpackList[0].requiredFormingNum ==
  321. this.formData.requiredFormingNum
  322. ) {
  323. this.$message.info('拆单数要大于1');
  324. return false;
  325. }
  326. if (
  327. this.form.surplusUnpack.length == 1 &&
  328. this.form.unpackList.length == 0
  329. ) {
  330. this.$message.info('拆单数要大于1');
  331. return false;
  332. }
  333. let params = [];
  334. if (this.requiredFormingNum != 0) {
  335. this.form.surplusUnpack[0].requiredFormingNum =
  336. this.requiredFormingNum;
  337. params = [...this.form.unpackList, ...this.form.surplusUnpack];
  338. } else {
  339. params = this.form.unpackList;
  340. }
  341. const res = await splitWork(params);
  342. console.log(res, 55);
  343. if (res) {
  344. this.$message.success('拆分成功!');
  345. this.$emit('success');
  346. this.cancel();
  347. }
  348. }
  349. });
  350. }
  351. }
  352. };
  353. </script>
  354. <style lang="scss" scoped>
  355. .mt20 {
  356. margin-top: 20px;
  357. }
  358. .el-form-item {
  359. margin-bottom: 0 !important;
  360. }
  361. </style>