晏有为
2024-05-16 781e1ea65273cf10d6e5ed39e435107d67a8c667
Merge remote-tracking branch 'origin/master'

# Conflicts:
# src/main.js
已修改9个文件
已添加1个文件
1576 ■■■■ 文件已修改
index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/api/controller.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tool/onlyoffice.vue 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b1-report-preparation.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b2-standard.vue 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b3-classes.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/person-manage.vue 925 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/system-log.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/view/notice.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
index.html
@@ -21,6 +21,7 @@
    </head>
    <body>
        <div id="app"></div>
        <script type='text/javascript' src='http://192.168.73.130:9001/web-apps/apps/api/documents/api.js'></script>
        <script src="<%= htmlWebpackPlugin.options.url %>/static/luckysheet/plugins/js/plugin.js"></script>
        <script src="<%= htmlWebpackPlugin.options.url %>/static/luckysheet/luckysheet.umd.js"></script>
    </body>
src/assets/api/controller.js
@@ -25,6 +25,7 @@
    performanceShift,
    auxiliaryWorkingHours,
      unPass,
    companies
    }
}
@@ -182,6 +183,7 @@
    selectStandardProductListByMethodId: "/standardTree/selectStandardProductListByMethodId", //通过检验标准查询检验项目
    selectStandardMethodEnum: "/standardTree/selectStandardMethodEnum", //获取标准树下标准方法枚举
  getStandardTree2: "/standardTree/getStandardTree2", //获取产品架构
  upStandardProducts: "/standardTree/upStandardProducts", //获取产品架构
}
const standardMethod = {
@@ -277,3 +279,9 @@
const unPass = {
    pageInsUnPass:"/unPass/pageInsUnPass", // æŸ¥è¯¢ä¸åˆæ ¼æ ·å“æ•°æ®
}
const companies = {
  selectCompaniesList: "/companies/selectCompaniesList", //获取人事系统组织
  selectSimpleList: "/companies/selectSimpleList", //获取人事系统组织下的人员
  addPersonUser: "/companies/addPersonUser", //获取人事系统组织下的人员
}
src/components/tool/onlyoffice.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,193 @@
<!--onlyoffice ç¼–辑器-->
<template>
  <div id="vabOnlyOffice"></div>
</template>
<script>
export default {
  name: "VabOnlyOffice",
  data() {
    return {
      doctype: "",
      docEditor: null,
      //参考vabOnlyOffice组件参数配置
      option: {
        url: "",
        isEdit: false,
        fileType: "",
        title: "",
        lang: "zh-CN",
        isPrint: true,
        user: {},
        editUrl: ""
      }
    };
  },
  created() {
    const option = this.$route.query
    this.option.url = option.url
    this.option.isEdit = option.isEdit === "true" ? true : false
    this.option.fileType = option.fileType
    this.option.title = option.title
    this.option.lang = option.lang
    this.option.isPrint = option.isPrint
    this.option.user.id = option.user_id
    this.option.user.name = option.user_name
    this.option.editUrl = option.editUrl
  },
  beforeDestroy() {
    if (this.docEditor !== null) {
      this.docEditor.destroyEditor();
      this.docEditor = null;
    }
  },
  watch: {
    option: {
      handler: function(n) {
        this.setEditor(n);
        this.doctype = this.getFileType(n.fileType);
      },
      deep: true
    }
  },
  mounted() {
    if (this.option.url) {
      this.setEditor(this.option);
    }
  },
  methods: {
    async setEditor(option) {
      console.log(`output->option`,option)
      if (this.docEditor !== null) {
        this.docEditor.destroyEditor();
        this.docEditor = null;
      }
      this.doctype = this.getFileType(option.fileType);
      let config = {
        document: {
          //后缀
          fileType: option.fileType,
          key: option.key || "",
          title: option.title,
          permissions: {
            edit: option.isEdit, //是否可以编辑: åªèƒ½æŸ¥çœ‹ï¼Œä¼ false
            print: option.isPrint,
            download: false
            // "fillForms": true,//是否可以填写表格,如果将mode参数设置为edit,则填写表单仅对文档编辑器可用。 é»˜è®¤å€¼ä¸Žedit或review参数的值一致。
            // "review": true //跟踪变化
          },
          url: option.url
        },
        documentType: this.doctype,
        editorConfig: {
          callbackUrl: option.editUrl, //"编辑word后保存时回调的地址,这个api需要自己写了,将编辑后的文件通过这个api保存到自己想要的位置
          lang: option.lang, //语言设置
          //定制
          customization: {
            autosave: false, //是否自动保存
            chat: true,
            comments: false,
            help: false,
            // "hideRightMenu": false,//定义在第一次加载时是显示还是隐藏右侧菜单。 é»˜è®¤å€¼ä¸ºfalse
            //是否显示插件
            plugins: false
          },
          user: {
            id: option.user.id,
            name: option.user.name
          },
          mode: option.model ? option.model : "edit"
        },
        width: "100%",
        height: "100%",
        token: option.token || ""
      };
      // eslint-disable-next-line no-undef,no-unused-vars
      this.docEditor = new DocsAPI.DocEditor("vabOnlyOffice", config);
    },
    getFileType(fileType) {
      let docType = "";
      let fileTypesDoc = [
        "doc",
        "docm",
        "docx",
        "dot",
        "dotm",
        "dotx",
        "epub",
        "fodt",
        "htm",
        "html",
        "mht",
        "odt",
        "ott",
        "pdf",
        "rtf",
        "txt",
        "djvu",
        "xps"
      ];
      let fileTypesCsv = [
        "csv",
        "fods",
        "ods",
        "ots",
        "xls",
        "xlsm",
        "xlsx",
        "xlt",
        "xltm",
        "xltx"
      ];
      let fileTypesPPt = [
        "fodp",
        "odp",
        "otp",
        "pot",
        "potm",
        "potx",
        "pps",
        "ppsm",
        "ppsx",
        "ppt",
        "pptm",
        "pptx"
      ];
      if (fileTypesDoc.includes(fileType)) {
        docType = "text";
      }
      if (fileTypesCsv.includes(fileType)) {
        docType = "spreadsheet";
      }
      if (fileTypesPPt.includes(fileType)) {
        docType = "presentation";
      }
      return docType;
    }
  }
};
</script>
<style>
html,
body {
  height: 100%;
}
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  height: 100%;
}
.qualityManual-container {
  padding: 0 !important;
  height: 100%;
}
.qualityManual-container-office {
  width: 100%;
  height: calc(100% - 55px);
}
</style>
src/components/view/b1-report-preparation.vue
@@ -181,15 +181,15 @@
          showSelect: false,
          select: false,
          do: [
            //   {
            //   id: 'handleWeave',
            //   font: '在线编制',
            //   type: 'text',
            //   method: 'handleWeave',
            //   disabFun: (row, index) => {
            //     return row.isExamine != null
            //   }
            // },
              {
              id: 'handleWeave',
              font: '在线编制',
              type: 'text',
              method: 'handleWeave',
              disabFun: (row, index) => {
                return row.isExamine != null
              }
            },
            {
              id: 'download',
              font: '下载',
@@ -243,9 +243,9 @@
            }
          ],
          linkEvent: {
            // code: {
            //   method: 'selectAllByOne'
            // }
            code: {
              method: 'selectAllByOne'
            }
          },
          tagField: {
            isRatify: {
@@ -344,22 +344,22 @@
        this.upIndex++
      },
      async handleWeave(row) {
        // this.value = await file.convertFileToHtml(row.url)
        // this.claimVisible = true;
        this.$axios.post(this.$api.insReport.wordToHtml, {
          path: row.urlS ? row.urlS : row.url
        }).then(res => {
          if (res.code === 200) {
            // console.log(11111111,res.data)
            this.value = res.data
              .replace(/<a [^>]*>/g, "")
              .replace(/<\/a>/g, "")
              .replace(/&nbsp;/g, "&nbsp;&nbsp;");
            this.claimVisible = true;
        const userName = JSON.parse(localStorage.getItem("user")).name;
        //参考vabOnlyOffice组件参数配置
        const { href } = this.$router.resolve({
          path: `/wordEdit`,
          query: {
            url: this.javaApi + "/word/" + row.entrustCode + ".docx",
            isEdit: true,
            fileType: "docx",
            title: row.entrustCode + ".docx",
            lang: 'zh-CN',
            isPrint: true,
            user:  { id: 1, name: userName},
            editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + row.entrustCode + ".docx"
          }
        }).catch(error => {
          console.error(error)
        })
        window.open(href, '_blank');
      },
      // æƒé™åˆ†é…
      getPower(radio) {
@@ -407,7 +407,23 @@
        // console.log(this.$refs.Word.getValue())
      },
      async selectAllByOne(row) {
        console.log(row, await file.convertFileToHtml(row.url));
        const userName = JSON.parse(localStorage.getItem("user")).name;
        //参考vabOnlyOffice组件参数配置
        const { href } = this.$router.resolve({
          path: `/wordEdit`,
          query: {
            url: this.javaApi + "/word/" + row.entrustCode + ".docx",
            isEdit: "false",
            fileType: "docx",
            title: row.entrustCode + ".docx",
            lang: 'zh-CN',
            isPrint: true,
            user_id: 1,
            user_name: userName
          }
        })
        window.open(href, '_blank');
        console.log(`output->row`,row)
      },
      download(row) {
        let url = row.urlS ? row.urlS : row.url;
src/components/view/b2-standard.vue
@@ -79,6 +79,38 @@
  >>>.el-table__row{
    height: 35px !important;
  }
  .search{
    height: 20%;
    border-bottom: 1px solid #ebeef5;
    margin-bottom: 16px;
    display: flex;
    align-items: center;
    box-sizing: border-box;
    padding-bottom: 10px;
  }
  .search-item{
    display: flex;
    align-items: center;
    flex-wrap: wrap;
  }
  .search-item .el-row{
    display: flex;
    align-items: center;
  }
  .search-item .el-col{
    margin-left: 0;
  }
  .more-edit .dialog-footer{
    position: absolute;
    top: 15px;
    right: 70px;
  }
  >>>.more-edit .el-dialog__body{
    height: calc(100vh - 90px);
  }
  >>>.is-disabled .el-textarea__inner{
    background: rgba(0, 0, 0, 0.05) !important;
  }
</style>
<style>
  .standard .el-tree-node__content {
@@ -133,7 +165,7 @@
                  :class="`node_i ${data.children != undefined ? (data.code==='[1]'?'el-icon-folder-opened':'el-icon-folder') : 'el-icon-tickets'}`"></i>
                {{ data.code }} {{ data.label }}</span>
            </el-col>
            <el-col :span="2" style="text-align: right;" v-if="delStandardTree">
            <el-col :span="2" style="text-align: right;" v-if="delStandardTree&&node.level==5">
              <el-button type="text" size="mini" @click.stop="remove(node, data)">
                <i class="el-icon-delete"></i>
              </el-button>
@@ -143,8 +175,9 @@
      </el-tree>
    </div>
    <div class="right">
      <el-row class="title">
        <el-col :span="24" style="font-size: 14px;color: #999;">{{selectTree}}</el-col>
      <el-row class="title" style="width: 100%;">
        <el-col :span="20" style="font-size: 14px;color: #999;">{{selectTree}}</el-col>
        <el-button size="small" type="primary" @click="handleMore" style="position: absolute;right: 0px;top: 1px;" v-if="upStandardProduct">批量编辑</el-button>
      </el-row>
      <el-row class="standard_table" v-loading="tableLoad">
        <el-table class="el-table" :data="standardList" style="width: 100%;height: 220px !important;" height="220" tooltip-effect="dark"
@@ -227,7 +260,7 @@
          <el-table-column prop="manHourGroup" label="工时分组" width="100" show-overflow-tooltip></el-table-column>
          <el-table-column prop="templateId" label="模板" width="200">
            <template slot-scope="scope">
              <el-select v-model="scope.row.templateId" size="small" filterable
              <el-select v-model="scope.row.templateId" size="small" filterable :disabled="!upStandardProduct"
               @change="(value)=>upStandardProductListOfTemplate(value,scope.row.id)">
                <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option>
              </el-select>
@@ -244,8 +277,8 @@
        style="position: absolute;right: 16px;bottom: 1px;"
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :page-size="50"
          :total="total">
        </el-pagination>
      </el-row>
@@ -289,6 +322,113 @@
        <el-button @click="addDia = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="addStandardTree" :loading="addLoad">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <el-dialog title="批量编辑" :visible.sync="moreEdit" width="90%" style="height: 100vh;" class="more-edit">
      <div class="body" style="height: 100%;display: flex;flex-direction: column;">
        <div class="search">
          <div class="search-item">
            <el-row style="width: 25%;margin-bottom: 16px;">
              <el-col :span="6" style="text-align: right;">
                <!-- <span class="required-span">* </span> -->
                è¦æ±‚值:</el-col>
              <el-col :span="16">
                <el-input size="small" v-model="moreInfo.ask" clearable :disabled="moreSelects.length==0"></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%;margin-bottom: 16px;">
              <el-col :span="6" style="text-align: right;">
                <!-- <span class="required-span">* </span> -->
                è¦æ±‚描述:</el-col>
              <el-col :span="16" style="display: flex;align-items: flex-start;height: 100%;">
                <el-input size="small" clearable type="textarea" :autosize="{ minRows: 1, maxRows: 3}" v-model="moreInfo.tell" :disabled="moreSelects.length==0"></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%;margin-bottom: 16px;">
              <el-col :span="6" style="text-align: right;">
                <!-- <span class="required-span">* </span> -->
                è¯•验方法:</el-col>
              <el-col :span="16">
                <el-select v-model="moreInfo.methodS" size="small" filterable style="width: 100%;" :disabled="moreSelects.length==0">
                  <el-option v-for="(a, ai) in methodList" :key="ai" :label="a.label" :value="a.value"></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 25%;margin-bottom: 16px;">
              <el-col :span="6" style="text-align: right;">
                <!-- <span class="required-span">* </span> -->
                å•ä»·(元):</el-col>
              <el-col :span="16" >
                <el-input size="small" v-model="moreInfo.price" clearable :disabled="moreSelects.length==0"></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%;">
              <el-col :span="6" style="text-align: right;">
                <!-- <span class="required-span">* </span> -->
                å·¥æ—¶ç³»æ•°ï¼š</el-col>
              <el-col :span="16">
                <el-input size="small" v-model="moreInfo.manHour" clearable :disabled="moreSelects.length==0"></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%;">
              <el-col :span="6" style="text-align: right;">
                <!-- <span class="required-span">* </span> -->
                æ¨¡æ¿ï¼š</el-col>
              <el-col :span="16">
                <el-select v-model="moreInfo.templateId" size="small" filterable  placeholder="模板" style="width: 100%;" :disabled="moreSelects.length==0">
                  <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 50%;">
              <el-col :span="23" style="display: flex;align-items: center;justify-content: end;">
                <el-button type="primary" size="small" @click="sectionUp(moreSelects)">设置区间</el-button>
                <el-button @click="moreEdit = false" size="small">取 æ¶ˆ</el-button>
                <el-button type="primary" @click="subMoreEdit" :loading="moreEditLoad" size="small">保 å­˜</el-button>
              </el-col>
            </el-row>
          </div>
        </div>
        <div style="flex: 1;overflow-y: auto;" v-loading="productTableLoading0">
          <el-table :data="productList0" ref="productTable0" style="width: 100%;" height="94%" tooltip-effect="dark"
          stripe
          :fit="true" border
          @select-all="handleSelectAll0"
          @select="handleSelectionChange0"
          header-row-class-name="header-class"
          :row-key="row=>row.id"
          >
            <el-table-column type="selection" width="50" >
            </el-table-column>
            <el-table-column prop="model" label="型号" min-width="100" show-overflow-tooltip></el-table-column>
            <el-table-column prop="inspectionItem" label="检验项" min-width="140" show-overflow-tooltip></el-table-column>
            <el-table-column prop="inspectionItemSubclass" label="检验项子项" min-width="140"
              show-overflow-tooltip></el-table-column>
            <el-table-column prop="sonLaboratory" label="子实验室" width="130" show-overflow-tooltip :filters="filters"
              :filter-method="filterHandler"></el-table-column>
            <el-table-column prop="ask" label="要求值" min-width="200px"></el-table-column>
            <el-table-column prop="tell" label="要求描述" min-width="220px"></el-table-column>
            <el-table-column prop="method" label="试验方法" width="200"></el-table-column>
            <el-table-column prop="unit" label="计量单位" width="100" show-overflow-tooltip></el-table-column>
            <el-table-column prop="price" label="单价(元)" width="120"></el-table-column>
            <el-table-column prop="manHour" label="工时系数" width="120"></el-table-column>
            <el-table-column prop="manHourGroup" label="工时分组" width="100" show-overflow-tooltip></el-table-column>
            <el-table-column prop="templateId" label="模板" width="200">
              <template slot-scope="scope">
                {{ templateList.find(item => item.id == scope.row.templateId)?templateList.find(item => item.id == scope.row.templateId).name:'' }}
              </template>
            </el-table-column>
            <el-table-column prop="section" label="区间" width="120" show-overflow-tooltip></el-table-column>
          </el-table>
          <el-pagination
        style="position: absolute;right: 16px;bottom: 4px;"
          @current-change="handleCurrentChange0"
          :current-page="currentPage0"
          layout="total, prev, pager, next, jumper"
          :page-size="50"
          :total="total0">
        </el-pagination>
        </div>
      </div>
    </el-dialog>
    <!-- <el-dialog title="新增标准" :visible.sync="addStandardDia" width="400px">
      <div class="body">
@@ -447,9 +587,42 @@
        sectionList: [],
        templateList: [],
        total:0,
        pageSize:100,
        currentPage:1,
        standardId: 0
        standardId: 0,
        moreEdit:false,
        moreEditLoad:false,
        moreSelects:[],
        total0:0,
        currentPage0:1,
        productList0: [],
        moreInfo:{
          ask:'',
          tell:'',
          methodS:'',
          price:'',
          manHour:'',
          templateId:''
        },
        methodList:[],
        productTableLoading0:false
      }
    },
    watch: {
      moreEdit(val) {
        if(!val){
          this.$refs.productTable0.clearSelection()
          this.moreSelects = []
          this.currentPage0 = 1;
          this.productList0 = []
          this.moreInfo = {
            ask:'',
            tell:'',
            methodS:'',
            price:'',
            manHour:'',
            templateId:''
          }
        }
      }
    },
    mounted() {
@@ -480,6 +653,8 @@
        this.upIndex++
      },
      handleNodeClick(val, node, el) { //树的值
        this.total = 0
        this.currentPage = 1
        this.selectTree = ''
        this.getNodeParent(node)
        this.selectTree = this.selectTree.replace(' - ', '')
@@ -993,19 +1168,29 @@
        }
      },
      sectionUp(row) {
        this.sectionRow = row
        this.sectionUpDia = true
        this.sectionList = []
        if (this.sectionRow.section != null && this.sectionRow.section != '') {
          JSON.parse(this.sectionRow.section).forEach((a, ai) => {
            this.sectionList.push({
              thing: a,
              ask: JSON.parse(this.sectionRow.ask)[ai],
              tell: JSON.parse(this.sectionRow.tell)[ai],
              price: JSON.parse(this.sectionRow.price)[ai],
              manHour: JSON.parse(this.sectionRow.manHour)[ai]
        if (Array.isArray(row)) {
            // å€¼æ˜¯ä¸€ä¸ªæ•°ç»„
            if(row.length === 0){
              return this.$message.error('请选择检验项')
            }
            this.sectionRow = {}
            this.sectionUpDia = true
        } else {
          // å€¼æ˜¯ä¸€ä¸ªå¯¹è±¡
          this.sectionRow = row
          this.sectionUpDia = true
          this.sectionList = []
          if (this.sectionRow.section != null && this.sectionRow.section != '') {
            JSON.parse(this.sectionRow.section).forEach((a, ai) => {
              this.sectionList.push({
                thing: a,
                ask: JSON.parse(this.sectionRow.ask)[ai],
                tell: JSON.parse(this.sectionRow.tell)[ai],
                price: JSON.parse(this.sectionRow.price)[ai],
                manHour: JSON.parse(this.sectionRow.manHour)[ai]
              })
            })
          })
          }
        }
      },
      sectionLoadAdd() {
@@ -1037,18 +1222,42 @@
          this.sectionRow.manHour = JSON.stringify(manHourList)
        }
        this.sectionLoad = true
        this.$axios.post(this.$api.standardTree.upStandardProductList, {
          id: this.sectionRow.id,
          section: this.sectionRow.section,
          ask: this.sectionRow.ask,
          tell: this.sectionRow.tell,
          price: this.sectionRow.price,
          manHour: this.sectionRow.manHour
        }, {
          headers: {
            'Content-Type': 'application/json'
        if(this.moreSelects.length === 0){
            this.$axios.post(this.$api.standardTree.upStandardProductList, {
            id: this.sectionRow.id,
            section: this.sectionRow.section,
            ask: this.sectionRow.ask,
            tell: this.sectionRow.tell,
            price: this.sectionRow.price,
            manHour: this.sectionRow.manHour
          }, {
            headers: {
              'Content-Type': 'application/json'
            }
          }).then(res => {
            this.sectionLoad = false
            if (res.code == 201) {
              this.$message.error('未保存')
              return
            }
            this.$message.success('已保存')
            this.sectionUpDia = false
          })
        }else{
          this.$axios.post(this.$api.standardTree.upStandardProducts, {
          ids:this.moreSelects.map(a=>a.id),
          standardProductList:{
            section: this.sectionRow.section,
            ask: this.sectionRow.ask,
            tell: this.sectionRow.tell,
            price: this.sectionRow.price,
            manHour: this.sectionRow.manHour
          }
        }).then(res => {
          }, {
            headers: {
              'Content-Type': 'application/json'
            }
          }).then(res => {
          this.sectionLoad = false
          if (res.code == 201) {
            this.$message.error('未保存')
@@ -1056,7 +1265,10 @@
          }
          this.$message.success('已保存')
          this.sectionUpDia = false
          this.currentPage0 = 1;
          this.getList()
        })
        }
      },
      getStandardTemplate() {
        this.$axios.get(this.$api.StandardTemplate.getStandardTemplate).then(res => {
@@ -1080,6 +1292,101 @@
          this.tableLoad2 = false
        })
      },
      async handleMore(){
        if((!this.standardId&&this.standardId!=0)||this.standardList.length==0){
          return this.$message.error('请选择实验室、样品')
        }
        await this.getList()
        this.selectStandardMethods()
        this.moreEdit = true
      },
      selectStandardMethods() {
        this.$axios.get(this.$api.standardMethod.selectStandardMethods).then(res => {
          let data = []
          res.data.forEach(a => {
            data.push({
              label: a.code,
              value: a.code
            })
          })
          this.methodList = data
        })
      },
      subMoreEdit(){
        if(this.moreSelects.length===0){
          return this.$message.error('请选择检验项')
        }
        this.moreEditLoad = true
        this.$axios.post(this.$api.standardTree.upStandardProducts, {
          ids:this.moreSelects.map(a=>a.id),
          standardProductList:this.moreInfo
          }, {
            headers: {
              'Content-Type': 'application/json'
            }
          }).then(res => {
          this.moreEditLoad = false
          if (res.code == 201) {
            this.$message.error('未保存')
            return
          }
          this.$message.success('已保存')
          this.currentPage0 = 1;
          this.getList()
          // this.moreInfo = {
          //   ask:'',
          //   tell:'',
          //   methodS:'',
          //   price:'',
          //   manHour:'',
          //   templateId:''
          // }
        })
      },
      handleSelectAll0(rows){
        if(rows.length){
          rows.forEach(a=>{
            if(!this.moreSelects.find(b=>a.id===b.id)){
              this.moreSelects.push(a)
            }
          })
        }else{
          this.productList0.forEach(a=>{
            this.moreSelects = this.moreSelects.filter(b=>b.id!=a.id )
          })
        }
      },
      handleSelectionChange0(val,row){
        if(this.moreSelects.find(a=>a.id===row.id)){
          this.moreSelects = this.moreSelects.filter(a=>a.id!=row.id)
        }else{
          this.moreSelects.push(row)
        }
      },
      getList(){
        this.productTableLoading0 = true
        this.$axios.post(this.$api.standardTree.selectStandardProductListByMethodId, {
          id: this.standardId,
          tree: this.selectTree,
          page: this.currentPage0
        }).then(res => {
          this.productList0 = res.data.productList
          this.total0 = res.data.total
          this.productTableLoading0 = false
          this.$nextTick(()=>{
            this.productList0.forEach((a,i) => {
              if(this.moreSelects.find(b=>a.id==b.id)){
                // console.log(111111111,a)
                this.$refs.productTable0.toggleRowSelection(this.productList0[i],true)
              }
            })
          })
        })
      },
      handleCurrentChange0(e){
        this.currentPage0 = e;
        this.getList()
      }
    }
  }
</script>
src/components/view/b3-classes.vue
@@ -87,7 +87,7 @@
                  <!-- <div class="work-box-left">
                    <span>{{ getShiftByDic(m.shift) }}</span>
                  </div> -->
                  <el-dropdown trigger="click" placement="bottom" @command="e=>handleCommand(e,m)" :disabled="!downPower">
                  <el-dropdown trigger="click" placement="bottom" @command="e=>handleCommand(e,m)" :disabled="!upPower">
                    <!-- <i class="el-icon-arrow-down el-icon--right" style="font-size: 20px;color: #fff;cursor: pointer;"></i> -->
                    <span style="cursor: pointer;" :style="`opacity: ${getShiftByDic(m.shift)=='无'?0:1};`">{{ getShiftByDic(m.shift) }}</span>
                    <el-dropdown-menu slot="dropdown">
src/components/view/person-manage.vue
@@ -1,80 +1,83 @@
<style scoped>
  .person_manage{
  .person_manage {
    padding: 20px 0;
        display: flex;
    display: flex;
  }
  .left {
        width: 270px;
        height: calc(100% - 40px);
        background-color: white;
        padding: 15px;
    }
  .el-tree{
    width: 270px;
    height: calc(100% - 40px);
    background-color: white;
    padding: 15px;
  }
  .el-tree {
    height: calc(100% - 37px);
    overflow-y: auto;
  }
    .custom-tree-node {
        width: 100%;
        line-height: 32px;
    }
  .custom-tree-node {
    width: 100%;
    line-height: 32px;
  }
    .custom-tree-node .el-icon-delete {
        color: #3A7BFA;
        opacity: 0;
        font-size: 18px;
    }
  .custom-tree-node .el-icon-delete {
    color: #3A7BFA;
    opacity: 0;
    font-size: 18px;
  }
    .custom-tree-node:hover .el-icon-delete {
        opacity: 1;
    }
  .custom-tree-node:hover .el-icon-delete {
    opacity: 1;
  }
    .node_i {
        color: orange;
        font-size: 18px;
    }
  .node_i {
    color: orange;
    font-size: 18px;
  }
    .right {
        margin-left: 5px;
        width: calc(100% - 305px);
        height: calc(100% - 40px);
    }
    .title {
        height: 60px;
        line-height: 60px;
    }
  .right {
    margin-left: 5px;
    width: calc(100% - 305px);
    height: calc(100% - 40px);
  }
    .search {
        background-color: #fff;
        height: 60px;
        display: flex;
        align-items: center;
    }
  .title {
    height: 60px;
    line-height: 60px;
  }
    .search_thing {
        width: 250px;
        display: flex;
        align-items: center;
    }
  .search {
    background-color: #fff;
    height: 60px;
    display: flex;
    align-items: center;
  }
    .search_label {
        width: 90px;
        font-size: 14px;
        text-align: right;
    }
  .search_thing {
    width: 250px;
    display: flex;
    align-items: center;
  }
    .search_input {
        width: calc(100% - 90px);
    }
  .search_label {
    width: 90px;
    font-size: 14px;
    text-align: right;
  }
    .table {
        margin-top: 4px;
        background-color: #fff;
        height: calc(100% - 44px);
    }
  .search_input {
    width: calc(100% - 90px);
  }
  .table {
    margin-top: 4px;
    background-color: #fff;
    height: calc(100% - 44px);
  }
</style>
<style>
  .el-upload--text{
  .el-upload--text {
    width: 100%;
    height: 100%;
    display: flex;
@@ -82,45 +85,66 @@
    justify-content: center;
  }
</style>
<style>
  .person_manage .el-tree-node__content {
    height: 32px;
    font-size: 14px;
    border-radius: 2px;
  }
  .person_manage .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
    color: #3A7BFA;
  }
  .person_manage .has-gutter .el-table__cell .cell {
    line-height: 34px;
    background-color: #f8f8f8;
  }
  .person_manage .has-gutter .el-table__cell {
    background-color: #fafafa !important;
  }
  .person_manage .el-table__row .cell {
    font-size: 14px;
  }
  .person_manage .el-table .warning-row .cell {
    color: #bababa;
  }
</style>
<template>
    <div class="person_manage">
        <!-- <el-row class="title">
      <el-col :span="12" style="padding-left: 20px;">用户管理</el-col>
      <el-col :span="12" style="text-align: right;">
      </el-col>
    </el-row> -->
  <div class="person_manage">
    <div class="left">
      <el-row>
                <el-col :span="20">
                    <el-input placeholder="输入关键字进行搜索" suffix-icon="el-icon-search" v-model="search" size="small"
                        style="margin-bottom: 5px;" clearable @blur="searchFilter" @clear="searchFilter"></el-input>
                </el-col>
                <el-col :span="4" style="text-align: center;line-height: 30px;" v-if="addPower">
                    <el-button type="primary" icon="el-icon-plus" size="mini" circle @click="handleAdd"></el-button>
                </el-col>
            </el-row>
            <el-tree :data="list" ref="tree" :props="{ children: 'children', label: 'name' }" node-key="id"
                :filter-node-method="filterNode" @node-click="handleNodeClick" highlight-current @node-expand="nodeOpen"
                @node-collapse="nodeClose" v-loading="treeLoad" :expand-on-click-node="false"
                :default-expanded-keys="expandedKeys"
        :default-checked-keys="[1]">
                <div class="custom-tree-node" slot-scope="{ node, data }">
                    <el-row style="width: 100%;">
                        <el-col :span="21" :class="{sort:node.level>3}">
                            <span><i
                                    :class="`node_i ${data.children != undefined&&data.children.length>0 ? 'el-icon-folder-opened' : 'el-icon-tickets'}`"></i>
                                 {{ data.name }}</span>
                        </el-col>
                        <el-col :span="2" style="text-align: right;" v-if="delStandardTree&&node.level>1">
                            <el-button type="text" size="mini" @click.stop="remove(node, data)">
                                <i class="el-icon-delete"></i>
                            </el-button>
                        </el-col>
                    </el-row>
                </div>
            </el-tree>
        <el-col :span="20">
          <el-input placeholder="输入关键字进行搜索" suffix-icon="el-icon-search" v-model="search" size="small"
            style="margin-bottom: 5px;" clearable @blur="searchFilter" @clear="searchFilter"
            @keyup.enter.native="searchFilter()"></el-input>
        </el-col>
        <el-col :span="4" style="text-align: center;line-height: 30px;" v-if="addPower">
          <el-button type="primary" icon="el-icon-plus" size="mini" circle @click="handleAdd"></el-button>
        </el-col>
      </el-row>
      <el-tree :data="list" ref="tree" :props="{ children: 'children', label: 'name' }" node-key="id"
        :filter-node-method="filterNode" @node-click="handleNodeClick" highlight-current @node-expand="nodeOpen"
        @node-collapse="nodeClose" v-loading="treeLoad" :expand-on-click-node="false"
        :default-expanded-keys="expandedKeys" :default-checked-keys="[1]">
        <div class="custom-tree-node" slot-scope="{ node, data }">
          <el-row style="width: 100%;">
            <el-col :span="21" :class="{sort:node.level>3}">
              <span><i
                  :class="`node_i ${data.children != undefined&&data.children.length>0 ? 'el-icon-folder-opened' : 'el-icon-tickets'}`"></i>
                {{ data.name }}</span>
            </el-col>
            <el-col :span="2" style="text-align: right;" v-if="delStandardTree&&node.level>1">
              <el-button type="text" size="mini" @click.stop="remove(node, data)">
                <i class="el-icon-delete"></i>
              </el-button>
            </el-col>
          </el-row>
        </div>
      </el-tree>
    </div>
    <div class="right">
      <div class="search">
@@ -142,7 +166,8 @@
        <div class="search_thing">
          <div class="search_label">公司名称:</div>
          <div class="search_input">
            <el-input size="small" placeholder="请输入" clearable v-model="componentData.entity.company" @keyup.enter.native="refreshTable()"></el-input>
            <el-input size="small" placeholder="请输入" clearable v-model="componentData.entity.company"
              @keyup.enter.native="refreshTable()"></el-input>
          </div>
        </div>
        <div class="search_thing" style="padding-left: 30px;">
@@ -150,148 +175,151 @@
          <el-button size="small" type="primary" @click="refreshTable()">查 è¯¢</el-button>
        </div>
        <div class="search_thing">
          <el-button size="small" type="primary" @click="openthirdParty">获取三方人员</el-button>
          <el-button size="small" type="primary" @click="openthirdParty" v-if="addUserPower">获取三方人员</el-button>
          <el-button size="small" type="primary" @click="opeaAdd" v-if="addPower">新增用户</el-button>
        </div>
      </div>
      <div class="table">
        <ValueTable ref="ValueTable" :url="$api.user.selectUserList" :upUrl="$api.user.updateUser" :componentData="componentData" :key="upIndex" @upUser="upUser"/>
        <ValueTable ref="ValueTable" :url="$api.user.selectUserList" :upUrl="$api.user.updateUser"
          :componentData="componentData" :key="upIndex" />
      </div>
    </div>
    <el-dialog title="架构新增" :visible.sync="addDia" width="400px">
            <div class="body">
                <el-row style="line-height: 50px;">
                    <el-col :span="6" style="text-align: right;">
                        <span class="required-span">* </span>架构名称:
                    </el-col>
                    <el-col :span="16" :offset="1">
                        <el-input v-model="addOb.name" placeholder="请输入架构名称" clearable size="small"></el-input>
                    </el-col>
                </el-row>
            </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="addDia = false">取 æ¶ˆ</el-button>
                <el-button type="primary" @click="addStandardTree" :loading="addLoad">ç¡® å®š</el-button>
            </span>
        </el-dialog>
    <el-dialog title="添加三方人员" :visible.sync="addthirdParty" width="400px">
    <el-dialog title="架构新增" :visible.sync="addDia0" width="400px">
      <div class="body">
        <el-tree
          :data="datathirdParty"
          show-checkbox
          node-key="id"
          :default-expanded-keys="[2, 3]"
          :default-checked-keys="[5]"
          :props="defaultProps">
        </el-tree>
        <span slot="footer" style="padding-left: 200px">
            <el-button @click="addthirdParty = false" size="mini">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="" :loading="addLoad" size="mini">ç¡® å®š</el-button>
            </span>
        <el-row style="line-height: 50px;">
          <el-col :span="6" style="text-align: right;">
            <span class="required-span">* </span>架构名称:
          </el-col>
          <el-col :span="16" :offset="1">
            <el-input v-model="addOb.name" placeholder="请输入架构名称" clearable size="small"></el-input>
          </el-col>
        </el-row>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDia0 = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="addStandardTree" :loading="addLoad">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <el-dialog title="获取人事系统人员信息" :visible.sync="addthirdParty" width="70%">
      <div class="body">
        <el-row>
          <el-col :span="9" style="height: 70vh;overflow: hidden;">
            <el-input placeholder="输入关键字进行过滤" v-model="search2" size="small" style="width: 90%;padding: 0 5% 10px 5%;"
              clearable @blur="searchFilter2" @clear="searchFilter2" @keyup.enter.native="searchFilter2()">
            </el-input>
            <el-tree :data="datathirdParty" node-key="id" :props="defaultProps" @node-click="nodeClick2"
              style="height: calc(100% - 42px);"
              @node-expand="nodeOpen0" :filter-node-method="filterNode2" ref="tree2" highlight-current>
            </el-tree>
          </el-col>
          <el-col :span="15" style="height: 70vh;padding-left: 8px;">
            <div class="search_thing" style="width: 360px;margin-bottom: 10px;">
              <div class="search_label" style="width: 140px;">员工号/员工姓名:</div>
              <div class="search_input">
                <el-input
                size="small"
                placeholder="请输入工号/员工姓名"
                @clear="searchPerson"
                clearable
                v-model="userSearch2"
                @keyup.enter.native="searchPerson()">
                <i slot="suffix" class="el-input__icon el-icon-search" style="cursor: pointer;" @click="searchPerson"></i></el-input>
                </div>
            </div>
            <el-table height="67vh" border stripe :data="personList" v-loading="personLoad" ref="personTable"
              @selection-change="handleSelectionChange">
              <el-table-column type="selection" width="50">
              </el-table-column>
              <el-table-column prop="employeeID" label="员工号">
              </el-table-column>
              <el-table-column prop="name" label="员工姓名">
              </el-table-column>
              <el-table-column prop="isLive" label="已存在" width="80" align="center">
                <template slot-scope="scope">
                  <el-tag type="success" effect="dark" v-if="scope.row.isLive === 1">√</el-tag>
                </template>
              </el-table-column>
            </el-table>
          </el-col>
        </el-row>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="addthirdParty = false" size="mini">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="addUser2" :loading="addLoad" size="mini">ç¡® å®š</el-button>
      </div>
    </el-dialog>
    </div>
  </div>
</template>
<script>
    import ValueTable from '../tool/value-table.vue'
    export default {
        components: {
            ValueTable
        },
        data() {
            return {
        datathirdParty:[{
          id: 1,
          label: '一级 1',
          children: [{
            id: 4,
            label: '二级 1-1',
            children: [{
              id: 9,
              label: '三级 1-1-1'
            }, {
              id: 10,
              label: '三级 1-1-2'
            }]
          }]
        }, {
          id: 2,
          label: '一级 2',
          children: [{
            id: 5,
            label: '二级 2-1'
          }, {
            id: 6,
            label: '二级 2-2'
          }]
        }, {
          id: 3,
          label: '一级 3',
          children: [{
            id: 7,
            label: '二级 3-1'
          }, {
            id: 8,
            label: '二级 3-2'
          }]
        }],
  import {
    compileToFunctions
  } from 'vue-template-compiler'
  import ValueTable from '../tool/value-table.vue'
  export default {
    components: {
      ValueTable
    },
    data() {
      return {
        datathirdParty: [],
        defaultProps: {
          children: 'children',
          label: 'label'
        },
        addthirdParty:false,
                componentData: {
                    entity: {
                        name: null,
                        state: null,
                        company: null,
                        orderBy:{
                            field: 'id',
                            order: 'asc'
                        }
                    },
        addthirdParty: false,
        componentData: {
          entity: {
            name: null,
            state: null,
            company: null,
            departId: null,
            orderBy: {
              field: 'id',
              order: 'asc'
            }
          },
          row: 2,
                    isIndex: true,
                    showSelect: false,
                    select: false,
          init:false,
                    do: [{
                        id: 'update',
                        font: '编辑',
                        type: 'text',
                        method: 'doDiy',
                        field:['createUserName','updateUserName','roleName','角色=roleId','密码=password']
                    }],
                    tagField: {
                        state: {
                            select: [{
                                value: 1,
                                type: 'success',
                                label: '启用'
                            },{
                                value: 0,
                                type: 'danger',
                                label: '停用'
                            }]
                        }
                    },
                    selectField: {
                        state: {
                            select: [{
                                value: 1,
                                type: 'success',
                                label: '启用'
                            },{
                                value: 0,
                                type: 'danger',
                                label: '停用'
                            }]
                        },
                        roleId: {
                            select: []
                        }
                    },
          isIndex: true,
          showSelect: false,
          select: false,
          init: false,
          do: [{
            id: 'update',
            font: '编辑',
            type: 'text',
            method: 'doDiy',
            field: ['createUserName', 'updateUserName', 'roleName', '角色=roleId', '密码=password']
          }],
          tagField: {
            state: {
              select: [{
                value: 1,
                type: 'success',
                label: '启用'
              }, {
                value: 0,
                type: 'danger',
                label: '停用'
              }]
            }
          },
          selectField: {
            state: {
              select: [{
                value: 1,
                type: 'success',
                label: '启用'
              }, {
                value: 0,
                type: 'danger',
                label: '停用'
              }]
            },
            roleId: {
              select: []
            }
          },
          /* cascaderField:{
            departId:{
              tree:[]
@@ -303,199 +331,344 @@
              checkStrictly: true
            }
          }, */
                    requiredAdd:['account','name','state','roleId','password','nameEn','phone'],
                    requiredUp:['account','name','state','roleId','nameEn','phone'],
          addUpload:['pictureUrl','signatureUrl'],
          addUploadConfig:{
            accept:'.png, .jpg, .jpeg, .gif',
            url:this.$api.deviceScope.uploadFile
          requiredAdd: ['account', 'name', 'state', 'roleId', 'password', 'nameEn', 'phone'],
          requiredUp: ['account', 'name', 'state', 'roleId', 'nameEn', 'phone'],
          // disabledUp:['departId'],
          addUpload: ['pictureUrl', 'signatureUrl'],
          addUploadConfig: {
            accept: '.png, .jpg, .jpeg, .gif',
            url: this.$api.deviceScope.uploadFile
          },
                },
                entityCopy: {},
                upIndex: 0,
                addDia: false,
                addPower: true,
        delStandardTree:true,
        addDia0:false,
        addOb:{
          fatherId:'',
          name:'',
        },
        entityCopy: {},
        upIndex: 0,
        addDia: false,
        addPower: true,
        addUserPower: true,
        delStandardTree: true,
        addDia0: false,
        addOb: {
          fatherId: '',
          name: '',
        },
        search: null,
                list: [],
                selectTree: '',
        treeLoad:false,
        list: [],
        selectTree: '',
        treeLoad: false,
        expandedKeys: [],
        addLoad:false,
            }
        },
        mounted() {
        addLoad: false,
        personList: [],
        personListCopy:[],
        treeLoad: false,
        personLoad: false,
        search2: '',
        multipleSelection: [],
        companiesList:[],
        currentCompaniesList: [],
        userSearch2:''
      }
    },
    // watch: {
    //   userSearch2(val){}
    // },
    mounted() {
      this.selectTreeList()
            this.selectRole()
            this.entityCopy = this.HaveJson(this.componentData.entity)
            this.getPower()
        },
        methods: {
      openthirdParty(){
        this.addthirdParty=true;
      this.selectRole()
      this.entityCopy = this.HaveJson(this.componentData.entity)
      this.getPower()
    },
    methods: {
      openthirdParty() {
        this.addthirdParty = true;
        this.$axios.get(this.$api.companies.selectCompaniesList).then(res => {
          this.companiesList = JSON.parse(JSON.stringify(res.data));
          this.datathirdParty = []
          for (let ai = 0; ai < res.data.length; ai++) {
            let a = res.data[ai]
            if (a.parentCompanyId === 'ROOT') {
              this.datathirdParty.push({
                id: a.companyId,
                label: a.companyName,
                children: []
              })
              res.data.splice(ai, 1)
              ai--
            } else {
              this.getOrganizational(a, ai, this.datathirdParty, res.data)
            }
          }
        })
      },
            refreshTable() {
                this.$refs['ValueTable'].selectList()
            },
            refresh() {
                this.componentData.entity = this.HaveJson(this.entityCopy)
                this.upIndex++
            },
            upUser(row){
                console.log(row);
            },
            selectRole(){
                this.$axios.get(this.$api.user.selectRoleList).then(res=>{
                    var str = []
                    res.data.forEach(a=>{
                        str.push({
                            label: a.name,
                            value: a.id
                        })
                    })
                    this.componentData.selectField.roleId.select = str
                })
            },
            opeaAdd(){
                this.$refs.ValueTable.openAddDia(this.$api.user.addUser);
            },
      selectTreeList(){
       /* this.$axios.get(this.$api.department.selectDepartment).then(res => {
      getOrganizational(a, ai, children, list) {
        for (let bi = 0; bi < children.length; bi++) {
          let b = children[bi]
          if (a.parentCompanyId === b.id) {
            b.children.push({
              id: a.companyId,
              label: a.companyName,
              children: []
            })
            list.splice(ai, 1)
            ai--
            break
          } else {
            this.getOrganizational(a, ai, b.children, list)
          }
        }
      },
      refreshTable() {
        this.$refs['ValueTable'].selectList()
      },
      refresh() {
        this.componentData.entity = this.HaveJson(this.entityCopy)
        // this.upIndex++
        this.refreshTable()
      },
      selectRole() {
        this.$axios.get(this.$api.user.selectRoleList).then(res => {
          var str = []
          res.data.forEach(a => {
            str.push({
              label: a.name,
              value: a.id
            })
          })
          this.componentData.selectField.roleId.select = str
        })
      },
      opeaAdd() {
        if (!this.addOb.fatherId || this.selectTree == '' || this.selectTree == '全部') {
          this.$message.error('请选择一个组织')
          return
        }
        this.$refs.ValueTable.openAddDia(this.$api.user.addUser);
        this.$refs['ValueTable'].upData.departId = this.selectTree
      },
      selectTreeList() {
        /* this.$axios.get(this.$api.department.selectDepartment).then(res => {
          this.componentData.cascaderField.departId.tree = this.handleTree(res.data[0].children)
                }) */
        this.$refs.ValueTable.selectList()
      },
      handleTree(arr){
      handleTree(arr) {
        arr.forEach(a => {
          if(a.children.length==0){
          if (a.children.length == 0) {
            a.children = null;
          }else{
          } else {
            this.handleTree(a.children)
          }
        })
        return arr
      },
            // æƒé™åˆ†é…
            getPower(){
                let power = JSON.parse(sessionStorage.getItem('power'))
                let up = false
                let add = false
                for (var i = 0; i < power.length; i++) {
                    if(power[i].menuMethod=='updateUser'){
                        up = true
                    }
                    if(power[i].menuMethod=='addUser'){
                        add = true
                    }
                }
                if(!up){
                    this.componentData.do.splice(0, 1)
                }
                this.addPower = add
            },
      handleAdd(){
        if(this.addOb.fatherId){
      // æƒé™åˆ†é…
      getPower() {
        let power = JSON.parse(sessionStorage.getItem('power'))
        let up = false
        let add = false
        let addUserPower = false
        let delStandardTree = false
        for (var i = 0; i < power.length; i++) {
          if (power[i].menuMethod == 'updateUser') {
            up = true
          }
          if (power[i].menuMethod == 'addUser') {
            add = true
          }
          if (power[i].menuMethod == 'delDepartment') {
            delStandardTree = true
          }
          if (power[i].menuMethod == 'addPersonUser') {
            addUserPower = true
          }
        }
        if (!up) {
          this.componentData.do.splice(0, 1)
        }
        this.delStandardTree = delStandardTree
        this.addPower = add
        this.addUserPower = addUserPower
      },
      handleAdd() {
        if (this.addOb.fatherId||this.addOb.name=='全部') {
          this.addDia0 = true;
        }else{
        } else {
          this.$message.error('请选择一个架构层级')
        }
      },
      searchFilter() {
                this.$refs.tree.filter(this.search)
            },
        this.$refs.tree.filter(this.search)
      },
      searchFilter2() {
        this.$refs.tree2.filter(this.search2)
      },
      filterNode(value, data) {
                if (!value) return true;
                return data.name.indexOf(value) !== -1;
            },
        console.log(data);
        if (!value) return true;
        return data.name.indexOf(value) !== -1;
      },
      filterNode2(value, data) {
        if (!value) return true;
        return data.label.indexOf(value) !== -1;
      },
      handleNodeClick(val, node, el) { //树的值
                this.selectTree = ''
                this.getNodeParent(node)
                this.selectTree = this.selectTree.replace(' - ', '')
                let data = this.selectTree.split(' - ')
                let data2 = ''
                for (let index = data.length - 1; index >= 0; index--) {
                    data2 += " - " + data[index]
                }
                this.selectTree = data2.replace(' - ', '')
        this.selectTree = ''
        this.getNodeParent(node)
        this.selectTree = this.selectTree.replace(' - ', '')
        let data = this.selectTree.split(' - ')
        let data2 = ''
        for (let index = data.length - 1; index >= 0; index--) {
          data2 += " - " + data[index]
        }
        this.selectTree = data2.replace(' - ', '')
        this.addOb.fatherId = val.id;
        this.componentData.entity.departId = val.id;
        this.refreshTable()
            },
      },
      nodeOpen(data, node, el) {
                $($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder-opened')
            },
        $($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder-opened')
      },
      nodeOpen0(data, node, el){
        this.currentCompaniesList[node.level-1] = data.id
      },
      nodeClose(data, node, el) {
                $($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder')
            },
        $($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder')
      },
      getNodeParent(val) {
                if (val.parent != null) {
                    this.selectTree += ' - ' + val.label
                    this.getNodeParent(val.parent)
                }
            },
        if (val.parent != null) {
          this.selectTree += ' - ' + val.label
          this.getNodeParent(val.parent)
        }
      },
      remove(node, data) {
                this.$confirm("是否删除该层级", "提示", {
                    type: "error"
                }).then(() => {
                    this.treeLoad = true
                    this.$axios.post(this.$api.department.delDepartment, {
                        id: data.id
                    }).then(res => {
                        if (res.code == 201) return
                        this.$message.success('已删除')
                        this.selectTreeList()
                    })
                }).catch(e => {})
            },
        this.$confirm("是否删除该层级", "提示", {
          type: "error"
        }).then(() => {
          this.treeLoad = true
          this.$axios.post(this.$api.department.delDepartment, {
            id: data.id
          }).then(res => {
            if (res.code == 201) return
            this.$message.success('已删除')
            this.selectTreeList()
          })
        }).catch(e => {})
      },
      selectTreeList() {
                this.treeLoad = true
                this.$axios.get(this.$api.department.selectDepartment).then(res => {
                    this.list = res.data
                    this.list.forEach(a => {
                        a.children.forEach(b => {
                            b.children.forEach(c => {
                                this.expandedKeys.push(c.id)
                            })
                        })
                    })
                    this.treeLoad = false
        this.treeLoad = true
        this.$axios.get(this.$api.department.selectDepartment).then(res => {
          this.list = res.data
          this.list.forEach(a => {
            a.children.forEach(b => {
              b.children.forEach(c => {
                this.expandedKeys.push(c.id)
              })
            })
          })
          this.treeLoad = false
          this.componentData.entity.departId = this.list[0].id;
          this.selectTree = '全部'
          this.refreshTable()
                })
            },
        })
      },
      addStandardTree() {
                if (this.addOb.name == null || this.addOb.factory == '') {
                    this.$message.error('构架名称是必填项')
                    return
                }
                this.addLoad = true
                this.$axios.post(this.$api.department.addDepartment, this.addOb, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    if (res.code === 201) {
                        this.addLoad = false
                        return
                    }
                    this.$message.success('添加成功')
                    this.addDia0 = false
                    this.selectTreeList()
                    this.addLoad = false
        if (this.addOb.name == null || this.addOb.factory == '') {
          this.$message.error('构架名称是必填项')
          return
        }
        this.addLoad = true
        this.$axios.post(this.$api.department.addDepartment, this.addOb, {
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(res => {
          if (res.code === 201) {
            this.addLoad = false
            return
          }
          this.$message.success('添加成功')
          this.addDia0 = false
          this.selectTreeList()
          this.addLoad = false
          this.addOb.name = ''
          this.addOb.fatherId = ''
                }).catch(e => {
                    this.addDia0 = false
                    this.addLoad = false
                })
            },
        }
    }
        }).catch(e => {
          this.addDia0 = false
          this.addLoad = false
        })
      },
      nodeClick2(ob, node, el) {
        this.currentCompaniesList[node.level-1] = ob.id
        if (ob.id !== 'SC21') {
          this.personLoad = true
          this.$axios.post(this.$api.companies.selectSimpleList, {
            companyId: ob.id
          }).then(res => {
            this.personListCopy = JSON.parse(JSON.stringify(res.data))
            this.personList = res.data
            this.personLoad = false
            this.$refs.personTable.doLayout()
          })
        }
      },
      handleSelectionChange(val) {
        this.multipleSelection = val;
      },
      addUser2(){
        if(this.multipleSelection.length === 0){
          return this.$message.error('请选择人员')
        }
        if(this.currentCompaniesList.length === 0){
          return this.$message.error('请选择组织')
        }
        for (let index = this.currentCompaniesList.length-1; index >1; index--) {
          let obj = this.multipleSelection.find(a=>a.companyId==this.currentCompaniesList[index])
          if(!obj){
            this.currentCompaniesList.splice(index,1)
          }else{
            return
          }
        }
        let arr = []
        this.currentCompaniesList.forEach(b=>{
          this.companiesList.forEach(a=>{
            if(a.companyId===b){
              console.log(a)
            }
          })
          let obj = this.companiesList.find(a=>a.companyId==b)
          arr.push(obj)
          })
        this.addLoad = true
        this.$axios.post(this.$api.companies.addPersonUser, {
          company: arr,
          person: this.multipleSelection
        }, {
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(res => {
          if (res.code === 201) {
            this.addLoad = false
            return
          }
          this.$message.success('操作成功')
          this.refresh()
          this.multipleSelection = []
          this.$refs.personTable.clearSelection()
          this.addthirdParty = false
        }).catch(e => {
          this.addthirdParty = false
          this.addLoad = false
        })
      },
      searchPerson(){
        let arr = JSON.parse(JSON.stringify(this.personListCopy))
        this.personList = arr.filter(a=>{
          if(a.employeeID.includes(this.userSearch2)||a.name.includes(this.userSearch2)){
            return true
          }
        })
      }
    }
  }
</script>
src/components/view/system-log.vue
@@ -106,4 +106,4 @@
            }
        }
    }
</script>
</script>
src/router/index.js
@@ -26,5 +26,8 @@
  },{
        path: "/test/excel",
        component: () => import("../components/tool/excel.vue")
    }]
    },{
    path: "/wordEdit",
    component: () => import("../components/tool/onlyoffice.vue")
  }]
})
src/view/notice.vue
@@ -190,8 +190,8 @@
    },
    goNoticeDetail(row){
      this.$axios.put(this.$api.informationNotification.triggerModificationStatusToRead+'/'+row.id).then(res => {
        this.drawer = false;
        row.num = Math.random(100);
        localStorage.setItem("noticeInfo", JSON.stringify(row))
        this.$bus.$emit("change", JSON.stringify(row));
        this.$parent.addTab({
          v: "消息详情",
@@ -206,6 +206,7 @@
        this.refresh();
        this.$emit('goNoticeDetail')
      })
      this.drawer = false;
    },
    handleDropdown(e,row){
      switch(e){