Explorar o código

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

695593266@qq.com hai 6 meses
pai
achega
7547585125

+ 10 - 0
src/api/system/file/index.js

@@ -239,3 +239,13 @@ export async function batchImportPBom(data) {
   }
   }
   return Promise.reject(new Error(res.data.message));
   return Promise.reject(new Error(res.data.message));
 }
 }
+/**
+ * 导出
+ */
+export async function exportTable(data) {
+  const res = await request.post(data.api, data.data, {
+    responseType: 'blob'
+  });
+  console.log(res.data, '***********');
+  download(res.data, data.fileName + '.xlsx');
+}

+ 45 - 0
src/components/upload/exportButton.vue

@@ -0,0 +1,45 @@
+<template>
+  <el-button
+    type="primary"
+    size="small"
+    icon="el-icon-download"
+    @click="exportFn"
+    >{{btnName}}</el-button
+  >
+</template>
+
+<script>
+  import { exportTable } from '@/api/system/file/index.js';
+  export default {
+    props: {
+      btnName: {
+        type: String,
+        default: '导出'
+      },
+      apiUrl: '',
+      fileName: '',
+      params: {
+        default: () => {
+          return {};
+        }
+      }
+    },
+    //注册组件
+    data() {
+      return {};
+    },
+
+    created() {},
+    methods: {
+      exportFn() {
+        exportTable({
+          api: this.apiUrl,
+          fileName: this.fileName,
+          data:this.params
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss"></style>

+ 11 - 0
src/utils/util.js

@@ -47,3 +47,14 @@ export function copyObj(obj) {
   } else newobj = obj;
   } else newobj = obj;
   return newobj;
   return newobj;
 }
 }
+//随机id
+export function generateRandomString(num = 5) {
+  let result = '';
+  const characters =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; // 包含字母和数字
+  const charactersLength = characters.length;
+  for (let i = 0; i < num; i++) {
+    result += characters.charAt(Math.floor(Math.random() * charactersLength));
+  }
+  return result;
+}

+ 6 - 6
src/views/rulesManagement/components/detail.vue

@@ -31,7 +31,11 @@
           </el-col>
           </el-col>
           <el-col :span="6">
           <el-col :span="6">
             <span>负责人:</span>
             <span>负责人:</span>
-            <span>{{ detailsForm.planConfigVOList[0].approvalUserName }}</span>
+            <span>{{
+              detailsForm.planConfigVOList[0].execute
+                .map((item) => item.userName)
+                .join(',')
+            }}</span>
           </el-col>
           </el-col>
           <el-col :span="6">
           <el-col :span="6">
             <span>计划完成时长:</span>
             <span>计划完成时长:</span>
@@ -43,11 +47,7 @@
           </el-col>
           </el-col>
           <el-col :span="6">
           <el-col :span="6">
             <span>审核人:</span>
             <span>审核人:</span>
-            <span>{{
-              detailsForm.planConfigVOList[0].execute
-                .map((item) => item.userName)
-                .join(',')
-            }}</span>
+            <span>{{ detailsForm.planConfigVOList[0].approvalUserName }}</span>
           </el-col>
           </el-col>
           <el-col :span="24">
           <el-col :span="24">
             <span>备注:</span>
             <span>备注:</span>

+ 222 - 0
src/views/rulesManagement/releaseRules/components/experimentationProcess.vue

@@ -0,0 +1,222 @@
+<template>
+  <div class="ele-body">
+    <el-button type="primary" @click="addHtml('customText')" v-if="edit"
+      >插入自定义文本</el-button
+    >
+    <el-button type="primary" @click="addHtml('customTable')" v-if="edit"
+      >插入表格</el-button
+    >
+    <!-- <el-button type="primary" @click="save()">保存</el-button> -->
+    <div
+      style="
+        display: flex;
+        width: 100%;
+        padding: 10px;
+        border: solid 1px #f1f1f1;
+        margin-top: 10px;
+      "
+    >
+      <vue-draggable
+        v-model="list"
+        group="project1"
+        :animation="300"
+        handle=".sort-handle"
+        style="flex: 1"
+      >
+        <div
+          class="demo-drag-list-item ele-cell"
+          v-for="item in list"
+          :key="item.id"
+        >
+          <div class="listItem">
+            <i
+              class="sort-handle el-icon-_nav move"
+              style="display: none"
+              v-if="edit"
+            ></i>
+            <i
+              class="sort-handle el-icon-delete delete"
+              v-if="edit"
+              style="display: none"
+              @click="del(item.id)"
+            ></i>
+            <customText
+              :ref="'customTextRef' + item.id"
+              style="flex: 1"
+              v-if="item.type == 'customText'"
+              :id="item.id"
+              :form="item.value"
+              :valueObj="item.valueObj"
+              @editShow="editShowFn"
+              :edit="edit"
+            ></customText>
+            <customTable
+              :ref="'customTextRef' + item.id"
+              style="flex: 1"
+              v-if="item.type == 'customTable'"
+              :id="item.id"
+              :form="item.value"
+              :valueObj="item.valueObj"
+              @editShow="editShowFn"
+              :edit="edit"
+            ></customTable>
+          </div>
+        </div>
+      </vue-draggable>
+
+      <el-card class="box-card" v-show="editShow" style="width: 320px">
+        <div slot="header" class="clearfix">
+          <span>配置</span>
+        </div>
+        <el-form label-width="100px">
+          <el-form-item label="字段标识:" prop="id">
+            <el-input
+              v-model="domObj.id"
+              placeholder=""
+              @change="editInputChange"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="宽度:" prop="width" v-if="!domObj.isNoWidth">
+            <el-input
+              v-model="domObj.width"
+              type="number"
+              placeholder=""
+              @change="editInputChange"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="是否只读:" prop="readonly">
+            <el-select
+              v-model="domObj.readonly"
+              placeholder="请选择"
+              @change="editInputChange"
+            >
+              <el-option :key="1" label="否" :value="1"> </el-option>
+              <el-option :key="2" label="是" :value="2"> </el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+  import customText from './templateDiv/customText.vue';
+  import customTable from './templateDiv/customTable.vue';
+  import VueDraggable from 'vuedraggable';
+  import { generateRandomString } from '@/utils/util';
+
+  export default {
+    components: {
+      customText,
+      VueDraggable,
+      customTable
+    },
+    props: {
+      edit: {
+        default:true,
+        type:Boolean
+      }
+    },
+    computed: {},
+    data() {
+      return {
+        list: [],
+        editShow: false,
+        templateDivRef: '',
+        domObj: {}
+      };
+    },
+    mounted() {},
+    created() {
+      // if (sessionStorage['valueJSON']) {
+      //   this.list = JSON.parse(sessionStorage['valueJSON']);
+      // }
+      //  if (localStorage['valueJSON']) {
+      //   this.list = JSON.parse(localStorage['valueJSON']);
+      // }
+    },
+    methods: {
+      init(list) {
+        this.list = JSON.parse(list);
+        console.log(this.list, ' this.list');
+        if (this.list.length) {
+          this.$nextTick(() => {
+            this.list.forEach((item) => {
+              this.$refs['customTextRef' + item.id][0].init({
+                form: item.value,
+                valueObj: item.valueObj
+              });
+            });
+          });
+        }
+      },
+      editShowFn({ templateDivRef, domObj }) {
+        this.templateDivRef = templateDivRef;
+        this.$set(this, 'domObj', domObj);
+        this.editShow = true;
+      },
+      editInputChange() {
+        this.$nextTick(() => {
+          this.$refs[this.templateDivRef][0].editInputChange(this.domObj);
+        });
+      },
+      del(id) {
+        this.list = this.list.filter((item) => item.id != id);
+      },
+      addHtml(type) {
+        this.list.push({
+          id: generateRandomString(6),
+          type: type,
+          value: '',
+          valueObj: {}
+        });
+      },
+      getValue() {
+        // this.$nextTick(() => {
+        //   // sessionStorage['valueJSON'] = JSON.stringify(this.list);
+        //   // localStorage['valueJSON'] = JSON.stringify(this.list);
+        // });
+        this.list.forEach((item, index) => {
+          let { form, valueObj } =
+            this.$refs['customTextRef' + item.id][0].getValue();
+          this.$set(this.list[index], 'value', form);
+          this.$set(this.list[index], 'valueObj', valueObj);
+        });
+        return this.list;
+      }
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .listItem {
+    padding: 5px;
+    padding-top: 15px;
+    border: solid 1px #f1f1f1;
+    display: flex;
+    width: 100%;
+    align-items: center;
+    margin-top: 3px;
+    position: relative;
+  }
+  .sort-handle {
+    font-size: 16px;
+    position: absolute;
+    left: 0;
+    top: 0;
+  }
+  .move {
+    cursor: move;
+  }
+  .delete {
+    cursor: pointer;
+    left: 20px;
+    color: #f56c6c;
+  }
+  .listItem:hover {
+    .sort-handle {
+      display: block !important;
+    }
+  }
+</style>

+ 124 - 39
src/views/rulesManagement/releaseRules/components/permitAdd.vue

@@ -132,7 +132,27 @@
         </el-col>
         </el-col>
 
 
         <el-col :span="8">
         <el-col :span="8">
-          <el-form-item label="启用日期" required prop="startDate">
+          <el-form-item
+            label="启用日期"
+            prop="startDate"
+            :rules="
+              !qmsReportWorkType.includes(formData.reportWorkType)
+                ? [
+                    {
+                      required: true,
+                      message: '请选择启用日期',
+                      trigger: 'blur'
+                    },
+                    {
+                      required: true,
+                      message: '请选择启用日期',
+                      trigger: 'change'
+                    },
+                    { validator: validateStartDate, trigger: 'change' }
+                  ]
+                : []
+            "
+          >
             <el-date-picker
             <el-date-picker
               v-model="formData.startDate"
               v-model="formData.startDate"
               type="date"
               type="date"
@@ -148,7 +168,22 @@
         </el-col>
         </el-col>
 
 
         <el-col :span="8">
         <el-col :span="8">
-          <el-form-item label="停用日期" required prop="stopDate">
+          <el-form-item
+            label="停用日期"
+            prop="stopDate"
+            :rules="
+              !qmsReportWorkType.includes(formData.reportWorkType)
+                ? [
+                    {
+                      required: true,
+                      message: '请选择停用时间',
+                      trigger: 'change'
+                    },
+                    { validator: validateStopDate, trigger: 'change' }
+                  ]
+                : []
+            "
+          >
             <el-date-picker
             <el-date-picker
               v-model="formData.stopDate"
               v-model="formData.stopDate"
               type="date"
               type="date"
@@ -225,7 +260,7 @@
           </el-form-item>
           </el-form-item>
         </el-col>
         </el-col>
       </el-row>
       </el-row>
-      <el-row>
+      <el-row v-if="!qmsReportWorkType.includes(formData.reportWorkType)">
         <el-col :span="24">
         <el-col :span="24">
           <el-form-item label="周期" prop="frequencyValue" required>
           <el-form-item label="周期" prop="frequencyValue" required>
             <rule-cycle
             <rule-cycle
@@ -238,10 +273,17 @@
         </el-col>
         </el-col>
       </el-row>
       </el-row>
 
 
-      <header-title title="规则明细"> </header-title>
+      <header-title
+        title="规则明细"
+        v-if="!qmsReportWorkType.includes(formData.reportWorkType)"
+      >
+      </header-title>
 
 
       <el-tabs
       <el-tabs
-        v-if="formData.recordTemplateStyle == '4'"
+        v-if="
+          formData.recordTemplateStyle == '4' &&
+          !qmsReportWorkType.includes(formData.reportWorkType)
+        "
         v-model="statisticsType"
         v-model="statisticsType"
         type="card"
         type="card"
       >
       >
@@ -255,6 +297,7 @@
       </el-tabs>
       </el-tabs>
 
 
       <ele-pro-table
       <ele-pro-table
+        v-if="!qmsReportWorkType.includes(formData.reportWorkType)"
         ref="table"
         ref="table"
         :columns="bankColumns"
         :columns="bankColumns"
         :datasource="detialsDatasource"
         :datasource="detialsDatasource"
@@ -537,6 +580,25 @@
           </el-link>
           </el-link>
         </template>
         </template>
       </ele-pro-table>
       </ele-pro-table>
+
+      <header-title
+        :title="
+          formData.reportWorkType == 5
+            ? '实验过程'
+            : formData.reportWorkType == 6
+            ? '工艺要求'
+            : formData.reportWorkType == 7
+            ? '实验记录'
+            : ''
+        "
+        v-if="qmsReportWorkType.includes(formData.reportWorkType)"
+      >
+      </header-title>
+      <experimentationProcess
+        :edit="type!='detail'"
+        v-if="qmsReportWorkType.includes(formData.reportWorkType)"
+        ref="experimentationProcess"
+      ></experimentationProcess>
     </el-form>
     </el-form>
     <template v-slot:footer>
     <template v-slot:footer>
       <el-button
       <el-button
@@ -616,6 +678,7 @@
   import ProductModal from '@/components/selectProduct/ProductModal.vue';
   import ProductModal from '@/components/selectProduct/ProductModal.vue';
   import { getTreeByPid } from '@/api/classifyManage';
   import { getTreeByPid } from '@/api/classifyManage';
   import processModal from './processModal.vue';
   import processModal from './processModal.vue';
+  import experimentationProcess from './experimentationProcess.vue';
   import ProductModalCorrelation from './ProductModal.vue';
   import ProductModalCorrelation from './ProductModal.vue';
   import { recordrulesexecutemethodPage } from '@/api/recordrulesexecutemethod/index';
   import { recordrulesexecutemethodPage } from '@/api/recordrulesexecutemethod/index';
   import { businessTypeList } from '@/views/regulationManagement/components/util';
   import { businessTypeList } from '@/views/regulationManagement/components/util';
@@ -630,7 +693,8 @@
       MaterialAdd,
       MaterialAdd,
       toolModal,
       toolModal,
       processModal,
       processModal,
-      ProductModalCorrelation
+      ProductModalCorrelation,
+      experimentationProcess
     },
     },
     props: {
     props: {
       typeInfo: {
       typeInfo: {
@@ -971,6 +1035,7 @@
       };
       };
 
 
       return {
       return {
+        qmsReportWorkType: ['5', '6', '7'],
         dialogTitle: '',
         dialogTitle: '',
         visible: false,
         visible: false,
         formDateBase,
         formDateBase,
@@ -991,15 +1056,15 @@
           ],
           ],
           // startDate 启用日期要大于当前时间
           // startDate 启用日期要大于当前时间
           // stopDate 停用时间要大于当前时间并且大于启用日期
           // stopDate 停用时间要大于当前时间并且大于启用日期
-          startDate: [
-            { required: true, message: '请选择启用日期', trigger: 'blur' },
-            { required: true, message: '请选择启用日期', trigger: 'change' },
-            { validator: this.validateStartDate, trigger: 'change' }
-          ],
-          stopDate: [
-            { required: true, message: '请选择停用时间', trigger: 'change' },
-            { validator: this.validateStopDate, trigger: 'change' }
-          ],
+          // startDate: [
+          //   { required: true, message: '请选择启用日期', trigger: 'blur' },
+          //   { required: true, message: '请选择启用日期', trigger: 'change' },
+          //   { validator: this.validateStartDate, trigger: 'change' }
+          // ],
+          // stopDate: [
+          //   { required: true, message: '请选择停用时间', trigger: 'change' },
+          //   { validator: this.validateStopDate, trigger: 'change' }
+          // ],
           deviceName: [
           deviceName: [
             { required: true, message: '请输入选择设备', trigger: 'blur' }
             { required: true, message: '请输入选择设备', trigger: 'blur' }
           ],
           ],
@@ -1199,6 +1264,9 @@
             this.$refs.cycleMultipleRef?.setRecordRulesCycleList(
             this.$refs.cycleMultipleRef?.setRecordRulesCycleList(
               this.formData.recordRulesCycleList
               this.formData.recordRulesCycleList
             );
             );
+            if (this.qmsReportWorkType.includes(this.formData.reportWorkType)) {
+              this.$refs.experimentationProcess.init(data.tempJson.tempJson);
+            }
           });
           });
 
 
           this.formData.startDate = new Date(data.startDate);
           this.formData.startDate = new Date(data.startDate);
