ysy 1 éve
szülő
commit
7c90d035a6

+ 10 - 0
src/api/workOrder/index.js

@@ -34,3 +34,13 @@ export async function updatePriority(data) {
   return Promise.reject(new Error(res.data.message));
 }
 
+
+// 订单拆单
+
+export async function splitBatch(data) {
+  const res = await request.post(`/aps/workorder/splitBatch`,  data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 391 - 0
src/views/workOrder/components/unpackDialog.vue

@@ -0,0 +1,391 @@
+<template>
+  <ele-modal width="60vw" :visible.sync="visible" :close-on-click-modal="false" custom-class="ele-dialog-form"
+    :title="'拆分工单'">
+    <div class="form-wrapper">
+      <el-form :model="requestData" label-width="0" :show-message="false">
+        <el-descriptions title="" :column="2" border>
+          <el-descriptions-item label="生产订单号">
+            {{ formData.code }}</el-descriptions-item>
+          <el-descriptions-item label="产品编码">
+            {{ formData.productCode }}</el-descriptions-item>
+          <el-descriptions-item label="产品名称">{{
+            formData.productName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="牌号|型号">
+            {{ formData.brandNo }}|{{ formData.model }}</el-descriptions-item>
+          <el-descriptions-item label="要求生产数量">{{
+            formData.formingNum
+          }}</el-descriptions-item>
+
+          <el-descriptions-item label="批次号">{{
+            formData.batchNo
+          }}</el-descriptions-item>
+
+          <el-descriptions-item label="计划开始时间">{{
+            formData.planStartTime
+          }}</el-descriptions-item>
+        </el-descriptions>
+      </el-form>
+
+      <headerTitle title="剩余拆单" class="mt20">
+      </headerTitle>
+      <el-form ref="form" :model="form" :rules="rules">
+        <ele-pro-table ref="table" :needPage="false" :columns="columns" :datasource="form.surplusUnpack">
+
+          <template v-slot:toolbar>
+            <el-button size="small" type="primary" icon="el-icon-plus" class="ele-btn-icon"
+              :disabled="formingNum == 0 ? true : false" @click="openUnpack">
+              拆单
+            </el-button>
+          </template>
+
+
+          <template v-slot:formingNum="scope">
+            <el-form-item v-if="formingNum != 0" :prop="'surplusUnpack.' + scope.$index + '.formingNum'" :rules="[
+              {
+                required: true,
+                message: '请输入要求生产数量',
+                trigger: 'change'
+              },
+              {
+                pattern: /^\d+(\.{0,1}\d+){0,1}$/, message: '拆单数超过生产数量', trigger: ['blur', 'change']
+              }
+            ]">
+              <el-input disabled v-model="formingNum" placeholder="请输入"></el-input>
+            </el-form-item>
+
+            <el-form-item v-else>
+              工单已全部拆完
+            </el-form-item>
+          </template>
+
+
+          <template v-slot:planStartTime="scope">
+            <el-form-item v-if="formingNum != 0" :prop="'surplusUnpack.' + scope.$index + '.planStartTime'" :rules="{
+              required: true,
+              message: '请选择开始计划时间',
+              trigger: 'change'
+            }">
+              <el-date-picker class="w100" v-model="scope.row.planStartTime" type="date"
+                value-format="yyyy-MM-dd"></el-date-picker>
+
+            </el-form-item>
+          </template>
+
+
+          <template v-slot:planCompleteTime="scope">
+            <el-form-item v-if="formingNum != 0" :prop="'surplusUnpack.' + scope.$index + '.planCompleteTime'" :rules="{
+              required: true,
+              message: '请选择计划结束时间',
+              trigger: 'change'
+            }">
+              <el-date-picker class="w100" v-model="scope.row.planCompleteTime" type="date"
+                value-format="yyyy-MM-dd"></el-date-picker>
+
+            </el-form-item>
+          </template>
+
+
+        </ele-pro-table>
+
+
+
+        <headerTitle title="拆单" class="mt20">
+        </headerTitle>
+
+        <ele-pro-table ref="table" :needPage="false" :columns="columns2" :datasource="form.unpackList">
+
+
+
+          <template v-slot:formingNum="scope">
+            <el-form-item :prop="'unpackList.' + scope.$index + '.formingNum'" :rules="{
+              required: true,
+              message: '请输入要求生产数量',
+              trigger: 'change'
+            }">
+              <el-input-number type="number" @change="changeNum(scope.$index)" :min="0" v-model="scope.row.formingNum"
+                placeholder="请输入"></el-input-number>
+            </el-form-item>
+          </template>
+
+
+          <template v-slot:planStartTime="scope">
+            <el-form-item :prop="'unpackList.' + scope.$index + '.planStartTime'" :rules="{
+              required: true,
+              message: '请选择开始计划时间',
+              trigger: 'change'
+            }">
+              <el-date-picker class="w100" v-model="scope.row.planStartTime" type="date"
+                value-format="yyyy-MM-dd"></el-date-picker>
+
+            </el-form-item>
+          </template>
+
+
+          <template v-slot:planCompleteTime="scope">
+            <el-form-item :prop="'unpackList.' + scope.$index + '.planCompleteTime'" :rules="{
+              required: true,
+              message: '请选择计划结束时间',
+              trigger: 'change'
+            }">
+              <el-date-picker class="w100" v-model="scope.row.planCompleteTime" type="date"
+                value-format="yyyy-MM-dd"></el-date-picker>
+
+            </el-form-item>
+          </template>
+
+
+          <template v-slot:action="{ $index }">
+            <el-popconfirm class="ele-action" title="确定要删除此子单吗?" @confirm="remove($index)">
+              <template v-slot:reference>
+                <el-link type="danger" :underline="false" icon="el-icon-delete">
+                  删除
+                </el-link>
+              </template>
+            </el-popconfirm>
+
+
+          </template>
+
+
+
+        </ele-pro-table>
+
+
+      </el-form>
+
+
+
+    </div>
+    <div slot="footer">
+      <el-button plain @click="cancel">取消</el-button>
+      <el-button type="primary" @click="confirm">确定</el-button>
+    </div>
+
+  </ele-modal>
+</template>
+
+<script>
+
+import {
+  splitBatch
+  } from '@/api/workOrder/index.js';
+
+import { deepClone } from '@/utils';
+export default {
+  components: {
+
+  },
+  data() {
+    return {
+      visible: false,
+
+      formData: {},
+      requestData: {
+        deviceCode: '',
+        deviceName: '',
+        deviceId: ''
+      },
+      formingNum: 0,
+
+      form: {
+        surplusUnpack: [],
+        unpackList: []
+      },
+
+
+
+      rules: {
+
+      },
+
+
+
+      columns: [
+        {
+          prop: 'originalCode',
+          label: '生产订单号',
+          align: 'center',
+          minWidth: 200
+        },
+        {
+          prop: 'formingNum',
+          label: '要求生产数量',
+          align: 'center',
+          slot: 'formingNum',
+          minWidth: 200
+        },
+        {
+          prop: 'planStartTime',
+          label: '计划开始时间',
+          align: 'center',
+          slot: 'planStartTime',
+          minWidth: 200
+        },
+        {
+          prop: 'planCompleteTime',
+          label: '计划结束时间',
+          align: 'center',
+          slot: 'planCompleteTime',
+          minWidth: 200
+        },
+      ],
+
+
+      columns2: [
+        {
+          prop: 'originalCode',
+          label: '生产订单号',
+          align: 'center',
+          minWidth: 200
+        },
+        {
+          prop: 'formingNum',
+          label: '要求生产数量',
+          align: 'center',
+          slot: 'formingNum',
+          minWidth: 200
+        },
+        {
+          prop: 'planStartTime',
+          label: '计划开始时间',
+          align: 'center',
+          slot: 'planStartTime',
+          minWidth: 200
+        },
+        {
+          prop: 'planCompleteTime',
+          label: '计划结束时间',
+          align: 'center',
+          slot: 'planCompleteTime',
+          minWidth: 200
+        }, {
+          columnKey: 'action',
+          label: '操作',
+          width: 160,
+          align: 'center',
+          resizable: false,
+          fixed: 'right',
+          slot: 'action',
+          showOverflowTooltip: true
+        }
+
+
+      ]
+
+    };
+  },
+  methods: {
+    open(row) {
+      this.visible = true;
+      this.formData = deepClone(row)
+      this.formingNum = this.formData.formingNum
+
+
+      this.form.surplusUnpack = []
+      this.form.unpackList = []
+      this.setSurplus()
+
+
+
+    },
+
+    setSurplus() {
+      this.form.surplusUnpack.push({ originalCode: this.formData.code, formingNum: this.formData.formingNum, planStartTime: '', planCompleteTime: '', isCopy:1  })
+    },
+
+    openUnpack() {
+      this.form.unpackList.push({ originalCode: this.formData.code, formingNum: '', planStartTime: '', planCompleteTime: '' })
+    },
+
+    changeNum(index) {
+      let num = this.formData.formingNum
+      this.form.unpackList.forEach((e) => {
+        if (e.formingNum != null && e.formingNum != undefined) {
+          num = num - Number(e.formingNum)
+          if (num >= 0) {
+            this.formingNum = num
+          } else {
+
+            this.$nextTick(() => {
+              this.$set(this.form.unpackList[index], 'formingNum', 0)
+            })
+            this.$message.error('拆单数超过生产数量')
+
+            return
+          }
+        }
+
+      })
+    },
+
+    remove(index) {
+      this.form.unpackList.splice(index, 1);
+      if (this.form.unpackList.length == 0) {
+        this.formingNum = this.formData.formingNum
+      } else {
+        this.changeNum(index)
+      }
+
+    },
+
+
+
+
+    cancel() {
+      this.formData = {};
+      this.visible = false;
+      this.$refs.form.resetFields();
+    },
+
+
+
+
+    confirm() {
+
+      this.$refs.form.validate(async (value) => {
+        if (value) {
+          if (this.form.unpackList.length == 1 && this.form.unpackList[0].formingNum == this.formData.formingNum) {
+            this.$message.info('拆单数要大于1')
+            return false
+          }
+
+          if (this.form.surplusUnpack.length == 1 && this.form.unpackList.length == 0) {
+            this.$message.info('拆单数要大于1')
+            return false
+          }
+
+
+          let params = []
+          if (this.formingNum != 0) {
+            this.form.surplusUnpack[0].formingNum = this.formingNum
+            params = [...this.form.unpackList, ...this.form.surplusUnpack]
+          } else {
+            params = this.form.unpackList
+          }
+
+          
+          const res = await splitBatch(params);
+          if (res) {
+            this.$message.success('拆分成功!');
+            this.$emit('success');
+            this.cancel();
+          }
+
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.mt20 {
+  margin-top: 20px;
+}
+
+.el-form-item {
+  margin-bottom: 0 !important;
+}
+</style>
+

+ 64 - 26
src/views/workOrder/index.vue

@@ -14,6 +14,8 @@
         cache-key="workOrderTable"
         @sort-change="onSortChange"
         height="calc(100vh - 380px)"
+        autoAmendPage
+        :parse-data="parseData"
       >
         <template v-slot:code="{ row }">
           {{ row.code }}
@@ -55,6 +57,20 @@
         </template>
         <!-- 操作列 -->
         <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+              @click="toUnpack(row)"
+            v-if="
+              (clientEnvironmentId != '4' && row.status == 8) ||
+              (clientEnvironmentId == '4' &&
+                !row.productName.includes('板材') &&
+                row.status == 8)
+            "
+          >
+            拆单
+          </el-link>
+
           <el-link
             type="primary"
             :underline="false"
@@ -81,9 +97,7 @@
         label-position="left"
         label-width="100px"
       >
-
-      
-      <el-form-item label="报工类型:" prop="singleReport">
+        <el-form-item label="报工类型:" prop="singleReport">
           <el-radio-group v-model="form.singleReport">
             <el-radio :label="1">单件报工</el-radio>
             <el-radio :label="0">批量报工</el-radio>
@@ -97,15 +111,13 @@
           </el-radio-group>
         </el-form-item>
 
-
-        <el-form-item label="班组:" prop="teamId" >
+        <el-form-item label="班组:" prop="teamId">
           <el-select
             class="ele-block"
             v-model="form.teamId"
             placeholder="请选择班组"
             size="mini"
             filterable
-
             @change="stationChange"
           >
             <el-option
@@ -118,7 +130,6 @@
           </el-select>
         </el-form-item>
 
-
         <el-form-item
           label="工位:"
           prop="workstationIds"
@@ -142,8 +153,6 @@
           </el-select>
         </el-form-item>
 
-
-
         <el-form-item label="人员:" prop="crewIds" v-if="form.assignType == 2">
           <el-select
             class="ele-block"
@@ -162,7 +171,6 @@
             </el-option>
           </el-select>
         </el-form-item>
-
       </el-form>
 
       <div class="footer" slot="footer">
@@ -170,6 +178,9 @@
         <el-button type="primary" v-click-once @click="confirm">确定</el-button>
       </div>
     </el-dialog>
+
+    <unpackDialog ref="unpackRef" @success="createSuccess" />
+
   </div>
 </template>
 
@@ -186,13 +197,15 @@
     listUserByIds
   } from '@/api/mainData/index.js';
   import OrderSearch from './components/order-search.vue';
+  import unpackDialog from './components/unpackDialog.vue';
 
   import { fieldModel } from '@/api/saleOrder';
 
   import { debounce } from 'lodash';
   export default {
     components: {
-      OrderSearch
+      OrderSearch,
+      unpackDialog
     },
     data() {
       return {
@@ -225,7 +238,6 @@
               trigger: ['blur', 'change']
             }
           ]
-       
         },
 
         teamList: [],
@@ -265,14 +277,14 @@
             slot: 'code',
             label: '生产订单号',
             align: 'center',
-            minWidth: 110,
+            minWidth: 150,
             sortable: true
           },
           {
             prop: 'productionPlanCode',
             label: '计划编号',
             align: 'center',
-            minWidth: 110
+            minWidth: 150
           },
           {
             prop: 'produceRoutingName',
@@ -308,7 +320,8 @@
           {
             prop: 'model',
             label: '型号',
-            align: 'center'
+            align: 'center',
+            showOverflowTooltip: true
           },
 
           {
@@ -354,13 +367,17 @@
           {
             prop: 'workCenterName',
             label: '工作中心',
-            align: 'center'
+            align: 'center',
+            minWidth: 110,
+            showOverflowTooltip: true
           },
 
           {
             prop: 'firstTaskName',
             label: '首工序',
-            align: 'center'
+            align: 'center',
+            minWidth: 110,
+            showOverflowTooltip: true
           },
 
           {
@@ -419,18 +436,33 @@
         });
       },
 
+
+            /* 数据转为树形结构 */
+            parseData(data) {
+
+            return {
+              ...data,
+              list: this.$util.toTreeData({
+                data: data.list,
+                count: data.total,
+
+                idField: 'code',
+                parentIdField: 'originalCode'
+              })
+            };
+            },
+
       getFieldModel() {
         fieldModel({ fieldModel: 't_main_category' }).then((res) => {
           const privateColumn = [
             {
               columnKey: 'action',
               label: '操作',
-              width: 90,
+              width: 120,
               align: 'center',
               resizable: false,
               fixed: 'right',
-              slot: 'action',
-              showOverflowTooltip: true
+              slot: 'action'
             }
           ];
 
@@ -454,8 +486,6 @@
         this.current = row;
         this.visible = true;
 
-
-
         this.FirstTaskIdFn();
         this.WorkCenterIdFn();
       },
@@ -464,7 +494,7 @@
         const loading = this.$loading({ text: '加载中...' });
         releaseWorkOrder({
           id: this.current.id,
-         ...this.form
+          ...this.form
         })
           .then((res) => {
             if (res) {
@@ -517,10 +547,18 @@
         });
       },
 
+      // 拆分
+      toUnpack(row) {
+        this.$refs.unpackRef.open(row);
+      },
+      
+      createSuccess() {
+        this.reload();
+      },
+
       stationChange() {
-        this.crewList = []
-        this.crewIds = []
-       
+        this.crewList = [];
+        this.crewIds = [];
 
         listUserByIds([this.form.teamId]).then((res) => {
           this.crewList = res;