wanghong
2024-01-05 60c97371be338da5a707b4c6516e7a2dbe8ea2c9
Merge remote-tracking branch 'origin/master'
已修改32个文件
1532 ■■■■ 文件已修改
Source/UBCS-WEB/src/api/docking/info.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/enum.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeTemplatePro.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/code-dialog-page/cloneRuleDialog.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/dockingSearch/VciDockingSearch.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/docking/info.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/docking/loge.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/integrationIndex.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/original.vue 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/monitor/log/localLog.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/PasswordManagement/passwords.vue 551 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/user.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/wel/index.vue 453 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/MdmApplyGroupCodeProvider.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/controller/DockingPreApplyCodeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/DockingManagementController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeShowFieldConfigServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSrchCondConfigServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/DockingSystemConfigServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/EnumController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IEnumService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/EnumServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/ClassifyAuthController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/ClassifyAuthServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/docking/info.js
@@ -1,13 +1,13 @@
import request from '@/router/axios';
export const getList = (page, size, params) => {
export const getList = (page, limit, params) => {
  return request({
    url: '/api/ubcs-code/dockingManagement/gridSystemConfig',
    method: 'get',
    params: {
      ...params,
      page,
      size
      limit
    }
  })
}
Source/UBCS-WEB/src/api/omd/enum.js
@@ -75,7 +75,7 @@
export const update = (row) => {
  return request({
    url: '/api/ubcs-omd/enum/submit',
    url: '/api/ubcs-omd/enum/update',
    method: 'post',
    data: row
  })
Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue
@@ -64,6 +64,7 @@
      </el-table-column>
    </el-table>
    <div slot="footer" class="dialog-footer">
      <el-button type="info" plain @click="selectAllButton">按钮全选</el-button>
      <el-button class="el-icon-plus" type="success" plain @click="addClassifyAuth"></el-button>
      <el-button class="el-icon-minus" type="warning" plain @click="subClassifyAuth"></el-button>
      <el-button type="primary" plain @click="submit">提 交</el-button>
@@ -189,6 +190,10 @@
    },
    // 增加行
    addClassifyAuth() {
      if(this.roleList.length<=0){
        this.$message.warning("当前租户不存在角色信息!");
        return;
      }
      let item = {
        roleData: this.roleList[0].id,
        classifyItem: this.classifyData.label,
@@ -288,6 +293,18 @@
        window.console.log(error);
      })
    },
    // 全选按钮
    selectAllButton(){
      if(this.selectList.length!==1){
        this.$message.warning("请只选择一行需要全选的按钮的数据行!");
        return;
      }
      this.classifyAuthButton.forEach(item => {
        //console.log("item",item);
        Vue.set(this.classifyAuthData[0], item.id, true);
      });
      //console.log("this.classifyAuthData",this.classifyAuthData);
    },
  },
};
</script>
Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue
@@ -451,6 +451,9 @@
      type: Boolean,
      default: false
    },
    btnAuthList: {
      type:Array
    }
  },
  watch: {
    crudOid: {
@@ -1560,20 +1563,20 @@
    ...mapGetters(["permission"]),
    permissionList() {
      return {
        busineStatus: this.vaildData(this.permission.classifyTree.attr_add, false),
        fullscreenStatus: this.vaildData(this.permission.classifyTree.attr_view_edit, false),
        ruleStatus: this.vaildData(this.permission.classifyTree.attr_rule, false),
        attrStatus: this.vaildData(this.permission.classifyTree.attr_group, false),
        saveStatus: this.vaildData(this.permission.classifyTree.attr_save, false),
        resetStatus: this.vaildData(this.permission.classifyTree.attr_reset, false),
        injectStatus: this.vaildData(this.permission.classifyTree.attr_inject, false),
        isShowStatus: this.vaildData(this.permission.classifyTree.attr_formrule, false),
        enumStatus: this.vaildData(this.permission.classifyTree.attr_enum, false),
        cascadStatus: this.vaildData(this.permission.classifyTree.attr_parentcode, false),
        syncStatus: this.vaildData(this.permission.classifyTree.attr_sync, false),
        applicationStatus: this.vaildData(this.permission.classifyTree.attr_application, false),
        orderStatus: this.vaildData(this.permission.classifyTree.attr_sort, false),
        removeStatus: this.vaildData(this.permission.classifyTree.attr_delete, false),
        busineStatus: this.vaildData(this.btnAuthList.attr_add, false),
        fullscreenStatus: this.vaildData(this.btnAuthList.attr_view_edit, false),
        ruleStatus: this.vaildData(this.btnAuthList.attr_rule, false),
        attrStatus: this.vaildData(this.btnAuthList.attr_group, false),
        saveStatus: this.vaildData(this.btnAuthList.attr_save, false),
        resetStatus: this.vaildData(this.btnAuthList.attr_reset, false),
        injectStatus: this.vaildData(this.btnAuthList.attr_inject, false),
        isShowStatus: this.vaildData(this.btnAuthList.attr_formrule, false),
        enumStatus: this.vaildData(this.btnAuthList.attr_enum, false),
        cascadStatus: this.vaildData(this.btnAuthList.attr_parentcode, false),
        syncStatus: this.vaildData(this.btnAuthList.attr_sync, false),
        applicationStatus: this.vaildData(this.btnAuthList.attr_application, false),
        orderStatus: this.vaildData(this.btnAuthList.attr_sort, false),
        removeStatus: this.vaildData(this.btnAuthList.attr_delete, false),
      }
    },
    attrOids() {
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue
@@ -4,50 +4,26 @@
    <!--    左侧菜单-->
    <el-aside>
      <basic-container>
        <div>
          <div>
            <div style="display: flex; flex-direction: column;">
              <div style="display: flex;">
                <el-button v-if="permissionList.TreeAddStatus" plain size="small" type="primary" @click="TreeAdd">添加
                </el-button>
                <el-button v-if="permissionList.TreeEditStatus" plain size="small" type="primary" @click="TreeEdit">修改
                </el-button>
                <el-button v-if="permissionList.TreeDelStatus" plain size="small" type="primary" @click="TreeDel">删除
                </el-button>
                <el-button v-if="permissionList.flushedStatus" plain size="small" type="primary" @click="flushed">刷新
                </el-button>
              </div>
              <div style="display: flex; margin-top: 10px">
                <el-button v-if="permissionList.EnableStatus" plain size="small" type="primary" @click="Enable">启用
                </el-button>
                <el-button v-if="permissionList.DeactivateStatus" plain size="small" type="primary" @click="Deactivate">
                  停用
                </el-button>
                <el-button v-if="permissionList.ImportExcelStatus" plain size="small" type="primary"
                           @click.native="ImportExcel">导入
                </el-button>
                <el-button v-if="permissionList.ExportExcelStatus" plain size="small" type="primary"
                           @click="ExportExcel">导出
                </el-button>
              </div>
            </div>
            <div style="display: flex;margin-top: 5px;margin-bottom: 5px">
              <el-button v-if="permissionList.flowingBtnStuatus" plain size="mini" type="primary"
                         @click="flowingDependHandler">流水处理
              </el-button>
              <el-button v-if="permissionList.classifyAuth" plain size="mini" type="primary"
                         @click="classifyAuthHandler">分类授权
              </el-button>
            </div>
        <div  style="height: calc(100vh - 142px);!important;">
          <div class="headerCon" style="display: flex; flex-wrap: wrap;margin-bottom: 5px">
            <el-button v-if="permissionList.TreeAddStatus" plain size="small" type="primary" @click="TreeAdd">添加</el-button>
            <el-button v-if="permissionList.TreeEditStatus" plain size="small" type="primary" @click="TreeEdit">修改</el-button>
            <el-button v-if="permissionList.TreeDelStatus" plain size="small" type="primary" @click="TreeDel">删除</el-button>
            <el-button v-if="permissionList.flushedStatus" plain size="small" type="primary" @click="flushed">刷新</el-button>
            <el-button v-if="permissionList.EnableStatus" plain size="small" type="primary" @click="Enable">启用</el-button>
            <el-button v-if="permissionList.DeactivateStatus" plain size="small" type="primary" @click="Deactivate">停用</el-button>
            <el-button v-if="permissionList.ImportExcelStatus" plain size="small" type="primary" @click.native="ImportExcel">导入</el-button>
            <el-button v-if="permissionList.ExportExcelStatus" plain size="small" type="primary" @click="ExportExcel">导出</el-button>
            <el-button style="width: 56px;text-align: center;padding-left: 3px" v-if="permissionList.flowingBtnStuatus" plain size="small" type="primary" @click="flowingDependHandler">流水处理</el-button>
            <el-button style="width: 56px;text-align: center;padding-left: 3px"  v-if="permissionList.classifyAuth" plain size="small" type="primary" @click="classifyAuthHandler">分类授权</el-button>
          </div>
        </div>
        <!-- 左侧树-->
        <div style="height: calc(100vh - 230px);overflow: auto">
          <!-- 左侧树-->
          <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="CloneTreedata"
                     :defaultExpandAll="false"
                     :option="Treeoption"
                     class="classifyTree"
                     style="height: calc(100vh - 290px)"
                     style="height: 690px"
                     @node-click="nodeClick"
          >
            <template slot-scope="{ node, data }" class="el-tree-node__label">
@@ -61,8 +37,8 @@
              </el-tooltip>
            </template>
          </avue-tree>
        </div>
        </div>
        <!-- 树节点添加对话框-->
        <el-dialog v-loading="AddLoading" :before-close="TreeEscHandler"
                   :title="this.TreeFlag ? '添加分类' :'添加主题库'" :visible.sync="TreeAddFormVisible" append-to-body
@@ -279,7 +255,7 @@
          </basic-container>
          <templatePro :Formlist="this.Formlist" :ProData="this.ProData" :codeClassifyOid="this.codeClassifyOid"
                       :crudArray="this.crudArray" :crudLCStatus="this.crudLCStatus" :crudOid="this.crudOid"
                       :rowIndex="this.selectRow"></templatePro>
                       :rowIndex="this.selectRow" :btnAuthList="btnAuthList"></templatePro>
        </span>
        <!--     编码规则-->
        <el-dialog :before-close="masterEscHandler" :visible.sync="MasterdialogVisible" append-to-body
@@ -451,12 +427,14 @@
import func from "@/util/func";
import {mapGetters} from "vuex";
import ClassifyAuth from './ClassifyAuthDialog.vue';
import {getAuthButtonList} from '@/api/system/classifyAuth'
export default {
  components: {ClassifyAuth},
  name: "classifyTrees.vue",
  data() {
    return {
      btnAuthList: [],
      activeName: 'first',
      masterRow: null,
      AddLoading: false,
@@ -830,6 +808,9 @@
        this.$refs.tree.setCurrentKey(null);
        this.nodeClickList = {};
        this.TreeFlagCode = true;
        // this.$nextTick(()=>{
        //   this.btnAuthList = [];
        // })
      }
    }, true)
  },
@@ -837,20 +818,25 @@
    ...mapGetters(["permission"]),
    permissionList() {
      return {
        TreeAddStatus: this.vaildData(this.permission.classifyTree.tree_add, false),
        TreeEditStatus: this.vaildData(this.permission.classifyTree.tree_edit, false),
        TreeDelStatus: this.vaildData(this.permission.classifyTree.tree_delete, false),
        flushedStatus: this.vaildData(this.permission.classifyTree.tree_break, false),
        EnableStatus: this.vaildData(this.permission.classifyTree.tree_enable, false),
        DeactivateStatus: this.vaildData(this.permission.classifyTree.tree_stop, false),
        ImportExcelStatus: this.vaildData(this.permission.classifyTree.tree_import, false),
        ExportExcelStatus: this.vaildData(this.permission.classifyTree.tree_export, false),
        FindStatus: this.vaildData(this.permission.classifyTree.manage_search, false),
        TemRefreshStatus: this.vaildData(this.permission.classifyTree.manage_break, false),
        CloneBtnStuatus: this.vaildData(this.permission.classifyTree.manage_clone, false),
        flowingBtnStuatus: this.vaildData(this.permission.classifyTree.tree_flowing, false),
        classifyAuth: this.vaildData(this.permission.classifyTree.classify_auth, false),
        TreeAddStatus: this.vaildData(this.btnAuthList.tree_add, false),
        TreeEditStatus: this.vaildData(this.btnAuthList.tree_edit, false),
        TreeDelStatus: this.vaildData(this.btnAuthList.tree_delete, false),
        flushedStatus: this.vaildData(this.btnAuthList.tree_break, false),
        EnableStatus: this.vaildData(this.btnAuthList.tree_enable, false),
        DeactivateStatus: this.vaildData(this.btnAuthList.tree_stop, false),
        ImportExcelStatus: this.vaildData(this.btnAuthList.tree_import, false),
        ExportExcelStatus: this.vaildData(this.btnAuthList.tree_export, false),
        FindStatus: this.vaildData(this.btnAuthList.manage_search, false),
        TemRefreshStatus: this.vaildData(this.btnAuthList.manage_break, false),
        CloneBtnStuatus: this.vaildData(this.btnAuthList.manage_clone, false),
        flowingBtnStuatus: this.vaildData(this.btnAuthList.tree_flowing, false),
        classifyAuth: this.vaildData(this.btnAuthList.classify_auth, false),
      }
    },
    treeStyle() {
      return {
        height: this.btnAuthList.length > 0 ? '620px' : '785px',
      };
    },
    crudTreeOption() {
      return {
@@ -1428,6 +1414,11 @@
    },
    //树点击事件
    async nodeClick(data) {
      getAuthButtonList({classifyId: data.oid}).then(res => {
        this.btnAuthList = res.data.data;
      }).catch(error => {
        console.log(error)
      })
      //操作新增和修改的业务类型隐藏
      this.TreeFlagCode = !data;
      this.editTreeFLagCode = !data.parentId;
@@ -1772,4 +1763,18 @@
  width: 500px;
}
.headerCon{
  .el-button+.el-button {
    margin-left: 5px;
  }
  .el-button {
    margin-top: 5px;
  }
}
.headerCon > .el-button:nth-child(5) {
  margin-left: 0;
}
.headerCon > .el-button:nth-child(9) {
  margin-left: 0;
}
</style>
Source/UBCS-WEB/src/components/Theme/ThemeTemplatePro.vue
@@ -2,7 +2,7 @@
  <basic-container>
    <avue-tabs :option="Taboption" @change="handleChange"></avue-tabs>
    <span v-if="type.prop==='tab1'">
      <attrCrud :ProData="ProData"  :crudOid="crudOid" :checkStatus="checkStatus"  :crudLCStatus="crudLCStatus" :crudArray="crudArray" :Formlist="Formlist" :codeClassifyOid="codeClassifyOid"></attrCrud>
      <attrCrud :ProData="ProData" :btnAuthList="btnAuthList" :crudOid="crudOid" :checkStatus="checkStatus"  :crudLCStatus="crudLCStatus" :crudArray="crudArray" :Formlist="Formlist" :codeClassifyOid="codeClassifyOid"></attrCrud>
    </span>
    <span v-else-if="type.prop==='tab2'">
       <FlowPath ref="FlowPath" :code="this.crudOid"  :checkStatus="checkStatus" :crudLCStatus="crudLCStatus" :Formlist="Formlist"></FlowPath>
@@ -18,7 +18,7 @@
<script>
export default {
  name: "TemplatePro.vue",
  props: ['ProData','crudOid','crudLCStatus','crudArray','Formlist','codeClassifyOid','rowIndex','crudArrayFlag'],
  props: ['ProData','crudOid','crudLCStatus','crudArray','Formlist','codeClassifyOid','rowIndex','crudArrayFlag','btnAuthList'],
  data: function () {
    return {
      type: {},
Source/UBCS-WEB/src/components/code-dialog-page/cloneRuleDialog.vue
@@ -125,6 +125,7 @@
        closeCloneDialog(){
            this.$emit('update:visible',false);
            this.cloneData = [];
            this.cloneCodeRuleLoading = false;
        },    
        /** 上移下移基础码段*/
        async upOrderNum(row) {
@@ -211,6 +212,7 @@
            },
            (error) => {
                window.console.log(error);
                this.cloneCodeRuleLoading = false;
            });
        },
Source/UBCS-WEB/src/components/dockingSearch/VciDockingSearch.vue
@@ -121,7 +121,7 @@
    SaveHandler(){
      let name = this.SearchObject.searchData[this.formInline.type].prop;
      const requestApi = (api) => {
        api(this.page.currentPage, this.page.pageSize, { [`conditionMap[${name}_like]`]: this.formInline.text}).then(res => {
        api(this.page.currentPage, this.page.pageSize,'createTime','desc',{[`conditionMap[${name}_like]`]: this.formInline.text}).then(res => {
          if(!res.data.data.records){
            this.$message.error('暂未查到数据!')
          }else {
@@ -149,7 +149,7 @@
      const { cut, state, stateTask, Date, lastDate, taskCut } = this.formInline;
      const requestParams = {};
      const requestApi = (api) => {
        api(currentPage, pageSize, requestParams).then(res => {
        api(currentPage, pageSize,'createTime','desc',requestParams).then(res => {
          if(!res.data.data.records){
            this.$message.error('暂未查到数据!');
          } else {
Source/UBCS-WEB/src/views/docking/info.vue
@@ -40,8 +40,7 @@
            <el-button v-if="permissionList.sync" icon="el-icon-share" size="small" @click="PUSH">同 步
            </el-button>
            <el-button v-if="permissionList.query" icon="el-icon-search" size="small"
                       @click="openAdvancedQuery">查
              询
                       @click="openAdvancedQuery">查 询
            </el-button>
          </template>
        </avue-crud>
Source/UBCS-WEB/src/views/docking/loge.vue
@@ -315,13 +315,13 @@
    },
    onLoad(page, params={}) {
      this.loading = true;
      var query={}
      var queryCondition={}
      if (this.query) {
        for (var key in this.query) {
          query['conditionMap["' + key + '"]'] = this.query[key];
          queryCondition['conditionMap["' + key + '"]'] = this.query[key];
        }
      }
      getLogoList(page.currentPage, page.pageSize,'createTime','desc',Object.assign(params,this.params, query,this.query),).then(res => {
      getLogoList(page.currentPage, page.pageSize,'createTime','desc',Object.assign(params,this.params, queryCondition,this.query),).then(res => {
        const data = res.data.data;
        this.page.total = data.total;
        this.data = data.records;
Source/UBCS-WEB/src/views/integration/integrationIndex.vue
@@ -1,21 +1,31 @@
<template>
  <div>
    <el-container style="height: 100%; border: 1px solid #fff">
      <el-card :style="{ marginRight: '10px' }">
        <el-aside style="background-color: #fff" width="220px">
      <el-card style="margin-right: 10px;height:  calc(100vh - 125px);overflow: auto">
        <el-aside style="background-color: #fff;" width="210px">
          <el-input v-model="filterText" placeholder="输入关键字进行过滤">
          </el-input>
          <el-menu :default-openeds="['1', '3']" >
            <el-tree  ref="tree" :data="treeData" :filter-node-method="filterNode" :props="defaultProps"
                     accordion class="filter-tree" empty-text="暂无数据" @node-click="handelTreeCell">
              <template slot-scope="{ node, data }" class="el-tree-node__label">
                <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item"
                            effect="dark"
                            open-delay="500"
                            placement="right-start">
                <span style="font-size: 14px;">
                {{ (node || {}).label }}
              </span>
                </el-tooltip>
              </template>
            </el-tree>
          </el-menu>
        </el-aside>
      </el-card>
      <el-main>
        <el-card>
      <el-main >
        <el-card style="height: calc(100vh - 128px)">
          <el-form :model="form">
            <el-form-item label="集团分类" label-width="70px" size="small">
            <el-form-item label="集团分类" label-width="80px" size="small">
              <el-select ref="selectTree" v-model="groupVal" clearable placeholder="请选择"
                         popper-class="popperTreeSelect">
                <el-option :label="groupVal" :value="groupVal">
@@ -27,7 +37,7 @@
            </el-form-item>
          </el-form>
          <el-card>
          <el-card  style="height:38vh">
            <avue-crud ref="crudMapping" :data="mappingData" :option="optionMapping" :table-loading="loading"
                       @select="setCurrentRow" @row-update="handleMapingUpdate"
                       @row-click="handleMapingClick" @row-dblclick="handleMapingRowClick" @selection-change="selectionChange"
@@ -47,7 +57,7 @@
              </template>
            </avue-crud>
          </el-card>
          <el-card :style="{ marginTop: '20px'}">
          <el-card style="margin-top: 10px;height: 38vh">
            <avue-crud ref="crudRange" :data="rangeData" :option="optinoRange" :style="{ marginTop: '-20px'}"
                       @row-update="handleUpdate"
                       @row-dblclick="handleRowClick">
@@ -117,21 +127,21 @@
      // 属性映射取值表配置
      optinoRange: {
        title: '属性映射取值范围',
        maxHeight: '300px',
        maxHeight: '280px',
        header: false,
        rowKey: 'oid',
        column: [
          {label: '属性集团枚举值', prop: 'numTextValue', minWidth: 80},
          {label: '集团属性枚举显示名称', prop: 'numText', minWidth: 80},
          {
            label: 'MDM枚举值',
            label: 'CODE枚举值',
            prop: 'targetNumTextValue',
            minWidth: 80,
            cell: true,
            blur: (value) => window.handleBlur(value, 'range')
          },
          {
            label: 'MDM枚举显示名称',
            label: 'CODE枚举显示名称',
            prop: 'targetNumText',
            minWidth: 80,
            cell: true,
@@ -142,7 +152,7 @@
      },
      // 属性映射表配置
      optionMapping: {
        maxHeight: '500px',
        maxHeight: '280px',
        header: true,
        rowKey: 'oid',
        selection: false,
Source/UBCS-WEB/src/views/modeling/original.vue
@@ -3,7 +3,7 @@
    <el-main>
      <basic-container>
        <avue-crud v-model="form" ref="crud" :option="option" :data="data" @on-load="onLoad" :page.sync="page" :permission="permissionList"
          @refresh-change="refreshChange" @row-click="rowClick">
          @refresh-change="refreshChange" @row-click="rowClick" style="height: calc(100vh - 148px)">
          <template slot="radio" slot-scope="{row}">
            <el-radio v-model="selectRow" :label="row.$index">&nbsp;
            </el-radio>
@@ -35,7 +35,8 @@
    </el-main>
    <el-aside>
      <basic-container class="itemForm">
        <el-descriptions class="margin-top" :column="1" size="medium" border title="属性项">
      <div style="height: 44vh">
        <el-descriptions class="margin-top" :column="1" size="medium" border title="属性项" >
          <el-descriptions-item>
            <template slot="label">
              属性编号
@@ -54,12 +55,12 @@
            </template>
            {{ itemForm.itemData.typeValue }}
          </el-descriptions-item>
<!--          <el-descriptions-item>
            <template slot="label">
              标签
            </template>
            {{ itemForm.itemData.hashtag }}
          </el-descriptions-item>-->
          <!--          <el-descriptions-item>
                      <template slot="label">
                        标签
                      </template>
                      {{ itemForm.itemData.hashtag }}
                    </el-descriptions-item>-->
          <el-descriptions-item>
            <template slot="label">
              默认值
@@ -85,48 +86,50 @@
            {{ itemForm.itemData.description }}
          </el-descriptions-item>
        </el-descriptions>
        <div style="height:15px"></div>
        <el-descriptions class="margin-top" :column="1" size="medium" border title="属性配置"></el-descriptions>
        <el-tabs v-model="itemForm.activeName" @tab-click="handleClick" stretch="true" style="height:235px">
          <el-tab-pane label="参照" name="referTab">
            <el-descriptions class="margin-top" :column="1" size="medium" border>
              <el-descriptions-item>
                <template slot="label">
                  使用参照
                </template>
                {{ itemForm.itemData.referTypeValue ? '是' : '否' }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  参照类型
                </template>
                {{ itemForm.itemData.referTypeValue }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  参照名称
                </template>
                {{ itemForm.itemData.referToName }}
              </el-descriptions-item>
            </el-descriptions>
          </el-tab-pane>
          <el-tab-pane label="枚举" name="enumTab">
            <el-descriptions class="margin-top" :column="1" :size="small" border>
              <el-descriptions-item>
                <template slot="label">
                  使用枚举
                </template>
                {{ itemForm.itemData.usingDict ? '是' : '否' }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  枚举类型
                </template>
                {{ itemForm.itemData.dictValue }}
              </el-descriptions-item>
            </el-descriptions>
          </el-tab-pane>
        </el-tabs>
      </div>
        <div style="height: 40vh">
          <el-descriptions class="margin-top" :column="1" size="medium" border title="属性配置"></el-descriptions>
          <el-tabs v-model="itemForm.activeName" @tab-click="handleClick" stretch="true" style="height:235px">
            <el-tab-pane label="参照" name="referTab">
              <el-descriptions class="margin-top" :column="1" size="medium" border>
                <el-descriptions-item>
                  <template slot="label">
                    使用参照
                  </template>
                  {{ itemForm.itemData.referTypeValue ? '是' : '否' }}
                </el-descriptions-item>
                <el-descriptions-item>
                  <template slot="label">
                    参照类型
                  </template>
                  {{ itemForm.itemData.referTypeValue }}
                </el-descriptions-item>
                <el-descriptions-item>
                  <template slot="label">
                    参照名称
                  </template>
                  {{ itemForm.itemData.referToName }}
                </el-descriptions-item>
              </el-descriptions>
            </el-tab-pane>
            <el-tab-pane label="枚举" name="enumTab">
              <el-descriptions class="margin-top" :column="1" :size="small" border>
                <el-descriptions-item>
                  <template slot="label">
                    使用枚举
                  </template>
                  {{ itemForm.itemData.usingDict ? '是' : '否' }}
                </el-descriptions-item>
                <el-descriptions-item>
                  <template slot="label">
                    枚举类型
                  </template>
                  {{ itemForm.itemData.dictValue }}
                </el-descriptions-item>
              </el-descriptions>
            </el-tab-pane>
          </el-tabs>
        </div>
      </basic-container>
    </el-aside>
    <originalAdd ref="originalAdd" @refreshTable="refreshChange" :attribute="editAttribute"></originalAdd>
@@ -162,7 +165,7 @@
      editAttribute: {},
      applyRangeData: [],
      option: {
        height: "auto",
        height:'auto',
        calcHeight:20,
        headerAlign: "center",
        border: true,
Source/UBCS-WEB/src/views/monitor/log/localLog.vue
@@ -97,11 +97,11 @@
              prop: "logType",
              width:'160'
            },
            {
            /*{
              label: "创建时间",
              prop: "createTime",
              width:'160'
            },
            },*/
            {
              label: "最后修改时间",
              prop: "lastModifier",
Source/UBCS-WEB/src/views/system/PasswordManagement/passwords.vue
@@ -1,21 +1,22 @@
<template>
  <basic-container >
    <avue-crud v-model="form" :option="option" :data="data" ref="crud"  @on-load="onLoad" @row-save="rowSave" @row-update="rowUpdate" @row-del="rowDel" :page.sync="page">
  <basic-container>
    <avue-crud ref="crud" v-model="form" :data="data" :option="option" :page.sync="page" @on-load="onLoad"
               @row-save="rowSave" @row-update="rowUpdate" @row-del="rowDel">
      <template slot="menu" slot-scope="{ row, index }">
        <el-button
          type="text"
          size="small"
          icon="el-icon-edit"
          v-if="permissionList.editBtn"
          icon="el-icon-edit"
          size="small"
          type="text"
          @click="handleEdit(row, index)"
        >
          编辑
        </el-button>
        <el-button
          type="text"
          size="small"
          icon="el-icon-delete"
          v-if="permissionList.delBtn"
          icon="el-icon-delete"
          size="small"
          type="text"
          @click="handleDel(row, index)"
        >
          删除
@@ -39,15 +40,16 @@
  combination
} from "@/api/system/passwords";
import {mapGetters} from "vuex";
export default {
  name: "passwords.vue",
  data() {
    return {
      //最小长度绑定value
      values:"",
      values: "",
      //最大长度绑定value
      values1:"",
      form:{},
      values1: "",
      form: {},
      page: {
        pageSize: 10,
        currentPage: 1,
@@ -56,22 +58,22 @@
      data: [],
      //添加存放多选的变量,用于下拉菜单的禁用效果和必填种类是否大于组合方式然后提示用户重新选择
      checkboxlength:"",
      checkboxlength: "",
      //这个是下拉菜单的数据变量
      selectlength:"",
      selectlength: "",
      //这个是用于防止change时间冒泡,出现两次弹窗定义的变量
      checkboxlist:"",
      checkboxlist: "",
      //用于首次点击编辑,判断组合方式是否小于必填种类的变量
      checkboxNumber:"",
      selectNumber:"",
      checkboxNumber: "",
      selectNumber: "",
      //这个也是存放多选的变量,效果一样,只是用作在编辑模块
      checkboxedit:"",
      checkboxedit: "",
      // 用于判断是否是编辑
      editFlag:false
      editFlag: false
    }
  },
  computed:{
  computed: {
    ...mapGetters(["permission"]),
    permissionList() {
      return {
@@ -89,245 +91,246 @@
        editBtn: this.vaildData(this.permission.password.password_edit, false),
      };
    },
    option(){
      return{
          headerAlign: 'center',
          align: 'center',
          columnBtn:false,
          border: true,
          index: true,
          rowKey:'id',
          addBtn:this.permissionList.addBtn,
          editBtn:false,
          height:700,
          delBtn:false,
          column: [
            {
              label: '策略名称',
              prop: 'strategyName',
              align: 'left',
              span:24,
              labelWidth: "11%",
              rules: [{
                required: true,
                message: "请输入策略名称",
                trigger: "blur"
              }]
            },
            {
              label: '密码最小长度',
              prop: 'minPwdLen',
              span:12,
              labelWidth:"22%",
              rules: [{
                required: true,
                validator:(rule, value,callback)=>{
                  this.values=value*1
                  if(value == ""){
                    callback(new Error('请输入密码最小长度'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('密码最小长度的输入类型只能为数字类型'));
                  }else if(this.values >= this.values1 && this.values1 != 0){
                    callback(new Error('密码最小长度不能大于密码最大长度'))
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
            {
              label: '密码最大长度',
              prop: 'maxPwdLen',
              span:12,
              labelWidth:"25%",
              rules: [{
                required: true,
                validator:(rule, value,callback) =>{
                  this.values1=value*1
                  if(value == ""){
                    callback(new Error('请输入密码最大长度'));
                  }else if(this.values1 <= this.values){
                    callback(new Error('密码最大长度不能小于密码最大长度'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('密码最大长度的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'change'
              }]
            },
            {
              label: '组合方法',
              prop: 'combinationNames',
              labelWidth: 91,
              display:false,
            },
            {
              label: '组合方法',
              prop: 'combinationIds',
              type: "checkbox",
              span:12,
              labelWidth:"22%",
              id:5,
              hide:true,
              change: this.handleCheckboxChange,
              rules: [{
                required: true,
                message: "请选择组合方法",
                trigger: "blur"
              }],
              dicUrl: '/api/ubcs-system/combination/select',
              dicMethod: 'get',
              props: {
                value: "ID",
                label: "NAME",
              },
            },
            {
              label: '必填种类',
              prop: 'requiredType',
              type: 'select',
              span:12,
              labelWidth:"25%",
              change:this.handleSelectChange,
              rules: [{
                required: true,
                message: "请选择必填种类",
                trigger: "blur"
              }],
              dicData:[{
                label:'1种',
                value:1,
                disabled:false
              },
                {
                  label:'2种',
                  value:2,
                  disabled:false
                },
                {
                  label:'3种',
                  value:3,
                  disabled:false
                },
                {
                  label:'4种',
                  value:4,
                  disabled:false
    option() {
      return {
        headerAlign: 'center',
        align: 'center',
        columnBtn: false,
        border: true,
        index: true,
        rowKey: 'id',
        addBtn: this.permissionList.addBtn,
        editBtn: false,
        height: 700,
        delBtn: false,
        refreshBtn: false,
        column: [
          {
            label: '策略名称',
            prop: 'strategyName',
            align: 'left',
            span: 24,
            labelWidth: "11%",
            rules: [{
              required: true,
              message: "请输入策略名称",
              trigger: "blur"
            }]
          },
          {
            label: '密码最小长度',
            prop: 'minPwdLen',
            span: 12,
            labelWidth: "22%",
            rules: [{
              required: true,
              validator: (rule, value, callback) => {
                this.values = value * 1
                if (value == "") {
                  callback(new Error('请输入密码最小长度'));
                } else if (/[^\d]/g.test(value)) {
                  callback(new Error('密码最小长度的输入类型只能为数字类型'));
                } else if (this.values >= this.values1 && this.values1 != 0) {
                  callback(new Error('密码最小长度不能大于密码最大长度'))
                } else {
                  callback();
                }
              ]
              },
              trigger: 'blur'
            }]
          },
          {
            label: '密码最大长度',
            prop: 'maxPwdLen',
            span: 12,
            labelWidth: "25%",
            rules: [{
              required: true,
              validator: (rule, value, callback) => {
                this.values1 = value * 1
                if (value == "") {
                  callback(new Error('请输入密码最大长度'));
                } else if (this.values1 <= this.values) {
                  callback(new Error('密码最大长度不能小于密码最大长度'));
                } else if (/[^\d]/g.test(value)) {
                  callback(new Error('密码最大长度的输入类型只能为数字类型'));
                } else {
                  callback();
                }
              },
              trigger: 'change'
            }]
          },
          {
            label: '组合方法',
            prop: 'combinationNames',
            labelWidth: 91,
            display: false,
          },
          {
            label: '组合方法',
            prop: 'combinationIds',
            type: "checkbox",
            span: 12,
            labelWidth: "22%",
            id: 5,
            hide: true,
            change: this.handleCheckboxChange,
            rules: [{
              required: true,
              message: "请选择组合方法",
              trigger: "blur"
            }],
            dicUrl: '/api/ubcs-system/combination/select',
            dicMethod: 'get',
            props: {
              value: "ID",
              label: "NAME",
            },
            {
              label: '过期时间(天)',
              prop:'expirationTime',
              span:12,
              labelWidth:"22%",
              rules: [{
                required: true,
                validator: (rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入过期时间'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('过期时间的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
          },
          {
            label: '必填种类',
            prop: 'requiredType',
            type: 'select',
            span: 12,
            labelWidth: "25%",
            change: this.handleSelectChange,
            rules: [{
              required: true,
              message: "请选择必填种类",
              trigger: "blur"
            }],
            dicData: [{
              label: '1种',
              value: 1,
              disabled: false
            },
            {
              label: '提醒时间(天)',
              prop:'reminderTime',
              span:12,
              labelWidth:"25%",
              rules: [{
                required: true,
                validator:(rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入过期时间'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('过期时间的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
            {
              label: '锁定次数(次)',
              prop:'lockingNum',
              span:12,
              labelWidth:"22%",
              rules: [{
                required: true,
                validator:(rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入锁定次数'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('锁定次数的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
            {
              label: '锁定时间(分钟)',
              prop:'lockingTime',
              span:12,
              labelWidth:"25%",
              rules: [{
                required: true,
                validator:(rule, value,callback) => {
                  if(value == ""){
                    callback(new Error('请输入锁定时间'));
                  }else if(/[^\d]/g.test(value)){
                    callback(new Error('锁定时间的输入类型只能为数字类型'));
                  }else {
                    callback();
                  }
                },
                trigger: 'blur'
              }]
            },
            {
              label: '描述',
              prop:'desc',
              type: 'textarea',
              span:12,
              labelWidth:"22%",
              rows: 5,
            },
            {
              label: '是否为默认策略',
              prop: 'isDefault',
              type: 'switch',
              labelWidth: 132,
              dicData:[{
                label:'否',
                value:0
              },{
                label:'是',
                value:1
              }]
            }
          ],
              {
                label: '2种',
                value: 2,
                disabled: false
              },
              {
                label: '3种',
                value: 3,
                disabled: false
              },
              {
                label: '4种',
                value: 4,
                disabled: false
              }
            ]
          },
          {
            label: '过期时间(天)',
            prop: 'expirationTime',
            span: 12,
            labelWidth: "22%",
            rules: [{
              required: true,
              validator: (rule, value, callback) => {
                if (value == "") {
                  callback(new Error('请输入过期时间'));
                } else if (/[^\d]/g.test(value)) {
                  callback(new Error('过期时间的输入类型只能为数字类型'));
                } else {
                  callback();
                }
              },
              trigger: 'blur'
            }]
          },
          {
            label: '提醒时间(天)',
            prop: 'reminderTime',
            span: 12,
            labelWidth: "25%",
            rules: [{
              required: true,
              validator: (rule, value, callback) => {
                if (value == "") {
                  callback(new Error('请输入过期时间'));
                } else if (/[^\d]/g.test(value)) {
                  callback(new Error('过期时间的输入类型只能为数字类型'));
                } else {
                  callback();
                }
              },
              trigger: 'blur'
            }]
          },
          {
            label: '锁定次数(次)',
            prop: 'lockingNum',
            span: 12,
            labelWidth: "22%",
            rules: [{
              required: true,
              validator: (rule, value, callback) => {
                if (value == "") {
                  callback(new Error('请输入锁定次数'));
                } else if (/[^\d]/g.test(value)) {
                  callback(new Error('锁定次数的输入类型只能为数字类型'));
                } else {
                  callback();
                }
              },
              trigger: 'blur'
            }]
          },
          {
            label: '锁定时间(分钟)',
            prop: 'lockingTime',
            span: 12,
            labelWidth: "25%",
            rules: [{
              required: true,
              validator: (rule, value, callback) => {
                if (value == "") {
                  callback(new Error('请输入锁定时间'));
                } else if (/[^\d]/g.test(value)) {
                  callback(new Error('锁定时间的输入类型只能为数字类型'));
                } else {
                  callback();
                }
              },
              trigger: 'blur'
            }]
          },
          {
            label: '描述',
            prop: 'desc',
            type: 'textarea',
            span: 12,
            labelWidth: "22%",
            rows: 5,
          },
          {
            label: '是否为默认策略',
            prop: 'isDefault',
            type: 'switch',
            labelWidth: 132,
            dicData: [{
              label: '否',
              value: 0
            }, {
              label: '是',
              value: 1
            }]
          }
        ],
      }
    }
  },
  created() {
    this.onLoad()
  },
  methods:{
    handleSelectChange(val){
      this.selectlength=val
  methods: {
    handleSelectChange(val) {
      this.selectlength = val
    },
    handleCheckboxChange(val) {
      const arr = this.option.column[5];
@@ -397,7 +400,7 @@
        showClose: true,
      });
    },
    rowDel(row){
    rowDel(row) {
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
@@ -412,15 +415,15 @@
            message: "操作成功!"
          });
          this.onLoad();
        }).catch(res=>{
        }).catch(res => {
        // console.log(res)
      })
    },
    rowSave(row,done){
    rowSave(row, done) {
      //将密码组合方式的数据转换为字符串
      const spliceId= row.combinationIds.toString()
      row.combinationIds=spliceId
      getadd(row).then((res)=>{
      const spliceId = row.combinationIds.toString()
      row.combinationIds = spliceId
      getadd(row).then((res) => {
        // this.onLoad(this.page);
        this.$message({
          type: "success",
@@ -428,37 +431,37 @@
        });
        done(row)
        this.onLoad()
      }).catch((res)=>{
      }).catch((res) => {
        this.$message.warning(res)
      })
    },
    rowEdit(row){
    rowEdit(row) {
      // console.log("打开编辑edit",row)
    },
    handleDel(row){
      this.$refs.crud.rowDel(row,row.$index);
    handleDel(row) {
      this.$refs.crud.rowDel(row, row.$index);
    },
    handleEdit(row){
      this.$refs.crud.rowEdit(row,row.$index);
      this.editFlag=true;
      this.checkboxNumber=row.combinationIds.split(",")
      this.selectNumber=row.requiredType
        if(this.checkboxNumber.length < this.selectNumber){
          this.$message({
            type:"warning",
            message:"必填种类不能大于组合方法,请重新选择!"
          })
        }
    handleEdit(row) {
      this.$refs.crud.rowEdit(row, row.$index);
      this.editFlag = true;
      this.checkboxNumber = row.combinationIds.split(",")
      this.selectNumber = row.requiredType
      if (this.checkboxNumber.length < this.selectNumber) {
        this.$message({
          type: "warning",
          message: "必填种类不能大于组合方法,请重新选择!"
        })
      }
    },
    rowUpdate(row,index,done){
      getupdata(row).then(()=>{
    rowUpdate(row, index, done) {
      getupdata(row).then(() => {
        this.onLoad()
        this.$message({
          type: "success",
          message: "修改成功!"
        });
        done()
      }).catch(res=>{
      }).catch(res => {
        // console.log(res)
      })
    },
@@ -471,8 +474,8 @@
        // this.loading = false;
        // this.selectionClear();
        // console.log(res)
        this.page.total=res.data.data.total
        this.data=res.data.data.records
        this.page.total = res.data.data.total
        this.data = res.data.data.records
      });
    }
  }
Source/UBCS-WEB/src/views/system/user.vue
@@ -94,19 +94,19 @@
          </template>
          <template slot="tenantName"
                    slot-scope="{row}">
            <el-tag>{{ row.tenantName }}</el-tag>
            <el-tag v-if="row.tenantName">{{ row.tenantName }}</el-tag>
          </template>
          <template slot="roleName"
                    slot-scope="{row}">
            <el-tag>{{ row.roleName }}</el-tag>
            <el-tag v-if="row.roleName">{{ row.roleName }}</el-tag>
          </template>
          <template slot="deptName"
                    slot-scope="{row}">
            <el-tag>{{ row.deptName }}</el-tag>
            <el-tag v-if="row.deptName">{{ row.deptName }}</el-tag>
          </template>
          <template slot="userTypeName"
                    slot-scope="{row}">
            <el-tag>{{ row.userTypeName }}</el-tag>
            <el-tag v-if="row.userTypeName">{{ row.userTypeName }}</el-tag>
          </template>
        </avue-crud>
        </div>
Source/UBCS-WEB/src/views/wel/index.vue
@@ -15,41 +15,44 @@
    <el-row>
      <el-col :span="24">
        <basic-container title="待办流程任务">
          <avue-crud ref="crud" :table-loading="loading" :data="todoData" :option="todoOption"
          <avue-crud ref="crud" :data="todoData" :option="todoOption" :page.sync="page"
                     :table-loading="loading"
                     @on-load="onLoad"
                     @cell-click="cellHandle"
                     :page.sync="page">
                     @cell-click="cellHandle">
            <template #menu="{size,row,index}">
              <el-button @click="gotodo(row,index)"
              <el-button :size="size"
                         icon="el-icon-check"
                         type="text"
                         :size="size">执行</el-button>
                         @click="gotodo(row,index)">执行
              </el-button>
            </template>
          </avue-crud>
        </basic-container>
      </el-col>
<!--      <el-col :span="8">-->
<!--        <el-row>-->
<!--          <basic-container title="消息列表">-->
<!--            <el-collapse v-model="logActiveNames" @change="handleChange">-->
<!--              <el-collapse-item v-for="item in noticeData" :title="item.title" :name="item.id">-->
<!--                <div>{{item.subtitle}}</div>-->
<!--              </el-collapse-item>-->
<!--            </el-collapse>-->
<!--          </basic-container>-->
<!--        </el-row>-->
      <!--      <el-col :span="8">-->
      <!--        <el-row>-->
      <!--          <basic-container title="消息列表">-->
      <!--            <el-collapse v-model="logActiveNames" @change="handleChange">-->
      <!--              <el-collapse-item v-for="item in noticeData" :title="item.title" :name="item.id">-->
      <!--                <div>{{item.subtitle}}</div>-->
      <!--              </el-collapse-item>-->
      <!--            </el-collapse>-->
      <!--          </basic-container>-->
      <!--        </el-row>-->
<!--      </el-col>-->
      <!--      </el-col>-->
    </el-row>
    <el-dialog title="修改密码" :visible.sync="dialogFormVisible" append-to-body  :close-on-press-escape="false" :before-close="Xdelhandle">
      <el-form :model="form"  :rules="rules" ref="form">
        <el-form-item label="原密码" :label-width="formLabelWidth" prop="oldPassword">
    <el-dialog :before-close="Xdelhandle" :close-on-press-escape="false" :visible.sync="dialogFormVisible"
               append-to-body
               title="修改密码">
      <el-form ref="form" :model="form" :rules="rules">
        <el-form-item :label-width="formLabelWidth" label="原密码" prop="oldPassword">
          <el-input v-model="form.oldPassword" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="新密码" :label-width="formLabelWidth" prop="newPassword">
        <el-form-item :label-width="formLabelWidth" label="新密码" prop="newPassword">
          <el-input v-model="form.newPassword" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="确认密码" :label-width="formLabelWidth" prop="newPassword1">
        <el-form-item :label-width="formLabelWidth" label="确认密码" prop="newPassword1">
          <el-input v-model="form.newPassword1" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
@@ -62,229 +65,229 @@
</template>
<script>
  import {mapGetters} from "vuex";
  import  {check,updatePassword} from "@/api/system/user"
  import md5 from "js-md5";
  import {removeToken} from "@/util/auth";
  import Statistic from './Statistic.vue';
  import {validatenull} from "@/util/validate";
  import {flowCategory,flowRoute} from "@/util/flow";
  import {todoList} from "@/api/work/work";
import {mapGetters} from "vuex";
import {check, updatePassword} from "@/api/system/user"
import md5 from "js-md5";
import {removeToken} from "@/util/auth";
import Statistic from './Statistic.vue';
import {validatenull} from "@/util/validate";
import {flowCategory, flowRoute} from "@/util/flow";
import {todoList} from "@/api/work/work";
  export default {
    name: "wel",
    components: {Statistic},
    data() {
      return {
        loading: false,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
export default {
  name: "wel",
  components: {Statistic},
  data() {
    return {
      loading: false,
      page: {
        pageSize: 10,
        currentPage: 1,
        total: 0
      },
      // 代办流程任务data
      todoData: [],
      // 代办流程任务option
      todoOption: {
        height: 500,
        addBtn: false,
        header: false,
        align: 'center',
        index: true,
        menuWidth: 80,
        editBtn: false,
        delBtn: false,
        border: true,
        column: [{
          label: '任务名称',
          prop: 'taskName',
          sortable: true,
          headerAlign: 'center',
          align: 'left',
          html: true,
          width: 300,
          overHidden: true,
          formatter: (val) => {
            return '<a name="processname" href="javascript:;" style="color: #66b1ff;">' + val.variables.processName + '-' + val.taskName + '</a>'
          }
        },
        // 代办流程任务data
        todoData: [],
        // 代办流程任务option
        todoOption: {
          height:500,
          addBtn: false,
          header: false,
          align: 'center',
          index: true,
          menuWidth: 80,
          editBtn: false,
          delBtn: false,
          border:true,
          column: [{
            label: '任务名称',
            prop: 'taskName',
            sortable:true,
            headerAlign:'center',
            align:'left',
            html: true,
            width:300,
            overHidden:true,
          {
            label: '上一步处理时间',
            sortable: true,
            width: 150,
            prop: 'createTime'
          },
          {
            label: '上一步操作人',
            sortable: true,
            width: 120,
            prop: 'historyActivityAssigneName'
          },
          {
            label: '流程描述',
            prop: 'processDesc',
            overHidden: true,
            formatter: (val) => {
              return '<a name="processname" href="javascript:;" style="color: #66b1ff;">' + val.variables.processName+'-'+val.taskName + '</a>'
              return val.variables.processDesc
            }
          },
            {
              label: '上一步处理时间',
              sortable:true,
              width:150,
              prop: 'createTime'
            },
            {
              label: '上一步操作人',
              sortable:true,
              width:120,
              prop: 'historyActivityAssigneName'
            },
            {
              label: '流程描述',
              prop: 'processDesc',
              overHidden:true,
              formatter: (val) => {
                return  val.variables.processDesc
              }
            },
            {
              label: '所属流程模板',
              sortable:true,
              overHidden:true,
              prop: 'categoryName'
            }
          ]
        },
        noticeData: [{
          img: '/img/bg/vip1.png',
          title: '史蒂夫·乔布斯 关注了你',
          subtitle: '05-08 15:08',
          tag: '已经开始',
          status: 0
        }, {
          img: '/img/bg/vip2.png',
          title: '斯蒂夫·沃兹尼亚克 关注了你',
          subtitle: '05-08 15:08',
          tag: '未开始',
          status: 1
        }, {
          img: '/img/bg/vip3.png',
          title: '蒂姆·库克 关注了你',
          subtitle: '05-08 15:08',
          status: 3,
          tag: '有错误'
        }, {
          img: '/img/bg/vip4.png',
          title: '比尔·费尔南德斯 关注了你',
          subtitle: '05-08 15:08',
          status: 4,
          tag: '已完成'
        }],
        logActiveNames: ['28'],
        userarr: [],
        userid: '',
        updataArr: [],
        dialogFormVisible: false,
        form: {
          oldPassword: '',
          newPassword: '',
          newPassword1: '',
        },
        rules: {
          oldPassword: [
            {required: true, message: '请输入原密码', trigger: 'blur'}
          ],
          newPassword: [
            {required: true, message: '请输入新密码', trigger: 'blur'}
          ],
          newPassword1: [
            {required: true, message: '请输确认密码', trigger: 'blur'}
          ]
        },
      };
          {
            label: '所属流程模板',
            sortable: true,
            overHidden: true,
            prop: 'categoryName'
          }
        ]
      },
      noticeData: [{
        img: '/img/bg/vip1.png',
        title: '史蒂夫·乔布斯 关注了你',
        subtitle: '05-08 15:08',
        tag: '已经开始',
        status: 0
      }, {
        img: '/img/bg/vip2.png',
        title: '斯蒂夫·沃兹尼亚克 关注了你',
        subtitle: '05-08 15:08',
        tag: '未开始',
        status: 1
      }, {
        img: '/img/bg/vip3.png',
        title: '蒂姆·库克 关注了你',
        subtitle: '05-08 15:08',
        status: 3,
        tag: '有错误'
      }, {
        img: '/img/bg/vip4.png',
        title: '比尔·费尔南德斯 关注了你',
        subtitle: '05-08 15:08',
        status: 4,
        tag: '已完成'
      }],
      logActiveNames: ['28'],
      userarr: [],
      userid: '',
      updataArr: [],
      dialogFormVisible: false,
      form: {
        oldPassword: '',
        newPassword: '',
        newPassword1: '',
      },
      rules: {
        oldPassword: [
          {required: true, message: '请输入原密码', trigger: 'blur'}
        ],
        newPassword: [
          {required: true, message: '请输入新密码', trigger: 'blur'}
        ],
        newPassword1: [
          {required: true, message: '请输确认密码', trigger: 'blur'}
        ]
      },
    };
  },
  // 拿到userid请求接口
  created() {
    this.updataArr = JSON.parse(localStorage.getItem("updataid"))
    this.userid = this.$store.state.user.upadatastatus.user_id
    const pageFlag = localStorage.getItem("pageFlag")
    if (pageFlag === null) {
      this.checkhandle()
      localStorage.setItem("pageFlag", true)
    }
  },
  computed: {
    ...mapGetters(["userInfo", "flowRoutes"]),
  },
  methods: {
    handleChange(val) {
      window.console.log(val);
    },
    // 拿到userid请求接口
    created() {
      this.updataArr = JSON.parse(localStorage.getItem("updataid"))
      this.userid = this.$store.state.user.upadatastatus.user_id
      const pageFlag = localStorage.getItem("pageFlag")
      if (pageFlag === null) {
    Xdelhandle() {
      removeToken()
      this.dialogFormVisible = false
    },
    // 关闭弹窗后清除token返回到登录页面
    delhandle() {
      removeToken()
      this.dialogFormVisible = false
    },
    // 修改密码方法
    addok() {
      this.dialogFormVisible = false
      updatePassword(md5(this.form.oldPassword), this.form.newPassword, this.form.newPassword1).then(res => {
        if (res.data.code == 200) {
          this.$message({
            type: "success",
            message: "修改成功!"
          })
        }
      }).catch(res => {
        console.log(res)
        this.checkhandle()
        localStorage.setItem("pageFlag", true)
      }
      })
    },
    computed: {
      ...mapGetters(["userInfo", "flowRoutes"]),
    },
    methods: {
      handleChange(val) {
        window.console.log(val);
      },
      Xdelhandle() {
        removeToken()
        this.dialogFormVisible = false
      },
      // 关闭弹窗后清除token返回到登录页面
      delhandle() {
        removeToken()
        this.dialogFormVisible = false
      },
      // 修改密码方法
      addok() {
        this.dialogFormVisible = false
        updatePassword(md5(this.form.oldPassword), this.form.newPassword, this.form.newPassword1).then(res => {
          if (res.data.code == 200) {
    // 提醒时间请求,也需要判断是否为超管身份,超管身份不判断
    checkhandle() {
      if (this.updataArr.user_id != '0' && this.updataArr.tenant_id !== '000000') {
        check(this.userid).then(res => {
          if (res.data.data > 0) {
            this.$message({
              type: "success",
              message: "修改成功!"
              type: 'warning',
              message: `你还有${res.data.data}天就要修改密码了`
            })
          } else if (res.data.data == -1) {
            this.$message({
              type: "warning",
              message: "密码策略已被修改,请重新修改密码!"
            })
            setTimeout(() => {
              this.dialogFormVisible = true
            }, 1500)
          } else if (res.data.data == 0) {
            // this.$message({
            //   type: 'success',
            //   message: "操作成功"
            // })
          }
        }).catch(res => {
          console.log(res)
          this.checkhandle()
        })
      },
      // 提醒时间请求,也需要判断是否为超管身份,超管身份不判断
      checkhandle() {
        if (this.updataArr.user_id != '0' && this.updataArr.tenant_id !== '000000') {
          check(this.userid).then(res => {
            if (res.data.data > 0) {
              this.$message({
                type: 'warning',
                message: `你还有${res.data.data}天就要修改密码了`
              })
            } else if (res.data.data == -1) {
              this.$message({
                type: "warning",
                message: "密码策略已被修改,请重新修改密码!"
              })
              setTimeout(() => {
                this.dialogFormVisible = true
              }, 1500)
            } else if (res.data.data == 0) {
              // this.$message({
              //   type: 'success',
              //   message: "操作成功"
              // })
            }
          }).catch(res => {
            console.log(res)
          })
        }
      },
      onLoad(page, params = {}) {
        this.loading = true;
        const query = {
          ...this.query,
          category: (params.category) ? flowCategory(params.category) : null
        };
        todoList(page.currentPage, page.pageSize, Object.assign(params, query)).then(res => {
          const data = res.data.data;
          this.page.total = data.total;
          this.todoData = data.records;
          this.loading = false;
        }).catch(error => {
          this.$message.error(error);
          this.loading = false;
        })
      },
      cellHandle(row, column, cell, event) {
        if (column.property == 'taskName') {
          this.gotodo(row)
        }
      },
      gotodo(row, index) {
        this.$router.push({ path: `/work/process/${flowRoute(this.flowRoutes, row.category)}/handle/${row.taskId}/${row.processInstanceId}/${row.businessId}` });
      }
    },
    onLoad(page, params = {}) {
      this.loading = true;
      const query = {
        ...this.query,
        category: (params.category) ? flowCategory(params.category) : null
      };
      todoList(page.currentPage, page.pageSize, Object.assign(params, query)).then(res => {
        const data = res.data.data;
        this.page.total = data.total;
        this.todoData = data.records;
        this.loading = false;
      }).catch(error => {
        this.$message.error(error);
        this.loading = false;
      })
    },
    cellHandle(row, column, cell, event) {
      if (column.property == 'taskName') {
        this.gotodo(row)
      }
    },
    gotodo(row, index) {
      this.$router.push({path: `/work/process/${flowRoute(this.flowRoutes, row.category)}/handle/${row.taskId}/${row.processInstanceId}/${row.businessId}`});
    }
  };
  }
};
</script>
<style>
  .el-font-size {
    font-size: 14px;
  }
.el-font-size {
  font-size: 14px;
}
</style>
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java
@@ -26,6 +26,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.rmi.ServerException;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -96,8 +97,8 @@
                        LocalLogVO localLog = new LocalLogVO();
                        localLog.setLogName(item.getName());
                        localLog.setLogType(getLogType(item.getName()));
                        localLog.setCreateTime(getLastModifiedOrCreatTime(false,logParentPath));
                        localLog.setLastModifier(getLastModifiedOrCreatTime(true,logParentPath));
                        localLog.setCreateTime(getLastModifiedOrCreatTime(false,item.getPath()));
                        localLog.setLastModifier(getLastModifiedOrCreatTime(true,item.getPath()));
                        localLog.setLogPath(logParentPath);
                        String serviceId = getServiceId(logParentPath);
                        localLog.setServiceId(serviceId);
@@ -117,8 +118,8 @@
                        File file = new File(fullPath);
                        if(file.exists()){
                            LocalLogVO localLogVO = new LocalLogVO();
                            localLogVO.setLastModifier(getLastModifiedOrCreatTime(true,fullPath));
                            localLogVO.setCreateTime(getLastModifiedOrCreatTime(false,fullPath));
                            localLogVO.setLastModifier(getLastModifiedOrCreatTime(true,file.getPath()));
                            localLogVO.setCreateTime(getLastModifiedOrCreatTime(false,file.getPath()));
                            localLogVO.setLogPath(fullPath);
                            String serviceId = getServiceId(file.getPath());
                            localLogVO.setServiceId(serviceId);
Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/MdmApplyGroupCodeProvider.java
@@ -35,7 +35,6 @@
     * @param dockingGroupDataVO AO/TO的信息
     * @return 执行结果
     */
    @PostMapping("/externalMainData/receiveAddApply")
    DockingResultVO receiveEditApply(@NotNull @RequestBody DockingGroupDataVO dockingGroupDataVO)throws VciBaseException;
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java
@@ -48,7 +48,6 @@
                // 设置所有者
                baseModel.setOwner(AuthUtil.getUserId().toString());
            }
            baseModel.setVersionSeq(1);
            baseModel.setVersionRule("0");
            baseModel.setVersionValue("1");
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/controller/DockingPreApplyCodeController.java
@@ -183,7 +183,7 @@
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "集团码申请", notes = "dockingPreAttrMappingVOList")
    public R applyGroupCode(String oids,String btmName){
        List<BaseModelVO> BaseModelVOs=new ArrayList<>();
        List<BaseModelVO> BaseModelVOS=new ArrayList<>();
        try {
            return groupMdmInterService.applyGroupCode(oids,btmName);
        }catch (Throwable e){
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/DockingManagementController.java
@@ -130,7 +130,7 @@
        }
        query.setCurrent(queryObject.getPage());
        query.setSize(queryObject.getLimit());
        IPage<DockingSystemConfigVO>  pages=dockingSystemConfigService.page(condtionMap,query);
        IPage<DockingSystemConfigVO> pages= dockingSystemConfigService.page(condtionMap,query);
        return R.data(pages);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
@@ -23,6 +23,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
import com.vci.ubcs.code.dto.CodeBasicSecDTO;
@@ -518,9 +519,10 @@
        }
        VciBaseUtil.alertNotNull(codeRuleDTO, "需要添加的数据对象");
        CodeRule codeRuleDO = new CodeRule();
        DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeRuleDO,MdmBtmTypeConstant.CODE_RULE);
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeRuleDTO, codeRuleDO);
        boolean exFlag = codeRuleMapper.insert(codeRuleDO)>0;
        DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeRuleDO,MdmBtmTypeConstant.CODE_RULE);
        boolean exFlag = SqlHelper.retBool(codeRuleMapper.insert(codeRuleDO));
        List<CodeBasicSecDTO> secList = codeRuleDTO.getElements();
        List<CodeBasicSec> codeBasicSecs = new ArrayList<>();
        List<CodeBasicSec> codeClassifySec = new ArrayList<>();
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeShowFieldConfigServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.code.entity.CodeShowFieldConfig;
import com.vci.ubcs.code.mapper.CodeShowFieldConfigMapper;
import com.vci.ubcs.code.service.ICodeShowFieldConfigService;
@@ -34,7 +35,7 @@
     */
    @Override
    public boolean insert(CodeShowFieldConfig codeShowFieldConfig) {
        return this.codeShowFieldConfigMapper.insert(codeShowFieldConfig)>0;
        return SqlHelper.retBool(this.codeShowFieldConfigMapper.insert(codeShowFieldConfig));
    }
    @Override
@@ -59,7 +60,7 @@
     */
    @Override
    public boolean deleteById(String oid) {
        return this.codeShowFieldConfigMapper.deleteById(oid) > 0;
        return SqlHelper.retBool(this.codeShowFieldConfigMapper.deleteById(oid));
    }
    @Override
@@ -67,7 +68,7 @@
        LambdaQueryWrapper<CodeShowFieldConfig> lambdaQueryWrapper = Wrappers.<CodeShowFieldConfig>query()
            .lambda()
            .eq(CodeShowFieldConfig::getReferConfigOid, oid);
        return this.codeShowFieldConfigMapper.delete(lambdaQueryWrapper) > 0;
        return SqlHelper.retBool(this.codeShowFieldConfigMapper.delete(lambdaQueryWrapper));
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSrchCondConfigServiceImpl.java
@@ -34,7 +34,7 @@
     */
    @Override
    public boolean insert(CodeSrchCondConfig codeSrchcondconfig) {
        return this.codeSrchcondconfigMapper.insert(codeSrchcondconfig)>0;
        return  this.codeSrchcondconfigMapper.insert(codeSrchcondconfig)>0;
    }
    @Override
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/DockingSystemConfigServiceImpl.java
@@ -137,7 +137,6 @@
    @Override
    public IPage<DockingSystemConfigVO> page(Map<String,String>codtionMap, Query query) {
        IPage<DockingSystemConfig> pages = page(Condition.getPage(query), UBCSSqlKeyword.buildConditionByMapString(codtionMap));
        List<DockingSystemConfig>  dockingSystemConfigList= pages.getRecords();
        dockingSystemConfigList.stream().forEach(dockingSystemConfig -> {
@@ -152,7 +151,7 @@
        //    dockingSystemConfig.setSourceSysName("");
            //dockingSystemConfig.setTargetSysName("");
        });
        return  DockingSystemConfigWrapper.build().pageVO(pages);
        return DockingSystemConfigWrapper.build().pageVO(pages);
    }
    /**
@@ -671,6 +670,7 @@
                dockingLog.setClassifyName(dockingSystemConfigDTO.getClassifyName());
                dockingLog.setId(dockingSystemConfigDTO.getId());
                dockingLog.setUniqueCode("");
                dockingLog.setCreateTime(new Date());
                dockingLog.setInterfaceStatus(isSend?"true":"false");
                dockingLog.setParamString(paramString);
                dockingLog.setType(DATA_LOGE_OUT);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -87,6 +87,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@@ -201,6 +202,11 @@
     * 客户现场excel为老版本,导出的总数限制为65535
     */
    public static final int EXPORT_LIMIT = 65535;
    /**
     * 自定义并发ForkJoinPool
     */
    private static final ForkJoinPool customForkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors()-1);
    /**
     * 批量申请:选取选中分类下的所有模板关键属性,相似属性,必填属性,写入execl中
@@ -4393,56 +4399,60 @@
        // 查询不需要参与关键属性校验的除自己以外的所有分类oid
        final String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
        final BladeUser user = AuthUtil.getUser();
        //cboList = new CopyOnWriteArrayList<>(cboList);
        // TODO:Thread limit exceeded replacing blocked 异常是这部分代码抛出的,所以暂时将parallelStream改成了stream
        List<ClientBusinessObject> repeatDataMap = cboList.stream().filter(cbo -> {
            //每行都得查询.如果其中出现了错误,我们就直接抛出异常,其余的显示
            //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
            Map<String, String> conditionMap = new HashMap<>();
            ketAttrMap.forEach((attrId, attrVO) -> {
                String value =cbo.getAttributeValue(attrId.toLowerCase(Locale.ROOT));
                if (value == null) {
                    value = "";
                }
                value= value.replace(REQUIRED_CHAR,SPECIAL_CHAR);
                engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
            });
            if (!CollectionUtils.isEmpty(ketAttrMap)) {
                // 添加不参与关键属性校验的分类oid判断
                if(Func.isNotBlank(isParticipateCheckOids)){
                    conditionMap.put("t.codeclsfid",QueryOptionConstant.NOTIN+isParticipateCheckOids);
                }
                if(isEdit){//如果是更改则需排除系统本身
                    conditionMap.put("t.id",QueryOptionConstant.NOTEQUAL+cbo.getId());
                }
                conditionMap.put("t.lastr", "1");
                conditionMap.put("t.lastv", "1");
                CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, null);
                List<String> repeatData = commonsMapper.selectList(sqlBO.getSqlId());
                if(!repeatData.isEmpty()){
                    final List<Map<String,String>> newDataList = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
                    DefaultAttrAssimtUtil.mapToLowerCase(newDataList,true);
                    //List<ClientBusinessObject> newCboList=ChangeMapTOClientBusinessObjects(newDataList);
                    List<BaseModel> newCboList = new ArrayList<>();
                    newDataList.stream().forEach(stringStringMap -> {
                        BaseModel baseModel=new BaseModel();
                        DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,false,user);
                        baseModel.setData(stringStringMap);
                        newCboList.add(baseModel);
                    });
                    // 添加错误值
                    String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                    errorMap.put(rowIndex, "重复的记录编号为:"+repeatData.stream().collect(Collectors.joining(",")));
                    if(!CollectionUtils.isEmpty(newCboList)) {
                        indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX), newCboList);
        // TODO:Thread limit exceeded replacing blocked 异常是这部分代码抛出的
        //  ,所以暂时将parallelStream改成了stream,改成了stream之后发现巨慢
        // customForkJoinPool控制并发度
        List<ClientBusinessObject> finalCboList = cboList;
        List<ClientBusinessObject> repeatDataMap = (List<ClientBusinessObject>) customForkJoinPool.submit(()->{
            finalCboList.parallelStream().filter(cbo -> {
                //每行都得查询.如果其中出现了错误,我们就直接抛出异常,其余的显示
                //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
                Map<String, String> conditionMap = new HashMap<>();
                ketAttrMap.forEach((attrId, attrVO) -> {
                    String value =cbo.getAttributeValue(attrId.toLowerCase(Locale.ROOT));
                    if (value == null) {
                        value = "";
                    }
                    value= value.replace(REQUIRED_CHAR,SPECIAL_CHAR);
                    engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
                });
                if (!CollectionUtils.isEmpty(ketAttrMap)) {
                    // 添加不参与关键属性校验的分类oid判断
                    if(Func.isNotBlank(isParticipateCheckOids)){
                        conditionMap.put("t.codeclsfid",QueryOptionConstant.NOTIN+isParticipateCheckOids);
                    }
                    if(isEdit){//如果是更改则需排除系统本身
                        conditionMap.put("t.id",QueryOptionConstant.NOTEQUAL+cbo.getId());
                    }
                    conditionMap.put("t.lastr", "1");
                    conditionMap.put("t.lastv", "1");
                    CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, null);
                    List<String> repeatData = commonsMapper.selectList(sqlBO.getSqlId());
                    if(!repeatData.isEmpty()){
                        final List<Map<String,String>> newDataList = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
                        DefaultAttrAssimtUtil.mapToLowerCase(newDataList,true);
                        //List<ClientBusinessObject> newCboList=ChangeMapTOClientBusinessObjects(newDataList);
                        List<BaseModel> newCboList = new ArrayList<>();
                        newDataList.stream().forEach(stringStringMap -> {
                            BaseModel baseModel=new BaseModel();
                            DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,false,user);
                            baseModel.setData(stringStringMap);
                            newCboList.add(baseModel);
                        });
                        // 添加错误值
                        String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                        errorMap.put(rowIndex, "重复的记录编号为:"+repeatData.stream().collect(Collectors.joining(",")));
                        if(!CollectionUtils.isEmpty(newCboList)) {
                            indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX), newCboList);
                        }
                    }
                    return !repeatData.isEmpty();
                }else{
                    return false;
                }
                return !repeatData.isEmpty();
            }else{
                return false;
            }
        }).collect(Collectors.toList());
            }).collect(Collectors.toList());
        }).join();
        if(!CollectionUtils.isEmpty(repeatDataMap)){
            resultVO.setKeyAttrRepeatRowIndexList(repeatDataMap.stream().map(s->s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet()));
        }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
@@ -372,7 +372,6 @@
                            resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
                        });
                    }else{
                        XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
                        xmlResultDataObjectDetailDO.setCode("");
                        xmlResultDataObjectDetailDO.setId("");
@@ -381,6 +380,7 @@
                        resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
                    }
                    e.printStackTrace();
                    log.error(e.getMessage());
                }finally {
                    XMLResultClassfyVO resultClassfyVO = new XMLResultClassfyVO();
                    resultClassfyVO.setClassCode(classVO.getClassCode());
@@ -399,6 +399,7 @@
        }catch (Throwable e){
            e.printStackTrace();
            msg="申请编码失败:"+e.getMessage();
            log.error(msg);
          /*  XMLResultSystemVO XMLResultSystemVO=new XMLResultSystemVO();
            XMLResultSystemVO.setErrorid(errorid);
            XMLResultSystemVO.setMsg("申请编码失败:->"+e.getMessage());
@@ -434,6 +435,7 @@
                this.saveLogs(systemId, systemId, data, resultStr, issucess[0], msg, "applyCode");
            }catch (Throwable e){
                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
        log.info("返回参数:"+resultStr);
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/EnumController.java
@@ -102,7 +102,7 @@
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入omdEnum")
    public R update(@Valid @RequestBody Enum omdEnum) {
        return R.status(omdEnumService.updateById(omdEnum));
        return R.status(omdEnumService.updateOmdEnum(omdEnum));
    }
    /**
@@ -112,7 +112,7 @@
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入omdEnum")
    public R submit(@Valid @RequestBody Enum omdEnum) {
        return R.status(omdEnumService.saveOrUpdate(omdEnum));
        return R.status(omdEnumService.submit(omdEnum));
    }
    /**
@@ -158,6 +158,5 @@
        List<EnumVO> tree = omdEnumService.getList(code);
        return R.data(tree);
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IEnumService.java
@@ -17,9 +17,11 @@
package com.vci.ubcs.omd.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.vo.EnumVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.poi.ss.formula.functions.T;
import org.springblade.core.mp.support.Query;
import java.util.List;
@@ -42,9 +44,22 @@
     */
    IPage<EnumVO> selectOmdEnumPage(IPage<EnumVO> page, EnumVO omdEnum);
    /**
     * TableId 注解存在更新记录,否插入一条记录
     *
     * @param omdEnum 实体对象
     */
    boolean submit(Enum omdEnum);
    boolean deleteLogic(List<String> toStringList);
    /**
     * 根据 ID 选择修改
     *
     * @param omdEnum 实体对象
     */
    boolean updateOmdEnum(Enum omdEnum);
    IPage<EnumVO> parentList(Map<String, Object> dict, Query query);
    /**
     * 树形结构
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/EnumServiceImpl.java
@@ -28,6 +28,7 @@
import com.vci.ubcs.omd.wrapper.EnumWrapper;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.beans.BeanUtils;
@@ -54,11 +55,29 @@
    }
    @Override
    public boolean submit(Enum omdEnum) {
        Date date = new Date();
        omdEnum.setCreator(AuthUtil.getUserAccount());
        omdEnum.setCreatetime(date);
        omdEnum.setModifier(AuthUtil.getUserAccount());
        omdEnum.setModifytime(date);
        omdEnum.setTs(date);
        return this.saveOrUpdate(omdEnum);
    }
    @Override
    public boolean deleteLogic(List<String> toStringList) {
        return SqlHelper.retBool(baseMapper.deleteBatchIds(toStringList));
    }
    @Override
    public boolean updateOmdEnum(Enum omdEnum) {
        omdEnum.setModifier(AuthUtil.getUserAccount());
        omdEnum.setModifytime(new Date());
        return this.updateById(omdEnum);
    }
    @Override
    public IPage<EnumVO> parentList(Map<String, Object> dict, Query query) {
        IPage<Enum> page = this.page(Condition.getPage(query),
            Condition.getQueryWrapper(dict, Enum.class).lambda()
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/ClassifyAuthController.java
@@ -34,7 +34,7 @@
     * @param classifyAuthList
     * @return
     */
    @PostMapping("saveOrUpdate")
    @PostMapping("/saveOrUpdate")
    public R saveOrUpdate(@RequestBody List<ClassifyAuth> classifyAuthList) {
        return classifyAuthService.submit(classifyAuthList);
    }
@@ -44,7 +44,7 @@
     * @param classifyAuthVO
     * @return
     */
    @GetMapping("list")
    @GetMapping("/list")
    public R<List<ClassifyAuthVO>> getClassifyAuthList(ClassifyAuthVO classifyAuthVO) {
        return R.data(classifyAuthService.getClassifyAuthList(classifyAuthVO));
    }
@@ -54,8 +54,8 @@
     * @param classifyId
     * @return
     */
    @GetMapping("getAuthButtonList")
    public R<Map<String,Boolean>> getAuthButtonList(String classifyId){
    @GetMapping("/getAuthButtonList")
    public R<Map<String,Boolean>> getAuthButtonList(@RequestParam("classifyId") String classifyId){
        return R.data(classifyAuthService.getAuthButtonList(classifyId));
    }
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/ClassifyAuthServiceImpl.java
@@ -102,7 +102,7 @@
     */
    public Map<String,Boolean> getAuthButtonList(String classifyId){
        if(Func.isBlank(classifyId)){
            return new HashMap<>();
            throw new ServiceException("必传参数分类oid不能为空!");
        }
        //查询分类节点的所有父级节点
        R<List<String>> listR = codeClassifyClient.selectAllParentOid(classifyId);