Browse Source

工艺管理

汪钰 2 năm trước cách đây
mục cha
commit
e78f92ad9f

+ 41 - 0
src/api/technology/control/index.js

@@ -0,0 +1,41 @@
+import request from '@/utils/request';
+
+export default {
+  //列表
+  list: async (params) => {
+    const res = await request.get('/main/producecontrol/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+
+  //详情
+  getCode: async () => {
+    const res = await request.get(`/main/codemanage/getCode/produce_control`);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //保存
+  save: async (data) => {
+    const res = await request.post('/main/producecontrol/save', data);
+    console.log(res, 'res');
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
+  //保存
+  update: async (data) => {
+    const res = await request.put('/main/producecontrol/update', data);
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
+  //删除
+  delete: async (data) => {
+    const res = await request.delete('/main/producecontrol/delete', { data });
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  }
+};

+ 53 - 4
src/api/technology/route/index.js

@@ -15,6 +15,55 @@ export default {
       return res.data.data;
     }
   },
+
+  //工艺路线工序参数实例-分页
+  taskinstanceParamList: async (params) => {
+    const res = await request.get('/main/producerouting/param/page', {
+      params
+    });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+
+  //工艺路线工序参数实例-保存
+  taskinstanceParamSave: async (data) => {
+    const res = await request.post('/main/producerouting/param/save', data);
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
+
+  //工艺路线工序实例-分页
+  taskinstanceList: async (data) => {
+    const res = await request.post(
+      '/main/producerouting/taskinstance/page',
+      data
+    );
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //工艺路线工序实例-保存
+  taskinstanceSave: async (data) => {
+    const res = await request.post(
+      '/main/producerouting/taskinstance/save',
+      data
+    );
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
+  //工艺路线工序实例-删除
+  taskinstanceDelete: async (data) => {
+    const res = await request.delete(
+      '/main/producerouting/taskinstance/delete',
+      { data }
+    );
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
   //获取工艺所属参数列表
   paramList: async (params) => {
     const res = await request.get('/main/producetask/param/page', { params });
@@ -31,7 +80,7 @@ export default {
   },
   //详情
   getById: async (id) => {
-    const res = await request.get(`/main/producetask/getById/${id}`);
+    const res = await request.get(`/main/producerouting/getById/${id}`);
     if (res.data.code == 0) {
       return res.data.data;
     }
@@ -45,14 +94,14 @@ export default {
   },
   //保存
   save: async (data) => {
-    const res = await request.post('/main/producetask/save', data);
+    const res = await request.post('/main/producerouting/save', data);
     if (res.data.code == 0) {
-      return res.data;
+      return res.data.message;
     }
   },
   //删除
   delete: async (data) => {
-    const res = await request.delete('/main/producetask/delete', { data });
+    const res = await request.delete('/main/producerouting/delete/' + data);
     if (res.data.code == 0) {
       return res.data.message;
     }

+ 24 - 7
src/api/technology/work/index.js

@@ -3,30 +3,47 @@ import request from '@/utils/request';
 export default {
   //列表
   list: async (params) => {
-    const res = await request.get('/main/producetask/page', { params });
+    const res = await request.get('/main/workcenter/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //获取人员列表
+  getUserPage: async () => {
+    const res = await request.get('/main/user/getUserPage', {
+      params: {
+        pageNum: 1,
+        size: -1
+      }
+    });
     if (res.data.code == 0) {
       return res.data.data;
     }
   },
   //详情
   getCode: async () => {
-    const res = await request.get(
-      `/main/codemanage/getCode/process_management`
-    );
+    const res = await request.get(`/main/codemanage/getCode/work_center`);
     if (res.data.code == 0) {
       return res.data.data;
     }
   },
   //保存
   save: async (data) => {
-    const res = await request.post('/main/producetask/save', data);
+    const res = await request.post('/main/workcenter/save', data);
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
+  //保存
+  update: async (data) => {
+    const res = await request.put('/main/workcenter/update', data);
     if (res.data.code == 0) {
-      return res.data;
+      return res.data.message;
     }
   },
   //删除
   delete: async (data) => {
-    const res = await request.delete('/main/producetask/delete', { data });
+    const res = await request.delete('/main/workcenter/delete', { data });
     if (res.data.code == 0) {
       return res.data.message;
     }

+ 200 - 0
src/views/technology/control/components/user-edit.vue

@@ -0,0 +1,200 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="960px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="true"
+    custom-class="ele-dialog-form"
+    :title="isUpdate ? '修改工序控制码' : '添加工序控制码'"
+    @update:visible="updateVisible"
+  >
+    <header-title title="基本信息"></header-title>
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="编码:" prop="code">
+            <el-input
+              clearable
+              disabled
+              v-model="form.code"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="8">
+          <el-form-item label="名称:" prop="name">
+            <el-input v-model="form.name" clearable placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <header-title title="业务控制"></header-title>
+    <el-form ref="form1" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="检验方式:" prop="checkMethod">
+            <el-select v-model="form.checkMethod" placeholder="请选择">
+              <el-option
+                v-for="item in checkMethodList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="报工方式:" prop="submitMethod">
+            <el-select v-model="form.submitMethod" placeholder="请选择">
+              <el-option
+                v-for="item in submitMethodList"
+                :key="item.code"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="加工方式:" prop="produceMethod">
+            <el-select v-model="form.produceMethod" placeholder="请选择">
+              <el-option
+                v-for="item in produceMethodList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import control from '@/api/technology/control';
+  export default {
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object,
+      submitMethodList: Array,
+      checkMethodList: Array,
+      produceMethodList: Array
+    },
+    data() {
+      const defaultForm = {
+        id: null,
+        code: '',
+        name: '',
+        checkMethod: '',
+        submitMethod: '',
+        produceMethod: ''
+      };
+      return {
+        defaultForm,
+        // 表单数据
+        form: { ...defaultForm },
+
+        // 表单验证规则
+        rules: {
+          name: [
+            { required: true, message: '请输入控制码名称', trigger: 'blur' }
+          ],
+          code: [{ required: true, trigger: 'change' }],
+          checkMethod: [
+            { required: true, message: '请选择检验方式', trigger: 'blur' }
+          ],
+          submitMethod: [
+            { required: true, message: '请选择报工方式', trigger: 'blur' }
+          ],
+          produceMethod: [
+            { required: true, message: '请选择加工方式', trigger: 'blur' }
+          ]
+        },
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 保存编辑 */
+      save() {
+        this.$refs.form.validate((valid) => {
+          this.$refs.form1.validate((valid1) => {
+            console.log(valid1, valid);
+            if (!valid || !valid1) {
+              return false;
+            }
+            if (!this.isUpdate) {
+              delete this.form.id;
+            }
+
+            this.loading = true;
+            const saveOrUpdate = this.isUpdate ? control.update : control.save; // 保存或更新工厂函数名称
+            let title = this.isUpdate ? '修改' : '保存';
+            saveOrUpdate(this.form)
+              .then((msg) => {
+                this.form = {};
+                this.loading = false;
+                this.$message.success(title + msg);
+                this.updateVisible(false);
+                this.$emit('done');
+              })
+              .catch((e) => {
+                this.loading = false;
+                // this.$message.error(e.message);
+              });
+          });
+        });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      async visible(visible) {
+        if (visible) {
+          if (this.data) {
+            console.log(111111);
+
+            // const res = await work.getById(this.data.id);
+
+            this.$util.assignObject(this.form, this.data);
+            this.isUpdate = true;
+          } else {
+            const res = await control.getCode();
+            this.form.code = res;
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm };
+        }
+      }
+    }
+  };
+</script>

+ 70 - 0
src/views/technology/control/components/user-search.vue

@@ -0,0 +1,70 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="77px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="编码:">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        code: '',
+        name: ''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere }
+      };
+    },
+
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 255 - 4
src/views/technology/control/index.vue

@@ -1,9 +1,260 @@
 <template>
-  <div>666</div>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <user-search @search="reload" />
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        v-loading="loading"
+        row-key="code"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit()"
+          >
+            新建
+          </el-button>
+        </template>
+
+        <template v-slot:checkMethod="{ row }">
+          {{ checkMethod(row.checkMethod) }}
+        </template>
+        <template v-slot:submitMethod="{ row }">
+          {{ submitMethod(row.submitMethod) }}
+        </template>
+        <template v-slot:produceMethod="{ row }">
+          {{ produceMethod(row.produceMethod) }}
+        </template>
+        <!-- 状态列 -->
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit(row)"
+          >
+            修改
+          </el-link>
+
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除当前工序吗?"
+            @confirm="remove(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :checkMethodList="checkMethodList"
+      :data="current"
+      :produceMethodList="produceMethodList"
+      :submitMethodList="submitMethodList"
+      @done="reload"
+      ref="userEdit"
+    />
+    <!-- 导入弹窗 -->
+  </div>
 </template>
 
 <script>
-  export default {};
-</script>
+  import UserSearch from './components/user-search.vue';
+  import UserEdit from './components/user-edit.vue';
+
+  import control from '@/api/technology/control';
+
+  export default {
+    name: 'technologyWork',
+    components: {
+      UserSearch,
+      UserEdit
+    },
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            prop: 'code',
+            label: '编码',
+
+            showOverflowTooltip: true,
+            align: 'center',
+
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'checkMethod',
+            label: '检验方式',
+            slot: 'checkMethod',
+            showOverflowTooltip: true,
+            align: 'center'
+          },
+          {
+            prop: 'submitMethod',
+            label: '报工方式',
+            slot: 'submitMethod',
+            showOverflowTooltip: true,
+            align: 'center'
+          },
+          {
+            prop: 'produceMethod',
+            label: '加工方式',
+            slot: 'produceMethod',
+            showOverflowTooltip: true,
+            align: 'center'
+          },
 
-<style></style>
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 220,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+
+        // 检验枚举
+        checkMethodList: [
+          { label: '专检', value: 1 },
+          { label: '非专检', value: 2 }
+        ],
+        //报工枚举
+        submitMethodList: [
+          { label: '必须报工', value: 1 },
+          { label: '可选报工', value: 2 },
+          { label: '不允许报工', value: 3 }
+        ],
+        //加工枚举
+        produceMethodList: [
+          { label: '不限制', value: 1 },
+          { label: '厂内加工', value: 2 },
+          { label: '委外加工', value: 3 }
+        ],
+
+        // 表格选中数据
+        selection: [],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 是否显示导入弹窗
+        showImport: false,
+        loading: false
+      };
+    },
+
+    methods: {
+      /*回显工厂 */
+      checkMethod(value) {
+        let obj = this.checkMethodList.find((f) => f.value == value);
+        return obj?.label;
+      },
+      /*回显类别 */
+      submitMethod(value) {
+        return this.submitMethodList.find((f) => f.value == value).label;
+      },
+      /*回显负责人 */
+      produceMethod(value) {
+        let obj = this.produceMethodList.find((f) => f.value == value);
+        return obj?.label;
+      },
+
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        const res = await control.list({
+          ...where,
+          ...order,
+          pageNum: page,
+          size: limit
+        });
+        return res;
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where: where });
+      },
+      /* 打开编辑弹窗 */
+      openEdit(row) {
+        this.current = row;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
+      },
+      /* 打开导入弹窗 */
+      openImport() {
+        this.showImport = true;
+      },
+      /* 删除 */
+      remove(row) {
+        // const loading = this.$loading({ lock: true });
+        this.loading = true;
+
+        control
+          .delete([row.id])
+          .then((msg) => {
+            // loading.close();
+            this.loading = false;
+            this.$message.success('删除' + msg);
+            this.reload();
+          })
+          .catch((e) => {
+            loading.close();
+            // this.$message.error(e.message);
+          });
+      },
+      /* 批量删除 */
+      removeBatch() {
+        if (!this.selection.length) {
+          this.$message.error('请至少选择一条数据');
+          return;
+        }
+        this.$confirm('确定要删除选中的工序吗?', '提示', {
+          type: 'warning'
+        })
+          .then(() => {
+            const loading = this.$loading({ lock: true });
+            producetask
+              .delete(this.selection.map((d) => d.id))
+              .then((msg) => {
+                loading.close();
+                this.$message.success('删除' + msg);
+                this.reload();
+              })
+              .catch((e) => {
+                loading.close();
+                // this.$message.error(e.message);
+              });
+          })
+          .catch(() => {});
+      }
+    }
+  };
+</script>

+ 33 - 30
src/views/technology/production/components/user-edit.vue

@@ -169,6 +169,31 @@
 <script>
   import producetask from '@/api/technology/production';
 
+  const defaultForm = {
+    id: null,
+    code: '',
+    name: '',
+    controlId: '',
+    workCenterId: '',
+    timeUnit: '',
+    intervalTime: {
+      nextShortPreTime: '', // 时间单位转换后的下一个短周期的时间,格式为YYYY-MM-DDTHH'
+      nextStandardPreTime: '', // 时间单位转换后的下一个正式的周期的时间,格式为YYYY-MM-DD'
+      tactics: 1, // 周期工艺描述,格式为JSON字符串或数组形式的对象形式的数据类
+      thisShortBoatTime: '',
+      thisShortPreTime: '',
+      thisStandardBoatTime: '',
+      thisStandardWaitTime: ''
+    },
+
+    workBeat: {
+      beatTimes: '',
+      otherTimes: '',
+      preTimes: '',
+      proTimes: '',
+      restTimes: ''
+    }
+  };
   export default {
     props: {
       // 弹窗是否打开
@@ -177,35 +202,10 @@
       data: Object
     },
     data() {
-      const defaultForm = {
-        id: null,
-        code: '',
-        name: '',
-        controlId: '',
-        workCenterId: '',
-        timeUnit: '',
-        intervalTime: {
-          nextShortPreTime: '', // 时间单位转换后的下一个短周期的时间,格式为YYYY-MM-DDTHH'
-          nextStandardPreTime: '', // 时间单位转换后的下一个正式的周期的时间,格式为YYYY-MM-DD'
-          tactics: 1, // 周期工艺描述,格式为JSON字符串或数组形式的对象形式的数据类
-          thisShortBoatTime: '',
-          thisShortPreTime: '',
-          thisStandardBoatTime: '',
-          thisStandardWaitTime: ''
-        },
-
-        workBeat: {
-          beatTimes: '',
-          otherTimes: '',
-          preTimes: '',
-          proTimes: '',
-          restTimes: ''
-        }
-      };
       return {
-        defaultForm,
+        defaultForm: this.$util.deepClone(defaultForm),
         // 表单数据
-        form: { ...defaultForm },
+        form: { ...this.$util.deepClone(defaultForm) },
         timeType: [
           { code: 1, label: '分' },
           { code: 2, label: '时' }
@@ -269,9 +269,10 @@
           producetask
             .save(this.form)
             .then((msg) => {
-              this.form = {};
               this.loading = false;
-              this.$message.success(msg);
+              this.$message.success(
+                (this.isUpdate ? '修改' : '新建') + msg.message
+              );
               this.updateVisible(false);
               this.$emit('done');
             })
@@ -283,6 +284,7 @@
       },
       /* 更新visible */
       updateVisible(value) {
+        this.form = this.$util.deepClone(defaultForm);
         this.$emit('update:visible', value);
       }
     },
@@ -301,12 +303,13 @@
             this.isUpdate = true;
           } else {
             const res = await producetask.getCode();
+            this.form = this.$util.deepClone(defaultForm);
             this.form.code = res;
             this.isUpdate = false;
           }
         } else {
           this.$refs.form.clearValidate();
-          this.form = { ...this.defaultForm };
+          this.form = this.$util.deepClone(defaultForm);
         }
       }
     }

+ 1 - 0
src/views/technology/production/components/user-setting.vue

@@ -290,6 +290,7 @@
       },
       /* 更新visible */
       updateVisible(value) {
+        this.removeList = [];
         this.$emit('update:visible', value);
       }
     },

+ 19 - 32
src/views/technology/route/components/production/components/parameter/index.vue

@@ -18,12 +18,7 @@
       </ele-pro-table>
     </el-card>
     <!-- 编辑弹窗 -->
-    <user-edit
-      :visible.sync="showEdit"
-      :data="current"
-      @done="reload"
-      ref="userEdit"
-    />
+
     <!-- 导入弹窗 -->
   </div>
 </template>
@@ -145,7 +140,7 @@
 
       /* 刷新表格 */
       reload(where) {
-        this.$refs.table.reload({ page: 1, where: where });
+        this.$refs.tableParameter.reload({ page: 1, where: where });
       },
       /* 打开编辑弹窗 */
       openEdit(row) {
@@ -170,32 +165,24 @@
             loading.close();
             // this.$message.error(e.message);
           });
-      },
-      /* 批量删除 */
-      removeBatch() {
-        if (!this.selection.length) {
-          this.$message.error('请至少选择一条数据');
-          return;
-        }
-        this.$confirm('确定要删除选中的工序吗?', '提示', {
-          type: 'warning'
-        })
-          .then(() => {
-            const loading = this.$loading({ lock: true });
-            parameter
-              .delete(this.selection.map((d) => d.id))
-              .then((msg) => {
-                loading.close();
-                this.$message.success('删除' + msg);
-                this.reload();
-              })
-              .catch((e) => {
-                loading.close();
-                // this.$message.error(e.message);
-              });
-          })
-          .catch(() => {});
+      }
+    },
+    watch: {
+      data: {
+        handler() {
+          this.$nextTick(() => {
+            this.reload();
+          });
+        },
+        immediate: true
       }
     }
   };
 </script>
+<style lang="scss" scoped>
+  :deep(.el-checkbox__input.is-disabled) {
+    .el-checkbox__inner {
+      background-color: rgba(142, 128, 128, 0.584) !important;
+    }
+  }
+</style>

+ 64 - 48
src/views/technology/route/components/production/components/user-edit.vue

@@ -158,7 +158,7 @@
     </el-form>
 
     <template v-slot:footer>
-      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button @click="cancelUpdata">取消</el-button>
       <el-button type="primary" :loading="loading" @click="save">
         保存
       </el-button>
@@ -168,6 +168,31 @@
 
 <script>
   import producetask from '@/api/technology/production';
+  const defaultForm = {
+    id: null,
+    code: '',
+    name: '',
+    controlId: '',
+    workCenterId: '',
+    timeUnit: '',
+    intervalTime: {
+      nextShortPreTime: '', // 时间单位转换后的下一个短周期的时间,格式为YYYY-MM-DDTHH'
+      nextStandardPreTime: '', // 时间单位转换后的下一个正式的周期的时间,格式为YYYY-MM-DD'
+      tactics: 1, // 周期工艺描述,格式为JSON字符串或数组形式的对象形式的数据类
+      thisShortBoatTime: '',
+      thisShortPreTime: '',
+      thisStandardBoatTime: '',
+      thisStandardWaitTime: ''
+    },
+
+    workBeat: {
+      beatTimes: '',
+      otherTimes: '',
+      preTimes: '',
+      proTimes: '',
+      restTimes: ''
+    }
+  };
 
   export default {
     props: {
@@ -177,35 +202,10 @@
       data: Object
     },
     data() {
-      const defaultForm = {
-        id: null,
-        code: '',
-        name: '',
-        controlId: '',
-        workCenterId: '',
-        timeUnit: '',
-        intervalTime: {
-          nextShortPreTime: '', // 时间单位转换后的下一个短周期的时间,格式为YYYY-MM-DDTHH'
-          nextStandardPreTime: '', // 时间单位转换后的下一个正式的周期的时间,格式为YYYY-MM-DD'
-          tactics: 1, // 周期工艺描述,格式为JSON字符串或数组形式的对象形式的数据类
-          thisShortBoatTime: '',
-          thisShortPreTime: '',
-          thisStandardBoatTime: '',
-          thisStandardWaitTime: ''
-        },
-
-        workBeat: {
-          beatTimes: '',
-          otherTimes: '',
-          preTimes: '',
-          proTimes: '',
-          restTimes: ''
-        }
-      };
       return {
-        defaultForm,
+        defaultForm: this.$util.deepClone(defaultForm),
         // 表单数据
-        form: { ...defaultForm },
+        form: { ...this.$util.deepClone(defaultForm) },
         timeType: [
           { code: 1, label: '分' },
           { code: 2, label: '时' }
@@ -234,7 +234,8 @@
         // 提交状态
         loading: false,
         // 是否是修改
-        isUpdate: false
+        isUpdate: false,
+        formClone: {}
       };
     },
     computed: {
@@ -266,23 +267,36 @@
           this.form.workBeat.beatTimes = this.totalTime;
 
           this.loading = true;
-          producetask
-            .save(this.form)
-            .then((msg) => {
-              this.form = {};
-              this.loading = false;
-              this.$message.success(msg);
-              this.updateVisible(false);
-              this.$emit('done');
-            })
-            .catch((e) => {
-              this.loading = false;
-              // this.$message.error(e.message);
-            });
+          this.$message.success('修改成功');
+          this.loading = false;
+          this.updateVisible(false);
+
+          // producetask
+          //   .save(this.form)
+          //   .then((msg) => {
+          //     this.form = {};
+          //     this.loading = false;
+          //     this.$message.success(
+          //       (this.isUpdate ? '修改' : '新建') + msg.message
+          //     );
+          //     this.updateVisible(false);
+          //     this.$emit('done');
+          //   })
+          //   .catch((e) => {
+          //     this.loading = false;
+          //     // this.$message.error(e.message);
+          //   });
         });
       },
+      cancelUpdata() {
+        // this.form = this.$util.deepClone(this.formClone);
+        // this.datta = this.formClone;
+        Object.assign(this.data, this.formClone);
+        this.updateVisible(false);
+      },
       /* 更新visible */
       updateVisible(value) {
+        this.form = this.$util.deepClone(defaultForm);
         this.$emit('update:visible', value);
       }
     },
