Просмотр исходного кода

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

LAPTOP-16IUEB3P\Lenovo 3 лет назад
Родитель
Сommit
b7ba69b757
29 измененных файлов с 2164 добавлено и 1276 удалено
  1. 8 1
      src/api/technology/production/index.js
  2. 60 0
      src/api/technology/route/index.js
  3. 3 16
      src/components/AssetTree/index.vue
  4. 3 1
      src/components/header-title/index.vue
  5. 5 1
      src/config/setting.js
  6. 4 1
      src/router/index.js
  7. 4 1
      src/store/index.js
  8. 0 163
      src/views/material/product/components/dict-data-edit.vue
  9. 0 227
      src/views/material/product/components/dict-data.vue
  10. 0 476
      src/views/material/product/components/dict-edit.vue
  11. 19 36
      src/views/material/product/components/product-search.vue
  12. 64 90
      src/views/material/product/index.vue
  13. 78 0
      src/views/material/productLinkMaterial/components/link-material-dialog.vue
  14. 95 0
      src/views/material/productLinkMaterial/components/product-search.vue
  15. 171 0
      src/views/material/productLinkMaterial/index.vue
  16. 7 0
      src/views/technology/production/components/parameter/index.vue
  17. 15 31
      src/views/technology/production/components/user-edit.vue
  18. 78 38
      src/views/technology/production/components/user-setting.vue
  19. 239 0
      src/views/technology/route/components/production/components/parameter/components/user-edit.vue
  20. 107 0
      src/views/technology/route/components/production/components/parameter/components/user-search.vue
  21. 201 0
      src/views/technology/route/components/production/components/parameter/index.vue
  22. 314 0
      src/views/technology/route/components/production/components/user-edit.vue
  23. 84 0
      src/views/technology/route/components/production/components/user-search.vue
  24. 307 0
      src/views/technology/route/components/production/components/user-setting.vue
  25. 247 0
      src/views/technology/route/components/production/index.vue
  26. 34 162
      src/views/technology/route/components/user-edit.vue
  27. 10 5
      src/views/technology/route/components/user-search.vue
  28. 3 23
      src/views/technology/route/index.vue
  29. 4 4
      vue.config.js

+ 8 - 1
src/api/technology/production/index.js

@@ -8,13 +8,20 @@ export default {
       return res.data.data;
     }
   },
-  //列表
+  //获取工艺所属参数列表
   paramList: async (params) => {
     const res = await request.get('/main/producetask/param/page', { params });
     if (res.data.code == 0) {
       return res.data.data;
     }
   },