@@ -1230,7 +1298,6 @@
             if (this.formData.startDate < now) {
             if (this.formData.startDate < now) {
               this.formData.startDate = now;
               this.formData.startDate = now;
             }
             }
-
           } else {
           } else {
             this.getExecuteMethodList();
             this.getExecuteMethodList();
           }
           }
@@ -1259,6 +1326,7 @@
 
 
           this.loading = false;
           this.loading = false;
         } catch (error) {
         } catch (error) {
+          console.log(error, 'error');
           this.loading = false;
           this.loading = false;
         }
         }
       },
       },
@@ -1297,7 +1365,10 @@
           if (!valid) {
           if (!valid) {
             return false;
             return false;
           }
           }
-          if (this.formData.details.length == 0) {
+          if (
+            this.formData.details.length == 0 &&
+            !this.qmsReportWorkType.includes(this.formData.reportWorkType)
+          ) {
             return this.$message.warning('至少条件一条规则项');
             return this.$message.warning('至少条件一条规则项');
           }
           }
 
 
@@ -1328,6 +1399,7 @@
             this.$emit('reload');
             this.$emit('reload');
             this.$emit('reloadTypeList');
             this.$emit('reloadTypeList');
           } catch (error) {
           } catch (error) {
+            console.log(error, 'dasda');
             this.btnLoading = false;
             this.btnLoading = false;
           }
           }
         });
         });
