ソースを参照

重排 生产准备更改

qinhb 9 ヶ月 前
コミット
ac878cf7ef

+ 2 - 2
src/views/base/craftManagement/process/index.vue

@@ -239,7 +239,7 @@ option.value = Object.assign(option.value, {
         },
       ],
     },
-    {
+    /*{
       label: "标准机时",
       prop: "timeingNum",
       type: "number",
@@ -251,7 +251,7 @@ option.value = Object.assign(option.value, {
           trigger: "blur",
         },
       ],
-    },
+    },*/
     {
       label: "标准工时",
       prop: "standardWorktime",

+ 2 - 2
src/views/base/craftManagement/route/bindConfig.ts

@@ -89,7 +89,7 @@ export const formOption = {
         },
       ],
     },
-    {
+    /*{
       label: "标准机时",
       prop: "timeingNum",
       span: 24,
@@ -102,7 +102,7 @@ export const formOption = {
       //     trigger: "blur",
       //   },
       // ],
-    },
+    },*/
     {
       label: "后置时间",
       prop: "forceTime",

+ 22 - 1
src/views/base/craftManagement/route/components/configs.ts

@@ -160,21 +160,30 @@ export const getTableConfig = (id: string) => {
           hide: true,
           value: id,
         },
-        { label: "精度要求", prop: "accuracy" },
+        { label: "精度要求", prop: "accuracy",labelWidth: 150,},
         { label: "所需数量", prop: "num", display: false, hide: true },
         {
           label: "设备类型",
           prop: "equitType",
           search: true,
+          labelWidth: 150,
           filterable: true,
           type: "select",
           dataType: "string",
           dicData: dicts.device_type,
           props: { label: "dictLabel", value: "dictValue" },
+          rules: [
+            {
+              required: true,
+              message: "设备类型",
+              trigger: "blur",
+            },
+          ],
         },
         {
           label: "必须采集",
           prop: "collection",
+          labelWidth: 150,
           type: "radio", //类型为单选框
           dicData: [
             {
@@ -195,6 +204,18 @@ export const getTableConfig = (id: string) => {
             },
           ],
         },
+        { label: "标准机时(分)", prop: "standTime",
+          type: "number",
+          labelWidth: 150,
+          min: 1,
+          rules: [
+            {
+              required: true,
+              message: "标准机时",
+              trigger: "blur",
+            },
+          ],
+        },
       ],
     },
     ESOP: {

+ 2 - 16
src/views/plan/order/components/order-page.vue

@@ -151,20 +151,6 @@ option.value = Object.assign(option.value, {
       filterable: true, //添加filterable属性即可启用搜索功能
     },
     {
-      label: "订单数量",
-      prop: "orderNum",
-      type: "number",
-      width: "100",
-      min: 1,
-      max: 99999,
-    },
-    {
-      label: "排产数量",
-      prop: "scheduledNum",
-      width: "100",
-      display: false,
-    },
-    {
       label: "优先级",
       prop: "priority",
       width: "100",
@@ -186,7 +172,7 @@ option.value = Object.assign(option.value, {
       format: "YYYY-MM-DD", //前端展示格式
       valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
     },
-    {
+    /*{
       label: "所属公司",
       prop: "companyId",
       width: 130,
@@ -197,7 +183,7 @@ option.value = Object.assign(option.value, {
         label: "deptName",
         value: "id",
       },
-    },
+    },*/
     {
       label: "项目号",
       width: 130,

+ 145 - 40
src/views/plan/prepare/index.vue

@@ -18,6 +18,7 @@
         @selection-change="selectionChange"
         :span-method="spanMethod"
     >
+
       <template #orderCode="{ row }">
         <el-text v-if="row.orderCode">{{row.orderCode}}</el-text>
         <div style="width: 100%; height: 100%;display: flex" v-if="!row.orderCode && row.operationDetails">
@@ -36,41 +37,23 @@
         <el-tag v-if="row.workOrderCode === '-' && row.stockNum === '0'" type="danger">库存数量:{{ row.stockNum }}</el-tag>
       </template>
       <template #menu="{size,row,index}">
-<!--        <el-button
+        <el-button
             type="primary"
             link
-            v-if="row.bom === '0' || row.dataFile === '0'|| row.routeId === '0'|| row.craftFile === '0'"
+            v-if="row.materialState === '0'"
             size="small"
             @click="handleEdit(row,0)"
-        ><i-ep-edit />编辑
-        </el-button>-->
-        <el-button
+        ><i-ep-edit />编辑准备
+        </el-button>
+<!--        <el-button
             type="primary"
             link
             v-if="row.deviceState === '0' || row.bom === '-' || row.craftFile === '-' || row.materialState === '0'"
             size="small"
             @click="handleRefresh(row.workOrderCode)"
         ><i-ep-edit />刷新
-        </el-button>
-<!--        <el-button
-            type="primary"
-            link
-            v-if="row.bom === '0' || row.dataFile === '0'|| row.routeId === '0'|| row.craftFile === '0' || row.materialState === '0' || row.deviceState === '0'"
-            size="small"
-            @click="deleteRow(row)"
-        ><i-ep-edit />删除
         </el-button>-->
       </template>
-<!--      <template #menu-left="{ size }">
-        <el-button
-          :disabled="toDeleteIds.length < 1"
-          type="danger"
-          icon="el-icon-delete"
-          :size="size"
-          @click="multipleDelete"
-          >删除</el-button
-        >
-      </template>-->
     </avue-crud>
     <el-dialog
         v-model="dialog.visible"
@@ -80,6 +63,77 @@
     >
       <work-order-page queryType="1"  @orderInfo="orderInfo"/>
     </el-dialog>
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="45%"
+        @close="dialog1.visible = false"
+    >
+      <el-form ref="dataFormRef" :model="form" label-width="90px">
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="工单编码" prop="materialCode">
+              <el-input v-model="form.workOrderCode" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="订单编码" prop="materialName">
+              <el-input v-model="form.orderCode" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="订单名称" prop="materialModel">
+              <el-input v-model="form.orderName" disabled/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="物料编码" prop="materialCode">
+              <el-input v-model="form.materialCode" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="物料名称" prop="materialName">
+              <el-input v-model="form.materialName" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="物料型号" prop="materialModel">
+              <el-input v-model="form.materialModel" disabled/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="工单数量" prop="materialModel">
+              <el-input v-model="form.workOrderNum" disabled/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24" v-for="(item,index) in templates">
+          <el-col :span="24">
+            <el-form-item :label="templates[index].str" >
+              <el-switch
+                  class="mb-2"
+                  v-model="templates[index].state"
+                  style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
+                  active-text="完成"
+                  inactive-text="未完成"
+                  active-value="1"
+                  inactive-value="0"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="onSubmit">确 定</el-button>
+          <el-button @click="dialog1.visible = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -89,13 +143,14 @@ import { useCrud } from "@/hooks/userCrud";
 import {prepareCheckInfo,refreshPrepareCheckInfo} from "@/api/order"
 import {queryChildrenInfo} from "@/api/process"
 import { useCommonStoreHook } from "@/store";
+import { queryDictDataByType } from "@/api/system/dict";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 const router = useRouter();
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
-
+const templates = ref([])
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
@@ -110,6 +165,15 @@ const dialog = reactive({
   title: "订单选择",
   visible: false,
 });
+const dialog1 = reactive({
+  title: "生产准备",
+  visible: false,
+});
+const onSubmit = (done,loading) => {
+  form.value.materialStr = JSON.stringify(templates.value)
+  updateRow(done,loading)
+  dialog1.visible = false
+}
 const merginState = ref(false)
 const spanMethod = ({ row, column, rowIndex, columnIndex })=>{
   if(row.hasParent){
@@ -144,7 +208,10 @@ const treeLoad = (tree, treeNode, resolve) =>{
   })
 }
 const handleEdit =(row,index)=>{
-  crudRef.value && crudRef.value.rowEdit(row,index);
+  dialog1.visible = true
+  form.value = row
+  templates.value = []
+  templates.value = JSON.parse(row.materialStr)
 }
 const handleRefresh =(code)=>{
   refreshPrepareCheckInfo(code).then((data)=>{
@@ -175,6 +242,7 @@ option.value = Object.assign(option.value, {
   lazy: true,
   menuWidth: 100,
   rowKey: 'workOrderCode',
+  defaultExpandedKeys: [],
   addBtn: false,
   dialogWidth: '45%', // 设置编辑弹窗的宽度为50%
   column: [
@@ -182,7 +250,7 @@ option.value = Object.assign(option.value, {
       label: "工单号",
       prop: "workOrderCode",
       search: true,
-      minWidth: 200,
+      minWidth: 120,
       editDisabled : true,
       rules: [
         {
@@ -284,7 +352,7 @@ option.value = Object.assign(option.value, {
         },
       ],
     },
-    {
+    /*{
       label: "文件资料",
       width: 350,
       overHidden: true,
@@ -360,19 +428,7 @@ option.value = Object.assign(option.value, {
         }
         return '<b class="el-tag el-tag--danger el-tag--light">'+val.materialStr+'</b>';
       },
-    },
-    {
-      label: "创建时间",
-      prop: "created",
-      width: 200,
-      display: false
-    },
-    {
-      label: "创建人",
-      width: 200,
-      prop: "creator",
-      display: false
-    },
+    },*/
   ],
 });
 
@@ -384,6 +440,55 @@ onMounted(() => {
   if(url.includes("workOrderCode")){
     search.value.workOrderCode = url.substring(url.indexOf("workOrderCode")+ 14)
   }
+  queryDictDataByType("prepare_template").then((res)=>{
+    if(res.data){
+      //templates.value = res.data
+      res.data.forEach((item)=>{
+        option.value.column.push(
+            {
+              label: item.dictLabel,
+              prop: item.dictValue,
+              width: 100,
+              slot: true,
+              display: false,
+              html: true,
+              formatter: (val) => {
+                let state = "-1"
+                if(val.materialStr){
+                  let list = JSON.parse(val.materialStr);
+                  let obj = list.find(option => option.name === item.dictValue);
+                  if(obj){
+                    state = obj.state;
+                  }
+                }
+                if (state === '1') {
+                  return '<b class="el-tag el-tag--success el-tag--light">已完成</b>';
+                }else if(state === '0'){
+                  return '<b class="el-tag el-tag--danger el-tag--light">未完成</b>';
+                }
+                return '<b class="el-tag el-tag--warrning el-tag--light">未配置</b>';
+              },
+            }
+        )
+      })
+    }
+    option.value.column.push(
+        {
+          label: "创建时间",
+          prop: "created",
+          width: 200,
+          display: false
+        }
+    )
+    option.value.column.push(
+        {
+          label: "创建人",
+          width: 200,
+          prop: "creator",
+          display: false
+        }
+    )
+  })
   dataList();
 });
 

+ 299 - 0
src/views/plan/prepareTemplate/index.vue

@@ -0,0 +1,299 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-save="createRow"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
+    >
+
+      <template #state="scope">
+        <el-switch
+            active-value="1"
+            inactive-value="0"
+            inline-prompt
+            active-text="是"
+            inactive-text="否"
+            v-model="scope.row.state"
+            @click="changeItem($event,scope.row)"
+            class="ml-2"
+            style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
+        />
+      </template>
+      <template #menu-left="{ size }">
+        <el-button
+            type="primary"
+            icon="el-icon-plus"
+            :size="size"
+            @click="openDialog(0, null)"
+        >新增</el-button>
+      </template>
+
+      <template #menu="{ size, row, index }">
+        <el-button
+            type="primary"
+            link
+            size="small"
+            @click="openDialog(1, row)"
+        ><i-ep-edit />编辑
+        </el-button>
+      </template>
+    </avue-crud>
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="45%"
+        @close="dialog1.visible = false"
+    >
+      <el-form ref="dataFormRef" :model="form" label-width="90px" :rules="rules">
+        <el-row :gutter="24">
+          <el-col :span="8">
+          <el-form-item label="物料编码" prop="materialCode">
+            <el-input v-model="form.materialCode" @click="openDialog" readOnly placeholder="请选择物料" />
+          </el-form-item>
+          </el-col>
+          <el-col :span="8">
+          <el-form-item label="物料名称" prop="materialName">
+            <el-input v-model="form.materialName" disabled placeholder="请选择物料" />
+          </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="物料型号" prop="materialModel">
+              <el-input v-model="form.materialModel" disabled placeholder="请选择物料" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="物料模板" prop="template">
+              <el-select v-model="form.template" multiple placeholder="请选择模板" @change="changeTemplate">
+                <el-option
+                    v-for="item in templates"
+                    :label="item.dictLabel"
+                    :value="item.dictValue"
+                    :key="item.dictLabel"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24" v-for="item in clickTemplates">
+          <el-col :span="24">
+            <el-form-item :label="item.name">
+            <el-switch
+                class="mb-2"
+                style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
+                active-text="完成"
+                inactive-text="未完成"
+                active-value="1"
+                inactive-value="0"
+            />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="onSubmit">确 定</el-button>
+          <el-button @click="dialog1.visible = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="80%"
+        @close="dialog.visible = false"
+    >
+      <choice-item-page @material-info="materialInfo" />
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook } from "@/store";
+import { queryDictDataByType } from "@/api/system/dict";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const router = useRouter();
+
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/prepareTemplate",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+const dataFormRef = ref(ElForm);
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const dialog = reactive({
+  title: "物料选择",
+  visible: false,
+});
+const dialog1 = reactive({
+  title: "模板保存",
+  visible: false,
+});
+const openDialog = (type, row) => {
+  if(type === 0 ){
+    form.value.materialCode = "";
+    form.value.materialName = ""
+    form.value.materialModel = ""
+    form.value.template = []
+    clickTemplates.value = []
+    dialog1.visible = true;
+  }else if(type === 1){
+    form.value = row
+    if(!Array.isArray(row.template)){
+      form.value.template = eval("(" +row.template + ")")
+    }
+    //form.value.templateList = row.template.split(",")
+    changeTemplate()
+    dialog1.visible = true;
+  }else{
+    dialog.visible = true;
+  }
+};
+const changeItem =(obj,row) => {
+  form.value = {id: row.id,state: row.state}
+  updateRow()
+  form.value = null
+}
+const templates = ref([])
+const clickTemplates = ref([])
+const changeTemplate = ()=>{
+  clickTemplates.value = []
+  if(form.value.template){
+    for(let i = 0 ; i< form.value.template.length; i ++){
+      clickTemplates.value.push({value: form.value.template[i],name: templates.value.find(option => option.dictValue === form.value.template[i]).dictLabel});
+    }
+  }
+}
+const onSubmit = (done,loading) => {
+  dataFormRef.value.validate((isValid) => {
+    if (isValid) {
+      if(!form.value.id){
+        createRow(done,loading)
+      }else{
+        updateRow(done,loading)
+      }
+      dialog1.visible = false
+    }
+  });
+  console.log('submit!')
+}
+const materialInfo = (value) => {
+  form.value.materialCode = value.materialCode;
+  form.value.materialName = value.materialName;
+  form.value.materialModel = value.spec;
+  dialog.visible = false;
+};
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: true,
+  selection: false,
+  editBtn: false,
+  viewBtn: false,
+  menuBtn: true,
+  menuWidth: 150,
+  addBtn: false,
+  dialogWidth: '45%', // 设置编辑弹窗的宽度为50%
+  column: [
+    {
+      label: "物料编码",
+      prop: "materialCode",
+      search: true,
+      overHidden: true,
+      disabled: true,
+      rules: [
+        {
+          required: true,
+          message: "产品编码不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "产品名称",
+      prop: "materialName",
+      disabled: true,
+      overHidden: true,
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "产品名称不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "产品规格",
+      prop: "materialModel",
+      disabled: true,
+      search: true,
+      overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "产品规格不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "是否启用",
+      prop: "state",
+      editDisplay: false,
+      addDisplay: false,
+      slot: true,
+      width: 100,
+    },
+    {
+      label: "创建时间",
+      prop: "created",
+      width: 200,
+      display: false
+    },
+    {
+      label: "创建人",
+      width: 200,
+      prop: "creator",
+      display: false
+    },
+  ],
+});
+const rules = reactive({
+  materialCode: [{ required: true, message: "请选择物料", trigger: "blur" }],
+  template: [{ required: true, message: "请选择模板值", trigger: "blur" }],
+});
+
+onMounted(() => {
+  dataList();
+  queryDictDataByType("prepare_template").then((res)=>{
+    templates.value = res.data
+  })
+});
+
+</script>
+<style scoped>
+:deep(.el-progress-bar__innerText) {
+  color: #737674;
+  display: inline-block;
+  font-size: 12px;
+  margin: 0 5px;
+  vertical-align: middle;
+}
+</style>

+ 16 - 6
src/views/plan/workOrder/index.vue

@@ -54,13 +54,11 @@
           ><i-ep-edit />编辑
         </el-button>
         <el-button
-          @click="aps(row.id)"
+          @click="aps(row.id,row.workOrderState)"
           text
           v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_aps]"
           v-if="
-            row.workOrderState === '0' ||
-            row.workOrderState === '1' ||
-            row.workOrderState === '2'
+            row.workOrderState !== '6'
           "
           type="primary"
           :size="size"
@@ -69,6 +67,7 @@
             <svg-icon icon-class="paicheng" />
           </template>
         </el-button>
+
         <el-button
           text
           v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_lock]"
@@ -263,6 +262,7 @@
               :label="item.dictLabel"
               :value="item.dictValue"
               :key="item.dictValue"
+              :disabled="apsDisabled.includes(item.dictValue)"
             />
           </el-select>
         </el-form-item>
@@ -343,11 +343,20 @@ const dialog5 = reactive({
   visible: false,
 });
 const apsType = ref(0);
-const aps = (id) => {
+const aps = (id,state) => {
   apsType.value = 0;
   formData.workOrderIds = [id];
   dialog5.visible = true;
+  formData.apsModel = null
+  apsDisabled.value = []
+  if(state === '0' || state === '1' || state === '2' || state === '3'){
+    apsDisabled.value = ['2']
+  }
+  if(state === '4' || state === '5'){
+    apsDisabled.value = ['0','1']
+  }
 };
+const apsDisabled = ref([])
 const showSeqPage = (workOrderCode) => {
   form.value = workOrderCode;
   dialog4.visible = true;
@@ -419,6 +428,7 @@ const handleEdit = (row, index) => {
 };
 const aps1 = () => {
   apsType.value = 1;
+  apsDisabled.value = []
   formData.workOrderIds = toDeleteIds;
   dialog5.visible = true;
 };
@@ -428,7 +438,7 @@ const apsPriority = ref([]);
 const formData = reactive({
   apsTime: null,
   priority: "1",
-  apsModel: "0",
+  apsModel: null,
   workOrderId: 0,
 });