+  //保存工艺所属参数列表
+  paramSave: async (data) => {
+    const res = await request.post('/main/producetask/param/save', data);
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
   //详情
   getById: async (id) => {
     const res = await request.get(`/main/producetask/getById/${id}`);

+ 60 - 0
src/api/technology/route/index.js

@@ -0,0 +1,60 @@
+import request from '@/utils/request';
+
+export default {
+  //列表
+  list: async (params) => {
+    const res = await request.get('/main/producerouting/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //厂房列表
+  Flist: async (params) => {
+    const res = await request.get('/main/factoryarea/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //获取工艺所属参数列表
+  paramList: async (params) => {
+    const res = await request.get('/main/producetask/param/page', { params });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //保存工艺所属参数列表
+  paramSave: async (data) => {
+    const res = await request.post('/main/producetask/param/save', data);
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  },
+  //详情
+  getById: async (id) => {
+    const res = await request.get(`/main/producetask/getById/${id}`);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //详情
+  getCode: async () => {
+    const res = await request.get(`/main/codemanage/getCode/process_route`);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+  },
+  //保存
+  save: async (data) => {
+    const res = await request.post('/main/producetask/save', data);
+    if (res.data.code == 0) {
+      return res.data;
+    }
+  },
+  //删除
+  delete: async (data) => {
+    const res = await request.delete('/main/producetask/delete', { data });
+    if (res.data.code == 0) {
+      return res.data.message;
+    }
+  }
+};

+ 3 - 16
src/components/AssetTree/index.vue

@@ -17,7 +17,7 @@
 </template>
 
 <script>
-  import { getTreeByPid, getTreeByType } from '@/api/classifyManage';
+  import { getTreeByPid } from '@/api/classifyManage';
   // let originId = '';
   // let originType = '';
   export default {
@@ -40,7 +40,7 @@
       defaultExpandAll: {
         type: Boolean,
         default: function () {
-          return true
+          return true;
         }
       },
       // 初始请求treeList
@@ -48,15 +48,6 @@
         type: Boolean,
         default: true
       },
-      // 接口分父级id 和 类型筛选
-      paramsType: {
-        type: String,
-        default: 'id'
-      },
-      type: {
-        type: String,
-        default: ''
-      },
       id: {
         type: String,
         default: '0'
@@ -92,12 +83,8 @@
       async getTreeData () {
         try {
           this.treeLoading = true;
-          const requestApi =
-            this.paramsType === 'type'
-              ? getTreeByType.bind(null, this.type)
-              : getTreeByPid.bind(null, this.id);
 
-          const res = await requestApi();
+          const res = await getTreeByPid(this.id);
           this.treeLoading = false;
           if (res?.code === '0') {
             this.treeList = res.data;

+ 3 - 1
src/components/header-title/index.vue

@@ -3,7 +3,9 @@
     <div class="title">
       <div class="left">
         <div class="ele-bg-primary box"></div>
-        <span :style="{ 'font-size': size }">{{ title }}</span>
+        <slot name="title"
+          ><span :style="{ 'font-size': size }">{{ title }}</span></slot
+        >
       </div>
       <div class="right">
         <slot />

+ 5 - 1
src/config/setting.js

@@ -3,6 +3,8 @@ export const API_BASE_URL = process.env.VUE_APP_API_BASE_URL;
 
 // 项目名称
 export const PROJECT_NAME = process.env.VUE_APP_NAME;
+// 系统名称
+export const SYSTEM_NAME = 'main-data';
 
 // 不显示侧栏的路由
 export const HIDE_SIDEBARS = [];
@@ -102,7 +104,9 @@ export const TAB_KEEP_ALIVE = true;
 export const TOKEN_HEADER_NAME = 'Authorization';
 
 // token 存储的名称
-export const TOKEN_STORE_NAME = 'access_token';
+export const TOKEN_STORE_NAME = window.__POWERED_BY_QIANKUN__
+  ? 'access_token'
+  : `${SYSTEM_NAME}-access_token`;
 
 // 主题配置存储的名称
 export const THEME_STORE_NAME = 'theme';

+ 4 - 1
src/router/index.js

@@ -8,11 +8,14 @@ import { WHITE_LIST, REDIRECT_PATH, LAYOUT_PATH } from '@/config/setting';
 import store from '@/store';
 import { getToken } from '@/utils/token-util';
 import { routes, getMenuRoutes } from './routes';
+import { SYSTEM_NAME } from '@/config/setting';
 
 Vue.use(VueRouter);
 
 const router = new VueRouter({
-  base: window.__POWERED_BY_QIANKUN__ ? '/page-main-data/' : '/main-data/',
+  base: window.__POWERED_BY_QIANKUN__
+    ? `/page-${SYSTEM_NAME}/`
+    : `/${SYSTEM_NAME}/`,
   routes,
   mode: 'history',
   scrollBehavior () {

+ 4 - 1
src/store/index.js

@@ -10,6 +10,7 @@ import theme from './modules/theme';
 import team from './modules/team';
 import createPersistedState from 'vuex-persistedstate';
 
+import { SYSTEM_NAME } from '@/config/setting';
 Vue.use(Vuex);
 
 export default new Vuex.Store({
@@ -25,7 +26,9 @@ export default new Vuex.Store({
   getters,
   plugins: [
     createPersistedState({
-      key: 'vuex-main',
+      key: window.__POWERED_BY_QIANKUN__
+        ? `vuex-${SYSTEM_NAME}`
+        : `private-vuex-${SYSTEM_NAME}`,
       storage: window.sessionStorage,
       paths: ['user']
     })

+ 0 - 163
src/views/material/product/components/dict-data-edit.vue

@@ -1,163 +0,0 @@
-<!-- 字典项编辑弹窗 -->
-<template>
-  <ele-modal
-    width="460px"
-    :visible="visible"
-    :close-on-click-modal="true"
-    :title="isUpdate ? '修改字典项' : '添加字典项'"
-    @update:visible="updateVisible"
-  >
-    <el-form :model="form" ref="form" :rules="rules" label-width="96px">
-      <el-form-item label="字典项名称:" prop="dictDataName">
-        <el-input
-          clearable
-          :maxlength="20"
-          v-model="form.dictDataName"
-          placeholder="请输入字典项名称"
-        />
-      </el-form-item>
-      <el-form-item label="字典项值:" prop="dictDataCode">
-        <el-input
-          clearable
-          :maxlength="20"
-          v-model="form.dictDataCode"
-          placeholder="请输入字典项值"
-        />
-      </el-form-item>
-      <el-form-item label="排序号:" prop="sortNumber">
-        <el-input-number
-          :min="0"
-          :max="9999"
-          v-model="form.sortNumber"
-          placeholder="请输入排序号"
-          controls-position="right"
-          class="ele-fluid ele-text-left"
-        />
-      </el-form-item>
-      <el-form-item label="备注:">
-        <el-input
-          :rows="4"
-          type="textarea"
-          :maxlength="200"
-          v-model="form.comments"
-          placeholder="请输入备注"
-        />
-      </el-form-item>
-    </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 {
-    addDictionaryData,
-    updateDictionaryData
-  } from '@/api/system/dictionary-data';
-
-  export default {
-    // props: {
-    //   // 弹窗是否打开
-    //   visible: Boolean,
-    //   // 修改回显的数据
-    //   data: Object,
-    //   // 字典id
-    //   dictId: Object
-    // },
-    props: ['visible', 'data', 'dictId'],
-    data() {
-      const defaultForm = {
-        dictDataId: null,
-        dictDataName: '',
-        dictDataCode: '',
-        sortNumber: '',
-        comments: ''
-      };
-      return {
-        defaultForm,
-        // 表单数据
-        form: { ...defaultForm },
-        // 表单验证规则
-        rules: {
-          dictDataName: [
-            {
-              required: true,
-              message: '请输入字典项名称',
-              trigger: 'blur'
-            }
-          ],
-          dictDataCode: [
-            {
-              required: true,
-              message: '请输入字典项值',
-              trigger: 'blur'
-            }
-          ],
-          sortNumber: [
-            {
-              required: true,
-              message: '请输入排序号',
-              trigger: 'blur'
-            }
-          ]
-        },
-        // 提交状态
-        loading: false,
-        // 是否是修改
-        isUpdate: false
-      };
-    },
-    methods: {
-      /* 保存编辑 */
-      save() {
-        this.$refs.form.validate((valid) => {
-          if (!valid) {
-            return false;
-          }
-          this.loading = true;
-          const saveOrUpdate = this.isUpdate
-            ? updateDictionaryData
-            : addDictionaryData;
-          saveOrUpdate({
-            ...this.form,
-            dictId: this.dictId
-          })
-            .then((msg) => {
-              this.loading = false;
-              console.log(msg);
-              this.$message.success(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: {
-      visible(visible) {
-        if (visible) {
-          if (this.data) {
-            this.$util.assignObject(this.form, this.data);
-            this.isUpdate = true;
-          } else {
-            this.isUpdate = false;
-          }
-        } else {
-          this.$refs.form.clearValidate();
-          this.form = { ...this.defaultForm };
-        }
-      }
-    }
-  };
-</script>

+ 0 - 227
src/views/material/product/components/dict-data.vue

@@ -1,227 +0,0 @@
-<template>
-  <div>
-    <!-- 数据表格 -->
-    <ele-pro-table
-      ref="table"
-      :columns="columns"
-      :datasource="datasource"
-      :need-page="true"
-      :toolkit="[]"
-      :selection.sync="selection"
-      height="calc(100vh - 350px)"
-      full-height="calc(100vh - 116px)"
-      tool-class="ele-toolbar-form"
-      cache-key="systemDictDataTable"
-    >
-      <!-- 表头工具栏 -->
-      <!-- <template v-slot:toolbar>
-        <dict-data-search @search="reload">
-          <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>
-        </dict-data-search>
-      </template> -->
-      <!-- 操作列 -->
-      <template v-slot:appType="{ row }">
-        {{ types[row.appType] }}
-      </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>
-    <!-- 编辑弹窗 -->
-    <dict-edit :visible.sync="showEdit" :id="id" @done="reload" />
-  </div>
-</template>
-
-<script>
-  import DictDataSearch from './dict-data-search.vue';
-  import DictDataEdit from './dict-data-edit.vue';
-  import {
-    pageDictionaryData,
-    removeDictionaryData,
-    removeDictionaryDataBatch
-  } from '@/api/system/dictionary-data';
-  import { listDictionaries, removeDictionary } from '@/api/system/dictionary';
-  import DictEdit from './dict-edit.vue';
-
-  export default {
-    components: { DictDataSearch, DictDataEdit, DictEdit },
-    data() {
-      return {
-        // 表格列配置
-        columns: [
-          {
-            columnKey: 'selection',
-            type: 'selection',
-            width: 45,
-            align: 'center'
-          },
-          {
-            columnKey: 'index',
-            type: 'index',
-            width: 45,
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'code',
-            label: '字典编码',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'name',
-            label: '字典名称',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          // {
-          //   prop: 'appType',
-          //   label: '字典类型',
-
-          //   showOverflowTooltip: true,
-          //   minWidth: 110
-          // },
-          {
-            prop: 'appType',
-            align: 'center',
-            label: '应用类型',
-            showOverflowTooltip: true,
-            slot: 'appType'
-          },
-          {
-            prop: 'remark',
-            label: '描述',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'updateTime',
-            label: '上次更新时间',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110,
-            formatter: (_row, _column, cellValue) => {
-              return this.$util.toDateString(cellValue);
-            }
-          },
-          {
-            columnKey: 'action',
-            label: '操作',
-            width: 130,
-            align: 'center',
-            resizable: false,
-            slot: 'action',
-            showOverflowTooltip: true
-          }
-        ],
-        types: {
-          1: '业务字典',
-          2: '数据字典'
-        },
-        // 表格选中数据
-        selection: [],
-        // 当前编辑数据
-        current: null,
-        // 是否显示编辑弹窗
-        showEdit: false,
-        id: ''
-      };
-    },
-
-    methods: {
-      /* 表格数据源 */
-      datasource({ page, limit, where, order }) {
-        return listDictionaries({ pageNum: page, size: limit, ...where });
-      },
-      /* 刷新表格 */
-      reload(where) {
-        this.$refs.table.reload({ page: 1, where: where });
-      },
-      /* 显示编辑 */
-      openEdit(row) {
-        this.id = row.id;
-        this.current = row;
-        this.showEdit = true;
-      },
-      /* 删除 */
-      remove(row) {
-        const loading = this.$loading({ lock: true });
-        removeDictionary(row.id)
-          .then((msg) => {
-            loading.close();
-            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 });
-            removeDictionaryDataBatch(this.selection.map((d) => d.dictDataId))
-              .then((msg) => {
-                loading.close();
-                this.$message.success(msg);
-                this.reload();
-              })
-              .catch((e) => {
-                loading.close();
-                // this.$message.error(e.message);
-              });
-          })
-          .catch(() => {});
-      }
-    },
-    watch: {
-      // 监听字典id变化
-      // dictId() {
-      //   this.reload();
-      // }
-    }
-  };
-</script>

+ 0 - 476
src/views/material/product/components/dict-edit.vue

@@ -1,476 +0,0 @@
-<!-- 字典编辑弹窗 -->
-<template>
-  <ele-modal
-    width="800px"
-    :maxable="true"
-    :visible="visible"
-    :close-on-click-modal="true"
-    :title="isUpdate ? '修改字典' : '添加字典'"
-    @update:visible="updateVisible"
-  >
-    <div class="divider">
-      <div class="title">
-        <div class="ele-bg-primary"></div>
-        <span>基本信息</span>
-      </div>
-      <div class="ele-bg-primary" style="width: 100%; height: 2px"></div>
-    </div>
-    <el-form
-      ref="form"
-      :model="form"
-      :rules="rules"
-      label-width="85px"
-      style="margin-bottom: 10px"
-    >
-      <el-row>
-        <el-col :span="12">
-          <el-form-item label="字典名称:" prop="name">
-            <el-input
-              clearable
-              :disabled="isUpdate"
-              :maxlength="20"
-              v-model="form.name"
-              placeholder="请输入字典名称"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="字典值:" prop="code">
-            <el-input
-              clearable
-              :disabled="isUpdate"
-              :maxlength="20"
-              v-model="form.code"
-              placeholder="请输入字典值"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="应用类型:" prop="appType">
-            <el-radio-group v-model="form.appType">
-              <el-radio :label="1">业务字典</el-radio>
-              <el-radio :label="2">数据字典</el-radio>
-            </el-radio-group>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="是否启用:" prop="enable">
-            <el-radio-group v-model="form.enable">
-              <el-radio :label="1">是</el-radio>
-              <el-radio :label="0">否</el-radio>
-            </el-radio-group>
-          </el-form-item>
-        </el-col>
-        <!-- <el-col :span="12">
-          <el-form-item label="排序号:" prop="sortNumber">
-            <el-input-number
-              :min="0"
-              :max="9999"
-              v-model="form.sortNumber"
-              controls-position="right"
-              placeholder="请输入排序号"
-              class="ele-fluid ele-text-left"
-            />
-          </el-form-item>
-        </el-col> -->
-
-        <el-col :span="24">
-          <el-form-item label="备注:">
-            <el-input
-              :rows="4"
-              type="textarea"
-              :maxlength="200"
-              v-model="form.remark"
-              placeholder="请输入备注"
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-    <div class="divider">
-      <div class="title">
-        <div class="ele-bg-primary"></div>
-        <span>字典项配置</span>
-      </div>
-      <div class="ele-bg-primary" style="width: 100%; height: 2px"></div>
-    </div>
-    <div style="margin: 5px 0">
-      <el-button
-        size="small"
-        type="primary"
-        icon="el-icon-plus"
-        class="ele-btn-icon"
-        @click="pushArr"
-      >
-        添加
-      </el-button>
-
-      <!-- <el-button
-        size="small"
-        type="danger"
-        icon="el-icon-delete"
-        class="ele-btn-icon"
-        @click="removeArr"
-      >
-        删除
-      </el-button> -->
-    </div>
-    <el-table
-      :data="tableData"
-      border
-      style="width: 100%"
-      @selection-change="handleSelectionChange"
-    >
-      <el-table-column prop="code" label="字典项编码">
-        <template slot-scope="scope">
-          <el-input
-            @blur="checkedValue(scope.row.code)"
-            v-model="scope.row.code"
-            placeholder=""
-          ></el-input>
-        </template>
-      </el-table-column>
-      <el-table-column prop="name" label="字典项名称">
-        <template slot-scope="scope">
-          <el-input v-model="scope.row.name" placeholder=""></el-input>
-        </template>
-      </el-table-column>
-      <el-table-column prop="sort" label="排序">
-        <template slot-scope="scope">
-          <el-input
-            v-model="scope.row.sort"
-            @input="
-              scope.row.sort = String(scope.row.sort).replace(/[^\d]/g, '')
-            "
-          ></el-input>
-        </template>
-      </el-table-column>
-      <el-table-column prop="enable" label="启用">
-        <template slot-scope="scope">
-          <el-radio-group v-model="scope.row.enable">
-            <el-radio :label="1">是</el-radio>
-            <el-radio :label="0">否</el-radio>
-          </el-radio-group>
-        </template>
-      </el-table-column>
-      <el-table-column align="center" label="操作">
-        <template slot-scope="scope">
-          <el-popconfirm
-            class="ele-action"
-            title="确定要删除此字典项吗?"
-            @confirm="removeArr(scope)"
-          >
-            <template v-slot:reference>
-              <el-link type="danger" :underline="false" icon="el-icon-delete">
-                删除
-              </el-link>
-            </template>
-          </el-popconfirm>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <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 { addDictionary, updateDictionary } from '@/api/system/dictionary';
-  import {
-    pageDictionaryData,
-    removeDictionaryData,
-    removeDictionaryDataBatch
-  } from '@/api/system/dictionary-data';
-
-  export default {
-    props: {
-      // 弹窗是否打开
-      visible: Boolean,
-      // 修改回显的数据
-      id: String | Number
-    },
-    data() {
-      const defaultForm = {
-        name: '',
-        code: '',
-        appType: 1,
-        enable: 1,
-        remark: '',
-        dictStaticSubmitPOList: []
-      };
-      return {
-        defaultForm,
-        // 表单数据
-        form: { ...defaultForm },
-        // form: {
-        //   name: '',
-        //   code: '',
-        //   appType: 1,
-        //   enable: 1,
-        //   remark: ''
-        // },
-        // 表单验证规则
-        rules: {
-          name: [
-            {
-              required: true,
-              message: '请输入字典名称',
-              trigger: 'blur'
-            }
-          ],
-          code: [
-            {
-              required: true,
-              message: '请输入字典值',
-              trigger: 'blur'
-            }
-          ],
-          appType: [
-            {
-              required: true,
-              message: '请选择应用类型',
-              trigger: 'blur'
-            }
-          ],
-          enable: [
-            {
-              required: true,
-              message: '请选择是否启用',
-              trigger: 'blur'
-            }
-          ],
-          sort: [
-            {
-              required: true,
-              message: '请输入排序号',
-              trigger: 'blur'
-            }
-          ]
-        },
-        // 表格列配置
-        columns: [
-          {
-            columnKey: 'selection',
-            type: 'selection',
-            width: 45,
-            align: 'center'
-          },
-          {
-            columnKey: 'index',
-            type: 'index',
-            width: 45,
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'code',
-            label: '字典编码',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'name',
-            label: '字典名称',
-
-            showOverflowTooltip: true
-          },
-          // {
-          //   prop: 'appType',
-          //   label: '字典类型',
-
-          //   showOverflowTooltip: true,
-          //   minWidth: 110
-          // },
-          {
-            prop: 'appType',
-            label: '应用类型',
-
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'remark',
-            label: '描述',
-
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'createTime',
-            label: '创建时间',
-
-            showOverflowTooltip: true,
-            minWidth: 110,
-            formatter: (_row, _column, cellValue) => {
-              return this.$util.toDateString(cellValue);
-            }
-          },
-          {
-            columnKey: 'action',
-            label: '操作',
-            width: 130,
-            align: 'center',
-            resizable: false,
-            slot: 'action',
-            showOverflowTooltip: true
-          }
-        ],
-        tableData: [],
-        // 表格选中数据
-        selection: [],
-        datasource: {
-          list: []
-        },
-        // 提交状态
-        loading: false,
-        // 是否是修改
-        isUpdate: false,
-        delectId: 1
-      };
-    },
-    created() {},
-
-    methods: {
-      pushArr() {
-        this.form.dictStaticSubmitPOList.push({
-          code: '',
-          enable: 1,
-          name: '',
-          sort: '',
-          delectId: this.delectId
-        });
-        this.delectId = this.delectId + 1;
-        this.filterArr();
-      },
-      //
-      checkedValue(val) {
-        console.log(val);
-      },
-      removeArr(row) {
-        console.log(row);
-        if (row.row.id) {
-          this.form.dictStaticSubmitPOList.forEach((item) => {
-            if (item.id === row.row.id) {
-              item.deleted = 1;
-            }
-          });
-          this.filterArr();
-        } else {
-          let index = this.form.dictStaticSubmitPOList.findIndex(
-            (item) => item.delectId === row.row.delectId
-          );
-          console.log(index);
-          this.form.dictStaticSubmitPOList.splice(index, 1); // 在数组的指定位置移除对应的元素。 返回移除的
-          this.filterArr();
-        }
-
-        // let falg = this.form.dictStaticSubmitPOList[row.$index].deleted === 0;
-        // if (falg) {
-        //   this.form.dictStaticSubmitPOList[row.$index].deleted = 1;
-        //   this.filterArr();
-        // } else {
-        //   this.form.dictStaticSubmitPOList.splice(row.$index, 1);
-        //   this.filterArr();
-        // }
-      },
-      handleSelectionChange() {},
-      /* 保存编辑 */
-      save() {
-        this.$refs.form.validate((valid) => {
-          if (!valid) {
-            return false;
-          }
-          let falg = this.form.dictStaticSubmitPOList.some(
-            (item, index) => item.code.length === 0
-          );
-          if (falg) {
-            this.$message({
-              message: '字典项编码不能为空',
-              type: 'warning'
-            });
-            return;
-          }
-          this.form.dictStaticSubmitPOList.forEach((item, index) => {
-            if (item.delectId) {
-              delete item.delectId;
-            }
-          });
-
-          this.loading = true;
-          const saveOrUpdate = this.isUpdate ? updateDictionary : addDictionary;
-          saveOrUpdate(this.form)
-            .then((msg) => {
-              this.loading = false;
-              this.$message.success(msg);
-              this.updateVisible(false);
-              this.$emit('done');
-            })
-            .catch((e) => {
-              this.loading = false;
-              // // this.$message.error(e.message);
-            });
-        });
-      },
-      filterArr() {
-        this.tableData = this.form.dictStaticSubmitPOList.filter(
-          (item) => item.deleted !== 1
-        );
-      },
-      /* 更新visible */
-      updateVisible(value) {
-        this.$emit('update:visible', value);
-      },
-
-      async getDetail() {
-        const res = await pageDictionaryData(this.id);
-        this.form = res.data.dictInfoVO;
-
-        this.form.dictStaticSubmitPOList = res.data.dictStaticVOList;
-        if (this.form.dictStaticSubmitPOList.length > 0) {
-          this.filterArr();
-        } else {
-          this.tableTata = [];
-        }
-      }
-    },
-    watch: {
-      visible(visible) {
-        if (visible) {
-          if (this.id) {
-            // this.$util.assignObject(this.form, this.data);
-            this.isUpdate = true;
-            this.getDetail();
-          } else {
-            this.isUpdate = false;
-          }
-        } else {
-          this.$refs.form.clearValidate();
-          this.form = { ...this.defaultForm };
-          this.form.dictStaticSubmitPOList = []; // clear the list of the dictionary static push button. 描述变化的字段不会在push后
-          this.tableData = []; // clear the list of the dictionary static push button. 描述变化的字段不会在push后。
-        }
-      }
-    }
-  };
-</script>
-<style lang="scss" scoped>
-  .divider {
-    margin-bottom: 20px;
-
-    .title {
-      display: flex;
-      align-items: center;
-      margin-bottom: 10px;
-      div {
-        width: 8px;
-        height: 20px;
-        margin-right: 10px;
-      }
-      span {
-        font-size: 20px;
-      }
-    }
-  }
-</style>

+ 19 - 36
src/views/material/product/components/dict-data-search.vue → src/views/material/product/components/product-search.vue

@@ -1,50 +1,35 @@
 <!-- 搜索表单 -->
 <template>
   <el-form
-    size="small"
     label-width="77px"
     class="ele-form-search"
     @keyup.enter.native="search"
     @submit.native.prevent
   >
     <el-row :gutter="10">
-      <el-col v-bind="styleResponsive ? { md: 4 } : { span: 4 }">
-        <el-form-item label="编码">
-          <el-input
-            clearable
-            size="small"
-            v-model="where.code"
-            placeholder="请输入"
-          />
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="产品编码">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 4 } : { span: 4 }">
-        <el-form-item label="名称">
-          <el-input
-            clearable
-            size="small"
-            v-model="where.name"
-            placeholder="请输入"
-          />
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="产品名称">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 4 } : { span: 4 }">
-        <el-form-item label="应用类型">
-          <el-select v-model="where.appType" placeholder="请选择">
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="牌号">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 12 } : { span: 4 }">
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="型号">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 4 } : { span: 4 }">
         <el-form-item>
           <el-button
-            size="small"
             type="primary"
             icon="el-icon-search"
             class="ele-btn-icon"
@@ -60,8 +45,6 @@
             size="medium"
             >重置</el-button
           >
-
-          <slot></slot>
         </el-form-item>
       </el-col>
     </el-row>
@@ -70,7 +53,7 @@
 
 <script>
   export default {
-    data() {
+    data () {
       // 默认表单数据
       const defaultWhere = {
         name: '',
@@ -90,20 +73,20 @@
     },
     computed: {
       // 是否开启响应式布局
-      styleResponsive() {
+      styleResponsive () {
         return this.$store.state.theme.styleResponsive;
       }
     },
     methods: {
       /* 搜索 */
-      search() {
+      search () {
         if (this.where.appType === 0) {
           this.where.appType = '';
         }
         this.$emit('search', this.where);
       },
       /*  重置 */
-      reset() {
+      reset () {
         this.where = { ...this.defaultWhere };
         this.search();
       }

+ 64 - 90
src/views/material/product/index.vue

@@ -1,82 +1,51 @@
 <template>
   <div class="ele-body">
     <el-card shadow="never">
-      <DictDataSearch @search="reload" />
-      <div style="margin: 5px 0; padding-left: 262px">
-        <el-button
-          size="small"
-          type="primary"
-          icon="el-icon-plus"
-          class="ele-btn-icon"
-          @click="openEdit()"
-        >
-          添加
-        </el-button>
-        <!-- <el-button
-          size="small"
-          type="warning"
-          icon="el-icon-edit"
-          class="ele-btn-icon"
-          :disabled="!current"
-          @click="openEdit(current)"
-        >
-          修改
-        </el-button> -->
-        <el-button
-          size="small"
-          type="danger"
-          icon="el-icon-delete"
-          class="ele-btn-icon"
-          :disabled="!current"
-          @click="remove"
-        >
-          删除
-        </el-button>
-      </div>
+      <ProductSearch @search="reload" />
       <ele-split-layout
         width="244px"
         allow-collapse
         :right-style="{ overflow: 'hidden' }"
       >
+        <div class="ele-border-lighter split-layout-right-content">
+          <AssetTree ref="assetTreeRef" id="9" />
+        </div>
         <!-- 表格 -->
-        <ele-pro-table
-          ref="table"
-          :columns="columns"
-          :datasource="datasource"
-          height="calc(100vh - 350px)"
-          :need-page="false"
-          :toolkit="[]"
-          :current.sync="current"
-          highlight-current-row
-          class="dict-table"
-          tool-class="ele-toolbar-actions"
-          @done="done"
-        >
-          <!-- 表头工具栏 -->
-          <template v-slot:toolbar> </template>
-        </ele-pro-table>
-
         <template v-slot:content>
-          <!-- 数据字典项列表 -->
-          <dict-data ref="dictData" v-if="current" :dict-id="current.id" />
+          <ele-pro-table
+            ref="table"
+            :columns="columns"
+            :datasource="datasource"
+            height="calc(100vh - 350px)"
+            :need-page="false"
+            :toolkit="[]"
+            :current.sync="current"
+            highlight-current-row
+            class="dict-table"
+            tool-class="ele-toolbar-actions"
+            @done="done"
+          >
+            <!-- 表头工具栏 -->
+            <template v-slot:toolbar> </template>
+            <template v-slot:action>
+              <el-link>编辑</el-link>
+            </template>
+          </ele-pro-table>
         </template>
       </ele-split-layout>
     </el-card>
-    <!-- 编辑弹窗 -->
-    <dict-edit :visible.sync="showEdit" @done="reload" />
   </div>
 </template>
 
 <script>
-  import DictData from './components/dict-data.vue';
-  import DictEdit from './components/dict-edit.vue';
-  import DictDataSearch from './components/dict-data-search.vue';
+  import AssetTree from '@/components/AssetTree';
+  import ProductSearch from './components/product-search.vue';
   import { listDictionaries, removeDictionary } from '@/api/system/dictionary';
 
   export default {
     name: 'SystemDictionary',
-    components: { DictData, DictEdit, DictDataSearch },
-    data() {
+    components: { AssetTree, ProductSearch },
+    data () {
       return {
         // 表格列配置
         columns: [
@@ -89,8 +58,38 @@
           },
           {
             prop: 'name',
-            label: '字典名称',
+            label: '产品编码',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '产品名称',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '牌号',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '型号',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '计量单位',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '包装单位',
             showOverflowTooltip: true
+          },
+          {
+            action: 'action',
+            slot: 'action',
+            label: '操作'
           }
         ],
         // 当前编辑数据
@@ -104,28 +103,28 @@
 
     methods: {
       /* 表格数据源 */
-      datasource() {
+      datasource () {
         // return;
         return listDictionaries();
       },
       /* 表格渲染完成回调 */
-      done(res) {
+      done (res) {
         if (res.data?.length) {
           this.$refs.table.setCurrentRow(res.data[0]);
         }
       },
       /* 刷新表格 */
-      reload(where) {
+      reload (where) {
         this.$refs.table.reload();
         this.$refs.dictData.reload(where);
       },
       /* 显示编辑 */
-      openEdit(row) {
+      openEdit (row) {
         this.editData = row;
         this.showEdit = true;
       },
       /* 删除 */
-      remove() {
+      remove () {
         this.$confirm('确定要删除选中的字典吗?', '提示', {
           type: 'warning'
         })
@@ -157,29 +156,4 @@
   };
 </script>
 
-<style lang="scss" scoped>
-  .dict-table {
-    :deep(.el-table__row) {
-      cursor: pointer;
-    }
-
-    :deep(.el-table__row > td:last-child:after) {
-      content: '\e6e0';
-      font-family: element-icons !important;
-      font-style: normal;
-      font-variant: normal;
-      text-transform: none;
-      -webkit-font-smoothing: antialiased;
-      -moz-osx-font-smoothing: grayscale;
-      line-height: 1;
-      position: absolute;
-      right: 10px;
-      top: 50%;
-      margin-top: -7px;
-    }
-
-    :deep(.el-table__row > td:last-child .cell) {
-      padding-right: 20px;
-    }
-  }
-</style>
+<style lang="scss" scoped></style>

+ 78 - 0
src/views/material/productLinkMaterial/components/link-material-dialog.vue

@@ -0,0 +1,78 @@
+<template>
+  <el-dialog :visible.sync="visible" title="">
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <headerTitle>
+          <template v-slot:title>
+            可选
+            <el-button type="primary" size="small">关联</el-button>
+            <el-button type="primary" size="small" icon="icon-search"
+              >搜索</el-button
+            >
+          </template>
+        </headerTitle>
+        <el-form label-width="60px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="分类">
+                <el-input placeholder="请输入"></el-input> </el-form-item
+            ></el-col>
+            <el-col :span="12">
+              <el-form-item label="编码">
+                <el-input placeholder="请输入"></el-input></el-form-item
+            ></el-col>
+            <el-col :span="12">
+              <el-form-item label="名称">
+                <el-input placeholder="请输入"></el-input></el-form-item
+            ></el-col>
+            <el-col :span="12">
+              <el-form-item label="型号">
+                <el-input placeholder="请输入"></el-input></el-form-item
+            ></el-col>
+          </el-row>
+        </el-form>
+        <ele-pro-table
+          ref="table"
+          :columns="columns"
+          :datasource="[]"
+          height="calc(100vh - 350px)"
+          :need-page="false"
+        >
+        </ele-pro-table>
+      </el-col>
+      <el-col :span="12">
+        <headerTitle
+          ><template v-slot:title
+            >已关联
+            <el-button type="primary" size="small">取消关联</el-button>
+            <el-button type="primary" size="small" icon="icon-search"
+              >搜索</el-button
+            ></template
+          ></headerTitle
+        ></el-col
+      >
+    </el-row>
+  </el-dialog>
+</template>
+
+<script>
+  export default {
+    data () {
+      return {
+        visible: true,
+        columns: []
+      };
+    },
+    methods: {
+      open (type, row) {
+        switch (type) {
+          case value:
+            break;
+
+          default:
+            break;
+        }
+      }
+    }
+  };
+</script>

+ 95 - 0
src/views/material/productLinkMaterial/components/product-search.vue

@@ -0,0 +1,95 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="77px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="10">
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="产品编码">
+          <el-input clearable v-model="where.code" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="产品名称">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="牌号">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 5 } : { span: 4 }">
+        <el-form-item label="型号">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 4 } : { span: 4 }">
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+
+          <el-button
+            @click="reset"
+            icon="el-icon-refresh"
+            class="ele-btn-icon"
+            size="medium"
+            >重置</el-button
+          >
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    data () {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        code: '',
+        appType: ''
+      };
+      return {
+        options: [
+          { value: 0, label: '全部' },
+          { value: 1, label: '业务字典' },
+          { value: 2, label: '数据字典' }
+        ],
+        defaultWhere,
+        // 表单数据
+        where: { ...defaultWhere }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive () {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search () {
+        if (this.where.appType === 0) {
+          this.where.appType = '';
+        }
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset () {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 171 - 0
src/views/material/productLinkMaterial/index.vue

@@ -0,0 +1,171 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <ProductSearch @search="reload" />
+      <ele-split-layout
+        width="244px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div class="ele-border-lighter split-layout-right-content">
+          <AssetTree ref="assetTreeRef" id="9" />
+        </div>
+        <!-- 表格 -->
+        <template v-slot:content>
+          <ele-pro-table
+            ref="table"
+            :columns="columns"
+            :datasource="datasource"
+            height="calc(100vh - 350px)"
+            :need-page="false"
+            :current.sync="current"
+            highlight-current-row
+            class="dict-table"
+            tool-class="ele-toolbar-actions"
+          >
+            <!-- 表头工具栏 -->
+            <template v-slot:toolbar>
+              <el-button type="primary" @click="handleLink(1)"
+                >关联设备</el-button
+              >
+              <el-button type="primary" @click="handleLink(2)"
+                >关联模具</el-button
+              >
+              <el-button type="primary" @click="handleLink(3)"
+                >关联舟皿</el-button
+              >
+            </template>
+            <template v-slot:action>
+              <el-link>编辑</el-link>
+            </template>
+          </ele-pro-table>
+        </template>
+      </ele-split-layout>
+    </el-card>
+    <linkMaterialDialog ref="linkMaterialDialogRef" />
+  </div>
+</template>
+
+<script>
+  import AssetTree from '@/components/AssetTree';
+  import ProductSearch from './components/product-search.vue';
+  import linkMaterialDialog from './components/link-material-dialog.vue';
+  import { listDictionaries, removeDictionary } from '@/api/system/dictionary';
+
+  export default {
+    name: 'SystemDictionary',
+    components: { AssetTree, ProductSearch, linkMaterialDialog },
+    data () {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'index',
+            type: 'index',
+            width: 45,
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '产品编码',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '产品名称',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '牌号',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '型号',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '计量单位',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '包装单位',
+            showOverflowTooltip: true
+          },
+          {
+            action: 'action',
+            slot: 'action',
+            label: '操作'
+          }
+        ],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 编辑回显数据
+        editData: null
+      };
+    },
+
+    methods: {
+      /* 表格数据源 */
+      datasource () {
+        // return;
+        return listDictionaries();
+      },
+      handleLink (type) {
+        console.log(this.current, 'handleLink');
+        if (!this.current) {
+          return this.$message.error('请选择产品!');
+        }
+
+        this.$refs.linkMaterialDialogRef.open(type, this.current);
+      },
+      /* 刷新表格 */
+      reload (where) {
+        this.$refs.table.reload();
+        this.$refs.dictData.reload(where);
+      },
+      /* 显示编辑 */
+      openEdit (row) {
+        this.editData = row;
+        this.showEdit = true;
+      },
+      /* 删除 */
+      remove () {
+        this.$confirm('确定要删除选中的字典吗?', '提示', {
+          type: 'warning'
+        })
+          .then(() => {
+            if (this.$refs.dictData.selection.length == 0) {
+              this.$message({
+                message: '当前未选择数据',
+                type: 'error'
+              });
+              return;
+            }
+            let ids = this.$refs.dictData.selection.map((item) => item.id);
+            const loading = this.$loading({ lock: true });
+
+            removeDictionary(ids, true)
+              .then((msg) => {
+                loading.close();
+                this.$message.success(msg);
+                this.reload();
+              })
+              .catch((e) => {
+                loading.close();
+                // this.$message.error(e.message);
+              });
+          })
+          .catch(() => {});
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 7 - 0
src/views/technology/production/components/parameter/index.vue

@@ -40,6 +40,9 @@
       UserSearch,
       UserEdit
     },
+    props: {
+      data: Array
+    },
     data() {
       return {
         // 表格列配置
@@ -49,6 +52,10 @@
             type: 'selection',
             width: 45,
             align: 'center',
+            selectable: (row, index) => {
+              return !this.data.some((it) => it.paramId == row.id);
+              // return row.id < 3; // 这里是让 id < 3 的禁用,根据自己业务修改
+            },
             reserveSelection: true
           },
           {

+ 15 - 31
src/views/technology/production/components/user-edit.vue

@@ -6,7 +6,7 @@
     :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>
@@ -18,31 +18,24 @@
               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-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-input v-model="form.controlId" placeholder="请输入" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
           <el-form-item label="工作中心:" prop="workCenterId">
-            <el-input
-              placeholder="请输入工作中心"
-              v-model="form.workCenterId"
-            />
+            <el-input placeholder="请输入" v-model="form.workCenterId" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
@@ -65,10 +58,7 @@
       <el-row>
         <el-col :span="8">
           <el-form-item label="工序休息时长:">
-            <el-input
-              v-model="form.workBeat.restTimes"
-              placeholder="请输入工序休息时长"
-            />
+            <el-input v-model="form.workBeat.restTimes" placeholder="请输入" />
           </el-form-item>
         </el-col>
 
@@ -77,24 +67,18 @@
             <el-input
               v-model="form.workBeat.preTimes"
               clearable
-              placeholder="请输入工序准备时长"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
         <el-col :span="8">
           <el-form-item label="设备生产时长:">
-            <el-input
-              v-model="form.workBeat.proTimes"
-              placeholder="请输入工序控制码"
-            />
+            <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-input placeholder="请输入" v-model="form.workBeat.otherTimes" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
@@ -126,7 +110,7 @@
           <el-form-item label="下工序标准准备时间:">
             <el-input
               v-model="form.intervalTime.nextStandardPreTime"
-              placeholder="请输入下工序标准准备时间"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
@@ -134,7 +118,7 @@
           <el-form-item label="下工序最短准备时间:">
             <el-input
               v-model="form.intervalTime.nextShortPreTime"
-              placeholder="请输入下工序最短准备时间"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
@@ -142,7 +126,7 @@
           <el-form-item label="本工序标准等待时间:">
             <el-input
               v-model="form.intervalTime.thisStandardWaitTime"
-              placeholder="请输入本工序标准等待时间"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
@@ -150,7 +134,7 @@
           <el-form-item label="本工序最短准备时间:">
             <el-input
               v-model="form.intervalTime.thisShortPreTime"
-              placeholder="请输入本工序最短准备时间"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
@@ -158,7 +142,7 @@
           <el-form-item label="本工序结束后标准周转时间:">
             <el-input
               v-model="form.intervalTime.thisStandardBoatTime"
-              placeholder="请输入本工序结束后标准周转时间"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>
@@ -166,7 +150,7 @@
           <el-form-item label="本工序结束后周转最短时间:">
             <el-input
               v-model="form.intervalTime.thisShortBoatTime"
-              placeholder="请输入本工序结束后周转最短时间"
+              placeholder="请输入"
             />
           </el-form-item>
         </el-col>

+ 78 - 38
src/views/technology/production/components/user-setting.vue

@@ -23,7 +23,7 @@
             type="primary"
             icon="el-icon-plus"
             class="ele-btn-icon"
-            @click="() => (addDialog = true)"
+            @click="showAddLog"
           >
             添加参数
           </el-button>
@@ -82,7 +82,7 @@
 
     <template v-slot:footer>
       <el-button @click="updateVisible(false)">取消</el-button>
-      <el-button type="primary" :loading="loading" @click="addParamrter">
+      <el-button type="primary" :loading="loading" @click="save">
         保存
       </el-button>
     </template>
@@ -94,11 +94,11 @@
       @update:visible="closeAdd"
       custom-class="ele-dialog-form"
     >
-      <Paramrter ref="Paramrter" />
+      <Paramrter :data="tableData" ref="Paramrter" />
       <template v-slot:footer>
         <el-button @click="closeAdd">取消</el-button>
         <el-button type="primary" :loading="loading" @click="addParamrter">
-          保存
+          添加
         </el-button>
       </template>
     </ele-modal>
@@ -127,7 +127,7 @@
         // 表格列配置
         columns: [
           {
-            prop: 'name',
+            prop: 'paramName',
             label: '参数名称',
             showOverflowTooltip: true,
             align: 'center',
@@ -188,13 +188,28 @@
           }
         ],
         loading: false,
-        addDialog: false
+        addDialog: false,
+        removeList: [],
+        tableData: []
       };
     },
 
     methods: {
       addParamrter() {
-        console.log(this.$refs.table.getData());
+        let arr = this.$refs.Paramrter.selection;
+        arr.forEach((element) => {
+          this.$set(element, 'paramId', element.id);
+          this.$set(element, 'paramName', element.name);
+          delete element.id;
+          delete element.name;
+        });
+
+        this.$refs.table.setData([...arr, ...this.$refs.table.getData()]);
+        this.closeAdd();
+      },
+      showAddLog() {
+        this.tableData = this.$refs.table.getData();
+        this.addDialog = true;
       },
       /*关闭选择参数*/
       closeAdd() {
@@ -202,12 +217,25 @@
         this.addDialog = false;
       },
       /* 刷新表格 */
-      reload(id) {
-        this.$refs.table1111.reload({ where: { id } });
+      reload() {
+        this.$refs.table.reload();
+      },
+      remove(row) {
+        const data = this.$refs.table.getData() ?? [];
+
+        if (row.id) {
+          this.removeList.push(row.id);
+          this.$refs.table.setData(data.filter((d) => d.id !== row.id));
+        } else {
+          this.$refs.table.setData(
+            data.filter((d) => d.paramId !== row.paramId)
+          );
+        }
       },
       /* 表格数据源 */
       async datasource({ page, limit, where }) {
         if (this.data?.id) {
+          console.log(22222);
           const res = await producetask.paramList({
             taskId: this.data.id,
             pageNum: 1,
@@ -218,31 +246,47 @@
       },
       /* 保存编辑 */
       save() {
-        this.$refs.form.validate((valid) => {
-          if (!valid) {
-            return false;
-          }
-          if (!this.isUpdate) {
-            delete this.form.id;
+        let arr = this.$refs.table.getData();
+        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.form.workBeat.beatTimes = this.totalTime;
+        // this.$refs.form.validate((valid) => {
+        //   if (!valid) {
+        //     return false;
+        //   }
+        //   if (!this.isUpdate) {
+        //     delete this.form.id;
+        //   }
 
-          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.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) {
@@ -253,13 +297,9 @@
     watch: {
       visible(visible) {
         if (visible) {
-          console.log(this.data, 'DATA');
-          if (this.data) {
-            this.isUpdate = true;
-          } else {
-            this.isUpdate = false;
-          }
-        } else {
+          this.$nextTick(() => {
+            this.reload();
+          });
         }
       }
     }

+ 239 - 0
src/views/technology/route/components/production/components/parameter/components/user-edit.vue

@@ -0,0 +1,239 @@
+<!-- 用户编辑弹窗 -->
+<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="10">
+          <el-form-item label="参数编码:" prop="code">
+            <el-input
+              clearable
+              disabled
+              v-model="form.code"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="10">
+          <el-form-item label="参数名称:" prop="name">
+            <el-input v-model="form.name" clearable placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="默认值:">
+            <el-input v-model="form.defaultValue" placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="参数单位:">
+            <el-input placeholder="请输入" v-model="form.unitName" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="参数上限:">
+            <el-input placeholder="请输入" v-model="form.maxValue" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10">
+          <el-form-item label="参数下限:">
+            <el-input placeholder="请输入" v-model="form.minValue" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="20">
+          <el-form-item label="文字描述:">
+            <el-input placeholder="请输入" v-model="form.description" />
+          </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="10">
+          <el-form-item label="参数类别:" prop="categoryType">
+            <el-select
+              v-model="form.categoryType"
+              filterable
+              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-col :span="10">
+          <el-form-item label="是否必填:" prop="notNull">
+            <el-select v-model="form.notNull" filterable placeholder="清选择">
+              <el-option
+                v-for="item in timeType"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="20">
+          <el-form-item label="备注:">
+            <el-input placeholder="请输入" v-model="form.remark" />
+          </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 parameter from '@/api/technology/parameter';
+
+  export default {
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object
+    },
+    data() {
+      const defaultForm = {
+        id: null,
+        code: '',
+        name: '',
+        categoryType: '',
+        defaultValue: '',
+        description: '',
+        maxValue: '',
+        minValue: '',
+        unitName: '',
+        remark: '',
+        notNull: ''
+      };
+      return {
+        defaultForm,
+        // 表单数据
+        form: { ...defaultForm },
+        timeType: [
+          { value: 1, label: '是' },
+          { value: 0, label: '否' }
+        ],
+        statusList: [
+          { label: '工艺', value: 0 },
+          { label: '工序', value: 1 },
+          { label: '产品', value: 2 },
+          { label: '原料', value: 3 },
+          { label: '设备', value: 4 },
+          { label: '其他', value: 5 }
+        ],
+        tacticsType: [
+          { code: 1, label: '标准时间' },
+          { code: 2, label: '最短时间' }
+        ],
+
+        // 表单验证规则
+        rules: {
+          name: [
+            { required: true, message: '请输入工序名称', trigger: 'blur' }
+          ],
+          code: [
+            { required: true, message: '请输入工序编码', trigger: 'blur' }
+          ],
+          categoryType: [
+            { required: true, message: '请选择参数类别', trigger: 'blur' }
+          ],
+          notNull: [
+            { 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((va) => {
+            if (!valid || !va) {
+              return false;
+            }
+            this.loading = true;
+            if (!this.isUpdate) {
+              delete this.form.id;
+            }
+            const saveOrUpdate = this.isUpdate
+              ? parameter.update
+              : parameter.save;
+
+            saveOrUpdate(this.form)
+              .then((msg) => {
+                this.loading = false;
+                this.form = {};
+                this.$message.success(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) {
+            const res = await parameter.getById(this.data.id);
+
+            this.$util.assignObject(this.form, {
+              ...res
+            });
+            this.isUpdate = true;
+          } else {
+            const res = await parameter.getCode();
+            this.form.code = res;
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm };
+        }
+      }
+    }
+  };
+</script>

+ 107 - 0
src/views/technology/route/components/production/components/parameter/components/user-search.vue

@@ -0,0 +1,107 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="120px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <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: 4 }">
+        <el-form-item label="参数名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <el-form-item label="参数默认值:">
+          <el-input
+            clearable
+            v-model="where.defaultValue"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
+        <el-form-item label="参数分类:">
+          <el-select
+            v-model="where.categoryType"
+            filterable
+            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-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: '',
+        defaultValue: '',
+        categoryType: ''
+        // nickname: '',
+        // sex: undefined
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        statusList: [
+          { label: '工艺', value: 0 },
+          { label: '工序', value: 1 },
+          { label: '产品', value: 2 },
+          { label: '原料', value: 3 },
+          { label: '设备', value: 4 },
+          { label: '其他', value: 5 }
+        ]
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 201 - 0
src/views/technology/route/components/production/components/parameter/index.vue

@@ -0,0 +1,201 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <user-search @search="reload" />
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="tableParameter"
+        :columns="columns"
+        :datasource="datasource"
+        :selection.sync="selection"
+        row-key="id"
+      >
+        <template v-slot:status="{ row }">
+          {{ checkType(row.categoryType) }}
+        </template>
+        <!-- 状态列 -->
+      </ele-pro-table>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :data="current"
+      @done="reload"
+      ref="userEdit"
+    />
+    <!-- 导入弹窗 -->
+  </div>
+</template>
+
+<script>
+  import UserSearch from './components/user-search.vue';
+  import UserEdit from './components/user-edit.vue';
+
+  import parameter from '@/api/technology/parameter';
+
+  export default {
+    name: 'technologyParameter',
+    components: {
+      UserSearch,
+      UserEdit
+    },
+    props: {
+      data: Array
+    },
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            selectable: (row, index) => {
+              return !this.data.some((it) => it.paramId == row.id);
+              // return row.id < 3; // 这里是让 id < 3 的禁用,根据自己业务修改
+            },
+            reserveSelection: true
+          },
+          {
+            prop: 'code',
+            label: '参数编码',
+            // sortable: 'custom',
+            showOverflowTooltip: true,
+            align: 'center',
+
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '参数名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            align: 'center',
+            prop: 'description',
+            label: '文本描述',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'maxValue',
+            label: '参数上限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'minValue',
+            label: '参数下限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'defaultValue',
+            label: '默认值',
+            align: 'center',
+
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'categoryType',
+            label: '参数分类',
+            align: 'center',
+            slot: 'status',
+            showOverflowTooltip: true
+          }
+        ],
+        statusList: [
+          { label: '工艺', value: 0 },
+          { label: '工序', value: 1 },
+          { label: '产品', value: 2 },
+          { label: '原料', value: 3 },
+          { label: '设备', value: 4 },
+          { label: '其他', value: 5 }
+        ],
+        // 表格选中数据
+        selection: [],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 是否显示导入弹窗
+        showImport: false
+      };
+    },
+    methods: {
+      /*回显类型 */
+      checkType(id) {
+        const obj = this.statusList.find((item) => item.value == id);
+        return obj.label;
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        const res = await parameter.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();
+      },
+
+      /* 删除 */
+      remove(row) {
+        const loading = this.$loading({ lock: true });
+
+        parameter
+          .delete([row.id])
+          .then((msg) => {
+            loading.close();
+            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 });
+            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(() => {});
+      }
+    }
+  };
+</script>

+ 314 - 0
src/views/technology/route/components/production/components/user-edit.vue

@@ -0,0 +1,314 @@
+<!-- 用户编辑弹窗 -->
+<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-col :span="8">
+          <el-form-item label="控制码:" prop="controlId">
+            <el-input v-model="form.controlId" 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>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="工序时间单位:" prop="timeUnit">
+            <el-select v-model="form.timeUnit">
+              <el-option
+                v-for="item in timeType"
+                :key="item.code"
+                :label="item.label"
+                :value="item.code"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <header-title title="工序节拍时间"></header-title>
+    <el-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 :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>
+        </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 producetask from '@/api/technology/production';
+
+  export default {
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      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,
+        // 表单数据
+        form: { ...defaultForm },
+        timeType: [
+          { code: 1, label: '分' },
+          { code: 2, label: '时' }
+        ],
+        tacticsType: [
+          { code: 1, label: '标准时间' },
+          { code: 2, label: '最短时间' }
+        ],
+
+        // 表单验证规则
+        rules: {
+          name: [
+            { required: true, message: '请输入工序名称', trigger: 'blur' }
+          ],
+          code: [{ required: true, trigger: 'change' }],
+          controlId: [
+            { required: true, message: '请选择控制码', trigger: 'blur' }
+          ],
+          workCenterId: [
+            { required: true, message: '请选择工作中心', trigger: 'blur' }
+          ],
+          timeUnit: [
+            { required: true, message: '请选择时间单位', trigger: 'blur' }
+          ]
+        },
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false
+      };
+    },
+    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;
+      }
+    },
+    methods: {
+      /* 保存编辑 */
+      save() {
+        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.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      async visible(visible) {
+        if (visible) {
+          if (this.data) {
+            console.log(111111);
+
+            const res = await producetask.getById(this.data.id);
+
+            this.$util.assignObject(this.form, {
+              ...res
+            });
+            this.isUpdate = true;
+          } else {
+            const res = await producetask.getCode();
+            this.form.code = res;
+            this.isUpdate = false;
+          }
+        } else {
+          this.$refs.form.clearValidate();
+          this.form = { ...this.defaultForm };
+        }
+      }
+    }
+  };
+</script>

+ 84 - 0
src/views/technology/route/components/production/components/user-search.vue

@@ -0,0 +1,84 @@
+<!-- 搜索表单 -->
+<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: 6 }">
+        <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: 6 }">
+        <el-form-item label="工序名称:">
+          <el-input clearable v-model="where.name" placeholder="请输入" />
+        </el-form-item>
+      </el-col>
+      <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="性别:">
+          <el-select
+            clearable
+            v-model="where.sex"
+            placeholder="请选择"
+            class="ele-fluid"
+          >
+            <el-option label="男" :value="1" />
+            <el-option label="女" :value="2" />
+          </el-select>
+        </el-form-item>
+      </el-col> -->
+
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <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: ''
+        // nickname: '',
+        // sex: undefined
+      };
+      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>

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

@@ -0,0 +1,307 @@
+<!-- 用户编辑弹窗 -->
+<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"
+      >
+        <!-- 表头工具栏 -->
+        <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:description="{ row }">
+          <el-input v-model="row.description" placeholder="请输入"></el-input>
+        </template>
+        <!-- 单位 -->
+        <template v-slot:unitName="{ row }">
+          <el-input v-model="row.unitName" placeholder="请输入"></el-input>
+        </template>
+        <!-- 上限 -->
+        <template v-slot:maxValue="{ row }">
+          <el-input v-model="row.maxValue" placeholder="请输入"></el-input>
+        </template>
+        <!-- 下限 -->
+        <template v-slot:minValue="{ row }">
+          <el-input v-model="row.minValue" placeholder="请输入"></el-input>
+        </template>
+        <!-- 默认值 -->
+        <template v-slot:defaultValue="{ row }">
+          <el-input v-model="row.defaultValue" placeholder="请输入"></el-input>
+        </template>
+        <!-- 默认值 -->
+        <template v-slot:notNull="{ row }">
+          <el-select v-model="row.notNull" placeholder="请选择">
+            <el-option
+              v-for="item in timeType"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </template>
+
+        <!-- 状态列 -->
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <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">
+        保存
+      </el-button>
+    </template>
+    <ele-modal
+      width="1720px"
+      :visible="addDialog"
+      :append-to-body="true"
+      :close-on-click-modal="true"
+      @update:visible="closeAdd"
+      custom-class="ele-dialog-form"
+    >
+      <Paramrter :data="tableData" ref="Paramrter" />
+      <template v-slot:footer>
+        <el-button @click="closeAdd">取消</el-button>
+        <el-button type="primary" :loading="loading" @click="addParamrter">
+          添加
+        </el-button>
+      </template>
+    </ele-modal>
+  </ele-modal>
+</template>
+
+<script>
+  import producetask from '@/api/technology/production';
+  import parameter from '@/api/technology/parameter';
+  import Paramrter from './parameter';
+
+  export default {
+    components: { Paramrter },
+    props: {
+      // 弹窗是否打开
+      visible: Boolean,
+      // 修改回显的数据
+      data: Object
+    },
+    data() {
+      return {
+        timeType: [
+          { value: 1, label: '是' },
+          { value: 0, label: '否' }
+        ],
+        // 表格列配置
+        columns: [
+          {
+            prop: 'paramName',
+            label: '参数名称',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            align: 'center',
+            slot: 'description',
+            prop: 'description',
+            label: '文本描述',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'unitName',
+            slot: 'unitName',
+            label: '参数单位',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'maxValue',
+            slot: 'maxValue',
+            label: '参数上限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'minValue',
+            slot: 'minValue',
+            label: '参数下限',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'defaultValue',
+            slot: 'defaultValue',
+            label: '默认值',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'notNull',
+            slot: 'notNull',
+            label: '是否必填',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+
+          {
+            columnKey: 'action',
+            label: '操作',
+
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        loading: false,
+        addDialog: false,
+        removeList: [],
+        tableData: []
+      };
+    },
+
+    methods: {
+      addParamrter() {
+        let arr = this.$refs.Paramrter.selection;
+        arr.forEach((element) => {
+          this.$set(element, 'paramId', element.id);
+          this.$set(element, 'paramName', element.name);
+          delete element.id;
+          delete element.name;
+        });
+
+        this.$refs.table.setData([...arr, ...this.$refs.table.getData()]);
+        this.closeAdd();
+      },
+      showAddLog() {
+        this.tableData = this.$refs.table.getData();
+        this.addDialog = true;
+      },
+      /*关闭选择参数*/
+      closeAdd() {
+        this.$refs.Paramrter.$refs.tableParameter.setSelectedRows([]);
+        this.addDialog = false;
+      },
+      /* 刷新表格 */
+      reload() {
+        this.$refs.table.reload();
+      },
+      remove(row) {
+        const data = this.$refs.table.getData() ?? [];
+
+        if (row.id) {
+          this.removeList.push(row.id);
+          this.$refs.table.setData(data.filter((d) => d.id !== row.id));
+        } else {
+          this.$refs.table.setData(
+            data.filter((d) => d.paramId !== row.paramId)
+          );
+        }
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where }) {
+        if (this.data?.id) {
+          console.log(22222);
+          const res = await producetask.paramList({
+            taskId: this.data.id,
+            pageNum: 1,
+            size: -1
+          });
+          return res;
+        }
+      },
+      /* 保存编辑 */
+      save() {
+        let arr = this.$refs.table.getData();
+        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.$emit('update:visible', value);
+      }
+    },
+
+    watch: {
+      visible(visible) {
+        if (visible) {
+          this.$nextTick(() => {
+            this.reload();
+          });
+        }
+      }
+    }
+  };
+</script>

+ 247 - 0
src/views/technology/route/components/production/index.vue

@@ -0,0 +1,247 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <user-search @search="reload" />
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        :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>
+    <!-- 编辑弹窗 -->
+    <user-edit
+      :visible.sync="showEdit"
+      :data="current"
+      @done="reload"
+      ref="userEdit"
+    />
+    <!-- 配置工艺参数 -->
+    <user-setting
+      :visible.sync="showSetting"
+      :data="current"
+      ref="userSetting"
+    />
+  </div>
+</template>
+
+<script>
+  import UserSearch from './components/user-search.vue';
+  import UserEdit from './components/user-edit.vue';
+  import UserSetting from './components/user-setting.vue';
+
+  import producetask from '@/api/technology/production';
+
+  export default {
+    name: 'technologyProduction',
+    components: {
+      UserSearch,
+      UserEdit,
+      UserSetting
+    },
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            fixed: 'left'
+          },
+
+          {
+            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
+          }
+        ],
+        // 表格选中数据
+        selection: [],
+        // 当前编辑数据
+        current: null,
+        // 是否显示编辑弹窗
+        showEdit: false,
+        // 是否显示参数弹窗
+        showSetting: false
+      };
+    },
+    methods: {
+      /*配置工艺参数 */
+      openSetting(row) {
+        this.current = row;
+        this.showSetting = true;
+      },
+      /* 表格数据源 */
+      async datasource({ page, limit, where, order }) {
+        const res = await producetask.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();
+      },
+
+      /* 删除 */
+      remove(row) {
+        const loading = this.$loading({ lock: true });
+
+        producetask
+          .delete([row.id])
+          .then((msg) => {
+            loading.close();
+            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>

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

@@ -6,25 +6,25 @@
     :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-form ref="form" :model="form" :rules="rules" label-width="140px">
       <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-form-item label="工艺路线组名称:" prop="name">
             <el-input
               v-model="form.name"
               clearable
@@ -33,142 +33,29 @@
           </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>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="工作中心:" prop="workCenterId">
-            <el-input
-              placeholder="请输入工作中心"
-              v-model="form.workCenterId"
-            />
-          </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="controlId">
+            <el-select v-model="form.factoryId" placeholder="">
               <el-option
-                v-for="item in timeType"
-                :key="item.code"
-                :label="item.label"
-                :value="item.code"
+                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-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-form-item label="工作中心:" prop="workCenterId">
             <el-input
-              placeholder="请输入其他时长"
-              v-model="form.workBeat.otherTimes"
+              placeholder="请输入工作中心"
+              v-model="form.workCenterId"
             />
           </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>
+          <el-form-item label="工序时间单位:" prop="timeUnit"> </el-form-item>
         </el-col>
       </el-row>
     </el-form>
@@ -184,7 +71,7 @@
 
 <script>
   // import { emailReg, phoneReg } from 'ele-admin';
-  import producetask from '@/api/technology/production';
+  import route from '@/api/technology/route';
 
   import { addUsers, putUsers } from '@/api/system/user';
 
@@ -199,38 +86,18 @@
       const defaultForm = {
         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: ''
       };
       return {
         defaultForm,
+        fList: [], //仓库列表
         // 表单数据
         form: { ...defaultForm },
-        timeType: [
-          { code: 1, label: '分' },
-          { code: 2, label: '时' }
-        ],
-        tacticsType: [
-          { code: 1, label: '标准时间' },
-          { code: 2, label: '最短时间' }
+
+        statusList: [
+          { label: '草稿', value: -1 },
+          { label: '失效', value: 0 },
+          { label: '生效', value: 1 }
         ],
 
         // 表单验证规则
@@ -271,6 +138,7 @@
       }
     },
     methods: {
+      fClick() {},
       /* 保存编辑 */
       save() {
         this.$refs.form.validate((valid) => {
@@ -281,7 +149,7 @@
           this.form.workBeat.beatTimes = this.totalTime;
 
           this.loading = true;
-          producetask
+          route
             .save(this.form)
             .then((msg) => {
               this.form = {};
@@ -305,17 +173,21 @@
     watch: {
       async visible(visible) {
         if (visible) {
+          const res = await route.Flist({
+            pageNum: 1,
+            size: -1,
+            type: 1
+          });
+          this.fList = res.list;
           if (this.data) {
-            console.log(111111);
-
-            const res = await producetask.getById(this.data.id);
+            const res = await route.getById(this.data.id);
 
             this.$util.assignObject(this.form, {
               ...res
             });
             this.isUpdate = true;
           } else {
-            const res = await producetask.getCode();
+            const res = await route.getCode();
             this.form.code = res;
             this.isUpdate = false;
           }

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

@@ -19,7 +19,12 @@
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
         <el-form-item label="生产版本:">
-          <el-input clearable v-model="where.version" placeholder="请输入" />
+          <el-input
+            clearable
+            disabled
+            v-model="where.version"
+            placeholder="请输入"
+          />
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 4 }">
@@ -60,7 +65,7 @@
       const defaultWhere = {
         code: '',
         name: '',
-        version: '',
+        version: '1.0',
         status: ''
         // nickname: '',
         // sex: undefined
@@ -69,9 +74,9 @@
         // 表单数据
         where: { ...defaultWhere },
         statusList: [
-          { label: '草稿', value: 0 },
-          { label: '已发布', value: 1 },
-          { label: '已停用', value: 2 }
+          { label: '草稿', value: -1 },
+          { label: '失效', value: 0 },
+          { label: '生效', value: 1 }
         ]
       };
     },

+ 3 - 23
src/views/technology/route/index.vue

@@ -22,28 +22,8 @@
           >
             新建
           </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>
         <!-- 状态列 -->
 
         <!-- 操作列 -->
@@ -86,10 +66,10 @@
   import UserSearch from './components/user-search.vue';
   import UserEdit from './components/user-edit.vue';
 
-  import producetask from '@/api/technology/production';
+  import route from '@/api/technology/route';
 
   export default {
-    name: 'technologyProduction',
+    name: 'technologyRoute',
     components: {
       UserSearch,
       UserEdit
@@ -160,7 +140,7 @@
     methods: {
       /* 表格数据源 */
       async datasource({ page, limit, where, order }) {
-        const res = await producetask.list({
+        const res = await route.list({
           ...where,
           ...order,
           pageNum: page,

+ 4 - 4
vue.config.js

@@ -3,7 +3,7 @@ const { transformElementScss } = require('ele-admin/lib/utils/dynamic-theme');
 const path = require('path');
 const { name } = require('./package.json');
 
-function resolve (dir) {
+function resolve(dir) {
   return path.join(__dirname, dir);
 }
 
@@ -31,11 +31,11 @@ module.exports = {
     proxy: {
       // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
       '/api': {
-        target: 'http://192.168.3.51:18086', // 测试
+        // target: 'http://192.168.3.51:18086', // 测试
         // target: 'http://192.168.3.35:8080', // kang杨威
         target: 'http://192.168.3.25:8080', // 黄峥嵘
         // target: 'http://192.168.3.41:8080', // 何江鹏
-        // target: 'http://192.168.3.33:8080', // 谢一平
+        target: 'http://192.168.3.33:8080', // 谢一平
         // target: 'http://192.168.3.64:8080', // 粟勋
         // target: 'http://192.168.3.34:8080', // 刘毅勋
         changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域
@@ -48,7 +48,7 @@ module.exports = {
       'Access-Control-Allow-Origin': '*'
     }
   },
-  chainWebpack (config) {
+  chainWebpack(config) {
     config.plugins.delete('prefetch');
     // set svg-sprite-loader
     // config.module.rule('svg').exclude.add(resolve('./src/icons')).end();