unpackDialog.vue 10 KB

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