Explorar o código

修改BOM管理

huang_an %!s(int64=2) %!d(string=hai) anos
pai
achega
63ead9d204

+ 11 - 0
src/api/factoryModel/index.js

@@ -197,3 +197,14 @@ export async function updateProfessionCertificationById(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+// 获取供应商/客户列表
+export async function getVendorPageList(params) {
+  const res = await request.get(`/eom/contact/page`, {
+    params
+  });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 11 - 1
src/api/technology/route/index.js

@@ -106,7 +106,7 @@ export default {
       return res.data.message;
     }
   },
-  
+
   syncRouting: async () => {
     const res = await request.get(`/sap/sync/syncRouting`);
     if (res.data.code == 0) {
@@ -114,4 +114,14 @@ export default {
     }
     return Promise.reject(new Error(res.data.message));
   },
+  // 通过工艺路线查询工序
+  getProcessById: async (data) => {
+    const res = await request.post(
+      '/main/producerouting/taskinstance/listByRoutingIds',
+      data
+    );
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  }
 };

+ 2 - 1
src/enum/dict.js

@@ -44,7 +44,8 @@ export default {
   流程实例的结果: ' bpm_process_instance_result',
   角色数据权限字典: 'role_data_authority_dic',
   区域等级: 'main_area_level',
-  区域类型: 'main_area_type'
+  区域类型: 'main_area_type',
+  工种类型: 'work_type'
 };
 
 export const numberList = [

+ 1 - 0
src/store/modules/user.js

@@ -55,6 +55,7 @@ export default {
   mutations: {
     // 设置登录用户的信息
     setUserInfo(state, info) {
+      localStorage.setItem('info', JSON.stringify(info));
       state.info = info;
     },
     // 设置登录用户的菜单

+ 209 - 146
src/views/documentManagement/certificateManagement/components/add-dialog.vue

@@ -1,85 +1,107 @@
 <template>
   <!-- 上传 -->
   <el-dialog :title="title" :visible.sync="dialogVisible" width="60%">
-      <el-form ref="form" :model="form" :rules="rules" label-width="82px">
-        <el-row :gutter="15">
-          <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
-            <el-form-item prop="code" label="证照编号">
-              <el-input
-                placeholder="请输入"
-                v-model="form.code"
-                disabled
-              ></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
-             <el-form-item prop="type" label="证件类型">
-                <DictSelection v-model="form.type" dictName="证件类型"></DictSelection>
-             </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
-            <el-form-item prop="status" label="状态">
-               <DictSelection v-model="form.status" dictName="规则状态"></DictSelection>
-            </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
-             <el-form-item prop="holder" label="持证人">
-               <el-input
-                 placeholder="请输入"
-                 v-model="form.holder"
-               ></el-input>
-             </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
-            <el-form-item label="颁发时间">
-              <el-date-picker
-                style="width:100%"
-                v-model="form.enactorTime"
-                type="date"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                placeholder="选择日期"
+    <el-form ref="form" :model="form" :rules="rules" label-width="82px">
+      <el-row :gutter="15">
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item prop="type" label="证件类型">
+            <DictSelection
+              v-model="form.type"
+              dictName="证件类型"
+            ></DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item prop="code" label="证照编号">
+            <el-input placeholder="请输入" v-model="form.code"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="等级:" prop="level">
+            <el-select style="width: 100%" v-model="form.level" filterable>
+              <el-option
+                :label="item.label"
+                :value="item.value"
+                v-for="(item, index) in levelOptions"
+                :key="index"
               >
-              </el-date-picker>
-            </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
-             <el-form-item prop="date" label="有效期至">
-                <el-date-picker
-                  style="width:100%"
-                  v-model="form.date"
-                  type="daterange"
-                  range-separator="至"
-                  start-placeholder="开始日期"
-                  end-placeholder="结束日期"
-                  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 ? { sm: 24 } : { span: 24 }">
-             <el-form-item prop="imageObj" label="证照图片">
-               <fileUpload
-                 v-model="form.imageObj"
-                 module="main"
-                 :showLib="true"
-                 :limit='1'
-               />
-             </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { sm: 24 } : { span: 24 }">
-            <el-form-item prop="remark" label="备注">
-               <el-input
-                 placeholder="请输入"
-                 v-model="form.remark"
-                 type="textarea"
-                 :rows="3"
-                 :resize="`none`"
-               ></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item prop="status" label="状态">
+            <DictSelection
+              v-model="form.status"
+              dictName="规则状态"
+            ></DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item prop="holder" label="持证人">
+            <el-input
+              v-model="form.holder"
+              clearable
+              readonly
+              placeholder="请选择"
+              @click.native="openStaffSelection"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="颁发时间">
+            <el-date-picker
+              style="width: 100%"
+              v-model="form.enactorTime"
+              type="date"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              placeholder="选择日期"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item prop="date" label="有效期至">
+            <el-date-picker
+              style="width: 100%"
+              v-model="form.date"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              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 ? { sm: 24 } : { span: 24 }">
+          <el-form-item prop="imageObj" label="证照图片">
+            <fileUpload
+              v-model="form.imageObj"
+              module="main"
+              :showLib="true"
+              :limit="1"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 24 } : { span: 24 }">
+          <el-form-item prop="remark" label="备注">
+            <el-input
+              placeholder="请输入"
+              v-model="form.remark"
+              type="textarea"
+              :rows="3"
+              :resize="`none`"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <staffSelection
+      ref="staffSelection"
+      @confirm="confirmStaffSelection"
+    ></staffSelection>
     <div slot="footer" class="dialog-footer">
       <el-button size="small" @click="submit" type="primary">提 交</el-button>
       <el-button size="small" @click="close">关 闭</el-button>
@@ -88,34 +110,65 @@
 </template>
 
 <script>
-  import { saveOrEdit , getPhotoInfo } from '@/api/documentManagement';
+  import staffSelection from './staffSelection.vue';
+  import { saveOrEdit, getPhotoInfo } from '@/api/documentManagement';
   import fileUpload from '@/components/upload/fileUpload';
   import imgUpload from '@/components/upload/imgUpload';
-  import { getCode  } from '@/api/ruleManagement/matter'
+  import { getCode } from '@/api/ruleManagement/matter';
   export default {
     components: {
       fileUpload,
-      imgUpload
+      imgUpload,
+      staffSelection
     },
     //注册组件
-    data () {
+    data() {
       const defaultForm = {
-        code:'',
-        date:[],
-        imageObj:[]
+        code: '',
+        holder: '',
+        holderId: '',
+        date: [],
+        imageObj: []
       };
       return {
         dialogVisible: false,
+        levelOptions: [
+          {
+            label: '初级',
+            value: '1'
+          },
+          {
+            label: '中级',
+            value: '2'
+          },
+          {
+            label: '高级',
+            value: '3'
+          }
+        ],
         rules: {
-          code: [{ required: true, trigger: 'blur', message: '请输入证照编号' }],
-          type: [{ required: true, trigger: 'change' , message: '请选择证件类型'}],
-          date: [{ required: true, trigger: 'change', message: '请选择有效期' }],
-          holder: [{ required: true, trigger: 'blur', message: '请输入持证人' }],
-          status: [{ required: true, trigger: 'change', message: '请选择状态' }],
-          imageObj: [{ required: true, trigger: 'change' , message: '请选择证照图片'}]
+          code: [
+            { required: true, trigger: 'blur', message: '请输入证照编号' }
+          ],
+          // level: [{ required: true, trigger: 'change', message: '选择等级' }],
+          type: [
+            { required: true, trigger: 'change', message: '请选择证件类型' }
+          ],
+          date: [
+            { required: true, trigger: 'change', message: '请选择有效期' }
+          ],
+          holder: [
+            { required: true, trigger: 'change', message: '请输入持证人' }
+          ],
+          status: [
+            { required: true, trigger: 'change', message: '请选择状态' }
+          ],
+          imageObj: [
+            { required: true, trigger: 'change', message: '请选择证照图片' }
+          ]
         },
-        form: {...defaultForm },
-        title:"新增"
+        form: { ...defaultForm },
+        title: '新增'
       };
     },
     computed: {
@@ -124,78 +177,88 @@
         return this.$store.state.theme.styleResponsive;
       }
     },
-    created () {},
+    created() {},
     methods: {
-      open (row) {
+      //选择负责人
+      confirmStaffSelection(data) {
+        console.log(data);
+        this.form.holderId = data.map((item) => item.id).join(',');
+        this.form.holder = data.map((item) => item.name).join(',');
+        this.$forceUpdate();
+        console.log(this.form);
+      },
+      openStaffSelection() {
+        this.$refs.staffSelection.open([]);
+      },
+      open(row) {
         this.$refs.form && this.$refs.form.clearValidate();
         this.dialogVisible = true;
-        if(row){
-           this.title = '修改'
-           this.getInfo(row.id)
-        }else{
-          this.title = '新增'
-          this.$refs.form.resetFields()
-          this.form = {...this.defaultForm};
-          this.getOrderCode()
+        if (row) {
+          this.title = '修改';
+          this.getInfo(row.id);
+        } else {
+          this.title = '新增';
+          this.$refs.form.resetFields();
+          this.form = { ...this.defaultForm };
+          this.getOrderCode();
         }
       },
-      async getOrderCode () {
+      async getOrderCode() {
         const data = await getCode('license_code');
         this.$set(this.form, 'code', data);
       },
 
-      async getInfo(id){
-        const data = await getPhotoInfo(id)
+      async getInfo(id) {
+        const data = await getPhotoInfo(id);
         this.form = {
           ...data,
-          date:[data.validityStartTime,data.validityEndTime]
-        }
-        this.$set(this.form,'imageObj',[data.fileObj])
+          date: [data.validityStartTime, data.validityEndTime]
+        };
+        this.$set(this.form, 'imageObj', [data.fileObj]);
       },
 
-      close(){
-         this.dialogVisible = false
-         // this.$refs.form.resetFields()
+      close() {
+        this.dialogVisible = false;
+        // this.$refs.form.resetFields()
       },
 
-      submit(){
-         this.$refs.form.validate((valid) => {
-           if (!valid) {
-             return false;
-           }
-           this.loading = true;
-           if(this.form.date?.length){
-              this.form.validityStartTime = this.form.date[0];
-              this.form.validityEndTime = this.form.date[1];
-           }
-           if(this.form.imageObj.length){
-              this.form.fileObj = this.form.imageObj[0]
-           }
-           const data = {
-             ...this.form,
-             fileId:this.form.fileObj.id
-           };
-           delete data.date
-           delete data.imageObj
-           saveOrEdit(data)
-             .then((msg) => {
-               this.loading = false;
-               this.$message.success(msg);
-               this.dialogVisible = false;
-               this.$emit('success');
-             })
-             .catch((e) => {
-               this.loading = false;
-             });
-         });
-
+      submit() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          this.loading = true;
+          if (this.form.date?.length) {
+            this.form.validityStartTime = this.form.date[0];
+            this.form.validityEndTime = this.form.date[1];
+          }
+          if (this.form.imageObj.length) {
+            this.form.fileObj = this.form.imageObj[0];
+          }
+          const data = {
+            ...this.form,
+            fileId: this.form.fileObj.id
+          };
+          delete data.date;
+          delete data.imageObj;
+          saveOrEdit(data)
+            .then((msg) => {
+              this.loading = false;
+              this.$message.success(msg);
+              this.dialogVisible = false;
+              this.$emit('success');
+            })
+            .catch((e) => {
+              this.loading = false;
+            });
+        });
       }
     }
   };
 </script>
 
 <style lang="scss">
- .el-form-item{
-    margin-bottom:20px!important;
- }
+  .el-form-item {
+    margin-bottom: 20px !important;
+  }
 </style>

+ 43 - 36
src/views/factoryModel/jobManagement/components/user-edit.vue

@@ -3,7 +3,6 @@
   <ele-modal
     width="960px"
     :visible="visible"
-    :append-to-body="true"
     :close-on-click-modal="false"
     custom-class="ele-dialog-form"
     :title="isView ? '查看工种' : isUpdate ? '修改工种' : '添加工种'"
@@ -12,6 +11,17 @@
     <header-title title="基本信息"></header-title>
     <el-form ref="form" :model="form" :rules="rules" label-width="100px">
       <el-row>
+        <el-col :span="10">
+          <el-form-item label="名称:" prop="name">
+            <el-input
+              :disabled="isView"
+              v-model="form.name"
+              clearable
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+
         <el-col :span="10">
           <el-form-item label="类型:" prop="type">
             <el-select
@@ -30,7 +40,8 @@
             </el-select>
           </el-form-item>
         </el-col>
-
+      </el-row>
+      <el-row>
         <el-col :span="10">
           <el-form-item label="编码:" prop="code">
             <el-input
@@ -41,8 +52,7 @@
             />
           </el-form-item>
         </el-col>
-      </el-row>
-      <el-row>
+
         <el-col :span="10">
           <el-form-item label="等级:" prop="level">
             <el-select
@@ -62,18 +72,6 @@
           </el-form-item>
         </el-col>
       </el-row>
-      <el-row>
-        <el-col :span="20">
-          <el-form-item label="名称:" prop="name">
-            <el-input
-              :disabled="isView"
-              v-model="form.name"
-              clearable
-              placeholder="请输入"
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
       <el-row>
         <el-col :span="20">
           <el-form-item label="标准工时费:" prop="hourCost">
@@ -108,28 +106,25 @@
           </el-form-item>
         </el-col>
       </el-row>
-      <el-row>
+      <!-- <el-row>
         <el-col :span="20">
-          <el-form-item label="资质:" prop="name">
-            <el-select
-              style="width: 100%"
-              :disabled="isView"
+          <el-form-item label="资质:" prop="aptitude">
+            <el-input
               v-model="form.aptitude"
-              filterable
-            >
-              <el-option
-                v-for="item in typeList"
-                :key="item.dictCode"
-                :label="item.dictValue"
-                :value="item.dictCode"
-              >
-              </el-option>
-            </el-select>
+              placeholder="请输入内容"
+              clearable
+              readonly
+              @clear="handleClear"
+              @click.native="handleDeliveryNote()"
+            ></el-input>
           </el-form-item>
         </el-col>
-      </el-row>
+      </el-row> -->
     </el-form>
-
+    <aptitudeDialog
+      ref="aptitudeDialogRef"
+      @success="chooseAptitude"
+    ></aptitudeDialog>
     <template v-slot:footer>
       <el-button @click="updateVisible(false)">取消</el-button>
       <el-button v-if="isView" type="primary" @click="updateVisible(false)">
@@ -148,6 +143,7 @@
     getProfessiongetById,
     updateProfessiongetById
   } from '@/api/factoryModel';
+  import aptitudeDialog from './aptitudeDialog.vue';
   export default {
     props: {
       // 弹窗是否打开
@@ -158,6 +154,9 @@
       controlList: Array,
       typeList: Array
     },
+    components: {
+      aptitudeDialog
+    },
     data() {
       const defaultForm = function () {
         return {
@@ -218,9 +217,6 @@
           hourCost: [
             { required: true, trigger: 'blur', message: '请输入标准工时费' }
           ],
-          aptitude: [
-            { required: true, message: '请选择资质', trigger: 'change' }
-          ],
           level: [{ required: true, message: '请选择等级', trigger: 'change' }],
           type: [{ required: true, message: '请选择类型', trigger: 'change' }]
         },
@@ -232,6 +228,17 @@
       };
     },
     methods: {
+      handleClear() {
+        this.form.aptitude = '';
+        this.form.certificationId = '';
+      },
+      chooseAptitude(data) {
+        this.form.aptitude = data.map((item) => item.name).join(',');
+        this.form.certificationId = data.map((item) => item.id).join(',');
+      },
+      handleDeliveryNote() {
+        this.$refs.aptitudeDialogRef.open();
+      },
       /* 保存编辑 */
       save() {
         this.$refs.form.validate((valid) => {

+ 13 - 13
src/views/factoryModel/jobManagement/index.vue

@@ -154,7 +154,7 @@
             align: 'center',
             minWidth: 110,
             formatter: (_row) => {
-              return this.getDictValue('工种', _row.type);
+              return this.getDictValue('工种类型', _row.type);
             }
           },
           {
@@ -193,16 +193,16 @@
             align: 'center',
             minWidth: 110
           },
-          {
-            slot: 'aptitude',
-            label: '资质',
-            showOverflowTooltip: true,
-            align: 'center',
-            minWidth: 110,
-            formatter: (_row) => {
-              return this.getDictValue('工种', _row.aptitude);
-            }
-          },
+          // {
+          //   slot: 'aptitude',
+          //   label: '资质',
+          //   showOverflowTooltip: true,
+          //   align: 'center',
+          //   minWidth: 110,
+          //   formatter: (_row) => {
+          //     return this.getDictValue('工种类型', _row.aptitude);
+          //   }
+          // },
           {
             columnKey: 'action',
             label: '操作',
@@ -227,11 +227,11 @@
       };
     },
     created() {
-      this.requestDict('工种');
+      this.requestDict('工种类型');
     },
     computed: {
       typeOptions() {
-        return this.dict[this.dictEnum['工种']];
+        return this.dict[this.dictEnum['工种类型']];
       }
     },
     methods: {

+ 91 - 12
src/views/factoryModel/qualificationManagement/components/user-edit.vue

@@ -6,31 +6,31 @@
     :append-to-body="true"
     :close-on-click-modal="false"
     custom-class="ele-dialog-form"
-    :title="isView ? '查看工种' : isUpdate ? '修改工种' : '添加工种'"
+    :title="isView ? '查看资质' : isUpdate ? '修改资质' : '添加资质'"
     @update:visible="updateVisible"
   >
     <header-title title="基本信息"></header-title>
     <el-form ref="form" :model="form" :rules="rules" label-width="100px">
       <el-row>
         <el-col :span="10">
-          <el-form-item label="类型:" prop="type">
+          <el-form-item label="资质类型:" prop="certificationType">
             <el-select
               style="width: 100%"
               :disabled="isView"
-              v-model="form.type"
+              v-model="form.certificationType"
+              @change="changeCertificationType"
               filterable
             >
               <el-option
-                v-for="item in typeList"
-                :key="item.dictCode"
-                :label="item.dictValue"
-                :value="item.dictCode"
+                v-for="item in qualificationOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
               >
               </el-option>
             </el-select>
           </el-form-item>
         </el-col>
-
         <el-col :span="10">
           <el-form-item label="编码:" prop="code">
             <el-input
@@ -43,6 +43,24 @@
         </el-col>
       </el-row>
       <el-row>
+        <el-col :span="10">
+          <el-form-item label="类型:" prop="type">
+            <el-select
+              style="width: 100%"
+              :disabled="isView"
+              v-model="form.type"
+              filterable
+            >
+              <el-option
+                v-for="item in typeList"
+                :key="item.dictCode"
+                :label="item.dictValue"
+                :value="item.dictCode"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
         <el-col :span="10">
           <el-form-item label="等级:" prop="level">
             <el-select
@@ -68,8 +86,10 @@
             <el-input
               :disabled="isView"
               v-model="form.name"
+              readonly
               clearable
-              placeholder="请输入"
+              @click.native="handleClick"
+              placeholder="请选择"
             />
           </el-form-item>
         </el-col>
@@ -115,6 +135,18 @@
         </el-col>
       </el-row>
     </el-form>
+    <vendorDialog
+      ref="vendorDialogRef"
+      @success="confirmSelection"
+    ></vendorDialog>
+    <staffSelection
+      ref="staffSelection"
+      @confirm="confirmSelection"
+    ></staffSelection>
+    <clientDialog
+      ref="clientSelection"
+      @success="confirmSelection"
+    ></clientDialog>
 
     <template v-slot:footer>
       <el-button @click="updateVisible(false)">取消</el-button>
@@ -129,6 +161,9 @@
 </template>
 
 <script>
+  import clientDialog from './clientDialog.vue';
+  import vendorDialog from './vendorDialog.vue';
+  import staffSelection from './staffSelection.vue';
   import fileUpload from '@/components/upload/fileUpload';
   import { getFile } from '@/api/system/file';
   import {
@@ -138,7 +173,10 @@
   } from '@/api/factoryModel';
   export default {
     components: {
-      fileUpload
+      fileUpload,
+      vendorDialog,
+      staffSelection,
+      clientDialog
     },
     props: {
       // 弹窗是否打开
@@ -153,7 +191,9 @@
       const defaultForm = function () {
         return {
           id: '',
+          certificationType: '',
           code: '',
+          personnelIds: '',
           level: '',
           name: '',
           type: '',
@@ -163,6 +203,21 @@
         };
       };
       return {
+        qualificationOptions: [
+          {
+            label: '客户资质',
+            value: '1'
+          },
+          {
+            label: '供应商资质',
+            value: '2'
+          },
+          {
+            label: '个人资质',
+            value: '3'
+          }
+        ],
+
         filedList: [],
         defaultForm,
         // 表单数据
@@ -203,10 +258,9 @@
         ],
         // 表单验证规则
         rules: {
-          name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+          name: [{ required: true, message: '请输入名称', trigger: 'change' }],
           code: [{ required: true, trigger: 'blur', message: '请输入编码' }],
           date: [{ required: true, message: '请选择资质', trigger: 'change' }],
-          level: [{ required: true, message: '请选择等级', trigger: 'change' }],
           type: [{ required: true, message: '请选择类型', trigger: 'change' }]
         },
         // 提交状态
@@ -217,6 +271,31 @@
       };
     },
     methods: {
+      changeCertificationType(value) {
+        this.form.certificationType = value;
+        this.form.name = '';
+        this.form.personnelIds = '';
+      },
+      handleClick() {
+        console.log(this.form);
+        switch (this.form.certificationType) {
+          case '1':
+            this.$refs.clientSelection.open();
+            break;
+          case '2':
+            this.$refs.vendorDialogRef.open();
+            break;
+          case '3':
+            this.$refs.staffSelection.open([]);
+            break;
+        }
+      },
+      confirmSelection(data) {
+        console.log(data);
+        this.form.personnelIds = data.map((item) => item.id).join(',');
+        this.form.name = data.map((item) => item.name).join(',');
+        this.$forceUpdate();
+      },
       downloadFile(url, form) {
         console.log(form);
         getFile({ objectName: url }, '附件');

+ 3 - 3
src/views/factoryModel/qualificationManagement/index.vue

@@ -154,7 +154,7 @@
             align: 'center',
             minWidth: 110,
             formatter: (_row) => {
-              return this.getDictValue('工种', _row.type);
+              return this.getDictValue('工种类型', _row.type);
             }
           },
           {
@@ -233,11 +233,11 @@
       };
     },
     created() {
-      this.requestDict('工种');
+      this.requestDict('工种类型');
     },
     computed: {
       typeOptions() {
-        return this.dict[this.dictEnum['工种']];
+        return this.dict[this.dictEnum['工种类型']];
       }
     },
     methods: {

+ 347 - 20
src/views/material/BOMmanage/components/workingProcedure.vue

@@ -837,11 +837,133 @@
             </template>
           </ele-pro-table>
         </el-tab-pane>
-        <el-tab-pane label="资质"> </el-tab-pane>
-        <el-tab-pane label="工艺文件"> </el-tab-pane>
+        <el-tab-pane label="工种" name="工种">
+          <ele-pro-table
+            ref="jobTable"
+            :columns="jobColumns"
+            :datasource="datasource"
+            row-key="id"
+          >
+            <!-- 表头工具栏 -->
+            <template v-slot:toolbar>
+              <el-button
+                size="small"
+                type="primary"
+                icon="el-icon-plus"
+                class="ele-btn-icon"
+                @click="addJob"
+                >新增</el-button
+              >
+            </template>
+            <template v-slot:action="{ row, $index }">
+              <el-link type="primary" @click="handleDel(row, $index)"
+                >删除</el-link
+              >
+            </template>
+          </ele-pro-table>
+        </el-tab-pane>
+        <el-tab-pane label="工艺文件" name="工艺文件">
+          <ele-pro-table
+            ref="fileTable"
+            :columns="jobColumns1"
+            :datasource="datasource"
+            :need-page="false"
+            :immediate="true"
+          >
+            <!-- 表头工具栏 -->
+            <template v-if="!isView" v-slot:toolbar>
+              <el-button type="primary" @click="addFile">添加</el-button>
+            </template>
+            <template v-slot:action="{ row, $index }">
+              <el-link type="primary" @click="handleDel(row, $index)"
+                >删除</el-link
+              >
+            </template>
+            <template v-slot:type="{ row }">
+              <div v-if="isView">{{ row.type }}</div>
+              <el-input
+                v-else
+                v-model="row.type"
+                placeholder="请输入"
+              ></el-input>
+            </template>
+
+            <template v-slot:code="{ row }">
+              <div v-if="isView">{{ row.code }}</div>
+              <el-input
+                v-else
+                v-model="row.code"
+                placeholder="请输入"
+              ></el-input>
+            </template>
+
+            <template v-slot:versions="{ row }">
+              <div v-if="isView">{{ row.versions }}</div>
+              <el-input
+                v-else
+                v-model="row.versions"
+                placeholder="请输入"
+              ></el-input>
+            </template>
+
+            <template v-slot:status="{ row }">
+              <div v-if="isView">{{
+                statusOption.filter((item) => item.value == row.status)[0].label
+              }}</div>
+              <div v-else>
+                <template>
+                  <el-select v-model="row.status" placeholder="请选择">
+                    <el-option
+                      v-for="item in statusOption"
+                      :label="item.label"
+                      :value="item.value"
+                      :key="item.value"
+                    >
+                    </el-option>
+                  </el-select>
+                </template>
+              </div>
+            </template>
+
+            <template v-slot:path="{ row }">
+              <div v-if="isView">附件</div>
+              <div v-else
+                ><div class="downLoad">
+                  <fileUpload
+                    v-model="jobFiledList"
+                    :show-file-list="false"
+                    module="main"
+                    @input="uploadedJobSuccess($event, row)"
+                    :showLib="false"
+                    :limit="1"
+                  />
+                  <div v-if="row.path">
+                    <el-button
+                      style="margin-left: 10px"
+                      size="mini"
+                      type="primary"
+                      @click="downloadFile(row.path)"
+                      >下载</el-button
+                    >
+                  </div></div
+                >
+              </div>
+            </template>
+
+            <template v-slot:remark="{ row }">
+              <div v-if="isView">{{ row.remark }}</div>
+              <el-input
+                v-else
+                v-model="row.remark"
+                placeholder="请输入"
+              ></el-input>
+            </template>
+          </ele-pro-table>
+        </el-tab-pane>
       </el-tabs>
     </el-card>
     <!-- 选择工艺参数 -->
+    <jobDialog ref="jobRef" @chooseModal="chooseJob"></jobDialog>
     <ParamModal ref="paramRefs" @chooseModal="chooseModal"></ParamModal>
     <ProductModal ref="productRefs" @changeProduct="determineChoose" />
     <div class="btns">
@@ -854,6 +976,7 @@
 </template>
 
 <script>
+  import dictMixins from '@/mixins/dictMixins';
   import * as dayjs from 'dayjs';
   import { getFile } from '@/api/system/file';
   import fileUpload from '@/components/upload/fileUpload';
@@ -861,22 +984,36 @@
   import ParamModal from '@/views/technology/productParam/components/ParamModal.vue';
   import ProductModal from '@/components/select/bom/ProductModal.vue';
   import userSearch from './user-search.vue';
+  import jobDialog from './jobDialog.vue';
   export default {
     components: {
       userSearch,
       ParamModal,
       fileUpload,
-      ProductModal
+      ProductModal,
+      jobDialog
     },
+    mixins: [dictMixins],
     data() {
       return {
         isView: false,
         filedList: [],
+        jobFiledList: [],
         activeName: '工艺参数',
         attributeData: {},
         visible: false,
         title: '配置',
         form: {},
+        statusOption: [
+          {
+            label: '启用',
+            value: 1
+          },
+          {
+            label: '停用',
+            value: 0
+          }
+        ],
         isReworkBom: ['否', '是'],
         isReworkBomList: [
           { label: '否', value: 0 },
@@ -994,9 +1131,164 @@
             align: 'center'
           }
         ],
-
+        levelOptions: [
+          {
+            label: '初级',
+            value: '1'
+          },
+          {
+            label: '中级',
+            value: '2'
+          },
+          {
+            label: '高级',
+            value: '3'
+          }
+        ],
+        // 表格列配置
+        jobColumns: [
+          {
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+          {
+            slot: 'type',
+            label: '类型',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.getDictValue('工种类型', _row.type);
+            }
+          },
+          {
+            align: 'center',
+            prop: 'code',
+            label: '编码',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            slot: 'name',
+            prop: 'name',
+            label: '名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'level',
+            prop: 'level',
+            label: '等级',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110,
+            formatter: (_row) => {
+              return this.levelOptions.filter(
+                (item) => _row.level == item.value
+              )[0].label;
+            }
+          },
+          {
+            slot: 'hourCost',
+            prop: 'hourCost',
+            label: '标准工时费',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 260,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
         // 表格选中数据
-        selection: [],
+        jobColumns1: [
+          {
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+          {
+            slot: 'type',
+            prop: 'type',
+            label: '类型',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'code',
+            prop: 'code',
+            label: '编码',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'name',
+            prop: 'name',
+            label: '名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'path',
+            prop: 'path',
+            label: '附件',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 200
+          },
+          {
+            slot: 'versions',
+            prop: 'versions',
+            label: '版本',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            slot: 'status',
+            prop: 'status',
+            label: '状态',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'createName',
+            label: '创建人',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 260,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
 
         rowData: {},
         treeData: {},
@@ -1006,9 +1298,37 @@
         normalHours: {}
       };
     },
-
-    watch: {},
+    created() {
+      this.requestDict('工种类型');
+    },
     methods: {
+      addFile() {
+        let userInfo = JSON.parse(localStorage.getItem('info'));
+        this.tableData.taskParam[this.currentIndex]['fileParam'].push({
+          code: '',
+          type: '',
+          name: '',
+          versions: '',
+          name: '',
+          status: 1,
+          createName: userInfo.name,
+          createTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
+        });
+      },
+      addJob() {
+        this.$refs.jobRef.open();
+      },
+      chooseJob(data) {
+        this.$refs.jobTable.setData([
+          ...data,
+          ...this.$refs.jobTable.getData()
+        ]);
+        this.$set(
+          this.tableData.taskParam[this.currentIndex],
+          'aptitudeParam',
+          this.$refs.jobTable.getData()
+        );
+      },
       determineChoose(title, row, idx) {
         let type = '';
         if (this.activeName === '材料定额') {
@@ -1060,6 +1380,11 @@
         row.bomArtFiles = data[0].storePath;
         this.filedList = [];
       },
+      uploadedJobSuccess(data, row) {
+        row.path = data[0].storePath;
+        row.name = data[0].name;
+        this.jobFiledList = [];
+      },
       downloadFile(url) {
         getFile({ objectName: url }, '附件');
       },
@@ -1074,6 +1399,10 @@
           type = 'resource';
         } else if (this.activeName === '替代料') {
           type = 'replaceMaterial';
+        } else if (this.activeName === '工种') {
+          type = 'aptitudeParam';
+        } else if (this.activeName === '工艺文件') {
+          type = 'fileParam';
         }
         this.tableData.taskParam[this.currentIndex][type].splice(index, 1);
       },
@@ -1150,6 +1479,14 @@
           this.$refs.replaceMaterialTable.setData(
             this.tableData.taskParam[this.currentIndex].replaceMaterial || []
           );
+        } else if (this.activeName === '工种') {
+          this.$refs.jobTable.setData(
+            this.tableData.taskParam[this.currentIndex].aptitudeParam || []
+          );
+        } else if (this.activeName === '工艺文件') {
+          this.$refs.fileTable.setData(
+            this.tableData.taskParam[this.currentIndex].fileParam || []
+          );
         }
       },
       openParam(type) {
@@ -1195,14 +1532,6 @@
         );
       },
       open(rowData, treeData, tableData, isView) {
-        console.log(treeData);
-        console.log(rowData);
-        console.log(tableData);
-        console.log(
-          JSON.parse(sessionStorage.getItem('private-vuex-main-data'))
-        );
-        console.log(isView);
-        console.log(this.defaultColumns);
         this.columns = [];
         this.columns1 = [];
         this.isView = isView;
@@ -1251,14 +1580,12 @@
           this.handleClose();
         } else {
           // 保存生产节拍
-          let userInfo = JSON.parse(
-            sessionStorage.getItem('private-vuex-main-data')
-          );
-          this.beatParam.createName = userInfo.user.info.name;
+          let userInfo = JSON.parse(localStorage.getItem('info'));
+          this.beatParam.createName = userInfo.name;
           this.beatParam.createTime = dayjs(new Date()).format(
             'YYYY-MM-DD HH:mm:ss'
           );
-          this.beatParam.updateName = userInfo.user.info.name;
+          this.beatParam.updateName = userInfo.name;
           this.beatParam.updateTime = dayjs(new Date()).format(
             'YYYY-MM-DD HH:mm:ss'
           );

+ 3 - 12
src/views/material/BOMmanage/components/workingStep.vue

@@ -1225,13 +1225,6 @@
         );
       },
       open(rowData, treeData, isView) {
-        console.log(treeData);
-        console.log(rowData);
-        console.log(
-          JSON.parse(sessionStorage.getItem('private-vuex-main-data'))
-        );
-        console.log(isView);
-        console.log(this.defaultColumns);
         this.columns = [];
         this.columns1 = [];
         this.isView = isView;
@@ -1276,14 +1269,12 @@
           this.handleClose();
         } else {
           // 保存生产节拍
-          let userInfo = JSON.parse(
-            sessionStorage.getItem('private-vuex-main-data')
-          );
-          this.beatParam.createName = userInfo.user.info.name;
+          let userInfo = JSON.parse(localStorage.getItem('info'));
+          this.beatParam.createName = userInfo.name;
           this.beatParam.createTime = dayjs(new Date()).format(
             'YYYY-MM-DD HH:mm:ss'
           );
-          this.beatParam.updateName = userInfo.user.info.name;
+          this.beatParam.updateName = userInfo.name;
           this.beatParam.updateTime = dayjs(new Date()).format(
             'YYYY-MM-DD HH:mm:ss'
           );

+ 10 - 1
src/views/material/BOMmanage/details.vue

@@ -102,6 +102,13 @@
               <el-tab-pane label="文档" name="文档">
                 <document></document>
               </el-tab-pane>
+              <el-tab-pane
+                v-if="currentNodeData.children?.length < 1"
+                label="工艺路线"
+                name="工艺路线"
+              >
+                <routing :taskParam="currentNodeData"></routing>
+              </el-tab-pane>
               <el-tab-pane
                 v-if="currentNodeData.children?.length < 1"
                 label="工艺"
@@ -129,6 +136,7 @@
   } from '@/api/material/BOM.js';
   import { getTreeByGroup } from '@/api/classifyManage';
   import attribute from './components/attribute.vue';
+  import routing from './components/routing.vue';
   import baseInfo from './components/baseInfo.vue';
   import document from './components/document.vue';
   import workmanship from './components/workmanship.vue';
@@ -140,7 +148,8 @@
       baseInfo,
       document,
       workmanship,
-      bomTreeDialog
+      bomTreeDialog,
+      routing
     },
     data() {
       return {

+ 0 - 1
src/views/system/organization/components/staffSelection.vue

@@ -160,7 +160,6 @@
     created() {},
     methods: {
       open(selectedList) {
-
         this.dialogVisible = true;
         this.selectStafflist = selectedList;
         this.getInfo();