فهرست منبع

Merge branch 'dev' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-aps into dev

huang_an 1 سال پیش
والد
کامیت
aa6dae4e58

BIN
dist.zip


+ 31 - 0
src/api/productionPlan/index.js

@@ -132,3 +132,34 @@ export async function batchSave(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+// 齐套性检查
+export async function homogeneityInspect(data) {
+  const res = await request.post(`/aps/productionplan/homogeneityInspect`,  data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function getStockList (params) {
+  const res = await request.get('/wms/outindetailtwo/page', {params});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+export async function getCurrentList (data) {
+  const res = await request.post('/eom/purchaseorder/getZtDetail', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+// 齐套性检查
+export async function homogeneityInspectMerge(data) {
+  const res = await request.post(`/aps/productionplan/homogeneityInspectMerge`,  data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 28 - 1
src/api/saleOrder/index.js

@@ -156,6 +156,14 @@ export async function getOrderDetail(code) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+// 获取多个订单详情
+export async function getByCodeList(data) {
+  const res = await request.post(`/aps/salesorder/getByCodeList`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
 // 获取计划详情
 export async function getUpdateInfoById(id) {
   const res = await request.get(`/aps/productionplan/getUpdateInfoById/${id}`);
@@ -247,4 +255,23 @@ export async function temporarilyUpdate(data) {
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
-}
+}
+
+// 同步数据
+
+export async function synchronousDataByJDY(data) {
+  const res = await request.post(`/main/externalinterface/synchronousDataByJDY`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 齐套性检查
+export async function orderHomogeneityInspect(data) {
+  const res = await request.post(`/aps/salesorder/orderHomogeneityInspect`,  data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+

+ 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));
+}

+ 292 - 0
src/views/productionPlan/components/currentDetailDialog.vue

@@ -0,0 +1,292 @@
+<template>
+  <ele-modal
+    width="80vw"
+    :visible.sync="visible"
+    :close-on-click-modal="false"
+    row-key="code"
+    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.batchNo-->
+<!--            }}</el-descriptions-item>-->
+
+<!--          <el-descriptions-item label="工艺路线">{{-->
+<!--            formData.produceRoutingName-->
+<!--            }}</el-descriptions-item>-->
+
+<!--          <el-descriptions-item label="要求生产数量">{{-->
+<!--            formData.requiredFormingNum-->
+<!--            }}</el-descriptions-item>-->
+<!--          <el-descriptions-item label="要求完成日期">{{-->
+<!--            formData.reqMoldTime-->
+<!--            }}</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="requiredFormingNum == 0 ? true : false"-->
+<!--              @click="openUnpack"-->
+<!--            >-->
+<!--              拆批-->
+<!--            </el-button>-->
+<!--          </template>-->
+
+<!--          <template v-slot:requiredFormingNum="scope">-->
+<!--            <el-form-item-->
+<!--              v-if="requiredFormingNum != 0"-->
+<!--              :prop="'surplusUnpack.' + scope.$index + '.requiredFormingNum'"-->
+<!--              :rules="[-->
+<!--                {-->
+<!--                  required: true,-->
+<!--                  message: '请输入要求生产数量',-->
+<!--                  trigger: 'change'-->
+<!--                },-->
+<!--                {-->
+<!--                  pattern: /^\d+(\.{0,1}\d+){0,1}$/,-->
+<!--                  message: '拆批数超过生产数量',-->
+<!--                  trigger: ['blur', 'change']-->
+<!--                }-->
+<!--              ]"-->
+<!--            >-->
+<!--              <el-input-->
+<!--                disabled-->
+<!--                v-model="requiredFormingNum"-->
+<!--                placeholder="请输入"-->
+<!--              ></el-input>-->
+<!--            </el-form-item>-->
+
+<!--            <el-form-item v-else> 工单已全部拆完 </el-form-item>-->
+<!--          </template>-->
+
+<!--          <template v-slot:splitResidue="scope">-->
+<!--            {{ formData.splitResidue }}-->
+<!--          </template>-->
+
+<!--        </ele-pro-table>-->
+
+<!--        <headerTitle title="拆批" class="mt20"> </headerTitle>-->
+
+        <ele-pro-table
+          ref="table"
+          :needPage="true"
+          :columns="columns"
+          :datasource="datasource"
+          :init-load="false"
+        >
+<!--          <template v-slot:requiredFormingNum="scope">-->
+<!--            <el-form-item-->
+<!--              :prop="'unpackList.' + scope.$index + '.requiredFormingNum'"-->
+<!--              :rules="{-->
+<!--                required: true,-->
+<!--                message: '请输入要求生产数量',-->
+<!--                trigger: 'change'-->
+<!--              }"-->
+<!--            >-->
+<!--              <el-input-number-->
+<!--                type="number"-->
+<!--                @change="changeNum(scope.$index)"-->
+<!--                :min="0"-->
+<!--                v-model="scope.row.requiredFormingNum"-->
+<!--                placeholder="请输入"-->
+<!--              ></el-input-number>-->
+<!--            </el-form-item>-->
+<!--          </template>-->
+
+<!--          <template v-slot:reqMoldTime="scope">-->
+<!--            <el-form-item-->
+<!--              :prop="'unpackList.' + scope.$index + '.reqMoldTime'"-->
+<!--              :rules="{-->
+<!--                required: true,-->
+<!--                message: '请选择开始计划时间',-->
+<!--                trigger: 'change'-->
+<!--              }"-->
+<!--            >-->
+<!--              <el-date-picker-->
+<!--                class="w100"-->
+<!--                v-model="scope.row.reqMoldTime"-->
+<!--                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>-->
+            <el-link type="primary" :underline="false" icon="el-icon-view">
+              库存
+            </el-link>
+            <el-link type="primary" :underline="false" icon="el-icon-view">
+              在途
+            </el-link>
+          </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 { getCurrentList } from '@/api/productionPlan/index.js';
+  export default {
+    components: {},
+    data() {
+      return {
+        visible: false,
+
+        formData: {},
+        requestData: {
+          deviceCode: '',
+          deviceName: '',
+          deviceId: ''
+        },
+        requiredFormingNum: 0,
+
+        form: {
+          currentList: []
+        },
+
+        rules: {},
+
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'orderNo',
+            label: '订单号',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'productCode',
+            label: '产品编码',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'productName',
+            label: '产品名称',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'totalCount',
+            label: '采购数量',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'receiveNo',
+            label: '发货单号',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            prop: 'ztNumber',
+            label: '在途数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            prop: 'deliveryDeadline',
+            label: '预计交期时间',
+            align: 'center',
+            minWidth: 80
+          },
+        ],
+
+      };
+    },
+    methods: {
+      reload(where) {
+        this.$nextTick(() => {
+          this.$refs.table.reload({ page: 1, where });
+        });
+      },
+      /* 表格数据源 */
+      datasource({ page, limit, where }) {
+        return getCurrentList({
+          pageNum: page,
+          size: limit,
+          ...where,
+        });
+      },
+      open(row) {
+         this.visible = true;
+         this.reload({code: row.bomCode});
+      },
+      cancel() {
+        this.formData = {};
+        this.visible = false;
+      },
+
+      confirm() {
+        this.visible = false;
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .mt20 {
+    margin-top: 20px;
+  }
+
+  .el-form-item {
+    margin-bottom: 0 !important;
+  }
+</style>

+ 289 - 0
src/views/productionPlan/components/homogeneityInspectDialog.vue

@@ -0,0 +1,289 @@
+<template>
+  <div>
+  <ele-modal
+    width="80vw"
+    :visible.sync="visible"
+    :close-on-click-modal="false"
+    row-key="code"
+    custom-class="ele-dialog-form"
+    :title="'齐套性检查'"
+  >
+    <div class="form-wrapper">
+      <div v-if="leftShow" :style="{width: leftWidth}">
+        <el-card class="box-card">
+<!--          <div v-for="o in 4" :key="o" class="text item">-->
+<!--            {{'列表内容 ' + o }}-->
+<!--          </div>-->
+        </el-card>
+      </div>
+      <div :style="{width: rightWidth}">
+        <div class="planInfo">
+          <div></div>
+          <div></div>
+        </div>
+        <div>
+          <ele-pro-table
+            ref="table"
+            :needPage="false"
+            :columns="columns"
+            :key="activeName"
+            :init-load="false"
+            :datasource="datasource"
+          >
+            <template v-slot:stockCount="{ row }">
+              <el-link type="primary" :underline="false" @click="stockDetail(row)">
+                {{ row.stockCount }}
+              </el-link>
+            </template>
+            <template v-slot:currentCount="{ row }">
+              <el-link type="primary" :underline="false" @click="currentDetail(row)">
+                {{ row.currentCount }}
+              </el-link>
+            </template>
+            <template v-slot:stockColor="{ row }">
+              <div :class="{'statusRed' : row.stockStatus == '缺料'}">
+                {{row.stockStatus}}
+              </div>
+            </template>
+            <template v-slot:currentColor="{ row }">
+              <div :class="{'statusRed' : row.currentStatus == '缺料'}">
+                {{row.currentStatus}}
+              </div>
+            </template>
+            <template v-slot:finishColor="{ row }">
+              <div :class="{'statusRed' : row.finishStatus == '缺料'}">
+                {{row.finishStatus}}
+              </div>
+            </template>
+            <template v-slot:finishCount="{ row }">
+              <div>
+                <div v-if="row.finishCount > 0">{{row.finishCount}}</div>
+                <div v-else>-</div>
+              </div>
+            </template>
+          </ele-pro-table>
+        </div>
+      </div>
+    </div>
+    <div slot="footer">
+      <el-button plain @click="cancel">取消</el-button>
+      <el-button type="primary" @click="confirm">确定</el-button>
+    </div>
+  </ele-modal>
+
+  <stockDetailDialog ref="stockDetailDialog" />
+
+  <currentDetailDialog ref="currentDetailDialog" />
+  </div>
+</template>
+
+<script>
+  import { homogeneityInspect, homogeneityInspectMerge } from '@/api/productionPlan/index.js';
+  import stockDetailDialog from './stockDetailDialog.vue';
+  import currentDetailDialog from './currentDetailDialog.vue';
+  export default {
+    components: {
+      stockDetailDialog,
+      currentDetailDialog
+    },
+    data() {
+      return {
+        visible: false,
+
+        formData: {},
+        requestData: {
+          deviceCode: '',
+          deviceName: '',
+          deviceId: ''
+        },
+        requiredFormingNum: 0,
+
+        form: {
+          homogeneityInspect: []
+        },
+
+        rules: {},
+
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'productCode',
+            label: '计划编号',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'opCode',
+            label: '工序编码',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'opName',
+            label: '工序名称',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'bomCode',
+            label: '物料编码',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'bomName',
+            label: '物料名称',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'count',
+            label: '定额数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'stockCount',
+            prop: 'stockCount',
+            label: '库存数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'stockColor',
+            prop: 'stockStatus',
+            label: '库存状态',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'currentCount',
+            prop: 'currentCount',
+            label: '在途数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'currentColor',
+            prop: 'currentStatus',
+            label: '在途状态',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'finishCount',
+            prop: 'finishCount',
+            label: '最终缺料数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'finishColor',
+            prop: 'finishStatus',
+            label: '最终状态',
+            align: 'center',
+            minWidth: 80
+          },
+        ],
+        ids: [],
+        leftShow: false,
+        leftWidth: '0%',
+        rightWidth: '100%',
+      };
+    },
+    watch: {
+      leftShow(newVal, oldVal){
+        if(newVal){
+          this.leftWidth = '30%';
+          this.rightWidth = '70%';
+        }
+      }
+    },
+    mounted() {
+    },
+    methods: {
+      reload(where) {
+        this.$nextTick(() => {
+          this.$refs.table.reload({ page: 1, where });
+        });
+      },
+      /* 表格数据源 */
+      datasource({ page, limit, where }) {
+        return homogeneityInspect({
+          pageNum: page,
+          size: limit,
+          ...where,
+        });
+      },
+       stockDetail(row) {
+         this.$refs.stockDetailDialog.open(row);
+       },
+       currentDetail(row) {
+         this.$refs.currentDetailDialog.open(row);
+       },
+      open(ids) {
+         this.visible = true;
+         this.ids = ids;
+         // this.reload({planIds: ids});
+      },
+      cancel() {
+        this.formData = {};
+        this.visible = false;
+      },
+
+      confirm() {
+        this.visible = false;
+      },
+      async merge(){
+        if(this.activeName == 'first'){
+          this.reload({planIds: this.ids, productType: 1, merge: 2});
+        }
+        if(this.activeName == 'second'){
+          this.reload({planIds: this.ids, productType: 2, merge: 2});
+        }
+      },
+      tabClick(){
+        if(this.activeName == 'first'){
+          this.reload({planIds: this.ids, productType: 1});
+        }
+        if(this.activeName == 'second'){
+          this.reload({planIds: this.ids, productType: 2});
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .mt20 {
+    margin-top: 20px;
+  }
+
+  .el-form-item {
+    margin-bottom: 0 !important;
+  }
+  .optionButton {
+    display: flex;
+    justify-content: flex-end;
+    padding-bottom: 3px;
+  }
+  .statusRed{
+    color: red;
+  }
+  .planInfo{
+
+  }
+  .form-wrapper{
+    display: flex;
+  }
+</style>

+ 24 - 1
src/views/productionPlan/components/productionPlan-search.vue

@@ -181,6 +181,25 @@
         </el-form-item>
       </el-col>
 
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
+        <el-form-item label="加工方式:">
+          <el-select
+                  size="mini"
+                  clearable
+                  v-model="where.productType"
+                  placeholder="请选择"
+                  class="w100"
+          >
+            <el-option
+                    v-for="item in productTypeList"
+                    :label="item.name"
+                    :value="item.code"
+                    :key="item.code"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+
       <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
         <div class="ele-form-actions">
           <el-button
@@ -229,7 +248,11 @@
         deliveryVal: 'deliveryTime',
         shapeVal: 'reqMoldTime',
         where: { ...defaultWhere },
-        treeData: []
+        treeData: [],
+        productTypeList: [
+          { code: 2, name: '加工(MBOM)' },
+          { code: 3, name: '装配(ABOM)' },
+        ],
       };
     },
     computed: {

+ 327 - 0
src/views/productionPlan/components/stockDetailDialog.vue

@@ -0,0 +1,327 @@
+<template>
+  <ele-modal
+    width="80vw"
+    :visible.sync="visible"
+    :close-on-click-modal="false"
+    row-key="code"
+    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.batchNo-->
+<!--            }}</el-descriptions-item>-->
+
+<!--          <el-descriptions-item label="工艺路线">{{-->
+<!--            formData.produceRoutingName-->
+<!--            }}</el-descriptions-item>-->
+
+<!--          <el-descriptions-item label="要求生产数量">{{-->
+<!--            formData.requiredFormingNum-->
+<!--            }}</el-descriptions-item>-->
+<!--          <el-descriptions-item label="要求完成日期">{{-->
+<!--            formData.reqMoldTime-->
+<!--            }}</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="requiredFormingNum == 0 ? true : false"-->
+<!--              @click="openUnpack"-->
+<!--            >-->
+<!--              拆批-->
+<!--            </el-button>-->
+<!--          </template>-->
+
+<!--          <template v-slot:requiredFormingNum="scope">-->
+<!--            <el-form-item-->
+<!--              v-if="requiredFormingNum != 0"-->
+<!--              :prop="'surplusUnpack.' + scope.$index + '.requiredFormingNum'"-->
+<!--              :rules="[-->
+<!--                {-->
+<!--                  required: true,-->
+<!--                  message: '请输入要求生产数量',-->
+<!--                  trigger: 'change'-->
+<!--                },-->
+<!--                {-->
+<!--                  pattern: /^\d+(\.{0,1}\d+){0,1}$/,-->
+<!--                  message: '拆批数超过生产数量',-->
+<!--                  trigger: ['blur', 'change']-->
+<!--                }-->
+<!--              ]"-->
+<!--            >-->
+<!--              <el-input-->
+<!--                disabled-->
+<!--                v-model="requiredFormingNum"-->
+<!--                placeholder="请输入"-->
+<!--              ></el-input>-->
+<!--            </el-form-item>-->
+
+<!--            <el-form-item v-else> 工单已全部拆完 </el-form-item>-->
+<!--          </template>-->
+
+<!--          <template v-slot:splitResidue="scope">-->
+<!--            {{ formData.splitResidue }}-->
+<!--          </template>-->
+
+<!--        </ele-pro-table>-->
+
+<!--        <headerTitle title="拆批" class="mt20"> </headerTitle>-->
+
+        <ele-pro-table
+          ref="table"
+          :needPage="true"
+          :columns="columns"
+          :datasource="datasource"
+          :init-load="false"
+        >
+<!--          <template v-slot:requiredFormingNum="scope">-->
+<!--            <el-form-item-->
+<!--              :prop="'unpackList.' + scope.$index + '.requiredFormingNum'"-->
+<!--              :rules="{-->
+<!--                required: true,-->
+<!--                message: '请输入要求生产数量',-->
+<!--                trigger: 'change'-->
+<!--              }"-->
+<!--            >-->
+<!--              <el-input-number-->
+<!--                type="number"-->
+<!--                @change="changeNum(scope.$index)"-->
+<!--                :min="0"-->
+<!--                v-model="scope.row.requiredFormingNum"-->
+<!--                placeholder="请输入"-->
+<!--              ></el-input-number>-->
+<!--            </el-form-item>-->
+<!--          </template>-->
+
+<!--          <template v-slot:reqMoldTime="scope">-->
+<!--            <el-form-item-->
+<!--              :prop="'unpackList.' + scope.$index + '.reqMoldTime'"-->
+<!--              :rules="{-->
+<!--                required: true,-->
+<!--                message: '请选择开始计划时间',-->
+<!--                trigger: 'change'-->
+<!--              }"-->
+<!--            >-->
+<!--              <el-date-picker-->
+<!--                class="w100"-->
+<!--                v-model="scope.row.reqMoldTime"-->
+<!--                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>-->
+            <el-link type="primary" :underline="false" icon="el-icon-view">
+              库存
+            </el-link>
+            <el-link type="primary" :underline="false" icon="el-icon-view">
+              在途
+            </el-link>
+          </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 { getStockList } from '@/api/productionPlan/index.js';
+  export default {
+    components: {},
+    data() {
+      return {
+        visible: false,
+
+        formData: {},
+        requestData: {
+          deviceCode: '',
+          deviceName: '',
+          deviceId: ''
+        },
+        requiredFormingNum: 0,
+
+        form: {
+          stockList: []
+        },
+
+        rules: {},
+
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'categoryCode',
+            label: '物品编码',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'categoryName',
+            label: '物品名称',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'modelType',
+            label: '型号',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'specification',
+            label: '规格',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'level',
+            label: '级别',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'measureQuantity',
+            label: '计划数量',
+            align: 'center',
+            minWidth: 100
+          },
+
+        ],
+        activeName: 'first',
+        selection: [],
+        request: {
+          categoryCode: '',
+        }
+      };
+    },
+    methods: {
+      reload(where) {
+        this.$nextTick(() => {
+          this.$refs.table.reload({ page: 1, where });
+        });
+      },
+      /* 表格数据源 */
+      datasource({ page, limit, where }) {
+        return getStockList({
+          pageNum: page,
+          size: limit,
+          ...where,
+        });
+      },
+      handleSelectionChange(list) {
+        if (list.length > 1) {
+          let _list = [];
+          list.forEach((e) => {
+            if (e.childList.length > 0 && e.splitBatch != 2) {
+              _list.push(...e.childList);
+            } else {
+              _list.push(e);
+            }
+          });
+          this.selection = _list;
+        } else {
+          this.selection = [];
+        }
+      },
+      /* 数据转为树形结构 */
+      parseData(data) {
+        return {
+          ...data,
+          list: this.$util.toTreeData({
+            data: data.list,
+            count: data.total,
+
+            idField: 'code',
+            parentIdField: 'joinPlanCode'
+          })
+        };
+      },
+      onSortChange(e) {
+        let sort = {
+          orderBy: e.order,
+          sortName: e.prop
+        };
+        this.sort = sort;
+        this.reload();
+      },
+      open(row) {
+          this.visible = true;
+          this.reload({categoryCode: row.bomCode});
+      },
+      cancel() {
+        this.formData = {};
+        this.visible = false;
+      },
+
+      confirm() {
+        this.visible = false;
+      },
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .mt20 {
+    margin-top: 20px;
+  }
+
+  .el-form-item {
+    margin-bottom: 0 !important;
+  }
+</style>

+ 1 - 1
src/views/productionPlan/detail.vue

@@ -56,7 +56,7 @@ export default {
   },
   methods: {
     async getDetail() {
-      const data = await getProductPlanDetail(this.$route.params.id);
+      const data = await getProductPlanDetail(this.$route.query.id);
 
       this.infoData = data;
     }

+ 24 - 5
src/views/productionPlan/index.vue

@@ -10,7 +10,7 @@
       >
       </productionPlan-search>
       <div class="btn_box">
-        <el-button type="success" size="mini">齐套性检查</el-button>
+        <el-button type="success" size="mini" @click="homogeneityInspect">齐套性检查</el-button>
         <el-button type="primary" size="mini" @click="disassemblePlan"
           >计划分解</el-button
         >
@@ -203,6 +203,8 @@
 
     <unpackDetails ref="DetailsRef"></unpackDetails>
 
+    <homogeneityInspectDialog ref="homogeneityInspectDialog" @success="reload" />
+
     <disassemblePlanPop
       ref="disassemblePlanRef"
       @close="reload"
@@ -222,6 +224,7 @@
   import productionPlanSearch from './components/productionPlan-search.vue';
   import unpackDialog from './components/unpackDialog.vue';
   import mergeDialog from './components/mergeDialog.vue';
+  import homogeneityInspectDialog from './components/homogeneityInspectDialog.vue';
   import unpackDetails from './components/unpackDetails.vue';
   import disassemblePlanPop from './components/disassemblePlanPop.vue';
   import factoryAdd from './components/factoryAdd/index.vue';
@@ -236,7 +239,8 @@
       mergeDialog,
       unpackDetails,
       disassemblePlanPop,
-      factoryAdd
+      factoryAdd,
+      homogeneityInspectDialog
     },
     props: {
       timeDimensionPlanType: { type: Number, default: 1 }
@@ -278,7 +282,7 @@
 
         factoryShow: false,
         factoryType: 1,
-        factoryObj: {}
+        factoryObj: {},
       };
     },
     computed: {
@@ -555,7 +559,7 @@
             showOverflowTooltip: true
           },
 
-          
+
 
           {
             prop: 'orderType',
@@ -600,6 +604,20 @@
       this.getFieldModel();
     },
     methods: {
+      homogeneityInspect(){
+        if(this.selection.length == 0){
+          this.$message.warning('请至少选择一条计划!');
+          return;
+        }
+        // for(let item of this.selection){
+        //   for(let )
+        // }
+        if(this.selection.length > 0){
+          this.$refs.homogeneityInspectDialog.open(this.selection);
+        } else {
+
+        }
+      },
       statusFormatter(status) {
         const obj = this.statusOpt[this.activeName].find(
           (i) => i.value == status
@@ -775,7 +793,8 @@
 
       goDetail({ id }) {
         this.$router.push({
-          path: '/productionPlan/detail/' + id
+          path: '/productionPlan/detail',
+          query: { id }
         });
       },
 

+ 11 - 0
src/views/saleOrder/components/EquipmentDialog.vue

@@ -20,6 +20,15 @@
                   size="small"
                 ></el-input>
               </el-col>
+
+              <el-col :span="6" style="margin-left: 10px">
+                <el-input
+                  v-model="name"
+                  placeholder="请输入物料名称"
+                  size="small"
+                ></el-input>
+              </el-col>
+
               <el-col :span="6" style="margin-left: 10px">
                 <el-button type="primary" size="small" @click="reload"
                   >搜索</el-button
@@ -128,6 +137,7 @@
         tableList: [],
         categoryLevelId: null,
         code: null,
+        name: null,
         selection: []
       };
     },
@@ -137,6 +147,7 @@
       async datasource ({ page, limit }) {
         const params = {
           code: this.code,
+          name: this.name,
           pageNum: page,
           size: limit,
           categoryLevelId: this.categoryLevelId,

+ 204 - 8
src/views/saleOrder/components/create-order.vue

@@ -1,4 +1,5 @@
 <template>
+  <div>
   <ele-modal :visible.sync="visible" :title="title" width="80vw" append-to-body>
     <el-form
       ref="form"
@@ -86,6 +87,12 @@
             <el-input clearable v-model="form.salesman" />
           </el-form-item>
         </el-col>
+
+
+
+
+
+
         <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <el-form-item label="交付日期:" prop="deliveryTime">
             <el-date-picker
@@ -99,13 +106,28 @@
             </el-date-picker>
           </el-form-item>
         </el-col>
-        <el-col v-bind="styleResponsive ? { lg: 18, md: 18 } : { span: 18 }">
+
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="齐套状态:" prop="completeState">
+            <el-select v-model="form.completeState" style="width: 100%"  >
+                  <el-option
+                    v-for="item of completeList"
+                    :key="item.code"
+                    :label="item.name"
+                    :value="item.code"
+                  ></el-option>
+                </el-select>
+
+          </el-form-item>
+        </el-col>
+
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
           <el-form-item label="备注:">
             <el-input clearable v-model="form.notes" />
           </el-form-item>
         </el-col>
       </el-row>
-      <el-table :data="form.productInfoList" border height="40vh">
+      <el-table :data="form.productInfoList" border height="40vh" key="id">
         <el-table-column label="序号" align="center" width="60">
           <template slot-scope="scope">
             <span>{{ scope.$index + 1 }}</span>
@@ -127,7 +149,7 @@
         </el-table-column>
         <el-table-column label="重量单位" align="center" prop="weightUnit">
         </el-table-column>
-        <el-table-column label="订单数量" align="center" prop="contractNum">
+        <el-table-column label="订单数量" width="140" align="center" prop="contractNum">
           <template slot-scope="scope">
             <el-form-item
               label-width="0px"
@@ -149,8 +171,93 @@
             </el-form-item>
           </template>
         </el-table-column>
+
+
+
+        <el-table-column label="加工方式" width="140" align="center" prop="productType">
+          <template slot-scope="scope">
+            <el-form-item
+              label-width="0px"
+              :prop="'productInfoList.' + scope.$index + '.productType'"
+
+            >
+
+              <el-select v-model="scope.row.productType"   @change="changeProductType(scope.row, scope.$index)" :key="scope.$index" >
+                  <el-option
+                    v-for="item of producedList"
+                    :key="scope.$index  + item.code"
+                    :label="item.name"
+                    :value="item.code"
+                  ></el-option>
+                </el-select>
+
+            </el-form-item>
+          </template>
+        </el-table-column>
+
+
+
+        <el-table-column label="BOM版本" width="140" align="center" prop="bomCategoryId" v-if="clientEnvironmentId != 4">
+          <template slot-scope="scope">
+            <el-form-item
+              label-width="0px"
+              :prop="'productInfoList.' + scope.$index + '.bomCategoryId'"
+              :key="scope.$index"
+
+            >
+
+              <el-select v-model="scope.row.bomCategoryId"    @change="changeBomId(scope.row, scope.$index)" >
+                <el-option
+                    v-for="item of scope.row.bomVersionList"
+                    :key="item.id"
+                    :label="item.name + '(V' + item.versions + '.0)'"
+                    :value="item.id"
+                  ></el-option>
+                </el-select>
+
+            </el-form-item>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="工艺路线" width="140" align="center" prop="produceRoutingId" v-if="clientEnvironmentId != 4">
+          <template slot-scope="scope">
+            <el-form-item
+              label-width="0px"
+              :prop="'productInfoList.' + scope.$index + '.produceRoutingId'"
+
+            >
+              <el-select v-model="scope.row.produceRoutingId"    >
+                <el-option
+                    v-for="item of scope.row.routingList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  ></el-option>
+                </el-select>
+
+            </el-form-item>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="工艺路线" align="center" prop="produceRoutingName" v-if="clientEnvironmentId == 4">
+          <template slot-scope="scope">
+            <el-form-item
+              label-width="0px"
+              :prop="'productInfoList.' + scope.$index + '.produceRoutingName'"
+            >
+            <el-input v-model="form.produceRoutingName" style="width: 100%"  readonly ></el-input>
+
+            </el-form-item>
+          </template>
+        </el-table-column>
+
+
+
+
+
+
         <el-table-column label="计量单位" align="center" prop="measuringUnit">
-          
+
         </el-table-column>
         <el-table-column
           label="模数"
@@ -186,7 +293,7 @@
               <el-input
                 size="small"
                 style="width: 100%"
-               
+
                 @input="
                   tableHandleKeyUp(
                     scope.row,
@@ -208,6 +315,13 @@
         </el-table-column>
         <el-table-column label="操作" align="center" width="70">
           <template slot-scope="scope">
+            <el-link
+              type="primary"
+              :underline="false"
+              @click="homogeneityInspect(scope.row)"
+            >
+              齐套性检查
+            </el-link>
             <el-button
               type="text"
               @click="handleDeleteItem(scope.$index)"
@@ -215,6 +329,7 @@
               >删除</el-button
             >
           </template>
+
         </el-table-column>
       </el-table>
       <div class="add-product" @click="addEquipment">
@@ -239,19 +354,26 @@
       "
     >
     </EquipmentDialog>
+
+
+
   </ele-modal>
+    <orderHomogeneityInspectDialog ref="orderHomogeneityInspectDialog"></orderHomogeneityInspectDialog>
+  </div>
 </template>
 
 <script>
 import { getCode } from '@/api/codeManagement';
 import EquipmentDialog from '../components/EquipmentDialog.vue';
-import { createOrUpdate, getOrderDetail } from '@/api/saleOrder';
+import orderHomogeneityInspectDialog from "./orderHomogeneityInspectDialog";
+import { createOrUpdate, getOrderDetail , bomListByPlan, bomRoutingList} from '@/api/saleOrder';
 
 import dayjs from 'dayjs';
 import { multiply } from '@/utils/math';
 export default {
   components: {
-    EquipmentDialog
+    EquipmentDialog,
+    orderHomogeneityInspectDialog
   },
   data() {
     return {
@@ -263,6 +385,9 @@ export default {
         deliveryRequirements: 1,
         orderType: 1,
         orderLibraryType: 2,
+        productType: 2,
+        bomCategoryId: '',
+        produceRoutingId: '',
         deliveryTime: dayjs(
           new Date().getTime() + 3600 * 1000 * 24 * 10
         ).format('YYYY-MM-DD')
@@ -278,6 +403,21 @@ export default {
         { id: 2, label: '外销订单' },
         { id: 3, label: '预制订单' }
       ],
+
+      producedList: [
+      { code: 2, name: '加工(MBOM)' },
+      { code: 3, name: '装配(ABOM)' }
+      ],
+
+      completeList: [
+      { code: 1, name: '齐套' },
+      { code: 2, name: '缺料' }
+      ],
+
+
+      routingList: [],
+
+
       title: '创建订单',
       pickerOptions: {
         disabledDate: (time) => {
@@ -314,9 +454,19 @@ export default {
         this.title = '创建订单';
         this.getSaleCode();
       }
+
+
+
     },
     getDetail(code) {
       getOrderDetail(code).then((res) => {
+        if(res.productInfoList){
+          for(let item of res.productInfoList){
+            if(item.productType){
+              item.productType = parseInt(item.productType);
+            }
+          }
+        }
         this.disabledList = res.productInfoList;
         this.form = res;
       });
@@ -547,7 +697,53 @@ export default {
 
       }
 
-    }
+    },
+
+
+    changeProductType(row, index) {
+      let param = {
+        bomType:  row.productType,
+        categoryId: row.categoryId
+      }
+      bomListByPlan(param).then(res => {
+        let arr = res || [];
+        if(arr.length == 0){
+          row.bomCategoryId = '';
+        }
+        this.$set(this.form.productInfoList[index], 'bomVersionList',  arr);
+        this.$forceUpdate()
+      })
+
+    },
+
+    changeBomId(row, index) {
+      bomRoutingList(row.bomCategoryId).then((res) => {
+        let arr = res || [];
+        if(arr.length == 0){
+          row.produceRoutingId = '';
+        }
+        this.$set(this.form.productInfoList[index], 'routingList',  arr);
+        this.$forceUpdate()
+      })
+    },
+
+    homogeneityInspect(row){
+      if(!row.productType){
+        this.$message.warning('请选择加工方式');
+        return;
+      }
+      if(!row.bomCategoryId){
+        this.$message.warning('请选择BOM版本');
+        return;
+      }
+      let data = [];
+      data.push({bomId: row.bomCategoryId, planNum: row.contractNum});
+      this.$refs.orderHomogeneityInspectDialog.open(data);
+
+    },
+
+
+
   }
 };
 </script>

+ 435 - 255
src/views/saleOrder/components/order-search.vue

@@ -1,124 +1,283 @@
 <!-- 搜索表单 -->
 <template>
-  <el-form label-width="90px" class="ele-form-search" @keyup.enter.native="search" @submit.native.prevent>
+  <el-form
+    label-width="90px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
     <el-row :gutter="15">
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="关键字:">
-          <el-input v-model="where.keyWord" size="mini" placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.keyWord"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="销售订单号:">
-          <el-input v-model="where.code" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.code"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="产品编码:">
-          <el-input v-model="where.productCode" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.productCode"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="行号:">
-          <el-input v-model="where.lineNumber" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.lineNumber"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="牌号:">
-          <el-input v-model="where.brandNo" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.brandNo"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="型号:">
-          <el-input v-model="where.model" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.model"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="订单来源:">
-          <DictSelection dictName="订单来源" size="mini"  clearable v-model="where.orderSource">
+          <DictSelection
+            dictName="订单来源"
+            size="mini"
+            clearable
+            v-model="where.orderSource"
+          >
           </DictSelection>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="客户名称:">
-          <el-input v-model="where.customerName" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.customerName"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="订单类型:">
-          <DictSelection dictName="订单类型" clearable size="mini"  v-model="where.orderType">
+          <DictSelection
+            dictName="订单类型"
+            clearable
+            size="mini"
+            v-model="where.orderType"
+          >
           </DictSelection>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="生产状态:">
-          <el-select v-model="where.proStu" placeholder="请选择" class="w100" size="mini" >
-            <el-option v-if="activeName == 'first'"  v-for="item in awaitProcuct" :key="item.value" :label="item.label"
-              :value="item.value">
+          <el-select
+            v-model="where.proStu"
+            placeholder="请选择"
+            class="w100"
+            size="mini"
+          >
+            <el-option
+              v-if="activeName == 'first'"
+              v-for="item in awaitProcuct"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
             </el-option>
-            <el-option v-if="activeName == 'second'" v-for="item in alreadyProcuct" :key="item.value" :label="item.label"
-              :value="item.value">
+            <el-option
+              v-if="activeName == 'second'"
+              v-for="item in alreadyProcuct"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
             </el-option>
           </el-select>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="按单按库:">
-          <el-select v-model="where.orderLibraryType" placeholder="请选择" class="w100" size="mini" >
-            <el-option v-for="item in orderTypeList" :key="item.value" :label="item.label" :value="item.value">
+          <el-select
+            v-model="where.orderLibraryType"
+            placeholder="请选择"
+            class="w100"
+            size="mini"
+          >
+            <el-option
+              v-for="item in orderTypeList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
             </el-option>
           </el-select>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="业务员:">
-          <el-input v-model="where.salesman" size="mini"  placeholder="请输入"></el-input>
+          <el-input
+            v-model="where.salesman"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
 
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-        <el-form-item label="产品名称:" >
-          <el-input v-model="where.productName" size="mini"  placeholder="请输入"></el-input>
+        <el-form-item label="产品名称:">
+          <el-input
+            v-model="where.productName"
+            size="mini"
+            placeholder="请输入"
+          ></el-input>
         </el-form-item>
       </el-col>
 
-
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="交货日期:">
-          <el-date-picker style="width: 100%" v-model="time" type="daterange" range-separator="至" start-placeholder="开始日期" 
-            end-placeholder="结束日期" size="mini"  value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:00', '23:59:59']">
+          <el-date-picker
+            style="width: 100%"
+            v-model="time"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            size="mini"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            :default-time="['00:00:00', '23:59:59']"
+          >
           </el-date-picker>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
         <el-form-item label="组织机构:">
-          <auth-selection data-type="Array" size="mini"  v-model="where.deptIds" style="width: 100%"></auth-selection>
+          <auth-selection
+            data-type="Array"
+            size="mini"
+            v-model="where.deptIds"
+            style="width: 100%"
+          ></auth-selection>
         </el-form-item>
       </el-col>
 
       <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
         <div class="ele-form-actions">
-          <el-button type="primary"   size="mini" icon="el-icon-search" class="ele-btn-icon" @click="search">
+          <el-button
+            type="primary"
+            size="mini"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
             查询
           </el-button>
-          <el-button @click="reset"  size="mini" icon="el-icon-refresh-left" type="primary">重置</el-button>
+          <el-button
+            @click="reset"
+            size="mini"
+            icon="el-icon-refresh-left"
+            type="primary"
+            >重置</el-button
+          >
         </div>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }" >
+      <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
         <el-form-item label-width="0px">
           <div class="btn-wrapper">
-            <el-button @click="goProduct"  size="mini"  v-if="activeName != 'second'"> 转生产计划</el-button>
-            <el-button type="primary"  size="mini" @click="orderRefresh" :loading="loading">订单刷新</el-button>
-            <el-button type="success"  size="mini" @click="toCreate" v-if="activeName == 'first'">创建订单</el-button>
-
+            <el-button
+              @click="payBudget"
+              size="mini"
+              type="danger"
+            >
+              交期预估</el-button
+            >
+            <el-button
+              @click="homogeneityInspect"
+              size="mini"
+              type="success"
+            >
+              齐套性检查</el-button
+            >
+            <el-button
+              @click="goProduct"
+              size="mini"
+              v-if="activeName != 'second'"
+            >
+              转生产计划</el-button
+            >
+            <el-button
+              type="primary"
+              size="mini"
+              @click="orderRefresh"
+              :loading="loading"
+              >订单刷新</el-button
+            >
+            <el-button
+              type="success"
+              size="mini"
+              @click="toCreate"
+              v-if="activeName == 'first'"
+              >创建订单</el-button
+            >
 
-            <el-upload class="avatar-uploader" action="#" :show-file-list="false"  v-if="activeName == 'first'":http-request="uploadFile"
-              :before-upload="beforeUpload" :on-change="handleChange" ref="uploadFile">
-              <el-button type="warning"  size="mini">批量导入</el-button>
+            <el-upload
+              class="avatar-uploader"
+              action="#"
+              :show-file-list="false"
+              v-if="activeName == 'first'"
+              :http-request="uploadFile"
+              :before-upload="beforeUpload"
+              :on-change="handleChange"
+              ref="uploadFile"
+            >
+              <el-button type="warning" size="mini">批量导入</el-button>
             </el-upload>
-            <el-button type="info"  size="mini">
-              <a :href="fileUrl" download="销售订单导入模板.xls" class="button-link">下载模板</a>
+            <el-button type="info" size="mini">
+              <a
+                :href="fileUrl"
+                download="销售订单导入模板.xls"
+                class="button-link"
+                >下载模板</a
+              >
             </el-button>
-            <el-button type="danger"  size="mini" @click="batchDelete" v-if="activeName == 'first'">批量删除</el-button>
+            <el-button
+              type="danger"
+              size="mini"
+              @click="batchDelete"
+              v-if="activeName == 'first'"
+              >批量删除</el-button
+            >
+
+            <el-button
+              type="danger"
+              size="mini"
+              @click="synchronous"
+              v-if="activeName == 'first' && clientEnvironmentId == 2"
+              >同步数据</el-button
+            >
           </div>
         </el-form-item>
       </el-col>
@@ -134,245 +293,266 @@
 </template>
 
 <script>
-import ImportException from '../components/import-exception.vue';
-import CreateOrder from '../components/create-order.vue';
-import GroupOrder from '../components/group-order.vue';
-import { importFile } from '@/api/saleOrder';
-import fileUrl from '@/assets/file/销售订单导入模板.xls';
-import { pullSalesOrder, deleteOrder } from '@/api/saleOrder';
-export default {
-  props: {
-    selection: Array,
-    activeName: String
-  },
-  components: {
-    ImportException,
-    CreateOrder,
-    GroupOrder
-  },
-  data() {
-    // 默认表单数据
-    const defaultWhere = {
-      keyWord: '',
-      code: '',
-      productCode: '',
-      customerName: '',
-      lineNumber: '',
-      model: '',
-      brandNo: '',
-      orderSource: 0,
-      orderType: 0,
-      proStu: '',
-      orderLibraryType: 0,
-      salesman: '',
-      productName: ''
-    };
-    return {
-      fileUrl,
-      // 表单数据
-      defaultWhere,
-      where: { ...defaultWhere },
-      time: [],
-      fileList: [],
-      awaitProcuct: [{ value: 1, label: '待排产' }],
-      alreadyProcuct: [
-        { value: 0, label: '所有状态' },
-        { value: 2, label: '待发布' },
-        { value: 3, label: '发布失败' },
-        { value: 4, label: '待生产' },
-        { value: 5, label: '生产中' },
-        { value: 6, label: '已完成' },
-        { value: 7, label: '已延期' }
-      ],
-      orderTypeList: [
-        { value: 0, label: '所有' },
-        { value: 1, label: '按单' },
-        { value: 2, label: '按库' }
-      ],
-      loading: false
-    };
-  },
-  computed: {
-    // 是否开启响应式布局
-    styleResponsive() {
-      return this.$store.state.theme.styleResponsive;
-    }
-  },
-  watch: {
-    activeName: {
-      handler() {
-        if (this.activeName == 'first') {
-          this.where.proStu = 1;
-        } else {
-          this.where.proStu = 0;
-        }
-
-        this.reset();
-      },
-      immediate: true
-    }
-  },
-  created() { },
-  methods: {
-    /* 搜索 */
-    search() {
-      if (this.time.length) {
-        this.where.startTime = this.time[0];
-        this.where.endTime = this.time[1];
-      }
-      this.$emit('search', this.where);
-    },
-    /*  重置 */
-    reset() {
-      this.time = [];
-      this.where = { ...this.defaultWhere };
-      if (this.activeName == 'first') {
-        this.where.proStu = 1;
-      } else {
-        this.where.proStu = 0;
-      }
-      this.search();
+  import ImportException from '../components/import-exception.vue';
+  import CreateOrder from '../components/create-order.vue';
+  import GroupOrder from '../components/group-order.vue';
+  import { importFile } from '@/api/saleOrder';
+  import fileUrl from '@/assets/file/销售订单导入模板.xls';
+  import {
+    pullSalesOrder,
+    deleteOrder,
+    synchronousDataByJDY
+  } from '@/api/saleOrder';
+  export default {
+    props: {
+      selection: Array,
+      activeName: String
     },
-    toImport() {
-      this.$refs.importDialog.open();
+    components: {
+      ImportException,
+      CreateOrder,
+      GroupOrder
     },
-    toCreate() {
-      this.$refs.createDialog.open();
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        keyWord: '',
+        code: '',
+        productCode: '',
+        customerName: '',
+        lineNumber: '',
+        model: '',
+        brandNo: '',
+        orderSource: 0,
+        orderType: 0,
+        proStu: '',
+        orderLibraryType: 0,
+        salesman: '',
+        productName: ''
+      };
+      return {
+        fileUrl,
+        // 表单数据
+        defaultWhere,
+        where: { ...defaultWhere },
+        time: [],
+        fileList: [],
+        awaitProcuct: [{ value: 1, label: '待排产' }],
+        alreadyProcuct: [
+          { value: 0, label: '所有状态' },
+          { value: 2, label: '待发布' },
+          { value: 3, label: '发布失败' },
+          { value: 4, label: '待生产' },
+          { value: 5, label: '生产中' },
+          { value: 6, label: '已完成' },
+          { value: 7, label: '已延期' }
+        ],
+        orderTypeList: [
+          { value: 0, label: '所有' },
+          { value: 1, label: '按单' },
+          { value: 2, label: '按库' }
+        ],
+        loading: false
+      };
     },
-    toGroup() {
-      this.$refs.groupDialog.open();
-    },
-    goProduct() {
-      if (!this.selection.length) {
-        return this.$message.warning('请先勾选一个或多个订单!');
-      }
-      const productCode = this.selection[0].productCode;
-      const orderType = this.selection[0].orderType;
-      const produceRoutingId = this.selection[0].produceRoutingId
-       const measuringUnit = this.selection[0].measuringUnit;
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      },
 
 
-      for (var i = 0; i < this.selection.length; i++) {
-        if (productCode != this.selection[i].productCode) {
-          return this.$message.warning('产品编码不一致!');
-        }
-        if (orderType != this.selection[i].orderType) {
-          return this.$message.warning('订单类型不一致!');
+      clientEnvironmentId() {
+        return this.$store.state.user.info.clientEnvironmentId;
+      },
+
+    },
+    watch: {
+      activeName: {
+        handler() {
+          if (this.activeName == 'first') {
+            this.where.proStu = 1;
+          } else {
+            this.where.proStu = 0;
+          }
+
+          this.reset();
+        },
+        immediate: true
+      }
+    },
+    created() {},
+    methods: {
+      /* 搜索 */
+      search() {
+        if (this.time.length) {
+          this.where.startTime = this.time[0];
+          this.where.endTime = this.time[1];
         }
-        if (produceRoutingId != this.selection[i].produceRoutingId) {
-          return this.$message.warning('工艺路线不一致!');
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.time = [];
+        this.where = { ...this.defaultWhere };
+        if (this.activeName == 'first') {
+          this.where.proStu = 1;
+        } else {
+          this.where.proStu = 0;
         }
-        if(measuringUnit != this.selection[i].measuringUnit) {
-          return this.$message.warning('计量单位不一致!');
+        this.search();
+      },
+      toImport() {
+        this.$refs.importDialog.open();
+      },
+      toCreate() {
+        this.$refs.createDialog.open();
+      },
+      toGroup() {
+        this.$refs.groupDialog.open();
+      },
+      goProduct() {
+        if (!this.selection.length) {
+          return this.$message.warning('请先勾选一个或多个订单!');
         }
+        const productCode = this.selection[0].productCode;
+        const orderType = this.selection[0].orderType;
+        const produceRoutingId = this.selection[0].produceRoutingId;
+        const measuringUnit = this.selection[0].measuringUnit;
 
-      }
-      const list = [];
-      this.selection.map((item) => {
-        list.push(item.id);
-      });
-      this.$router.push({
-        path: '/saleOrder/salesToProduction',
-        query: {
-          selection: JSON.stringify(list),
-          produceRoutingId: produceRoutingId,
-          produceRoutingName: this.selection[0].produceRoutingName
+        for (var i = 0; i < this.selection.length; i++) {
+          if (productCode != this.selection[i].productCode) {
+            return this.$message.warning('产品编码不一致!');
+          }
+          if (orderType != this.selection[i].orderType) {
+            return this.$message.warning('订单类型不一致!');
+          }
+          if (produceRoutingId != this.selection[i].produceRoutingId) {
+            return this.$message.warning('工艺路线不一致!');
+          }
+          if (measuringUnit != this.selection[i].measuringUnit) {
+            return this.$message.warning('计量单位不一致!');
+          }
         }
-      });
-    },
-
-    // 刷新订单
-    orderRefresh() {
-      this.loading = true;
-      pullSalesOrder()
-        .then((res) => {
-          this.$message.success('刷新成功!');
-          this.loading = false;
-        })
-        .catch(() => {
-          this.loading = false;
+        const list = [];
+        this.selection.map((item) => {
+          list.push(item.id);
         });
-    },
+        this.$router.push({
+          path: '/saleOrder/salesToProduction',
+          query: {
+            selection: JSON.stringify(list),
+            produceRoutingId: produceRoutingId,
+            produceRoutingName: this.selection[0].produceRoutingName
+          }
+        });
+      },
 
-    // 点击批量删除
-    batchDelete() {
-      if (!this.selection.length) {
-        return this.$message.warning('请先勾选一个或多个订单!');
-      }
-      let ids = [];
-      this.selection.map((item) => {
-        ids.push(item.id);
-      });
-      this.$confirm('此操作将永久删除所选择的订单, 是否继续?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      })
-        .then(() => {
-          deleteOrder(ids).then((res) => {
-            this.$message.success(res);
-            this.search();
+      // 刷新订单
+      orderRefresh() {
+        this.loading = true;
+        pullSalesOrder()
+          .then((res) => {
+            this.$message.success('刷新成功!');
+            this.loading = false;
+          })
+          .catch(() => {
+            this.loading = false;
           });
+      },
+
+      // 点击批量删除
+      batchDelete() {
+        if (!this.selection.length) {
+          return this.$message.warning('请先勾选一个或多个订单!');
+        }
+        let ids = [];
+        this.selection.map((item) => {
+          ids.push(item.id);
+        });
+        this.$confirm('此操作将永久删除所选择的订单, 是否继续?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
         })
-        .catch(() => { });
-    },
+          .then(() => {
+            deleteOrder(ids).then((res) => {
+              this.$message.success(res);
+              this.search();
+            });
+          })
+          .catch(() => {});
+      },
 
-    handleChange(file, fileList) {
-      this.fileList = fileList;
-      console.log(fileList);
-    },
+      handleChange(file, fileList) {
+        this.fileList = fileList;
+        console.log(fileList);
+      },
 
-    //上传限制
-    beforeUpload(file) {
-      const isLt10M = file.size / 1024 / 1024 < 10;
-      if (!isLt10M) {
-        this.$message.error('上传文件大小不能超过 10MB!');
-      }
-      return isLt10M;
-    },
-    //文件上传
-    uploadFile(param) {
-      let fd = new FormData();
-      this.fileList.forEach((item) => {
-        fd.append('importExcel', item.raw);
-      });
-      importFile(fd)
-        .then((res) => {
-          this.$emit('search', this.where);
-          this.$refs.uploadFile.clearFiles();
-        })
-        .catch((data) => {
-          if (data.code != -1) {
-            this.$message.error(data.message);
-          }
-        })
-        .finally(() => {
-          this.$refs.uploadFile.clearFiles();
+      //上传限制
+      beforeUpload(file) {
+        const isLt10M = file.size / 1024 / 1024 < 10;
+        if (!isLt10M) {
+          this.$message.error('上传文件大小不能超过 10MB!');
+        }
+        return isLt10M;
+      },
+      //文件上传
+      uploadFile(param) {
+        let fd = new FormData();
+        this.fileList.forEach((item) => {
+          fd.append('importExcel', item.raw);
+        });
+        importFile(fd)
+          .then((res) => {
+            this.$emit('search', this.where);
+            this.$refs.uploadFile.clearFiles();
+          })
+          .catch((data) => {
+            if (data.code != -1) {
+              this.$message.error(data.message);
+            }
+          })
+          .finally(() => {
+            this.$refs.uploadFile.clearFiles();
+          });
+      },
+
+      synchronous() {
+        synchronousDataByJDY().then((res) => {
+          this.$message.success('同步成功!');
+          this.reset()
         });
+      },
+      payBudget(){
+
+      },
+      homogeneityInspect(){
+        this.$emit('check');
+      },
     }
-  }
-};
+  };
 </script>
 <style lang="scss" scoped>
-.ele-form-actions {
-  display: flex;
-  align-items: center;
-  justify-content: flex-end;
-}
+  .ele-form-actions {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
 
-.btn-wrapper {
-  display: flex;
-  align-items: center;
-  justify-content: flex-start;
-  flex-wrap: wrap;
-}
+  .btn-wrapper {
+    display: flex;
+    align-items: center;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+  }
 
-.avatar-uploader {
-  display: inline-block;
-  margin: 0 10px;
-}
+  .avatar-uploader {
+    display: inline-block;
+    margin: 0 10px;
+  }
 
-.button-link {
-  color: #fff;
-}
+  .button-link {
+    color: #fff;
+  }
 </style>

+ 325 - 0
src/views/saleOrder/components/orderHomogeneityInspectDialog.vue

@@ -0,0 +1,325 @@
+<template>
+  <div>
+  <ele-modal
+    width="80vw"
+    :visible.sync="visible"
+    :close-on-click-modal="false"
+    row-key="code"
+    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.batchNo-->
+<!--            }}</el-descriptions-item>-->
+
+<!--          <el-descriptions-item label="工艺路线">{{-->
+<!--            formData.produceRoutingName-->
+<!--            }}</el-descriptions-item>-->
+
+<!--          <el-descriptions-item label="要求生产数量">{{-->
+<!--            formData.requiredFormingNum-->
+<!--            }}</el-descriptions-item>-->
+<!--          <el-descriptions-item label="要求完成日期">{{-->
+<!--            formData.reqMoldTime-->
+<!--            }}</el-descriptions-item>-->
+<!--        </el-descriptions>-->
+<!--      </el-form>-->
+
+<!--      <headerTitle title="剩余拆批" class="mt20"> </headerTitle>-->
+      <el-tabs v-model="activeName" @tab-click="tabClick()" type="card" size="mini">
+        <el-tab-pane label="自制件" name="first"></el-tab-pane>
+        <el-tab-pane label="装配件" name="second"></el-tab-pane>
+      </el-tabs>
+      <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="requiredFormingNum == 0 ? true : false"-->
+<!--              @click="openUnpack"-->
+<!--            >-->
+<!--              拆批-->
+<!--            </el-button>-->
+<!--          </template>-->
+
+<!--          <template v-slot:requiredFormingNum="scope">-->
+<!--            <el-form-item-->
+<!--              v-if="requiredFormingNum != 0"-->
+<!--              :prop="'surplusUnpack.' + scope.$index + '.requiredFormingNum'"-->
+<!--              :rules="[-->
+<!--                {-->
+<!--                  required: true,-->
+<!--                  message: '请输入要求生产数量',-->
+<!--                  trigger: 'change'-->
+<!--                },-->
+<!--                {-->
+<!--                  pattern: /^\d+(\.{0,1}\d+){0,1}$/,-->
+<!--                  message: '拆批数超过生产数量',-->
+<!--                  trigger: ['blur', 'change']-->
+<!--                }-->
+<!--              ]"-->
+<!--            >-->
+<!--              <el-input-->
+<!--                disabled-->
+<!--                v-model="requiredFormingNum"-->
+<!--                placeholder="请输入"-->
+<!--              ></el-input>-->
+<!--            </el-form-item>-->
+
+<!--            <el-form-item v-else> 工单已全部拆完 </el-form-item>-->
+<!--          </template>-->
+
+<!--          <template v-slot:splitResidue="scope">-->
+<!--            {{ formData.splitResidue }}-->
+<!--          </template>-->
+
+<!--        </ele-pro-table>-->
+
+<!--        <headerTitle title="拆批" class="mt20"> </headerTitle>-->
+
+        <ele-pro-table
+          ref="table"
+          :needPage="false"
+          :columns="columns"
+          :datasource="datasource"
+          :init-load="false"
+        >
+          <template v-slot:stockCount="{ row }">
+            <el-link type="primary" :underline="false" @click="stockDetail(row)">
+              {{ row.stockCount }}
+            </el-link>
+          </template>
+          <template v-slot:currentCount="{ row }">
+            <el-link type="primary" :underline="false" @click="currentDetail(row)">
+              {{ row.currentCount }}
+            </el-link>
+          </template>
+<!--          <template v-slot:requiredFormingNum="scope">-->
+<!--            <el-form-item-->
+<!--              :prop="'unpackList.' + scope.$index + '.requiredFormingNum'"-->
+<!--              :rules="{-->
+<!--                required: true,-->
+<!--                message: '请输入要求生产数量',-->
+<!--                trigger: 'change'-->
+<!--              }"-->
+<!--            >-->
+<!--              <el-input-number-->
+<!--                type="number"-->
+<!--                @change="changeNum(scope.$index)"-->
+<!--                :min="0"-->
+<!--                v-model="scope.row.requiredFormingNum"-->
+<!--                placeholder="请输入"-->
+<!--              ></el-input-number>-->
+<!--            </el-form-item>-->
+<!--          </template>-->
+
+<!--          <template v-slot:reqMoldTime="scope">-->
+<!--            <el-form-item-->
+<!--              :prop="'unpackList.' + scope.$index + '.reqMoldTime'"-->
+<!--              :rules="{-->
+<!--                required: true,-->
+<!--                message: '请选择开始计划时间',-->
+<!--                trigger: 'change'-->
+<!--              }"-->
+<!--            >-->
+<!--              <el-date-picker-->
+<!--                class="w100"-->
+<!--                v-model="scope.row.reqMoldTime"-->
+<!--                type="date"-->
+<!--                value-format="yyyy-MM-dd"-->
+<!--              ></el-date-picker>-->
+<!--            </el-form-item>-->
+<!--          </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>
+
+  <stockDetailDialog ref="stockDetailDialog" />
+
+  <currentDetailDialog ref="currentDetailDialog" />
+  </div>
+</template>
+
+<script>
+  import { orderHomogeneityInspect } from '@/api/saleOrder/index.js';
+  import stockDetailDialog from '../../productionPlan/components/stockDetailDialog.vue';
+  import currentDetailDialog from '../../productionPlan/components/currentDetailDialog.vue';
+  export default {
+    components: {
+      stockDetailDialog,
+      currentDetailDialog
+    },
+    data() {
+      return {
+        visible: false,
+        activeName: 'first',
+        bomIdList: [],
+        formData: {},
+        requestData: {
+          deviceCode: '',
+          deviceName: '',
+          deviceId: ''
+        },
+        requiredFormingNum: 0,
+
+        form: {
+          homogeneityInspect: []
+        },
+
+        rules: {},
+
+        columns: [
+          {
+            prop: 'opCode',
+            label: '工序编码',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'opName',
+            label: '工序名称',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'bomCode',
+            label: '物料编码',
+            align: 'center',
+            minWidth: 100,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'bomName',
+            label: '物料名称',
+            align: 'center',
+            minWidth: 100
+          },
+          {
+            prop: 'count',
+            label: '定额数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'stockCount',
+            prop: 'stockCount',
+            label: '库存数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            prop: 'stockStatus',
+            label: '库存状态',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            slot: 'currentCount',
+            prop: 'currentCount',
+            label: '在途数量',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            prop: 'currentStatus',
+            label: '在途状态',
+            align: 'center',
+            minWidth: 80
+          },
+          {
+            prop: 'finishStatus',
+            label: '最终状态',
+            align: 'center',
+            minWidth: 80
+          },
+        ],
+        ids: [],
+      };
+    },
+    methods: {
+      tabClick(){
+        if(this.activeName == 'first'){
+          this.reload({bomIdList: this.bomIdList, productType: 1});
+        }
+        if(this.activeName == 'second'){
+          this.reload({bomIdList: this.bomIdList, productType: 2});
+        }
+      },
+        reload(where) {
+          this.$nextTick(() => {
+            this.$refs.table.reload({ page: 1, where });
+          });
+        },
+        /* 表格数据源 */
+        datasource({ page, limit, where }) {
+          return orderHomogeneityInspect({
+            pageNum: page,
+            size: limit,
+            ...where,
+          });
+        },
+       stockDetail(row) {
+         this.$refs.stockDetailDialog.open(row);
+       },
+       currentDetail(row) {
+         this.$refs.currentDetailDialog.open(row);
+       },
+      open(data) {
+         this.visible = true;
+         this.bomIdList = data;
+         this.reload({bomIdList: data});
+      },
+      cancel() {
+        this.formData = {};
+        this.visible = false;
+      },
+
+      confirm() {
+        this.visible = false;
+      },
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .mt20 {
+    margin-top: 20px;
+  }
+
+  .el-form-item {
+    margin-bottom: 0 !important;
+  }
+</style>

+ 53 - 2
src/views/saleOrder/index.vue

@@ -6,6 +6,7 @@
         @search="reload"
         :selection="selection"
         :activeName="activeName"
+        @check="check"
       >
       </order-search>
       <el-tabs v-model="activeName" type="card" @tab-click="changeTab">
@@ -97,6 +98,8 @@
     <order-detail @refresh="reload" ref="detailDialog"> </order-detail>
     <!-- 创建订单 -->
     <create-order ref="createDialog" @refresh="reload"> </create-order>
+
+    <orderHomogeneityInspectDialog ref="orderHomogeneityInspectDialog"></orderHomogeneityInspectDialog>
   </div>
 </template>
 
@@ -104,12 +107,14 @@
   import OrderSearch from './components/order-search.vue';
   import OrderDetail from './components/order-detail.vue';
   import CreateOrder from './components/create-order.vue';
+  import orderHomogeneityInspectDialog from './components/orderHomogeneityInspectDialog';
 
   import {
     getPageList,
     deleteOrder,
     updatePriority,
-    fieldModel
+    fieldModel,
+    getByCodeList
   } from '@/api/saleOrder';
   import dictMixins from '@/mixins/dictMixins';
   import { debounce } from 'lodash';
@@ -120,7 +125,8 @@
     components: {
       OrderSearch,
       OrderDetail,
-      CreateOrder
+      CreateOrder,
+      orderHomogeneityInspectDialog,
     },
     data() {
       return {
@@ -359,6 +365,51 @@
       this.requestDict('生产状态');
     },
     methods: {
+      async check(){
+        if(this.selection.length > 0){
+          let codeList = [];
+          this.selection.map(ele => {
+            if(ele.code){
+              codeList.push(ele.code);
+            }
+          })
+          let res = await getByCodeList(codeList)
+          console.log(res);
+          let flag = true;
+          let data = [];
+          if(res){
+            for(let ele of res){
+              let list = ele.productInfoList;
+              if(list){
+                for(let item of list){
+                  if(!item.productType){
+                    flag = false;
+                    this.$message.warning('产品(' + item.productCode + ')未选择加工方式');
+                    break;
+                  }
+                  if(!item.bomCategoryId){
+                    flag = false;
+                    this.$message.warning('产品(' + item.productCode + ')未选择BOM版本');
+                    break;
+                  }
+                  // JSON.parse(JSON.stringify({}))
+                  data.push({bomId: item.bomCategoryId, planNum: item.contractNum})
+                }
+              }
+              if(!flag){
+                break;
+              }
+            }
+          }
+          if(flag){
+            // 齐料
+            this.$refs.orderHomogeneityInspectDialog.open(data);
+          }
+        } else {
+          this.$message.warning('请至少选择一条计划!');
+        }
+
+      },
       getFieldModel() {
         fieldModel({ fieldModel: 't_main_category' }).then((res) => {
           const privateColumn = [];

+ 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>
+

+ 67 - 30
src/views/workOrder/index.vue

@@ -12,8 +12,11 @@
         :columns="newColumns"
         :datasource="datasource"
         cache-key="workOrderTable"
+         row-key="code"
         @sort-change="onSortChange"
         height="calc(100vh - 380px)"
+        autoAmendPage
+        :parse-data="parseData"
       >
         <template v-slot:code="{ row }">
           {{ row.code }}
@@ -55,16 +58,31 @@
         </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"
             icon="el-icon-truck"
             @click="toRelease(row)"
             v-if="
+            row.isSplit != 1  &&
               (clientEnvironmentId != '4' && row.status == 8) ||
               (clientEnvironmentId == '4' &&
                 !row.productName.includes('板材') &&
-                row.status == 8)
+                row.status == 8) 
             "
           >
             派单
@@ -81,11 +99,9 @@
         label-position="left"
         label-width="100px"
       >
-
-      
-      <el-form-item label="报工类型:" prop="singleReport">
-          <el-radio-group v-model="form.singleReport">
-            <el-radio :label="1">单件报工</el-radio>
+        <el-form-item label="报工类型:" prop="singleReport">
+          <el-radio-group v-model="form.singleReport" >
+            <el-radio :label="1" v-if="clientEnvironmentId != 2">单件报工</el-radio>
             <el-radio :label="0">批量报工</el-radio>
           </el-radio-group>
         </el-form-item>
@@ -97,15 +113,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 +132,6 @@
           </el-select>
         </el-form-item>
 
-
         <el-form-item
           label="工位:"
           prop="workstationIds"
@@ -142,8 +155,6 @@
           </el-select>
         </el-form-item>
 
-
-
         <el-form-item label="人员:" prop="crewIds" v-if="form.assignType == 2">
           <el-select
             class="ele-block"
@@ -162,7 +173,6 @@
             </el-option>
           </el-select>
         </el-form-item>
-
       </el-form>
 
       <div class="footer" slot="footer">
@@ -170,6 +180,8 @@
         <el-button type="primary" v-click-once @click="confirm">确定</el-button>
       </div>
     </el-dialog>
+
+    <unpackDialog ref="unpackRef" @success="createSuccess" />
   </div>
 </template>
 
@@ -186,13 +198,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 {
@@ -201,7 +215,7 @@
 
         form: {
           assignType: 1,
-          singleReport: 1
+          singleReport: this.clientEnvironmentId == 2 ? 0 : 1
         },
         rules: {
           singleReport: [
@@ -225,7 +239,6 @@
               trigger: ['blur', 'change']
             }
           ]
-       
         },
 
         teamList: [],
@@ -265,14 +278,14 @@
             slot: 'code',
             label: '生产订单号',
             align: 'center',
-            minWidth: 110,
+            minWidth: 210,
             sortable: true
           },
           {
             prop: 'productionPlanCode',
             label: '计划编号',
             align: 'center',
-            minWidth: 110
+            minWidth: 150
           },
           {
             prop: 'produceRoutingName',
@@ -308,7 +321,8 @@
           {
             prop: 'model',
             label: '型号',
-            align: 'center'
+            align: 'center',
+            showOverflowTooltip: true
           },
 
           {
@@ -354,13 +368,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 +437,31 @@
         });
       },
 
+      /* 数据转为树形结构 */
+      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 +485,6 @@
         this.current = row;
         this.visible = true;
 
-
-
         this.FirstTaskIdFn();
         this.WorkCenterIdFn();
       },
@@ -464,7 +493,7 @@
         const loading = this.$loading({ text: '加载中...' });
         releaseWorkOrder({
           id: this.current.id,
-         ...this.form
+          ...this.form
         })
           .then((res) => {
             if (res) {
@@ -517,10 +546,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;