@@ -1339,22 +1411,24 @@
           if (!valid) {
           if (!valid) {
             return false;
             return false;
           }
           }
-          if (this.formData.details.length == 0) {
-            return this.$message.warning('至少条件一条规则项');
-          }
+          if (!this.qmsReportWorkType.includes(this.formData.reportWorkType)) {
+            if (this.formData.details.length == 0) {
+              return this.$message.warning('至少条件一条规则项');
+            }
 
 
-          if (this.formData.reportWorkType == 4) {
-            // 生产统计过滤掉非成品统计的明细
-            this.formData.details = this.formData.details.filter(
-              (i) => i.statisticsType
-            );
-          }
+            if (this.formData.reportWorkType == 4) {
+              // 生产统计过滤掉非成品统计的明细
+              this.formData.details = this.formData.details.filter(
+                (i) => i.statisticsType
+              );
+            }
 
 
-          // 判断参数类型是否选择
-          for (const detail of this.formData.details) {
-            if (!detail.paramType) {
-              console.log('detail', detail);
-              return this.$message.warning('请选择规则明细中的参数类型!');
+            // 判断参数类型是否选择
+            for (const detail of this.formData.details) {
+              if (!detail.paramType) {
+                console.log('detail', detail);
+                return this.$message.warning('请选择规则明细中的参数类型!');
+              }
             }
             }
           }
           }
 
 