@@ -291,22 +305,24 @@
       async visible(visible) {
         if (visible) {
           if (this.data) {
-            console.log(111111);
+            this.formClone = this.$util.deepClone(this.data);
+            this.form = this.data;
 
-            const res = await producetask.getById(this.data.id);
+            // const res = await producetask.getById(this.data.id);
 
-            this.$util.assignObject(this.form, {
-              ...res
-            });
+            // this.$util.assignObject(this.form, {
+            //   ...this.data
+            // });
             this.isUpdate = true;
           } else {
             const res = await producetask.getCode();
+            this.form = this.$util.deepClone(defaultForm);
             this.form.code = res;
             this.isUpdate = false;
           }
         } else {
           this.$refs.form.clearValidate();
-          this.form = { ...this.defaultForm };
+          this.form = this.$util.deepClone(defaultForm);
         }
       }
     }

+ 30 - 10
src/views/technology/route/components/production/components/user-setting.vue

@@ -106,7 +106,7 @@
 </template>
 
 <script>
-  import producetask from '@/api/technology/production';
+  import route from '@/api/technology/route';
   import parameter from '@/api/technology/parameter';
   import Paramrter from './parameter';
 
@@ -126,6 +126,15 @@
         ],
         // 表格列配置
         columns: [
+          // {
+          //   prop: 'code',
+          //   label: '参数编码',
+          //   // sortable: 'custom',
+          //   showOverflowTooltip: true,
+          //   align: 'center',
+
+          //   minWidth: 110
+          // },
           {
             prop: 'paramName',
             label: '参数名称',
@@ -210,6 +219,9 @@
       showAddLog() {
         this.tableData = this.$refs.table.getData();
         this.addDialog = true;
+        this.$nextTick(() => {
+          this.$refs.Paramrter.reload();
+        });
       },
       /*关闭选择参数*/
       closeAdd() {
@@ -236,8 +248,8 @@
       async datasource({ page, limit, where }) {
         if (this.data?.id) {
           console.log(22222);
-          const res = await producetask.paramList({
-            taskId: this.data.id,
+          const res = await route.taskinstanceParamList({
+            routingTaskId: this.data.id,
             pageNum: 1,
             size: -1
           });
@@ -247,19 +259,26 @@
       /* 保存编辑 */
       save() {
         let arr = this.$refs.table.getData();
+        if (arr.length == 0) {
+          this.$message.warning('至少配置一条工序才能保存');
+          return;
+        }
         arr.forEach((it) => {
-          if (!it.taskId) {
-            this.$set(it, 'taskId', this.data.id);
+          if (!it.routingTaskId) {
+            this.$set(it, 'routingTaskId', this.data.id);
           }
         });
-        producetask
-          .paramSave({
+        route
+          .taskinstanceParamSave({
             removeList: this.removeList,
             saveList: arr
           })
-          .then(() => {
-            this.$message.success('保存成功!');
-            this.updateVisible(false);
+          .then((res) => {
+            if (res) {
+              this.$message.success('保存成功!');
+
+              this.updateVisible(false);
+            }
           });
 
         // this.$refs.form.validate((valid) => {
@@ -290,6 +309,7 @@
       },
       /* 更新visible */
       updateVisible(value) {
+        this.removeList = [];
         this.$emit('update:visible', value);
       }
     },

+ 17 - 73
src/views/technology/route/components/production/index.vue

@@ -11,72 +11,9 @@
         :selection.sync="selection"
         row-key="code"
       >
-        <!-- 表头工具栏 -->
-        <template v-slot:toolbar>
-          <el-button
-            size="small"
-            type="primary"
-            icon="el-icon-plus"
-            class="ele-btn-icon"
-            @click="openEdit()"
-          >
-            新建
-          </el-button>
-          <el-button
-            size="small"
-            type="danger"
-            icon="el-icon-delete"
-            class="ele-btn-icon"
-            @click="removeBatch"
-          >
-            删除
-          </el-button>
-        </template>
-
-        <template v-slot:roleList="{ row }">
-          <el-tag
-            v-for="item in row.roleList"
-            :key="item.id"
-            size="mini"
-            type="primary"
-            :disable-transitions="true"
-          >
-            {{ item.name }}
-          </el-tag>
-        </template>
         <!-- 状态列 -->
 
         <!-- 操作列 -->
-        <template v-slot:action="{ row }">
-          <el-link
-            type="primary"
-            :underline="false"
-            icon="el-icon-edit"
-            @click="openEdit(row)"
-          >
-            修改
-          </el-link>
-          <el-link
-            type="primary"
-            :underline="false"
-            icon="el-icon-setting"
-            @click="openSetting(row)"
-          >
-            配置工艺参数
-          </el-link>
-
-          <el-popconfirm
-            class="ele-action"
-            title="确定要删除当前工序吗?"
-            @confirm="remove(row)"
-          >
-            <template v-slot:reference>
-              <el-link type="danger" :underline="false" icon="el-icon-delete">
-                删除
-              </el-link>
-            </template>
-          </el-popconfirm>
-        </template>
       </ele-pro-table>
     </el-card>
     <!-- 编辑弹窗 -->
@@ -118,6 +55,11 @@
             type: 'selection',
             width: 45,
             align: 'center',
+            selectable: (row, index) => {
+              return !this.data.some((it) => it.code == row.code);
+              // return row.id < 3; // 这里是让 id < 3 的禁用,根据自己业务修改
+            },
+            reserveSelection: true,
             fixed: 'left'
           },
 
@@ -150,16 +92,6 @@
             align: 'center',
             showOverflowTooltip: true,
             minWidth: 110
-          },
-
-          {
-            columnKey: 'action',
-            label: '操作',
-            width: 260,
-            align: 'center',
-            resizable: false,
-            slot: 'action',
-            showOverflowTooltip: true
           }
         ],
         // 表格选中数据
@@ -172,6 +104,9 @@
         showSetting: false
       };
     },
+    props: {
+      data: Array
+    },
     methods: {
       /*配置工艺参数 */
       openSetting(row) {
@@ -184,6 +119,7 @@
           ...where,
           ...order,
           pageNum: page,
+          isDetail: true,
           size: limit
         });
         return res;
@@ -245,3 +181,11 @@
     }
   };
 </script>
+
+<style lang="scss" scoped>
+  :deep(.el-checkbox__input.is-disabled) {
+    .el-checkbox__inner {
+      background-color: rgba(142, 128, 128, 0.584) !important;
+    }
+  }
+</style>

+ 65 - 34
src/views/technology/route/components/user-edit.vue

@@ -1,7 +1,7 @@
 <!-- 用户编辑弹窗 -->
 <template>
   <ele-modal
-    width="960px"
+    width="1060px"
     :visible="visible"
     :append-to-body="true"
     :close-on-click-modal="true"
@@ -25,37 +25,56 @@
 
         <el-col :span="8">
           <el-form-item label="工艺路线组名称:" prop="name">
-            <el-input
-              v-model="form.name"
-              clearable
-              placeholder="请输入工序名称"
-            />
+            <el-input v-model="form.name" clearable placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="所属工厂:" prop="controlId">
-            <el-select v-model="form.factoryId" placeholder="">
+          <el-form-item label="所属工厂:" prop="factoryId">
+            <el-select v-model="form.factoryId" placeholder="请选择">
               <el-option
                 v-for="item in fList"
                 :key="item.id"
                 :label="item.name"
                 :value="item.id"
-                @click.native="fClick(item)"
               >
               </el-option>
             </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="工作中心:" prop="workCenterId">
+          <el-form-item label="产品编码:" prop="categoryId">
+            <el-input
+              placeholder="点击选择产品编码"
+              v-model="form.categoryId"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="产品名称:" prop="categoryId">
             <el-input
-              placeholder="请输入工作中心"
-              v-model="form.workCenterId"
+              placeholder="点击选择产品编码"
+              disabled
+              v-model="form.categoryId"
             />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="工序时间单位:" prop="timeUnit"> </el-form-item>
+          <el-form-item label="工艺路线版本:" prop="version">
+            <el-input disabled v-model="form.version" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="状态:" prop="status">
+            <el-select v-model="form.status" placeholder="">
+              <el-option
+                v-for="item in statusList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
         </el-col>
       </el-row>
     </el-form>
@@ -86,11 +105,18 @@
       const defaultForm = {
         code: '',
         name: '',
-        factoryId: ''
+        factoryId: '',
+        status: -1,
+        categoryId: '',
+        version: '1.0',
+        id: ''
       };
       return {
         defaultForm,
         fList: [], //仓库列表
+        categoryCode: '',
+        categoryName: '',
+
         // 表单数据
         form: { ...defaultForm },
 
@@ -103,17 +129,22 @@
         // 表单验证规则
         rules: {
           name: [
-            { required: true, message: '请输入工名称', trigger: 'blur' }
+            { required: true, message: '请输入工艺路线名称', trigger: 'blur' }
           ],
-          code: [{ required: true, trigger: 'change' }],
-          controlId: [
-            { required: true, message: '请选择控制码', trigger: 'blur' }
+          code: [
+            { required: true, message: '请输入工艺路线编码', trigger: 'blur' }
           ],
-          workCenterId: [
-            { required: true, message: '请选择工作中心', trigger: 'blur' }
+          factoryId: [
+            { required: true, message: '请输入工艺路线', trigger: 'blur' }
           ],
-          timeUnit: [
-            { required: true, message: '请选择时间单位', trigger: 'blur' }
+          categoryId: [
+            { required: true, message: '请选择产品编码', trigger: 'blur' }
+          ],
+          status: [
+            { required: true, message: '请输入工艺路线版本', trigger: 'blur' }
+          ],
+          version: [
+            { required: true, message: '请输入工艺路线版本', trigger: 'blur' }
           ]
         },
         // 提交状态
@@ -123,14 +154,8 @@
       };
     },
     computed: {
-      totalTime() {
-        let to =
-          (-this.form.workBeat.restTimes +
-            -this.form.workBeat.preTimes +
-            -this.form.workBeat.proTimes +
-            -this.form.workBeat.otherTimes) *
-          -1;
-        return to;
+      statusTitle() {
+        return this.isUpdate ? '修改' : '保存';
       },
       // 是否开启响应式布局
       styleResponsive() {
@@ -138,23 +163,29 @@
       }
     },
     methods: {
-      fClick() {},
       /* 保存编辑 */
       save() {
         this.$refs.form.validate((valid) => {
           if (!valid) {
             return false;
           }
-
-          this.form.workBeat.beatTimes = this.totalTime;
+          if (!this.data) {
+            delete this.form.id;
+          }
 
           this.loading = true;
+          let title = this.isUpdate ? '修改' : '新建'; // 提交的名称或编号是否有效率有用的标识,
+          console.log(title);
+
           route
             .save(this.form)
             .then((msg) => {
               this.form = {};
+              this.categoryName = '';
+              this.categoryCode = '';
               this.loading = false;
-              this.$message.success(msg);
+              let tit = title + msg;
+              this.$message.success(tit);
               this.updateVisible(false);
               this.$emit('done');
             })

+ 1 - 1
src/views/technology/route/components/user-search.vue

@@ -29,7 +29,7 @@
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
         <el-form-item label="状态:">
-          <el-select v-model="where.status" filterable placeholder="选择">
+          <el-select v-model="where.status" filterable placeholder="选择">
             <el-option
               v-for="item in statusList"
               :key="item.value"

+ 353 - 0
src/views/technology/route/components/user-taskinstance.vue

@@ -0,0 +1,353 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="1060px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="true"
+    custom-class="ele-dialog-form"
+    :title="`给工序【${this.data?.code}${this.data?.name}】配置工序`"
+    @update:visible="updateVisible"
+  >
+    <div class="ele-body">
+      <ele-pro-table
+        ref="table"
+        :needPage="false"
+        :columns="columns"
+        :datasource="datasource"
+        row-key="code"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="showAddLog"
+          >
+            添加参数
+          </el-button>
+        </template>
+
+        <!-- 状态列 -->
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit(row)"
+          >
+            修改
+          </el-link>
+          <el-link
+            :type="row.id ? 'primary' : 'info'"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openSetting(row)"
+          >
+            配置工艺参数
+          </el-link>
+          <el-popconfirm
+            class="ele-action"
+            title="删除数据操作立即生效!!!确定要删除当前工序吗?"
+            @confirm="remove(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </div>
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="save(false)">
+        保存
+      </el-button>
+      <el-button type="primary" :loading="loading" @click="save(true)">
+        保存并关闭
+      </el-button>
+    </template>
+    <ele-modal
+      width="1720px"
+      :visible="addDialog"
+      :append-to-body="true"
+      :close-on-click-modal="true"
+      @update:visible="closeAdd"
+    >
+      <Production :data="tableData" ref="ProductionCom" />
+      <template v-slot:footer>
+        <el-button @click="closeAdd">取消</el-button>
+        <el-button type="primary" :loading="loading" @click="addParamrter">
+          添加
+        </el-button>
+      </template>
+    </ele-modal>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :data="current"
+      @done="reload"
+      ref="userEdit"
+    />
+    <!-- 配置工艺参数 -->
+    <user-setting
+      :visible.sync="showSetting"
+      :data="current"
+      ref="userSetting"
+    />
+  </ele-modal>
+</template>
+
+<script>
+  import route from '@/api/technology/route';
+  import Production from './production';
+  import UserEdit from './production/components/user-edit.vue';
+  import UserSetting from './production/components/user-setting.vue';
+
+  export default {
+    components: { Production, UserEdit, UserSetting },
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object
+    },
+    data() {
+      return {
+        timeType: [
+          { value: 1, label: '是' },
+          { value: 0, label: '否' }
+        ],
+        // 表格列配置
+        columns: [
+          {
+            prop: 'code',
+            label: '工序编码',
+            // sortable: 'custom',
+            showOverflowTooltip: true,
+            align: 'center',
+
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '工序名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            align: 'center',
+            prop: 'controlName',
+            label: '工序控制码',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'workCenterName',
+            label: '所属工作中心',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 260,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+
+        loading: false,
+        addDialog: false,
+        showSetting: false,
+        showEdit: false,
+        current: {},
+        removeList: [],
+        tableData: []
+      };
+    },
+
+    methods: {
+      addParamrter() {
+        // console.log(this.$refs.ProductionCom?.selection);
+        let arr = this.$refs.ProductionCom.selection;
+
+        let arrM = arr.map((item, index) => {
+          return { ...item.detail };
+        });
+        arrM.forEach((element) => {
+          if (element.id) {
+            this.$set(element, 'sourceTaskId', element.id);
+            delete element.id;
+          }
+        });
+
+        this.$refs.table.setData([...arrM, ...this.$refs.table.getData()]);
+        this.closeAdd();
+      },
+      showAddLog() {
+        this.tableData = this.$refs.table.getData();
+        this.addDialog = true;
+        // this.$nextTick(() => {
+        //   this.$refs.ProductionCom.reload();
+        // });
+      },
+      /* 打开编辑弹窗 */
+      openEdit(row) {
+        this.current = row;
+        this.showEdit = true;
+        this.$refs.userEdit.$refs.form &&
+          this.$refs.userEdit.$refs.form.clearValidate();
+      },
+      /*配置工艺参数 */
+      openSetting(row) {
+        if (!row.id) {
+          this.$message.warning('新增的数据需要保存之后才能配置工艺参数');
+          return;
+        }
+        this.current = row;
+        this.showSetting = true;
+      },
+
+      /*关闭选择参数*/
+      closeAdd() {
+        this.$refs.ProductionCom.$refs.table.setSelectedRows([]);
+        this.addDialog = false;
+      },
+      /* 刷新表格 */
+      reload() {
+        this.$refs.table.reload();
+      },
+      remove(row) {
+        if (row.id) {
+          route.taskinstanceDelete([row.id]).then(() => {
+            this.$message.success('删除成功');
+            this.reload();
+          });
+        } else {
+          const data = this.$refs.table.getData() ?? [];
+          console.log(data);
+          this.$refs.table.setData(data.filter((d) => d.code !== row.code));
+        }
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where }) {
+        if (this.data?.id) {
+          console.log(22222);
+          const res = await route.taskinstanceList({
+            routingId: this.data.id,
+            isDetail: true,
+            pageNum: 1,
+            size: -1
+          });
+          let arr = res.list.map((it) => it.detail);
+          return {
+            list: arr,
+            count: res.count
+          };
+        }
+      },
+      /* 保存编辑 */
+      save(isClose) {
+        let arr = this.$refs.table.getData();
+        if (arr.length == 0) {
+          this.$message.warning('至少配置一条工序才能保存');
+          return;
+        }
+        let arr1 = arr.map((it, i) => {
+          if (it.orderNum) {
+            delete it.orderNum;
+          }
+          return {
+            ...it,
+            orderNum: i + 1
+          };
+        });
+
+        route
+          .taskinstanceSave({
+            routingId: this.data.id,
+            taskInstanceList: arr1
+          })
+          .then((res) => {
+            if (res) {
+              this.$message.success('保存成功!');
+              if (isClose) {
+                this.updateVisible(false);
+              } else {
+                this.reload();
+              }
+            }
+          });
+        // arr.forEach((it) => {
+        //   if (!it.taskId) {
+        //     this.$set(it, 'taskId', this.data.id);
+        //   }
+        // });
+        // producetask
+        //   .paramSave({
+        //     removeList: this.removeList,
+        //     saveList: arr
+        //   })
+        //   .then(() => {
+        //     this.$message.success('保存成功!');
+        //     this.updateVisible(false);
+        //   });
+
+        // this.$refs.form.validate((valid) => {
+        //   if (!valid) {
+        //     return false;
+        //   }
+        //   if (!this.isUpdate) {
+        //     delete this.form.id;
+        //   }
+
+        //   this.form.workBeat.beatTimes = this.totalTime;
+
+        //   this.loading = true;
+        //   producetask
+        //     .save(this.form)
+        //     .then((msg) => {
+        //       this.form = {};
+        //       this.loading = false;
+        //       this.$message.success(msg);
+        //       this.updateVisible(false);
+        //       this.$emit('done');
+        //     })
+        //     .catch((e) => {
+        //       this.loading = false;
+        //       // this.$message.error(e.message);
+        //     });
+        // });
+      },
+      /* 更新visible */
+      updateVisible(value) {
+        this.removeList = [];
+        this.$refs.table.setData([]);
+        this.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      visible(visible) {
+        if (visible) {
+          this.$nextTick(() => {
+            this.reload();
+          });
+        }
+      }
+    }
+  };
+</script>

+ 59 - 11
src/views/technology/route/index.vue

@@ -25,6 +25,9 @@
         </template>
 
         <!-- 状态列 -->
+        <template v-slot:status="{ row }">
+          {{ checkStatus(row) }}
+        </template>
 
         <!-- 操作列 -->
         <template v-slot:action="{ row }">
@@ -36,8 +39,17 @@
           >
             修改
           </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-setting"
+            @click="openSetting(row)"
+          >
+            配置工序
+          </el-link>
 
           <el-popconfirm
+            v-if="row.status != 1"
             class="ele-action"
             title="确定要删除当前工序吗?"
             @confirm="remove(row)"
@@ -58,13 +70,19 @@
       @done="reload"
       ref="userEdit"
     />
-    <!-- 导入弹窗 -->
+    <!-- 自身工序弹窗 -->
+    <user-taskinstance
+      :visible.sync="showTaskinstance"
+      :data="current"
+      ref="userTaskinstance"
+    />
   </div>
 </template>
 
 <script>
   import UserSearch from './components/user-search.vue';
   import UserEdit from './components/user-edit.vue';
+  import UserTaskinstance from './components/user-taskinstance.vue';
 
   import route from '@/api/technology/route';
 
@@ -72,7 +90,8 @@
     name: 'technologyRoute',
     components: {
       UserSearch,
-      UserEdit
+      UserEdit,
+      UserTaskinstance
     },
     data() {
       return {
@@ -88,7 +107,7 @@
 
           {
             prop: 'code',
-            label: '工编码',
+            label: '工艺路线组编码',
             // sortable: 'custom',
             showOverflowTooltip: true,
             align: 'center',
@@ -97,25 +116,40 @@
           },
           {
             prop: 'name',
-            label: '工名称',
+            label: '工艺路线名称',
             showOverflowTooltip: true,
             align: 'center',
             minWidth: 110
           },
           {
             align: 'center',
-            prop: 'controlName',
-            label: '工序控制码',
+            prop: 'categoryCode',
+            label: '产品编码',
             showOverflowTooltip: true,
             minWidth: 110
           },
           {
-            prop: 'workCenterName',
-            label: '所属工作中心',
+            prop: 'categoryName',
+            label: '产品名称',
             align: 'center',
             showOverflowTooltip: true,
             minWidth: 110
           },
+          {
+            prop: 'version',
+            label: '工艺路线版本',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            slot: 'status',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
 
           {
             columnKey: 'action',
@@ -127,6 +161,7 @@
             showOverflowTooltip: true
           }
         ],
+        showTaskinstance: false,
         // 表格选中数据
         selection: [],
         // 当前编辑数据
@@ -134,7 +169,12 @@
         // 是否显示编辑弹窗
         showEdit: false,
         // 是否显示导入弹窗
-        showImport: false
+        showImport: false,
+        statusList: [
+          { label: '草稿', value: -1 },
+          { label: '失效', value: 0 },
+          { label: '生效', value: 1 }
+        ]
       };
     },
     methods: {
@@ -148,6 +188,14 @@
         });
         return res;
       },
+      openSetting(row) {
+        this.current = row;
+        this.showTaskinstance = true; // 显示编辑弹窗 true/false 不显示弹窗 true/false 不显示
+      },
+      checkStatus(row) {
+        let obj = this.statusList.find((it) => it.value == row.status);
+        return obj.label;
+      },
 
       /* 刷新表格 */
       reload(where) {
@@ -168,8 +216,8 @@
       remove(row) {
         const loading = this.$loading({ lock: true });
 
-        producetask
-          .delete([row.id])
+        route
+          .delete(row.id)
           .then((msg) => {
             loading.close();
             this.$message.success('删除' + msg);

+ 55 - 180
src/views/technology/work/components/user-edit.vue

@@ -6,168 +6,66 @@
     :append-to-body="true"
     :close-on-click-modal="true"
     custom-class="ele-dialog-form"
-    :title="isUpdate ? '修改用户' : '添加用户'"
+    :title="isUpdate ? '修改工作中心' : '添加工作中心'"
     @update:visible="updateVisible"
   >
     <header-title title="基本信息"></header-title>
     <el-form ref="form" :model="form" :rules="rules" label-width="120px">
       <el-row>
         <el-col :span="8">
-          <el-form-item label="工编码:" prop="code">
+          <el-form-item label="工作中心编码:" prop="code">
             <el-input
               clearable
               disabled
               v-model="form.code"
-              placeholder="请输入工序编码"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
 
         <el-col :span="8">
-          <el-form-item label="工序名称:" prop="name">
-            <el-input
-              v-model="form.name"
-              clearable
-              placeholder="请输入工序名称"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="控制码:" prop="controlId">
-            <el-input v-model="form.controlId" placeholder="请输入工序控制码" />
+          <el-form-item label="工作中心名称:" prop="name">
+            <el-input v-model="form.name" clearable placeholder="请输入" />
           </el-form-item>
         </el-col>
+
         <el-col :span="8">
-          <el-form-item label="工作中心:" prop="workCenterId">
-            <el-input
-              placeholder="请输入工作中心"
-              v-model="form.workCenterId"
-            />
+          <el-form-item label="所属工厂:" prop="factoryId">
+            <el-select v-model="form.factoryId" placeholder="所属工厂">
+              <el-option
+                v-for="item in flist"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="工序时间单位:" prop="timeUnit">
-            <el-select v-model="form.timeUnit">
+          <el-form-item label="工作中心类别:" prop="categoryType">
+            <el-select v-model="form.categoryType" placeholder="工作中心类别">
               <el-option
-                v-for="item in timeType"
+                v-for="item in categoryTypes"
                 :key="item.code"
                 :label="item.label"
-                :value="item.code"
+                :value="item.value"
               >
               </el-option>
             </el-select>
           </el-form-item>
         </el-col>
-      </el-row>
-    </el-form>
-    <header-title title="工序节拍时间"></header-title>
-    <el-form ref="form" :model="form" label-width="120px">
-      <el-row>
         <el-col :span="8">
-          <el-form-item label="工序休息时长:">
-            <el-input
-              v-model="form.workBeat.restTimes"
-              placeholder="请输入工序休息时长"
-            />
-          </el-form-item>
-        </el-col>
-
-        <el-col :span="8">
-          <el-form-item label="工序准备时长:">
-            <el-input
-              v-model="form.workBeat.preTimes"
-              clearable
-              placeholder="请输入工序准备时长"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="设备生产时长:">
-            <el-input
-              v-model="form.workBeat.proTimes"
-              placeholder="请输入工序控制码"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="其他时长:">
-            <el-input
-              placeholder="请输入其他时长"
-              v-model="form.workBeat.otherTimes"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="节拍时间:">
-            <el-input disabled :value="totalTime"></el-input>
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-    <header-title title="工序间隔时间"></header-title>
-    <el-form ref="form" :model="form" label-width="200px">
-      <el-row>
-        <el-col :span="24">
-          <el-col :span="12">
-            <el-form-item label="间隔策略:">
-              <el-select v-model="form.intervalTime.tactics">
-                <el-option
-                  v-for="item in tacticsType"
-                  :key="item.code"
-                  :label="item.label"
-                  :value="item.code"
-                >
-                </el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="下工序标准准备时间:">
-            <el-input
-              v-model="form.intervalTime.nextStandardPreTime"
-              placeholder="请输入下工序标准准备时间"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="下工序最短准备时间:">
-            <el-input
-              v-model="form.intervalTime.nextShortPreTime"
-              placeholder="请输入下工序最短准备时间"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="本工序标准等待时间:">
-            <el-input
-              v-model="form.intervalTime.thisStandardWaitTime"
-              placeholder="请输入本工序标准等待时间"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="本工序最短准备时间:">
-            <el-input
-              v-model="form.intervalTime.thisShortPreTime"
-              placeholder="请输入本工序最短准备时间"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="本工序结束后标准周转时间:">
-            <el-input
-              v-model="form.intervalTime.thisStandardBoatTime"
-              placeholder="请输入本工序结束后标准周转时间"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="本工序结束后周转最短时间:">
-            <el-input
-              v-model="form.intervalTime.thisShortBoatTime"
-              placeholder="请输入本工序结束后周转最短时间"
-            />
+          <el-form-item label="负责人:" prop="leaderUserId">
+            <el-select v-model="form.leaderUserId" placeholder="负责人">
+              <el-option
+                v-for="item in userList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
@@ -184,7 +82,7 @@
 
 <script>
   // import { emailReg, phoneReg } from 'ele-admin';
-  import producetask from '@/api/technology/production';
+  import work from '@/api/technology/work';
 
   import { addUsers, putUsers } from '@/api/system/user';
 
@@ -193,32 +91,19 @@
       // 弹窗是否打开
       visible: Boolean,
       // 修改回显的数据
-      data: Object
+      data: Object,
+      categoryTypes: Array,
+      flist: Array,
+      userList: Array
     },
     data() {
       const defaultForm = {
+        id: null,
         code: '',
         name: '',
-        controlId: '',
-        workCenterId: '',
-        timeUnit: '',
-        intervalTime: {
-          nextShortPreTime: '', // 时间单位转换后的下一个短周期的时间,格式为YYYY-MM-DDTHH'
-          nextStandardPreTime: '', // 时间单位转换后的下一个正式的周期的时间,格式为YYYY-MM-DD'
-          tactics: 1, // 周期工艺描述,格式为JSON字符串或数组形式的对象形式的数据类
-          thisShortBoatTime: '',
-          thisShortPreTime: '',
-          thisStandardBoatTime: '',
-          thisStandardWaitTime: ''
-        },
-
-        workBeat: {
-          beatTimes: '',
-          otherTimes: '',
-          preTimes: '',
-          proTimes: '',
-          restTimes: ''
-        }
+        factoryId: '',
+        categoryType: '',
+        leaderUserId: ''
       };
       return {
         defaultForm,
@@ -239,14 +124,14 @@
             { required: true, message: '请输入工序名称', trigger: 'blur' }
           ],
           code: [{ required: true, trigger: 'change' }],
-          controlId: [
-            { required: true, message: '请选择控制码', trigger: 'blur' }
+          factoryId: [
+            { required: true, message: '请选择所属工厂', trigger: 'blur' }
           ],
-          workCenterId: [
-            { required: true, message: '请选择工作中心', trigger: 'blur' }
+          categoryType: [
+            { required: true, message: '请选择工作中心类别', trigger: 'blur' }
           ],
-          timeUnit: [
-            { required: true, message: '请选择时间单位', trigger: 'blur' }
+          leaderUserId: [
+            { required: true, message: '请选择负责人', trigger: 'blur' }
           ]
         },
         // 提交状态
@@ -256,15 +141,6 @@
       };
     },
     computed: {
-      totalTime() {
-        let to =
-          (-this.form.workBeat.restTimes +
-            -this.form.workBeat.preTimes +
-            -this.form.workBeat.proTimes +
-            -this.form.workBeat.otherTimes) *
-          -1;
-        return to;
-      },
       // 是否开启响应式布局
       styleResponsive() {
         return this.$store.state.theme.styleResponsive;
@@ -277,16 +153,17 @@
           if (!valid) {
             return false;
           }
-
-          this.form.workBeat.beatTimes = this.totalTime;
-
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
           this.loading = true;
-          producetask
-            .save(this.form)
+          const saveOrUpdate = this.isUpdate ? work.update : work.save; // 保存或更新工厂函数名称
+          let title = this.isUpdate ? '修改' : '保存';
+          saveOrUpdate(this.form)
             .then((msg) => {
               this.form = {};
               this.loading = false;
-              this.$message.success(msg);
+              this.$message.success(title + msg);
               this.updateVisible(false);
               this.$emit('done');
             })
@@ -308,14 +185,12 @@
           if (this.data) {
             console.log(111111);
 
-            const res = await producetask.getById(this.data.id);
+            // const res = await work.getById(this.data.id);
 
-            this.$util.assignObject(this.form, {
-              ...res
-            });
+            this.$util.assignObject(this.form, this.data);
             this.isUpdate = true;
           } else {
-            const res = await producetask.getCode();
+            const res = await work.getCode();
             this.form.code = res;
             this.isUpdate = false;
           }

+ 36 - 15
src/views/technology/work/components/user-search.vue

@@ -1,30 +1,47 @@
 <!-- 搜索表单 -->
 <template>
   <el-form
-    label-width="77px"
+    label-width="120px"
     class="ele-form-search"
     @keyup.enter.native="search"
     @submit.native.prevent
   >
     <el-row :gutter="15">
-      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
-        <el-form-item label="工序编码:">
-          <el-input clearable v-model="where.code" placeholder="请输入" />
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="所属工厂:">
+          <el-select v-model="where.factoryId" placeholder="所属工厂">
+            <el-option
+              v-for="item in flist"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
-        <el-form-item label="工序编码:">
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="工作中心编码:">
           <el-input clearable v-model="where.code" placeholder="请输入" />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
-        <el-form-item label="工序编码:">
-          <el-input clearable v-model="where.code" placeholder="请输入" />
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="工作中心名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
-        <el-form-item label="工序名称:">
-          <el-input clearable v-model="where.name" placeholder="请输入" />
+
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+        <el-form-item label="工作中心类别:">
+          <el-select v-model="where.categoryType" placeholder="工作中心类别">
+            <el-option
+              v-for="item in categoryTypes"
+              :key="item.code"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
         </el-form-item>
       </el-col>
 
@@ -51,15 +68,19 @@
       // 默认表单数据
       const defaultWhere = {
         code: '',
-        name: ''
-        // nickname: '',
-        // sex: undefined
+        name: '',
+        factoryId: '',
+        categoryType: ''
       };
       return {
         // 表单数据
         where: { ...defaultWhere }
       };
     },
+    props: {
+      flist: Array, // 需要展示的品牌列表数据或数组类型,例如["蓝色品牌", "
+      categoryTypes: Array
+    },
     computed: {
       // 是否开启响应式布局
       styleResponsive() {

+ 88 - 42
src/views/technology/work/index.vue

@@ -2,13 +2,18 @@
   <div class="ele-body">
     <el-card shadow="never">
       <!-- 搜索表单 -->
-      <user-search @search="reload" />
+      <user-search
+        @search="reload"
+        :flist="fList"
+        :categoryTypes="categoryTypes"
+      />
       <!-- 数据表格 -->
       <ele-pro-table
         ref="table"
         :columns="columns"
         :datasource="datasource"
         :selection.sync="selection"
+        v-loading="loading"
         row-key="code"
       >
         <!-- 表头工具栏 -->
@@ -22,27 +27,16 @@
           >
             新建
           </el-button>
-          <el-button
-            size="small"
-            type="danger"
-            icon="el-icon-delete"
-            class="ele-btn-icon"
-            @click="removeBatch"
-          >
-            删除
-          </el-button>
         </template>
 
-        <template v-slot:roleList="{ row }">
-          <el-tag
-            v-for="item in row.roleList"
-            :key="item.id"
-            size="mini"
-            type="primary"
-            :disable-transitions="true"
-          >
-            {{ item.name }}
-          </el-tag>
+        <template v-slot:factoryId="{ row }">
+          {{ checkfactoryId(row.factoryId) }}
+        </template>
+        <template v-slot:categoryType="{ row }">
+          {{ checkcategoryType(row.categoryType) }}
+        </template>
+        <template v-slot:leaderUserId="{ row }">
+          {{ checkleaderUserId(row.leaderUserId) }}
         </template>
         <!-- 状态列 -->
 
@@ -74,7 +68,10 @@
     <!-- 编辑弹窗 -->
     <user-edit
       :visible.sync="showEdit"
+      :flist="fList"
       :data="current"
+      :userList="userList"
+      :categoryTypes="categoryTypes"
       @done="reload"
       ref="userEdit"
     />
@@ -85,8 +82,8 @@
 <script>
   import UserSearch from './components/user-search.vue';
   import UserEdit from './components/user-edit.vue';
-
-  import producetask from '@/api/technology/production';
+  import work from '@/api/technology/work';
+  import route from '@/api/technology/route';
 
   export default {
     name: 'technologyWork',
@@ -99,17 +96,19 @@
         // 表格列配置
         columns: [
           {
-            columnKey: 'selection',
-            type: 'selection',
-            width: 45,
+            prop: 'factoryId',
+            label: '所属工厂',
+            slot: 'factoryId',
+            showOverflowTooltip: true,
             align: 'center',
-            fixed: 'left'
+
+            minWidth: 110
           },
 
           {
             prop: 'code',
-            label: '工编码',
-            // sortable: 'custom',
+            label: '工作中心编码',
+
             showOverflowTooltip: true,
             align: 'center',
 
@@ -117,24 +116,24 @@
           },
           {
             prop: 'name',
-            label: '工名称',
+            label: '工作中心名称',
             showOverflowTooltip: true,
             align: 'center',
             minWidth: 110
           },
           {
-            align: 'center',
-            prop: 'controlName',
-            label: '工序控制码',
+            prop: 'categoryType',
+            label: '工作中心类别',
+            slot: 'categoryType',
             showOverflowTooltip: true,
-            minWidth: 110
+            align: 'center'
           },
           {
-            prop: 'workCenterName',
-            label: '所属工作中心',
-            align: 'center',
+            prop: 'leaderUserId',
+            label: '负责人',
+            slot: 'leaderUserId',
             showOverflowTooltip: true,
-            minWidth: 110
+            align: 'center'
           },
 
           {
@@ -147,6 +146,18 @@
             showOverflowTooltip: true
           }
         ],
+        categoryTypes: [
+          { label: '设备', value: 0 },
+          { label: '设备组', value: 1 },
+          { label: '人工', value: 2 },
+          { label: '人工组', value: 3 },
+          { label: '生产线', value: 4 },
+          { label: '委外生产', value: 5 }
+        ],
+        // 厂房列表
+        fList: [],
+        // 人员列表
+        userList: [],
         // 表格选中数据
         selection: [],
         // 当前编辑数据
@@ -154,13 +165,46 @@
         // 是否显示编辑弹窗
         showEdit: false,
         // 是否显示导入弹窗
-        showImport: false
+        showImport: false,
+        loading: false
       };
     },
+    created() {
+      this.getfLise();
+      this.getUserPage();
+    },
     methods: {
+      /*回显工厂 */
+      checkfactoryId(id) {
+        let obj = this.fList.find((f) => f.id == id);
+        return obj?.name;
+      },
+      /*回显类别 */
+      checkcategoryType(value) {
+        return this.categoryTypes.find((f) => f.value == value).label;
+      },
+      /*回显负责人 */
+      checkleaderUserId(id) {
+        let obj = this.userList.find((f) => f.id == id);
+        return obj?.name;
+      },
+      /*厂房列表 */
+      async getUserPage() {
+        const res = await work.getUserPage();
+        this.userList = res.list;
+      },
+      /*人员列表 */
+      async getfLise() {
+        const res = await route.Flist({
+          pageNum: 1,
+          size: -1,
+          type: 1
+        });
+        this.fList = res.list;
+      },
       /* 表格数据源 */
       async datasource({ page, limit, where, order }) {
-        const res = await producetask.list({
+        const res = await work.list({
           ...where,
           ...order,
           pageNum: page,
@@ -186,12 +230,14 @@
       },
       /* 删除 */
       remove(row) {
-        const loading = this.$loading({ lock: true });
+        // const loading = this.$loading({ lock: true });
+        this.loading = true;
 
-        producetask
+        work
           .delete([row.id])
           .then((msg) => {
-            loading.close();
+            // loading.close();
+            this.loading = false;
             this.$message.success('删除' + msg);
             this.reload();
           })