@@ -1375,6 +1449,7 @@
             this.handleClose();
             this.handleClose();
             this.$emit('reload');
             this.$emit('reload');
           } catch (error) {
           } catch (error) {
+            console.log(error, 'error');
             this.btnLoading = false;
             this.btnLoading = false;
           }
           }
         });
         });
@@ -1513,6 +1588,7 @@
       // 数据格式化
       // 数据格式化
       formatBody() {
       formatBody() {
         this.formData.recordRulesCycleList =
         this.formData.recordRulesCycleList =
+          this.$refs.cycleMultipleRef &&
           this.$refs.cycleMultipleRef.recordRulesCycleList
           this.$refs.cycleMultipleRef.recordRulesCycleList
             .map((i) => {
             .map((i) => {
               // 根据月日时分排序计算权重排序
               // 根据月日时分排序计算权重排序
@@ -1549,7 +1625,14 @@
           body.stopDate,
           body.stopDate,
           'yyyy-MM-dd HH:mm:ss'
           'yyyy-MM-dd HH:mm:ss'
         );
         );
-
+        if (this.qmsReportWorkType.includes(body.reportWorkType)) {
+          let tempJson = this.$refs.experimentationProcess.getValue();
+          if (tempJson) {
+            body.tempJson = {
+              tempJson: JSON.stringify(tempJson)
+            };
+          }
+        }
         // details 根据下标添加 sortNum
         // details 根据下标添加 sortNum
         body.details = body.details.map((item, index) => {
         body.details = body.details.map((item, index) => {
           return { ...item };
           return { ...item };
@@ -1766,14 +1849,16 @@
       // 过程控制修改 保存
       // 过程控制修改 保存
       processEditSave() {
       processEditSave() {
         // 只验证详情内容
         // 只验证详情内容
-        if (this.formData.details.length == 0) {
-          return this.$message.warning('至少条件一条规则项');
-        }
+        if (!this.qmsReportWorkType.includes(this.formData.reportWorkType)) {
+          if (this.formData.details.length == 0) {
+            return this.$message.warning('至少条件一条规则项');
+          }
 
 
-        // 判断参数类型是否选择
-        for (const detail of this.formData.details) {
-          if (!detail.paramType) {
-            return this.$message.warning('请选择规则明细中的参数类型!');
+          // 判断参数类型是否选择
+          for (const detail of this.formData.details) {
+            if (!detail.paramType) {
+              return this.$message.warning('请选择规则明细中的参数类型!');
+            }
           }
           }
         }
         }
 
 

+ 223 - 0
src/views/rulesManagement/releaseRules/components/templateDiv/customTable.vue

@@ -0,0 +1,223 @@
+<!-- 搜索表单 -->
+<template>
+  <div style="margin-top: 10px">
+    <el-button type="primary" @click="addColumn" v-if="edit">新增列</el-button>
+    <el-button type="primary" @click="addRow" v-if="edit">新增行</el-button>
+
+    <table style="margin-top: 10px" :id="id">
+      <thead>
+        <tr>
+          <th v-for="(item, index) in columns" class="tableTh">
+            <i
+              class="el-icon-delete delete"
+              style="display: none"
+              @click="removeColumn(index)"
+              v-if="edit"
+            ></i>
+            <input
+              v-model="item.value"
+              type="text"
+              class="templateInput"
+              :id="item.id"
+              :readonly="item.readonly == 2||!edit"
+              @click="inputClick(item)"
+            />
+          </th>
+          <th v-if="edit"></th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr v-for="(row, rowIndex) in rows">
+          <td v-for="item in row.cells"
+            ><input
+              v-model="item.value"
+              type="text"
+              class="templateInput"
+              :id="item.id"
+               :readonly="item.readonly == 2||!edit"
+              @click="inputClick(item)"
+          /></td>
+          <td v-if="edit">
+            <i
+              class="sort-handle el-icon-delete delete"
+              style="color: #f56c6c"
+              @click="removeRow(rowIndex)"
+            ></i
+          ></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</template>
+
+<script>
+  import dictMixins from '@/mixins/dictMixins';
+  import { generateRandomString } from '@/utils/util';
+
+  export default {
+    props: {},
+    mixins: [dictMixins],
+    props: {
+      id: '',
+      edit: {
+        default: true,
+        type: Boolean
+      },
+    
+    },
+    data() {
+      return {
+        form: null,
+        valueObj: {},
+        domId: '',
+        rightClickShow: false,
+        columns: [],
+        rows: []
+      };
+    },
+    methods: {
+      // 方法:添加新列
+      addColumn() {
+        this.columns.push({
+          value: `列${this.columns.length + 1}`,
+          id: generateRandomString(5),
+          readonly: 1
+        });
+        this.rows.forEach((row) => {
+          row.cells.push({
+            value: '',
+            readonly: 1,
+            id: generateRandomString(5)
+          });
+        });
+      },
+
+      // 方法:删除指定列
+      removeColumn(index) {
+        this.columns.splice(index, 1);
+        this.rows.forEach((row) => {
+          row.cells.splice(index, 1);
+        });
+      },
+
+      // 方法:添加新行
+      addRow() {
+        const newRow = {
+          cells: Array(this.columns.length)
+            .fill(null)
+            .map(() => ({
+              readonly: 1,
+              value: '',
+              id: generateRandomString(5)
+            }))
+        };
+        this.rows.push(newRow);
+      },
+      // 方法:删除指定行
+      removeRow(index) {
+        this.rows.splice(index, 1);
+      },
+
+      objInit() {
+        if (Object.keys(this.valueObj).length) {
+          for (let key in this.valueObj) {
+            this.$nextTick(() => {
+              let dom = document.getElementById(key);
+              dom.value = this.valueObj[key];
+            });
+          }
+        }
+      },
+
+      getValue() {
+        return {
+          form: null,
+          valueObj: {
+            columns: this.columns,
+            rows: this.rows
+          }
+        };
+      },
+      init({ form, valueObj }) {
+        this.form = form;
+        this.columns = valueObj.columns;
+        this.rows = valueObj.rows;
+      },
+      editInputChange(domObj) {
+        let columnsIndex = this.columns.findIndex(
+          (item) => item.id == this.domId
+        );
+        if (columnsIndex >= 0) {
+          this.$set(this.columns, columnsIndex, domObj);
+          return;
+        }
+        this.rows.forEach((item, index) => {
+          let rowsIndex = item.cells.findIndex(
+            (cells) => cells.id == this.domId
+          );
+          // console.log(rowsIndex,'rowsIndex')
+          if (rowsIndex >= 0) {
+            this.$set(this.rows[index].cells, rowsIndex, domObj);
+          }
+        });
+      },
+
+      inputClick(item) {
+        if(!this.edit){
+          return
+        }
+        this.domId = item.id;
+        this.$emit('editShow', {
+          templateDivRef: 'customTextRef' + this.id,
+          domObj: {
+            isNoWidth: true,
+            id: item.id,
+            readonly: item.readonly,
+            value: item.value
+          }
+        });
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  :deep(.templateInput) {
+    width: 100%;
+    border: solid 1px #bfbfbf;
+    padding: 1px;
+    margin: 1px;
+    margin-left: 3px;
+    text-align: center;
+    background-color: #fff;
+  }
+  table {
+    width: 100%;
+    border-collapse: collapse;
+  }
+  th,
+  td {
+    border: 1px solid #ddd;
+    padding: 0;
+    text-align: center;
+  }
+  th {
+    background-color: #f2f2f2;
+  }
+  tr:nth-child(even) {
+    background-color: #f9f9f9;
+  }
+  input:focus {
+    border-color: #66afe9; /* 改变边框颜色 */
+    outline: none; /* 移除默认的轮廓线 */
+  }
+  .tableTh:hover {
+    position: relative;
+    .delete {
+      display: block !important;
+      position: absolute;
+      right: 0;
+      top: 0;
+      color: #f56c6c;
+    }
+  }
+</style>

+ 202 - 0
src/views/rulesManagement/releaseRules/components/templateDiv/customText.vue

@@ -0,0 +1,202 @@
+<!-- 搜索表单 -->
+<template>
+  <div>
+    <el-popover
+      style="position: fixed; z-index: 2000"
+      width="130"
+      ref="popoverRef"
+      v-model="rightClickShow"
+      @click.native="rightClickShow = false"
+    >
+      <div>
+        <el-button type="primary" @click="addHtml">插入输入框</el-button>
+      </div>
+    </el-popover>
+    <div
+      v-html="form"
+      :contenteditable="edit"
+      class="contenteditable"
+      :ref="'valueChange'"
+      :id="id"
+      @contextmenu.prevent="onRightClick($event)"
+    >
+    </div>
+  </div>
+</template>
+
+<script>
+  import dictMixins from '@/mixins/dictMixins';
+  import { generateRandomString } from '@/utils/util';
+
+  export default {
+    props: {},
+    mixins: [dictMixins],
+    props: {
+      id: '',
+      edit: {
+        default: true,
+        type: Boolean
+      }
+    },
+    data() {
+      return {
+        form: null,
+        valueObj: {},
+        domId: '',
+        rightClickShow: false
+      };
+    },
+    methods: {
+      addHtml() {
+        this.insertInput();
+
+        this.objInit();
+      },
+      objInit() {
+        if (Object.keys(this.valueObj).length) {
+          for (let key in this.valueObj) {
+            this.$nextTick(() => {
+              let dom = document.getElementById(key);
+              dom.value = this.valueObj[key];
+            });
+          }
+        }
+      },
+      insertInput() {
+        const selection = window.getSelection();
+        if (selection.rangeCount > 0) {
+          const range = selection.getRangeAt(0);
+          console.log(range, 'range');
+          this.getParentID(range.commonAncestorContainer);
+          if (this.getParentID(range.commonAncestorContainer)) {
+            range.setStart(selection.anchorNode, selection.anchorOffset);
+            range.setEnd(selection.focusNode, selection.focusOffset);
+            range.deleteContents(); // 删除选中的内容(如果需要)
+            range.insertNode(this.getInput()); // 插入input元素
+            // 可以设置光标位置在input之后
+            range.selectNodeContents(this.getInput());
+            range.collapse(false); // 光标放在input之后
+            selection.removeAllRanges();
+            selection.addRange(range);
+          }
+
+          // return
+        }
+      },
+      getParentID(data) {
+        if (data.id == this.id) {
+          return true;
+        }
+        if (data.parentElement) {
+          return this.getParentID(data.parentElement);
+        }
+      },
+
+      getInput() {
+        let id = generateRandomString();
+        const inputElement = document.createElement('input');
+        inputElement.setAttribute('type', 'text');
+        inputElement.setAttribute('class', 'templateInput');
+        inputElement.setAttribute('id', id);
+        return inputElement;
+      },
+      getValue() {
+        // this.form = this.$refs['valueChange'].innerHTML;
+        return {
+          form: this.$refs['valueChange'].innerHTML,
+          valueObj: this.valueObj
+        };
+      },
+      init({ form, valueObj }) {
+        this.form = form;
+        this.valueObj = valueObj;
+        this.$nextTick(() => {
+          if (!this.edit) {
+            let inputs = document.querySelectorAll('.templateInput');
+            inputs.forEach((item) => {
+              item.setAttribute('readonly', 'readonly');
+            });
+          }
+        });
+        this.objInit();
+      },
+      editInputChange(domObj) {
+        let dom = document.getElementById(this.domId);
+        dom.style.width = domObj.width + 'px';
+        if (domObj.readonly == 2) {
+          dom.setAttribute('readonly', 'readonly');
+        } else {
+          dom.removeAttribute('readonly');
+        }
+        delete this.valueObj[dom.id];
+        this.valueObj[domObj.id] = dom.value;
+        dom.id = domObj.id;
+      },
+      onRightClick(PointerEvent) {
+        this.rightClickShow = true;
+        this.$nextTick(() => {
+          let y = PointerEvent.pageY;
+          let x = PointerEvent.pageX + 10;
+          if (PointerEvent.screenY >= PointerEvent.view.innerHeight) {
+            y -= 80;
+          }
+          this.$refs.popoverRef.$el.style.top = y + 'px';
+          this.$refs.popoverRef.$el.style.left = x + 'px';
+        });
+      },
+      inputChange(event) {
+        if (event.target && event.target.className == 'templateInput') {
+          this.valueObj[event.target.id] = event.target.value;
+        }
+      },
+      inputClick(event) {
+        if (!this.edit) {
+          return;
+        }
+        if (event.target && event.target.className == 'templateInput') {
+          this.domId = event.target.id;
+          console.log(event, 'event');
+          // event.getAttribute('class', 'templateInput');
+          this.$emit('editShow', {
+            templateDivRef: 'customTextRef' + this.id,
+            domObj: {
+              width: event.target.offsetWidth,
+              id: event.target.id,
+              readonly: event.target.readOnly ? 2 : 1
+            }
+          });
+        }
+      }
+    },
+
+    mounted() {
+      this.$nextTick(() => {
+        console.log(document.getElementById(this.id), 'dsd');
+        document
+          .getElementById(this.id)
+          .addEventListener('change', this.inputChange);
+
+        document
+          .getElementById(this.id)
+          .addEventListener('click', this.inputClick);
+      });
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  :deep(.templateInput) {
+    width: 80px;
+    border: solid 1px #bfbfbf;
+    padding: 1px;
+    margin: 1px;
+    margin-left: 3px;
+    text-align: center;
+  }
+  .contenteditable {
+    // padding: 5px;
+    width: 100%;
+    min-height: 20px;
+    padding-left: 10px;
+    // border: solid 1px #b3b0b0;
+  }
+</style>

+ 2 - 2
src/views/rulesManagement/releaseRules/index.vue

@@ -421,7 +421,7 @@
     },
     },
     methods: {
     methods: {
       addPermit(row, type, title) {
       addPermit(row, type, title) {
-        console.log('this.treeNode 1122', this.treeNode);
+     
         if (type == 'add') {
         if (type == 'add') {
           if (!this.treeNode) {
           if (!this.treeNode) {
             return this.$message.warning('请先选择类型节点!');
             return this.$message.warning('请先选择类型节点!');
@@ -639,7 +639,7 @@
         this.$refs.editTypeModalRef.open(type, type == 'add' ? this.treeNode : data);
         this.$refs.editTypeModalRef.open(type, type == 'add' ? this.treeNode : data);
       },
       },
       async deleteTypeNode(node) {
       async deleteTypeNode(node) {
-        console.log('delete node', node.data.item.id);
+        console.log('delete node', node);
         // 删除类型节点
         // 删除类型节点
         await recordrulesTypeDeletes([node.data.item.id]);
         await recordrulesTypeDeletes([node.data.item.id]);
         this.$message.success('删除成功');
         this.$message.success('删除成功');

+ 10 - 10
src/views/system/user/components/role-select.vue

@@ -62,18 +62,18 @@
       // }
       // }
 
 
       updateValue(value) {
       updateValue(value) {
-        const dataList = [];
-        console.log(value);
-        for (let it of value) {
-          const data = this.data.find((item) =>
-            item.id == it.id ? it.id : it
-          );
-          if (data) dataList.push(data);
-        }
+        // const dataList = [];
+        // console.log(value);
+        // for (let it of value) {
+        //   const data = this.data.find((item) =>
+        //     item.id == it.id ? it.id : it
+        //   );
+        //   if (data) dataList.push(data);
+        // }
 
 
-        console.log(dataList);
+        // console.log(dataList);
 
 
-        this.$emit('input', dataList);
+        this.$emit('input', value);
       }
       }
     }
     }
   };
   };

+ 1 - 0
src/views/system/user/components/user-edit.vue

@@ -242,6 +242,7 @@
       },
       },
       /* 保存编辑 */
       /* 保存编辑 */
       save() {
       save() {
+        console.log(this.form.groupRolePOList,'this.form.groupRolePOList')
         this.$refs.form.validate((valid) => {
         this.$refs.form.validate((valid) => {
           let isRole = true;
           let isRole = true;
           if (!valid) {
           if (!valid) {

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

@@ -47,6 +47,11 @@
           >
           >
             导入
             导入
           </el-button>
           </el-button>
+          <exportButton
+            fileName="工艺路线"
+            apiUrl="/main/producerouting/exeportProduceTask"
+            :params="params"
+          ></exportButton>
         </template>
         </template>
 
 
         <template v-slot:code="{ row }">
         <template v-slot:code="{ row }">
@@ -202,6 +207,8 @@
   import importDialog from '@/components/upload/import-dialogNew.vue';
   import importDialog from '@/components/upload/import-dialogNew.vue';
   import { parameterGetByCode } from '@/api/system/dictionary-data';
   import { parameterGetByCode } from '@/api/system/dictionary-data';
   import chooseCategory from './components/chooseCategory.vue';
   import chooseCategory from './components/chooseCategory.vue';
+  import exportButton from '@/components/upload/exportButton.vue';
+
   export default {
   export default {
     name: 'technologyRoute',
     name: 'technologyRoute',
     mixins: [tabMixins],
     mixins: [tabMixins],
@@ -212,11 +219,12 @@
       historyModal,
       historyModal,
       processSubmitDialog,
       processSubmitDialog,
       importDialog,
       importDialog,
-      chooseCategory
+      chooseCategory,exportButton
     },
     },
     data() {
     data() {
       return {
       return {
         isUpdate: false,
         isUpdate: false,
+        params: {},
         // 表格列配置
         // 表格列配置
         columns: [
         columns: [
           {
           {
@@ -363,12 +371,13 @@
       },
       },
       /* 表格数据源 */
       /* 表格数据源 */
       async datasource({ page, limit, where, order }) {
       async datasource({ page, limit, where, order }) {
-        const res = await route.list({
+        this.params = {
           ...where,
           ...where,
           ...order,
           ...order,
           pageNum: page,
           pageNum: page,
           size: limit
           size: limit
-        });
+        };
+        const res = await route.list({ ...this.params });
         return res;
         return res;
       },
       },
       importDialog() {
       importDialog() {

+ 1 - 1
vue.config.js

@@ -32,7 +32,7 @@ module.exports = {
     proxy: {
     proxy: {
       // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
       // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
       '/api': {
       '/api': {
-        // target: 'http://192.168.1.105:18086',
+        target: 'http://192.168.1.3:18086',
         // target: 'http://192.168.1.158:18086',
         // target: 'http://192.168.1.158:18086',
         // target: 'http://192.168.1.176:18086',
         // target: 'http://192.168.1.176:18086',
         target: 'http://192.168.1.125:18086',
         target: 'http://192.168.1.125:18086',