ludc
2023-11-30 1b8098b7f79b66a80e5ca49d8765606cb5fa0408
操作日志完善
已修改30个文件
已删除1个文件
已添加14个文件
1976 ■■■■ 文件已修改
Source/UBCS-WEB/package.json 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Master/MasterTree.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/MasterData/items.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/code.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/docking/info.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/monitor/log/operateLog.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/user.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/vue.config.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRuleCharacter.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/字符集.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SaveLogUtil.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeRuleCharacterEnum.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeRuleCharacterMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 869 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeRuleCharacterWapper.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleCharacterMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/package.json
@@ -11,44 +11,44 @@
    "test:e2e": "vue-cli-service test:e2e"
  },
  "dependencies": {
    "avue-plugin-ueditor": "0.1.4",
    "axios": "0.18.0",
    "babel-polyfill": "6.26.0",
    "classlist-polyfill": "1.2.0",
    "crypto-js": "4.1.1",
    "avue-plugin-ueditor": "^0.1.4",
    "axios": "^0.18.0",
    "babel-polyfill": "^6.26.0",
    "classlist-polyfill": "^1.2.0",
    "crypto-js": "^4.1.1",
    "echarts": "4.9.0",
    "element-ui": "2.15.6",
    "instead": "1.0.3",
    "js-base64": "2.5.1",
    "js-cookie": "2.2.0",
    "js-md5": "0.7.3",
    "js-pinyin": "0.2.4",
    "mockjs": "1.0.1-beta3",
    "moment": "2.29.4",
    "node-gyp": "4.0.0",
    "element-ui": "^2.15.6",
    "instead": "^1.0.3",
    "js-base64": "^2.5.1",
    "js-cookie": "^2.2.0",
    "js-md5": "^0.7.3",
    "js-pinyin": "^0.2.4",
    "mockjs": "^1.0.1-beta3",
    "moment": "^2.29.4",
    "node-gyp": "^4.0.0",
    "nprogress": "0.2.0",
    "portfinder": "1.0.23",
    "save": "2.9.0",
    "script-loader": "0.7.2",
    "vue": "2.6.10",
    "vue-axios": "2.1.2",
    "vue-clipboard2": "0.3.3",
    "vue-axios": "^2.1.2",
    "vue-clipboard2": "^0.3.3",
    "vue-echarts": "5.0.0-beta.0",
    "vue-flowchart-editor": "1.0.2",
    "vue-i18n": "8.7.0",
    "vue-router": "3.0.1",
    "vuex": "3.1.1"
    "vue-i18n": "^8.7.0",
    "vue-router": "^3.0.1",
    "vuex": "^3.1.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "3.1.1",
    "@vue/cli-plugin-eslint": "3.1.5",
    "@vue/cli-service": "3.1.4",
    "@vue/composition-api": "1.7.2",
    "chai": "4.1.2",
    "@vue/cli-plugin-babel": "^3.5.0",
    "@vue/cli-plugin-eslint": "^3.5.0",
    "@vue/cli-service": "^3.5.0",
    "@vue/composition-api": "^1.7.2",
    "chai": "^4.1.2",
    "node-sass": "6.0.1",
    "sass-loader": "10.0.5",
    "vue-template-compiler": "2.5.17",
    "webpack-bundle-analyzer": "3.0.3"
    "sass-loader": "10.3.1",
    "vue-template-compiler": "2.6.10",
    "webpack-bundle-analyzer": "^3.0.3"
  },
  "lint-staged": {
    "*.js": [
Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
@@ -278,7 +278,6 @@
        let columnItem = {
          change: (val) => {
            console.log(val)
            if (val.column.field === "drawingno") {
              this.codeattrsecValue = val.value;
              return;
@@ -600,12 +599,16 @@
    // èŽ·å–è¡¨å•è¯¦æƒ…æ•°æ®
    getFormDetail() {
      if (this.type === "add") return;
      getFormDetail({templateOid: this.templateOid, oid: this.rowOid}).then(
        (res) => {
          this.form = Object.assign(this.form, res.data.data[0]);
          this.loading = false;
        }
      );
      if(this.templateOid){
        getFormDetail({templateOid: this.templateOid, oid: this.rowOid}).then(
          (res) => {
            this.form = Object.assign(this.form, res.data.data[0]);
            this.loading = false;
          }
        );
        return;
      }
    },
    setReferValue(data) {
      if (data.field) {
Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -250,9 +250,11 @@
  },
  methods: {
    openDialog() {
      //新增和修改共同调用
      this.getFormTemplate();
      if (this.type === "add") {
      if (this.type === "add" || (this.type !== "add" && this.status === "amend")) {
        this.getCodeRule();
        return;
      }
    },
    close() {
@@ -260,6 +262,7 @@
    },
    // æŽ¥å£èŽ·å–è¡¨å•æ•°æ®
    getFormTemplate() {
      //新增和修改共同调用
      getFormTemplate({
        templateOid: this.templateOid,
        codeClassifyOid: this.codeClassifyOid,
@@ -277,6 +280,7 @@
            } else {
              this.showResembleQuery = false;
            }
            //传递表单上方区域数据 ï¼ˆæ–°å¢žå’Œä¿®æ”¹ï¼‰
            this.$nextTick(() => {
              this.$refs.FormTemplate.templateRender(
                res.data.formDefineVO.items
@@ -319,7 +323,7 @@
          that.secVOList = (res.data.data.secVOList || []).filter((item) =>
            typeList.includes(item.secType)
          );
          if (that.secVOList.length > 0 && that.type === "add") {
          if (that.secVOList.length > 0 && that.type === "add" ||(that.type !== "add" &&  that.status === "amend")) {
            that.showCodeApply = true;
            that.activeName = "codeApply";
Source/UBCS-WEB/src/components/Master/MasterTree.vue
@@ -1,12 +1,12 @@
<template>
  <div class="app" style="display: flex;">
  <div class="app" style="position: relative;">
    <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="Treedata" :defaultExpandAll="false"
               :option="Treeoption" style="width: fit-content;" @node-click="nodeClick">
      <template slot-scope="{ node }">
        <span v-html="node.label"></span>
      </template>
    </avue-tree>
    <div style="display: inline-block;">
    <div style="position: absolute; right: 0px; top: -1px;">
      <el-link class="refresh-icon" icon="el-icon-refresh" @click="getTreeLists"></el-link>
    </div>
  </div>
Source/UBCS-WEB/src/views/MasterData/items.vue
@@ -1,7 +1,7 @@
<template>
  <el-container>
    <el-aside>
      <basic-container style="overflow: hidden;">
    <el-aside style="width:250px">
      <basic-container>
        <!--          æ ‘组件-->
        <master-tree
          :currentPage="this.currentPage"
Source/UBCS-WEB/src/views/code/code.vue
@@ -1385,7 +1385,7 @@
            cols: [
              {title: '算法编号', field: 'id', width: 200},
              {title: '算法名称', field: 'name', width: 150},
              {title: '自定义流水Bean', field: 'classFullName', width: 300},
              {title: '类全路径', field: 'classFullName', width: 300},
              {title: '类型', field: 'serialType', width: 300},
              {title: '描述', field: 'description'}
            ],
Source/UBCS-WEB/src/views/docking/info.vue
@@ -266,15 +266,15 @@
  },
  computed: {
    ...mapGetters(["permission"]),
    permissionList(){
      return{
        sync:this.vaildData(this.permission.info.info_sync,false),
        add:this.vaildData(this.permission.info.info_add,false),
        query:this.vaildData(this.permission.info.info_query,false),
        edit:this.vaildData(this.permission.info.info_edit,false),
        delete:this.vaildData(this.permission.info.info_delete,false),
        enable:this.vaildData(this.permission.info.info_enable,false),
        stop:this.vaildData(this.permission.info.info_stop,false),
    permissionList() {
      return {
        sync: this.vaildData(this.permission.info.info_sync, false),
        add: this.vaildData(this.permission.info.info_add, false),
        query: this.vaildData(this.permission.info.info_query, false),
        edit: this.vaildData(this.permission.info.info_edit, false),
        delete: this.vaildData(this.permission.info.info_delete, false),
        enable: this.vaildData(this.permission.info.info_enable, false),
        stop: this.vaildData(this.permission.info.info_stop, false),
      }
    },
    oids() {
Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
@@ -14,6 +14,11 @@
               @size-change="sizeChange"
               @refresh-change="refreshChange"
               @on-load="onLoad">
    <template slot="description" slot-scope="scope">
      <avue-text-ellipsis :text="scope.row.description" :height="50">
        <small slot="more">...</small>
      </avue-text-ellipsis>
    </template>
    </avue-crud>
  </basic-container>
</template>
@@ -89,7 +94,10 @@
            {
              label: "描述",
              prop: "description",
              width:'300'
              span: 24,
              minRows: 20,
              type: "textarea",
              slot: true,
            },
          ]
        },
@@ -130,14 +138,6 @@
      },
      underscoreName(key) {
        return key.replace(/([A-Z])/g, "_$1").toLowerCase();
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
          getUsualLogs(this.form.id).then(res => {
            this.form = res.data.data;
          });
        }
        done();
      },
      currentChange(currentPage){
        this.page.currentPage = currentPage;
Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
</template>
<script>
export default {
  name: "delimiterConfig"
}
</script>
<style scoped>
</style>
Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
</template>
<script>
export default {
  name: "paddingCharacter"
}
</script>
<style scoped>
</style>
Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
</template>
<script>
export default {
name: "usableCharacter"
}
</script>
<style scoped>
</style>
Source/UBCS-WEB/src/views/system/user.vue
@@ -186,7 +186,7 @@
import {exportBlob} from "@/api/common";
import {getDeptTree, getDeptLazyTree} from "@/api/system/dept";
import {getRoleTree} from "@/api/system/role";
import {getPostList} from "@/api/system/post";
//import {getPostList} from "@/api/system/post";
import {mapGetters} from "vuex";
import website from '@/config/website';
import {getToken} from '@/util/auth';
@@ -894,10 +894,10 @@
        const column = this.findObject(this.option.group, "deptId");
        column.dicData = res.data.data;
      });
      getPostList(tenantId).then(res => {
        const column = this.findObject(this.option.group, "postId");
        column.dicData = res.data.data;
      });
      // getPostList(tenantId).then(res => {
      //   const column = this.findObject(this.option.group, "postId");
      //   column.dicData = res.data.data;
      // });
    },
    submitRole() {
      const roleList = this.$refs.treeRole.getCheckedKeys().join(",");
Source/UBCS-WEB/vue.config.js
@@ -26,11 +26,11 @@
    proxy: {
      '/api': {
        //本地服务接口地址
        target: 'http://127.0.0.1:37000',
        // target: 'http://127.0.0.1:37000',
        // target: 'http://192.168.1.51:37000',
        // target: 'http://dev.vci-tech.com:37000',
        target: 'http://dev.vci-tech.com:37000',
        //yxc
        // target: 'http:// 192.168.0.104:37000',
        // target: 'http:// 192.168.0.100:37000',
        // target: 'http://192.168.0.105:37000',
        // target: 'http://192.168.0.103:37000',
        // target: 'http://192.168.1.63:37000',
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java
@@ -25,6 +25,7 @@
     * æ¨¡æ¿çš„主键
     */
    private String templateOid;
    /**
     * ç¼–码规则的主键
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRuleCharacter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
/**
 * ç›¸ä¼¼æŸ¥è¯¢è§„则显示对象
 *
 * @author xj
 * @date 2023-11-30
 */
@TableName(CodeTableNameConstant.PL_CODE_RULE_CHARACTER)
@ApiModel(value = "CodeRuleCharacter对象", description = "编码规则字符集")
@EqualsAndHashCode(callSuper = true)
@Data
public class CodeRuleCharacter extends BaseModel{
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = 4615707119066298941L;
    /***
     * å˜è§„则oid
     */
    @NotBlank(message = "规则的主键不能为空")
    @ApiModelProperty(value = "规则的主键不能为空")
    private String codeRuleId;
    /**
     * å­—符集
     */
    @ApiModelProperty(value = "字符集")
    private String chartValue;
    /***
     * å­—符类型
     */
    @ApiModelProperty(value = "字符类型")
    @NotBlank(message = "字符类型不能为空")
    private String chartType;
    /***
     * å­—符类型显示值
     */
    @ApiModelProperty(value = "字符类型显示值")
    @TableField(exist = false)
    private String chartTypeText;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
/**
 * ç›¸ä¼¼æŸ¥è¯¢è§„则显示对象
 *
 * @author xj
 * @date 2023-11-30
 */
@Data
public class CodeRuleCharacterVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = 4615707119066298949L;
    /***
     * è§„则oid
     */
    private String codeRuleId;
    /**
     * å­—符集
     */
    private String chartValue;
    /***
     * å­—符类型
     */
    private String chartType;
    /***
     * å­—符类型显示值
     */
    private String chartTypeText;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/×Ö·û¼¯.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
{
  "codeRuleId": "1729702446013485056",
  "chartValue": "abckzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
  "chartType": "charset"
}
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java
@@ -133,4 +133,21 @@
        this.userStatus = userStatus;
    }
    @Override
    public String toString() {
        return "基本信息:{" +
            "用户编号='" + code + '\'' +
            ", ç”¨æˆ·å¹³å°=" + userType +
            ", è´¦å·='" + account + '\'' +
            ", æ˜µç§°='" + name + '\'' +
            ", çœŸå='" + realName + '\'' +
            ", é‚®ç®±='" + email + '\'' +
            ", ç”µè¯='" + phone + '\'' +
            ", ç”Ÿæ—¥=" + birthday +
            ", æ€§åˆ«=" + sex +
            ", å¯†çº§='" + secretGrade + '\'' +
            ", ç”¨æˆ·çŠ¶æ€=" + userStatus +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java
@@ -23,13 +23,16 @@
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
/**
 * è§†å›¾å®žä½“ç±»
 *
 * @author Chill
 */
@Data
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "UserVO对象", description = "UserVO对象")
public class UserVO extends User {
@@ -96,4 +99,19 @@
     * è´¦å·æ˜¯å¦åœç”¨ 0为启用,1为启用
     */
    private String userStatusText;
    @Override
    public String toString() {
        return "用户信息{[" +
            super.toString()+ "]" +
            ", roleName='" + roleName + '\'' +
            ", tenantName='" + tenantName + '\'' +
            ", userTypeName='" + userTypeName + '\'' +
            ", deptName='" + deptName + '\'' +
            ", postName='" + postName + '\'' +
            ", sexName='" + sexName + '\'' +
            ", userStatusText='" + userStatusText + '\'' +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java
@@ -78,6 +78,11 @@
    public static final String PL_CODE_RULE = "PL_CODE_RULE";
    /**
     * ç¼–码规则字符集
     */
    public static final String PL_CODE_RULE_CHARACTER = "PL_CODE_RULE_CHARACTER";
    /**
     * ç¼–码规则的流水值
     */
    public static final String PL_CODE_SERIALVALUE = "PL_CODE_SERIALVALUE";
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SaveLogUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.vci.ubcs.starter.util;
import org.springblade.core.log.annotation.GrantLog;
import org.springblade.core.log.annotation.OperateLog;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
 * @author ludc
 * @date 2023/11/29 12:39
 */
@Configuration
public class SaveLogUtil {
    /**
     * æ“ä½œæ—¥å¿—插入操作
     * @param res
     */
    @OperateLog
    public boolean operateLog(String type,boolean isException/*是否触发了异常*/,String res){
        return true;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java
@@ -80,4 +80,9 @@
     * ç³»ç»ŸæŽ¥å£ç±»åž‹
     */
    public static  final  String SYS_INTEGRATION_LOG_TYPE="sysIntegrationLogType";
    /***
     * ç³»ç»ŸæŽ¥å£ç±»åž‹
     */
    public static  final  String CODE_RULE_CHARACTER_TYPE="code_rule_character_type";
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.vci.ubcs.code.controller;
import com.vci.ubcs.code.service.ICodeRuleCharacterService;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/***
 * è§„则字符集配置
 * @author xj
 * @date 2023-11-30
 */
@RestController
@RequestMapping("/codeRuleCharacterController")
public class CodeRuleCharacterController {
    @Resource
     private ICodeRuleCharacterService iCodeRuleCharacterService;
    /**
     * ä½¿ç”¨ç¼–码规则oid获取数据
     * @param codeRuleId è§„则oid
     * @return æ•°æ®å†…容
     */
    @GetMapping("/list")
    public R<List<Map<String,String>>> getDataByOid(@RequestParam("codeRuleId")String codeRuleId,@RequestParam("chartType")String chartType){
        return R.data(iCodeRuleCharacterService.getDataByRuleId(codeRuleId,chartType));
    }
    /**
     * ä¿å­˜è§„则对象
     * @param codeRuleCharacterVO è§„则字符对象
     * @return æ•°æ®å†…容
     */
    @PostMapping("/addSave")
    public R addSave(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
        return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
    }
    /**
     * ä¿®æ”¹è§„则对象
     * @param codeRuleCharacterVO è§„则字符对象
     * @return æ•°æ®å†…容
     */
    @PostMapping("/editSave")
    public R editSave(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
        return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
    }
    /**
     * ä¿®æ”¹è§„则对象
     * @param codeRuleCharacterVO è§„则字符对象
     * @return æ•°æ®å†…容
     */
    @PostMapping("/delete")
    public R delete(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
        return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -16,6 +16,7 @@
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.util.SaveLogUtil;
import com.vci.ubcs.starter.web.pagemodel.*;
import com.vci.ubcs.starter.web.util.ControllerUtil;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
@@ -55,7 +56,11 @@
     */
    @Autowired
    private MdmIOService mdmIOService;
    /**
     * æ—¥å¿—保存工具类
     */
    @Autowired
    private SaveLogUtil saveLogUtil;
    /**
     * ä¸‹è½½æ‰¹é‡ç”³è¯·çš„导入模板
@@ -144,7 +149,7 @@
    }
    /**
     * æ‰¹é‡ç”³è¯·ç¼–码的信息
     * æ‰¹é‡ç”³è¯·ç¼–码的信息(当前分类上批量申请)
     * @param secDTOList ç”³è¯·ç¼–码的信息,必须包含码段和分类主键的信息
     * @param file æ–‡ä»¶çš„内容
     */
@@ -237,7 +242,7 @@
    }
    /**
     * å¯¼å…¥åŽ†å²æ•°æ®
     * å¯¼å…¥åŽ†å²æ•°æ®(从顶层分类导的)
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @param classifyAttr åˆ†ç±»è·¯å¾„使用的属性
     * @param file æ–‡ä»¶çš„内容
@@ -302,7 +307,15 @@
    @PostMapping("/addSaveCode")
    @VciBusinessLog(operateName = "申请单个编码")
    public R addSaveCode(@RequestBody CodeOrderDTO orderDTO) throws Exception {
        return R.success(engineService.addSaveCode(orderDTO));
        String s = null;
        try {
            s = engineService.addSaveCode(orderDTO);
            saveLogUtil.operateLog("编码申请",false,orderDTO.toString());
        }catch (Exception e){
            saveLogUtil.operateLog("编码申请",true,e.getMessage());
            throw e;
        }
        return R.success(s);
    }
    /**
@@ -429,6 +442,7 @@
    public DataGrid<Map<String,String>> gridResemble(String codeClassifyOid,String redisOid){
        return mdmIOService.gridDatas(codeClassifyOid,redisOid);
    }
    /***
     * å¯¼å…¥æ•°æ®
     * @param codeImprotSaveDatVO//数据对象
@@ -436,11 +450,11 @@
     */
    @PostMapping("/batchImportData")
    public R batchImportData(@RequestBody CodeImprotParmaDatVO codeImprotSaveDatVO){
        return  mdmIOService.batchImportData(codeImprotSaveDatVO.getCodeImprotSaveDatVOList(),codeImprotSaveDatVO.getClassifyAttr(),codeImprotSaveDatVO.getImprot());
        return mdmIOService.batchImportData(codeImprotSaveDatVO.getCodeImprotSaveDatVOList(),codeImprotSaveDatVO.getClassifyAttr(),codeImprotSaveDatVO.getImprot());
    }
    /***
     *根据数据oid从缓存中移除数据
     * æ ¹æ®æ•°æ®oid从缓存中移除数据
     * @param redisOid redisid
     * @param codeClassifyOid å­˜å‚¨è§„则的oid
     * @param dataOids  æ‰€éœ€åˆ é™¤çš„æ•°æ®
@@ -450,6 +464,7 @@
    public  R deleteDatas(String redisOid,String codeClassifyOid,String dataOids){
        return mdmIOService.deleteDatas(redisOid,codeClassifyOid,dataOids);
    }
    /**
     * æ‰¹é‡ä¿å­˜æµç¨‹æ‰§è¡Œé¡µé¢ä¿®æ”¹çš„内容
     * @param orderDTOList ç¼–码相关的信息,不需要码段的信息
@@ -514,7 +529,7 @@
    @PostMapping("/upSaveCode")
    public R upSaveCode(@RequestBody CodeOrderDTO orderDTO){
        engineService.upSaveCode(orderDTO);
        return  R.success("操作成功!");
        return R.success("操作成功!");
    }
    /**
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeRuleCharacterEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
package com.vci.ubcs.code.enumpack;
import com.vci.ubcs.starter.annotation.VciEnum;
import com.vci.ubcs.starter.web.constant.MdmEnumIdConstant;
import com.vci.ubcs.starter.web.enumpck.BaseEnum;
/**
 * ç¼–码规则码段字符控制类型
 * @author weidy
 * @date 2022-1-17
 */
@VciEnum(name = MdmEnumIdConstant.CODE_RULE_CHARACTER_TYPE,text = "编码规则码段字符控制类型",description = "")
public enum CodeRuleCharacterEnum implements BaseEnum {
    /**
     * å¯ç”¨å­—符集
     */
    CODE_RULE_CHARACTER_CHARSET("charset","可用字符集"),
    /**
     * å¯ç”¨å­—符集
     */
    CODE_RULE_CHARACTER_FILLERCHAR("fillerChar","可用字符集"),
    /**
     * è¡¥ä½å­—符
     */
    CODE_RULE_CHARACTER_SEPARATOR("separator","补位字符"),
    /**
     *前后缀字符
     */
    CODE_RULE_CHARACTER_PREFIX("prefix","前后缀字符");
    /**
     * æžšä¸¾çš„值
     */
    private String value;
    /**
     * æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    /**
     * èŽ·å–æžšä¸¾å€¼
     *
     * @return æžšä¸¾å€¼
     */
    @Override
    public String getValue() {
        return value;
    }
    /**
     * è®¾ç½®æžšä¸¾å€¼
     *
     * @param value æžšä¸¾å€¼
     */
    public void setValue(String value) {
        this.value = value;
    }
    /**
     * èŽ·å–æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     *
     * @return æ˜¾ç¤ºæ–‡æœ¬
     */
    @Override
    public String getText() {
        return text;
    }
    /**
     * è®¾ç½®æ˜¾ç¤ºæ–‡æœ¬
     *
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    public void setText(String text) {
        this.text = text;
    }
    /**
     * æž„造函数
     *
     * @param value å€¼
     * @param text  æ˜¾ç¤ºæ–‡æœ¬
     */
    private CodeRuleCharacterEnum(String value, String text) {
        this.value = value;
        this.text = text;
    }
    /**
     * æ ¹æ®åç§°èŽ·å–å¯¹åº”çš„æžšä¸¾å€¼
     *
     * @param text åç§°
     * @return æžšä¸¾å€¼
     */
    public static String getValueByText(String text) {
        for (CodeRuleCharacterEnum wenum : CodeRuleCharacterEnum.values()) {
            if (wenum.getText().equalsIgnoreCase(text)) {
                return wenum.getValue();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–åç§°
     *
     * @param value æžšä¸¾å€¼
     * @return åç§°
     */
    public static String getTextByValue(String value) {
        for (CodeRuleCharacterEnum wenum : CodeRuleCharacterEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(value)) {
                return wenum.getText();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–æžšä¸¾å¯¹è±¡
     *
     * @param value æžšä¸¾å€¼
     * @return æžšä¸¾å¯¹è±¡ï¼Œä¸å­˜åœ¨æ—¶å€™è¿”回null
     */
    public static CodeRuleCharacterEnum forValue(String value) {
        for (CodeRuleCharacterEnum wenum : CodeRuleCharacterEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(value)) {
                return wenum;
            }
        }
        return null;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeRuleCharacterMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.vci.ubcs.code.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.code.entity.CodeRuleCharacter;
public interface CodeRuleCharacterMapper extends BaseMapper<CodeRuleCharacter>{
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.vci.ubcs.code.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.yulichang.base.MPJBaseService;
import com.vci.ubcs.code.entity.CodeAllCode;
import com.vci.ubcs.code.entity.CodeClassify;
import com.vci.ubcs.code.entity.CodeResembleRule;
import com.vci.ubcs.code.entity.CodeRuleCharacter;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import org.springblade.core.tool.api.R;
import java.util.List;
import java.util.Map;
/***
 * è§„则字符集配置
 * @author xj
 * @date 2023-11-30
 */
public interface ICodeRuleCharacterService  extends IService<CodeRuleCharacter> {
    /**
     * ä½¿ç”¨ç¼–码规则oid获取数据
     * @param codeRuleId
     * @param chartType
     * @return
     * @throws VciBaseException
     */
    List<Map<String,String>> getDataByRuleId(String codeRuleId,String chartType)throws VciBaseException;
    /***
     * ä¿å­˜ç¼–码规则字符集
     * @param codeRuleCharacterVO
     * @return
     */
    R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO)throws VciBaseException;
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java
@@ -40,7 +40,7 @@
     * @param file excel文件的信息
     * @return æœ‰é”™è¯¯ä¿¡æ¯çš„excel
     */
    CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file);
    CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception;
    /***
     *批量申请编码数据
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -207,12 +208,16 @@
        // ä¸ä¸ºç©ºå°±éœ€è¦è¯¥å½“前分类下所有子分类的isParticipateCheck
        if(!codeClassifies.isEmpty()){
            List<String> oids = codeClassifies.stream().map(CodeClassify::getOid).collect(Collectors.toList());
            updateAttr = codeClassifyMapper.update(
                null,
                Wrappers.<CodeClassify>update()
                    .lambda().in(CodeClassify::getOid, oids)
                    .set(CodeClassify::getIsParticipateCheck, codeClassifyEntity.getIsParticipateCheck())
            );
            LambdaUpdateWrapper<CodeClassify> updateWrapper = Wrappers.<CodeClassify>update()
                .lambda().in(CodeClassify::getOid, oids)
                .set(CodeClassify::getIsParticipateCheck, codeClassifyEntity.getIsParticipateCheck());
            // çˆ¶åˆ†ç±»çš„业务类型做了更改,所有子分类的都得进行更改
            if(!codeClassifyEntity.getBtmTypeId().equals(detail.getBtmTypeId())){
                updateWrapper.set(CodeClassify::getBtmTypeId,codeClassifyEntity.getBtmTypeId())
                    .set(CodeClassify::getBtmTypeName,codeClassifyEntity.getBtmTypeName());
            }
            updateAttr = codeClassifyMapper.update(null,updateWrapper);
        }
//         //处理数据集成逻辑,成功后执行集成第一步,分类数据特殊处理。只有启用状态的分类才推送
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.base.Joiner;
import com.vci.ubcs.code.entity.CodeRuleCharacter;
import com.vci.ubcs.code.mapper.CodeRuleCharacterMapper;
import com.vci.ubcs.code.service.ICodeRuleCharacterService;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/***
 * ç¼–码规则字符集服务
 * @author xj
 * @date 2023-11-30
 */
@Service
public class CodeRuleCharacterServiceImpl extends ServiceImpl<CodeRuleCharacterMapper, CodeRuleCharacter> implements ICodeRuleCharacterService {
    @Autowired
    private CodeRuleCharacterMapper codeRuleCharacterMapper;
    /***
     * ä½¿ç”¨ç¼–码规则oid获取数据
     * @param codeRuleId
     * @param chartType
     * @return
     * @throws VciBaseException
     */
    @Override
    public List<Map<String, String>> getDataByRuleId(String codeRuleId,String chartType) throws VciBaseException {
        List<Map<String,String>> charValueList=new ArrayList<>();
        CodeRuleCharacter codeRuleCharacter=codeRuleCharacterMapper.selectOne(Wrappers.<CodeRuleCharacter>query().lambda().eq(CodeRuleCharacter::getCodeRuleId,codeRuleId).eq(CodeRuleCharacter::getChartType,chartType));
        List<Character> characterList=codeRuleCharacter.getChartValue().chars().mapToObj(c -> (char) c).collect(Collectors.toList());
        for (int i = 0; i < characterList.size(); i += 15) {
            final int startIndex = i;
            final int endIndex = Math.min(i + 15, characterList.size());
            List<Character> subList = characterList.subList(startIndex, endIndex);
            Map<String, String> chartMap=new HashMap<>();
            // è°ƒç”¨æ’入数据库的方法
            for (int j=1;j<subList.size()+1;j++){
                String characterValue=subList.get(j-1)==null?"":subList.get(j-1).toString();
                chartMap.put(String.valueOf(j),String.valueOf(characterValue));
            }
            charValueList.add(chartMap);
        }
        return charValueList;
    }
    /***
     * å­—符集数据保存
     * @param codeRuleCharacterVO
     * @return
     * @throws VciBaseException
     */
    @Override
    public R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO) throws VciBaseException {
        VciBaseUtil.alertNotNull(codeRuleCharacterVO.getCodeRuleId(),"编码规则id",codeRuleCharacterVO.getChartType(),"字符集类型");
        CodeRuleCharacter codeRuleCharacter=codeRuleCharacterMapper.selectOne(Wrappers.<CodeRuleCharacter>query().lambda().eq(CodeRuleCharacter::getCodeRuleId,codeRuleCharacterVO.getCodeRuleId()).eq(CodeRuleCharacter::getChartType,codeRuleCharacterVO.getChartType()));
        if(codeRuleCharacter!=null&& StringUtils.isNotBlank(codeRuleCharacter.getOid())) {
            List<Character> oldCharacterList =  StringUtils.isBlank(codeRuleCharacter.getChartValue())?new ArrayList<>():codeRuleCharacter.getChartValue().chars().mapToObj(c -> (char) c).collect(Collectors.toList());
            List<Character> newCharacterList = StringUtils.isBlank(codeRuleCharacterVO.getChartValue())?new ArrayList<>():codeRuleCharacterVO.getChartValue().chars().mapToObj(c -> (char) c).collect(Collectors.toList());
            List<Character> intersectList = intersect(oldCharacterList, newCharacterList);
            if (intersectList.size() > 0) {
                String ss = Joiner.on(",").join(intersectList);
                throw new VciBaseException("系统中存在相应的字符:【" + ss + "】");
            }
            List<Character> allCharacterList = union(oldCharacterList, newCharacterList);
            String str = allCharacterList.stream().map(integer -> Func.isNotEmpty(integer)?integer.toString():"").collect(Collectors.joining());
            codeRuleCharacter.setChartValue(str);
            codeRuleCharacterMapper.updateById(codeRuleCharacter);
        }else{
            codeRuleCharacter=new CodeRuleCharacter();
            DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeRuleCharacter,"character");
            codeRuleCharacter.setCodeRuleId(codeRuleCharacterVO.getCodeRuleId());
            codeRuleCharacter.setChartType(codeRuleCharacterVO.getChartType());
            codeRuleCharacter.setChartValue(codeRuleCharacterVO.getChartValue());
            codeRuleCharacterMapper.insert(codeRuleCharacter);
        }
        return R.status(true);
    }
    /**
     * äº¤é›†
     * @param list1
     * @param list2
     * @return
     */
    private static List<Character> intersect(List<Character> list1, List<Character> list2) {
        List<Character> intersect = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
        return intersect;
    }
    /**
     * å¹¶é›†ï¼ˆåŽ»é‡ï¼‰
     * @param list1
     * @param list2
     * @return
     */
    private static List<Character> union(List<Character> list1, List<Character> list2) {
        list1.addAll(list2);
        return list1.stream().distinct().collect(Collectors.toList());
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1,5 +1,6 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -42,6 +43,7 @@
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
import com.vci.ubcs.starter.util.SaveLogUtil;
import com.vci.ubcs.starter.util.UBCSSqlKeyword;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
import com.vci.ubcs.starter.web.constant.RegExpConstant;
@@ -62,12 +64,14 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.log.annotation.OperateLog;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.Cache;
@@ -346,8 +350,15 @@
     */
    @Autowired
    private IMDMIFlowAttrClient imdmiFlowAttrClient;
//    @Autowired
//    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;----
    //    @Autowired
    //    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
    /**
     * æ—¥å¿—保存工具类
     */
    @Autowired
    private SaveLogUtil saveLogUtil;
    /**
@@ -410,39 +421,52 @@
    @Transactional
    @Override
    public void changeStatus(BaseModelDTO baseModelDTO) {
        VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
        List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
        List<BaseModel> baseModels = new ArrayList<>();
        baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
        if (baseModels.size() == 0) {
            throw new VciBaseException("未查询到相关数据。");
        }
        //还需要修改allCode的生命周期
        QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
        allCodeWrapper.eq("createcodebtm", baseModelDTO.getBtmname());
        allCodeWrapper.in("createcodeoid", oids);
        List<CodeAllCode> codeCbos = codeAllCodeService.selectByWrapper(allCodeWrapper);// å›žæ”¶éœ€è¦ä¸šåŠ¡æ•°æ®åˆ é™¤
        if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
            R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
            if (!listR.isSuccess() || listR.getData().size() == 0) {
                throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
            }
            // ç›´æŽ¥åˆ é™¤ï¼Œä¸ç»™çŠ¶æ€
            commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()));
            // commonsMapper.updateByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()),CodeDefaultLC.TASK_BACK.getValue());
        } else {
            for (BaseModel baseModel : baseModels) {
                baseModel.setLcStatus(baseModelDTO.getLcStatus());
            }
            R r = updateBatchByBaseModel(baseModelDTO.getBtmname(), baseModels);
            if(!r.isSuccess()){
                throw new VciBaseException("更新数据出错,重试!"+r.getMsg());
        try {
            VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
            List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
            List<BaseModel> baseModels = new ArrayList<>();
            baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
            if (baseModels.size() == 0) {
                throw new VciBaseException("未查询到相关数据。");
            }
            //还需要修改allCode的生命周期
            QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
            allCodeWrapper.eq("createcodebtm", baseModelDTO.getBtmname());
            allCodeWrapper.in("createcodeoid", oids);
            List<CodeAllCode> codeCbos = codeAllCodeService.selectByWrapper(allCodeWrapper);// å›žæ”¶éœ€è¦ä¸šåŠ¡æ•°æ®åˆ é™¤
            if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
                R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
                if (!listR.isSuccess() || listR.getData().size() == 0) {
                    throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
                }
                // ç›´æŽ¥åˆ é™¤ï¼Œä¸ç»™çŠ¶æ€
                commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()));
                // commonsMapper.updateByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()),CodeDefaultLC.TASK_BACK.getValue());
            } else {
                for (BaseModel baseModel : baseModels) {
                    baseModel.setLcStatus(baseModelDTO.getLcStatus());
                }
                R r = updateBatchByBaseModel(baseModelDTO.getBtmname(), baseModels);
                if(!r.isSuccess()){
                    throw new VciBaseException("更新数据出错,重试!"+r.getMsg());
                }
            }
            for (CodeAllCode codeCbo : codeCbos) {
                codeCbo.setLcStatus(baseModelDTO.getLcStatus());
            }
            codeAllCodeService.updateBatchById(codeCbos);
            //记录日志信息
            saveLogUtil.operateLog(
                CodeDefaultLC.getTextByValue(baseModelDTO.getLcStatus()),
                false,
                JSON.toJSONString(baseModels)
            );
        }catch (Exception e){
            // æ’入更改日志记录
            saveLogUtil.operateLog(CodeDefaultLC.getTextByValue(baseModelDTO.getLcStatus()),true,e.getMessage());
            throw e;
        }
        for (CodeAllCode codeCbo : codeCbos) {
            codeCbo.setLcStatus(baseModelDTO.getLcStatus());
        }
        codeAllCodeService.updateBatchById(codeCbos);
    }
    /**
@@ -2705,6 +2729,7 @@
        cbo.setLastModifyTime(new Date());
        cbo.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
        R r = updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), Collections.singletonList(cbo));
        if(!r.isSuccess()){
            throw new ServiceException(r.getMsg());
        }
@@ -3079,11 +3104,18 @@
        oldCbo.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
        oldCbo.setLastModifyTime(new Date());
        try {
            // ä¿®æ”¹ç‰ˆæ¬¡å·
            updateBatchByBaseModel(oldCbo.getBtmname(), Collections.singletonList(oldCbo));
            // æ’入新的数据
            insertBatchByType(cbo.getBtmname(), Collections.singletonList(cbo));
        } catch (Exception vciError) {
            throw new VciBaseException("数据更改保存出错了", new String[0], vciError);
        }
            // è®°å½•数据更改日志
            saveLogUtil.operateLog("数据更改",false, StringUtil.format("{}\n修改为:\n{}",JSON.toJSONString(Collections.singletonList(oldCbo)),JSON.toJSONString(Collections.singletonList(cbo))));
        } catch (Exception vciError) {
            // è®°å½•数据更改报错时的日志
            saveLogUtil.operateLog("数据更改",true,vciError.getMessage());
            throw new VciBaseException("数据更改保存出错了", new String[0], vciError);
        }
        batchSaveSelectChar(templateVO, Collections.singletonList(cbo));
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -1,5 +1,6 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -37,6 +38,7 @@
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.util.SaveLogUtil;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
@@ -56,6 +58,7 @@
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -72,6 +75,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
@@ -175,6 +179,11 @@
     */
    @Resource
    private IWebSecretClient secretService;
    /**
     * æ—¥å¿—保存工具类
     */
    @Autowired
    private SaveLogUtil saveLogUtil;
    /**
     * å¯¼å‡ºçš„十万条
@@ -538,7 +547,7 @@
     * @return  æœ‰é”™è¯¯ä¿¡æ¯çš„excel的文件
     */
    @Override
    public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
    public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception {
        VciBaseUtil.alertNotNull(orderDTO,"编码申请相关的数据",orderDTO.getCodeClassifyOid(),"主题库分类主键");
        ReadExcelOption reo = new ReadExcelOption();
        reo.setReadAllSheet(true);
@@ -810,322 +819,331 @@
     */
    @Override
    public CodeImProtRusultVO batchImportHistoryData(String codeClassifyOid, String classifyAttr,File file) throws  Throwable{
        VciBaseUtil.alertNotNull(codeClassifyOid,"分类的主键");
        ReadExcelOption reo = new ReadExcelOption();
        reo.setReadAllSheet(true);
        List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
        if (sheetDataSetList.size() > LIMIT + 1) {
            throw new VciBaseException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
        }
        Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
        //相似项目查重
        String uuid=VciBaseUtil.getPk();
        boolean isCreateUUid=false;
        boolean isExport=false;
        //long start = System.currentTimeMillis();
        for(int i=0;i<sheetDataSetList.size()-1;i++) {
            if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
                || sheetDataSetList.get(i).getRowData().size() < 1) {
                continue;
        try {
            VciBaseUtil.alertNotNull(codeClassifyOid,"分类的主键");
            ReadExcelOption reo = new ReadExcelOption();
            reo.setReadAllSheet(true);
            List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
            if (sheetDataSetList.size() > LIMIT + 1) {
                throw new VciBaseException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
            }
            // å•次导入数量限制
            if(sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT){
                throw new ServiceException("为了保证系统的稳定性,请一次不要导入超过"+IMPORT_DATA_LIMIT+"条的数据");
            }
            //历史导入的时候不处理编码
            //----逻辑内容----
            //1. åˆ†ç±»çš„路径可以在页面上选择是分类编号还是分类的名称
            //2. åˆ†ç±»çš„路径,必须是当前导入选择的分类的节点,以及其下级节点
            //3. é€šè¿‡æ•°æ®è¦å¯¼å…¥çš„分类去查找对应的编码规则
            //4. æ•°æ®å­˜å‚¨å’Œæ‰¹é‡ç”³è¯·ä¸€æ ·ï¼Œ
            //5. éœ€è¦å•独处理企业编码的内容,
            //     5.1 ä¼ä¸šç¼–码在当前excel里不能重复
            //     5.2 ä¼ä¸šç¼–码在系统中不能重复(可以是已经回收的)
            //     5.3 ä¼ä¸šç¼–码的长度,和编码规则的长度要对应上
            //     5.4 èŽ·å–æµæ°´ç æ®µçš„å€¼ï¼ŒåŽ»é™¤å¡«å……çš„å­—ç¬¦ï¼Œçœ‹æµæ°´å·æ˜¯å¤šå°‘ï¼Œç„¶åŽå°†æµæ°´å·å’ŒçŽ°åœ¨çš„æœ€å¤§æµæ°´å·åˆ¤æ–­ï¼Œå°äºŽå°±ç›´æŽ¥å½•å…¥ï¼Œå¤§äºŽåˆ™ä¿®æ”¹æœ€å¤§æµæ°´å·
            //     5.5 å­˜å‚¨ä¼ä¸šç¼–码到allcode中
            //查询分类和模板
            Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
            //相似项目查重
            String uuid=VciBaseUtil.getPk();
            boolean isCreateUUid=false;
            boolean isExport=false;
            //long start = System.currentTimeMillis();
            // è®°å½•导入成功的总数
            List<Integer> importCount = new ArrayList<>();
            CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
            //先找到每一行的标题,然后根据标题来获取对应的属性
            SheetDataSet dataSet = sheetDataSetList.get(i);
            List<SheetRowData> rowDataList = dataSet.getRowData();
            //找第一行,为了找标题
            CodeClassifyTemplateVO templateVO = new CodeClassifyTemplateVO();
            /**  if (!templateService.checkChildHasSameTemplate(classifyFullInfo.getCurrentClassifyVO().getOid())) {
                 throw new VciBaseException("当前的分类以及下级分类的模板不相同");
             }***/
            //都转换完了。需要批量检查
            //找所有的分类路径,需要校验路径是否正确,是否都在当前的分类的下级
            List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
            Map<String/**路径**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
            List<String> titleRowData = dataSet.getColName();
            Map<String, String> errorMap = new ConcurrentHashMap<>();
            pathMap.put("#current#",classifyFullInfo.getCurrentClassifyVO());
            try {
                List<CodeClassifyTemplateVO> templateVOList= checkSamesTemplate(titleRowData,sheetDataSetList,i,pathMap,errorMap);
                templateVO= templateVOList.get(0);
            }catch (Throwable e){
                throw  new VciBaseException(e.getMessage());
            }
            List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
                String rowIndex = cbo.getRowIndex();
                return !errorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
            //checkTemplateSync(sheetDataSetList, templateVO,i);
            //这里不除去默认的属性
            List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
            Map<Integer/**列号**/, String/**字段的名称**/> fieldIndexMap = new HashMap<>();
            Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
            String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
            getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
            //先不用管属性是否都存在,先转换一下数据
            List<ClientBusinessObject> cboList = new ArrayList<>();
            String fullPath = getFullPath(classifyFullInfo);
            //我们需要获取到所有的下级分类的oid的路径,因为后面需要
            Map<String/**主键**/, String/**路径**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
            excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
            Map<String/**主键**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
            classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
            pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
            //判断编号在excel里本身就重复的
            Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
            List<String> repeatIdList = new ArrayList<>();
            idCountMap.forEach((id, count) -> {
                if (count > 1) {
                    repeatIdList.add(id);
            for(int i=0;i<sheetDataSetList.size()-1;i++) {
                if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
                    || sheetDataSetList.get(i).getRowData().size() < 1) {
                    continue;
                }
            });
            if (!CollectionUtils.isEmpty(repeatIdList)) {
                cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
                    errorMap.put(rowIndex, "编号在当前excel中重复;");
                });
            }
            //我们需要判断这些分类的模板是不是一样的,只需要校验,不用获取
            //检查分类的路径
            checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
                // å•次导入数量限制
                if(sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT){
                    throw new ServiceException("为了保证系统的稳定性,请一次不要导入超过"+IMPORT_DATA_LIMIT+"条的数据");
                }
                //历史导入的时候不处理编码
                //----逻辑内容----
                //1. åˆ†ç±»çš„路径可以在页面上选择是分类编号还是分类的名称
                //2. åˆ†ç±»çš„路径,必须是当前导入选择的分类的节点,以及其下级节点
                //3. é€šè¿‡æ•°æ®è¦å¯¼å…¥çš„分类去查找对应的编码规则
                //4. æ•°æ®å­˜å‚¨å’Œæ‰¹é‡ç”³è¯·ä¸€æ ·ï¼Œ
                //5. éœ€è¦å•独处理企业编码的内容,
                //     5.1 ä¼ä¸šç¼–码在当前excel里不能重复
                //     5.2 ä¼ä¸šç¼–码在系统中不能重复(可以是已经回收的)
                //     5.3 ä¼ä¸šç¼–码的长度,和编码规则的长度要对应上
                //     5.4 èŽ·å–æµæ°´ç æ®µçš„å€¼ï¼ŒåŽ»é™¤å¡«å……çš„å­—ç¬¦ï¼Œçœ‹æµæ°´å·æ˜¯å¤šå°‘ï¼Œç„¶åŽå°†æµæ°´å·å’ŒçŽ°åœ¨çš„æœ€å¤§æµæ°´å·åˆ¤æ–­ï¼Œå°äºŽå°±ç›´æŽ¥å½•å…¥ï¼Œå¤§äºŽåˆ™ä¿®æ”¹æœ€å¤§æµæ°´å·
                //     5.5 å­˜å‚¨ä¼ä¸šç¼–码到allcode中
                //查询分类和模板
            //检查规则
            Map<String/**分类主键**/, String/**规则主键**/> ruleOidMap = new ConcurrentHashMap<String, String>();
            List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
            checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
            //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
                //先找到每一行的标题,然后根据标题来获取对应的属性
                SheetDataSet dataSet = sheetDataSetList.get(i);
                List<SheetRowData> rowDataList = dataSet.getRowData();
            //我们根据出错的分类的主键,去找行号
            if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
                cboList.stream().forEach(cbo -> {
                    if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
                        String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                        errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";根据分类路径对应的分类,没有设置编码规则");
                //找第一行,为了找标题
                CodeClassifyTemplateVO templateVO = new CodeClassifyTemplateVO();
                /**  if (!templateService.checkChildHasSameTemplate(classifyFullInfo.getCurrentClassifyVO().getOid())) {
                 throw new VciBaseException("当前的分类以及下级分类的模板不相同");
                 }***/
                //都转换完了。需要批量检查
                //找所有的分类路径,需要校验路径是否正确,是否都在当前的分类的下级
                List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
                Map<String/**路径**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
                List<String> titleRowData = dataSet.getColName();
                Map<String, String> errorMap = new ConcurrentHashMap<>();
                pathMap.put("#current#",classifyFullInfo.getCurrentClassifyVO());
                try {
                    List<CodeClassifyTemplateVO> templateVOList= checkSamesTemplate(titleRowData,sheetDataSetList,i,pathMap,errorMap);
                    templateVO= templateVOList.get(0);
                }catch (Throwable e){
                    throw  new VciBaseException(e.getMessage());
                }
                List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
                    String rowIndex = cbo.getRowIndex();
                    return !errorMap.containsKey(rowIndex);
                }).collect(Collectors.toList());
                //checkTemplateSync(sheetDataSetList, templateVO,i);
                //这里不除去默认的属性
                List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
                Map<Integer/**列号**/, String/**字段的名称**/> fieldIndexMap = new HashMap<>();
                Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
                String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
                getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
                //先不用管属性是否都存在,先转换一下数据
                List<ClientBusinessObject> cboList = new ArrayList<>();
                String fullPath = getFullPath(classifyFullInfo);
                //我们需要获取到所有的下级分类的oid的路径,因为后面需要
                Map<String/**主键**/, String/**路径**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
                excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
                Map<String/**主键**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
                classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
                pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
                //判断编号在excel里本身就重复的
                Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
                List<String> repeatIdList = new ArrayList<>();
                idCountMap.forEach((id, count) -> {
                    if (count > 1) {
                        repeatIdList.add(id);
                    }
                });
            }
            //判断必输项
            batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
            //优先校验编码是否存在
            batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
            //boolean
            reSwitchBooleanAttrOnOrder(attrVOS, cboList);
            // æžšä¸¾çš„内容需要根据名称转换为枚举的值
            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
            batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
            //6.处理分类注入
            batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
            //设置默认值
            batchSwitchAttrDefault(attrVOS, cboList);
            //7.处理组合规则
            batchSwitchComponentAttrOnOrder(attrVOS, cboList);
            //3.判断关键属性
            CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
            Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
            Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
            if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
                selfRepeatRowIndexList.stream().forEach(rowIndex -> {
                    errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";在当前excel文件中关键属性重复");
                });
            }
            if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
                keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
                    errorMap.put(rowIndex, "关键属性与系统中的重复;" + errorMap.getOrDefault(rowIndex, ""));
                });
            }
            //4.校验规则
            batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
            //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
            batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
            if (CollectionUtils.isEmpty(ruleOidMap.values())) {
                throw new VciBaseException("导入的数据所选择的分类都没有设置编码规则");
            }
            // TODO: è¯¥ç”¨oid查询规则的,别用id
            Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
            //校验编码规则和码段是否正确
            Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
            checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
            ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
                List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
                List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
                //我们需要先查询一下,内容是否已经存在
                if(!CollectionUtils.isEmpty(thisCbos)){
                    List<String> existIds = new ArrayList<>();
                    VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
                        List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
                            .notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
                            .notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
                        );
                        existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
                            String id = s.getId();
                            if (StringUtils.isBlank(id)) {
                                id = s.getId();
                            }
                            return id;
                        }).collect(Collectors.toList()));
                if (!CollectionUtils.isEmpty(repeatIdList)) {
                    cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
                        errorMap.put(rowIndex, "编号在当前excel中重复;");
                    });
                    List<String> existIdCbos = thisCbos.stream().filter(s -> {
                        String id = s.getId();
                        if (StringUtils.isBlank(id)) {
                            id = s.getAttributeValue("id");
                }
                //我们需要判断这些分类的模板是不是一样的,只需要校验,不用获取
                //检查分类的路径
                checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
                //检查规则
                Map<String/**分类主键**/, String/**规则主键**/> ruleOidMap = new ConcurrentHashMap<String, String>();
                List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
                checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
                //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
                //我们根据出错的分类的主键,去找行号
                if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
                    cboList.stream().forEach(cbo -> {
                        if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
                            String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                            errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";根据分类路径对应的分类,没有设置编码规则");
                        }
                        return existIds.contains(id);
                    }).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
                    if (!CollectionUtils.isEmpty(existIdCbos)) {
                        thisCbos = thisCbos.stream().filter(s -> {
                    });
                }
                //判断必输项
                batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
                //优先校验编码是否存在
                batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
                //boolean
                reSwitchBooleanAttrOnOrder(attrVOS, cboList);
                // æžšä¸¾çš„内容需要根据名称转换为枚举的值
                batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
                batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
                //6.处理分类注入
                batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
                //设置默认值
                batchSwitchAttrDefault(attrVOS, cboList);
                //7.处理组合规则
                batchSwitchComponentAttrOnOrder(attrVOS, cboList);
                //3.判断关键属性
                CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
                Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
                Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
                if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
                    selfRepeatRowIndexList.stream().forEach(rowIndex -> {
                        errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";在当前excel文件中关键属性重复");
                    });
                }
                if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
                    keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
                        errorMap.put(rowIndex, "关键属性与系统中的重复;" + errorMap.getOrDefault(rowIndex, ""));
                    });
                }
                //4.校验规则
                batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
                //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
                batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
                if (CollectionUtils.isEmpty(ruleOidMap.values())) {
                    throw new VciBaseException("导入的数据所选择的分类都没有设置编码规则");
                }
                // TODO: è¯¥ç”¨oid查询规则的,别用id
                Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
                //校验编码规则和码段是否正确
                Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
                checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
                ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
                    List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
                    List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
                    //我们需要先查询一下,内容是否已经存在
                    if(!CollectionUtils.isEmpty(thisCbos)){
                        List<String> existIds = new ArrayList<>();
                        VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
                            List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
                                .notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
                                .notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
                            );
                            existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
                                String id = s.getId();
                                if (StringUtils.isBlank(id)) {
                                    id = s.getId();
                                }
                                return id;
                            }).collect(Collectors.toList()));
                        });
                        List<String> existIdCbos = thisCbos.stream().filter(s -> {
                            String id = s.getId();
                            if (StringUtils.isBlank(id)) {
                                id = s.getAttributeValue("id");
                            }
                            return !existIdCbos.contains(id);
                        }).collect(Collectors.toList());
                        existIdCbos.stream().forEach(rowIndex -> {
                            errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";【" + idFieldName + "】在系统中已经被占用");
                        });
                    }
                }
            });
            Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
            if (errorMap.size() > 0) {
                isExport=true;
                createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
            }
            createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
            List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                return !errorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
            //相似校验
            Map<String, String> resembleMap = new HashMap<>();
            List<DataResembleVO> dataResembleVOS = new ArrayList<>();
            String btmtypeid = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
            bathcResembleQuery(templateVO.getCodeclassifyoid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
            if (resembleMap.size() > 0) {
                if (!CollectionUtils.isEmpty(dataResembleVOS)) {
                    bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
                    createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
                }
            }
            //生成class缓存
            Map<String, String> rowIndexClsOidMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t.getAttributeValue(CODE_CLASSIFY_OID_FIELD)));
            createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,true);
            //获取编码,查询在系统中是否被其他的引用了
            //排除错误的,剩下正确的
            Map<String, String> newErrorMap = new HashMap<>();
            newErrorMap.putAll(resembleMap);
            newErrorMap.putAll(errorMap);
            //要把以上的错误的都抛出后,再继续处理时间和组合规则
            needSaveCboList = cboList.stream().filter(cbo -> {
                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                return !newErrorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
            if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
                isCreateUUid=true;
            }
            List<String> needRowIndexList = needSaveCboList.stream().filter(s -> errorMap.containsKey(s.getAttributeValue(IMPORT_ROW_INDEX))).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
            if (isExport||newErrorMap.size() > 0) {
                createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
            } else {
                List<BaseModel> dataCBOIdList=new ArrayList<>();
                //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
                List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
                CodeClassifyTemplateVO finalTemplateVO = templateVO;
                ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
                    //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
                    List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
                    List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
                    List<BaseModel> dataCBOList=new CopyOnWriteArrayList<>();
                    thisCbos.stream().forEach(clientBusinessObject -> {
                        BaseModel baseModel=new BaseModel();
                        BeanUtil.convert(clientBusinessObject,baseModel);
                        //baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
                        dataCBOList.add(baseModel);
                        dataCBOIdList.add(baseModel);
                    });
                    if (!CollectionUtils.isEmpty(thisCbos)) {
                        try {
                            // TODO å¤šçº¿ç¨‹æµé—®é¢˜
                            productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
                        } catch (Throwable e) {
                            log.error("批量产生编码的时候出错了", e);
                            thisCbos.stream().forEach(cbo -> {
                                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                                errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";系统错误,存储数据的时候出错了:"+e.getMessage());
                            return existIds.contains(id);
                        }).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
                        if (!CollectionUtils.isEmpty(existIdCbos)) {
                            thisCbos = thisCbos.stream().filter(s -> {
                                String id = s.getId();
                                if (StringUtils.isBlank(id)) {
                                    id = s.getAttributeValue("id");
                                }
                                return !existIdCbos.contains(id);
                            }).collect(Collectors.toList());
                            existIdCbos.stream().forEach(rowIndex -> {
                                errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";【" + idFieldName + "】在系统中已经被占用");
                            });
                        }
                    }
                });
                if (errorMap.size() > 0) {
                    isExport = true;
                }
                createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
                engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
            }
        }
        //long end = System.currentTimeMillis();
        //log.info("=============for执行时间================="+String.valueOf((end-start)/1000));
        String excelFileName="";
        if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
            excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "错误信息.xls";
            WriteExcelOption eo = new WriteExcelOption();
            shetNameMap.forEach((shetName, errorDataList) -> {
                eo.addSheetDataList(shetName, errorDataList);
            });
            try {
                new File(excelFileName).createNewFile();
            } catch (IOException e) {
                throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
            }
            ExcelUtil.writeDataToFile(excelFileName, eo);
        }
        CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
        if(StringUtils.isNotBlank(excelFileName)) {
            codeImProtRusultVO.setFilePath(excelFileName);
            codeImProtRusultVO.setFileOid("");
        }
        if(isCreateUUid){
            codeImProtRusultVO.setRedisUuid(uuid);
        }
        return codeImProtRusultVO;
                Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
                if (errorMap.size() > 0) {
                    isExport=true;
                    createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
                }
                createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
                List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
                    String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                    return !errorMap.containsKey(rowIndex);
                }).collect(Collectors.toList());
                //相似校验
                Map<String, String> resembleMap = new HashMap<>();
                List<DataResembleVO> dataResembleVOS = new ArrayList<>();
                String btmtypeid = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
                bathcResembleQuery(templateVO.getCodeclassifyoid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
                if (resembleMap.size() > 0) {
                    if (!CollectionUtils.isEmpty(dataResembleVOS)) {
                        bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
                        createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
                    }
                }
                //生成class缓存
                Map<String, String> rowIndexClsOidMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t.getAttributeValue(CODE_CLASSIFY_OID_FIELD)));
                createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,true);
                //获取编码,查询在系统中是否被其他的引用了
                //排除错误的,剩下正确的
                Map<String, String> newErrorMap = new HashMap<>();
                newErrorMap.putAll(resembleMap);
                newErrorMap.putAll(errorMap);
                //要把以上的错误的都抛出后,再继续处理时间和组合规则
                needSaveCboList = cboList.stream().filter(cbo -> {
                    String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                    return !newErrorMap.containsKey(rowIndex);
                }).collect(Collectors.toList());
                if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
                    isCreateUUid=true;
                }
                List<String> needRowIndexList = needSaveCboList.stream().filter(s -> errorMap.containsKey(s.getAttributeValue(IMPORT_ROW_INDEX))).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
                if (isExport||newErrorMap.size() > 0) {
                    createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
                } else {
                    List<BaseModel> dataCBOIdList=new ArrayList<>();
                    //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
                    List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
                    CodeClassifyTemplateVO finalTemplateVO = templateVO;
                    ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
                        //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
                        List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
                        List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
                        List<BaseModel> dataCBOList=new CopyOnWriteArrayList<>();
                        thisCbos.stream().forEach(clientBusinessObject -> {
                            BaseModel baseModel=new BaseModel();
                            BeanUtil.convert(clientBusinessObject,baseModel);
                            //baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
                            dataCBOList.add(baseModel);
                            dataCBOIdList.add(baseModel);
                        });
                        if (!CollectionUtils.isEmpty(thisCbos)) {
                            try {
                                // TODO å¤šçº¿ç¨‹æµé—®é¢˜
                                productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
                                importCount.add(dataCBOList.size());
                            } catch (Throwable e) {
                                log.error("批量产生编码的时候出错了", e);
                                thisCbos.stream().forEach(cbo -> {
                                    String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                                    errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";系统错误,存储数据的时候出错了:"+e.getMessage());
                                });
                            }
                        }
                    });
                    if (errorMap.size() > 0) {
                        isExport = true;
                    }
                    createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
                    engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
                }
            }
            //long end = System.currentTimeMillis();
            //log.info("=============for执行时间================="+String.valueOf((end-start)/1000));
            String excelFileName="";
            if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
                excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "错误信息.xls";
                WriteExcelOption eo = new WriteExcelOption();
                shetNameMap.forEach((shetName, errorDataList) -> {
                    eo.addSheetDataList(shetName, errorDataList);
                });
                try {
                    new File(excelFileName).createNewFile();
                } catch (IOException e) {
                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
                }
                ExcelUtil.writeDataToFile(excelFileName, eo);
            }
            CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
            if(StringUtils.isNotBlank(excelFileName)) {
                codeImProtRusultVO.setFilePath(excelFileName);
                codeImProtRusultVO.setFileOid("");
                saveLogUtil.operateLog("历史数据导入",true, StringUtil.format("错误信息:{}",JSON.toJSONString(shetNameMap)) );
            }else{
                saveLogUtil.operateLog("历史数据导入",false, StringUtil.format("导入到分类{}中,导入成功总数为:{}", JSON.toJSONString(classifyFullInfo),importCount.get(0)));
            }
            if(isCreateUUid){
                codeImProtRusultVO.setRedisUuid(uuid);
            }
            return codeImProtRusultVO;
        }catch (Exception e){
            saveLogUtil.operateLog("历史数据导入",true,e.getMessage());
            throw e;
        }
    }
    /*private void converBaseModels(List<ClientBusinessObject> clientBusinessObjects,List<BaseModel>dataCBOList){
@@ -1291,7 +1309,6 @@
    }
    /***
     * æ‰¹é‡å¤„理申请数据
     * @param orderDTO
@@ -1299,140 +1316,148 @@
     * @param dataSet
     * @return
     */
    private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
    private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType) throws Exception {
        List<String> codeList=new ArrayList<>();
        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
        //规则的主键需要去获取
        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
        //1.判断规则中除了流水码段,是否有其他码段
        engineService.checkSecValueOnOrder(ruleVO,orderDTO);
        List<SheetRowData> rowDataList = dataSet.getRowData();
        String uuid = "";
        try {
            CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
            //规则的主键需要去获取
            CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
            //1.判断规则中除了流水码段,是否有其他码段
            engineService.checkSecValueOnOrder(ruleVO,orderDTO);
            List<SheetRowData> rowDataList = dataSet.getRowData();
        //除去默认的属性.还有只有表单显示的字段才导入
        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
        ).collect(Collectors.toList());
        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
        List<String> titleRowData = dataSet.getColName();
        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
            //除去默认的属性.还有只有表单显示的字段才导入
            List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
                !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
            ).collect(Collectors.toList());
            Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
            List<String> titleRowData = dataSet.getColName();
            Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
            getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
        //需要判断是否所有的属性都在模板上了
        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
            && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//组合规则和分类注入确实没给用户导出去
        ).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
        }
        List<ClientBusinessObject> cboList = new ArrayList<>();
        String fullPath = getFullPath(classifyFullInfo);
        excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
        //都转换完了。需要批量检查
        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
        batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
        //3.判断关键属性
        CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
        Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
        Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
        if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
            selfRepeatRowIndexList.stream().forEach(rowIndex->{
                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
            });
        }
        if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
            keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
                errorMap.put(rowIndex,"关键属性与系统中的重复;" + errorMap.getOrDefault(rowIndex,""));
            });
        }
        //分类注入
        batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
        //boolean
        reSwitchBooleanAttrOnOrder(attrVOS,cboList);
        //4.校验规则
        batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
        if(isEnumType) {//是否需要校验枚举/参照
            //5.校验枚举是否正确
            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
            //7.处理参照的情况
            batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
        }
        //6.时间格式的验证
        //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
        batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
        //最后弄组合规则
        batchSwitchComponentAttrOnOrder(attrVOS,cboList);
        String uuid=VciBaseUtil.getPk();
        Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
        if(errorMap.size()>0) {
            createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
        }
        boolean isCreateUUid=false;
        List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
            return !errorMap.containsKey(rowIndex);
        }).collect(Collectors.toList());
        //相似校验
        Map<String,String>resembleMap=new HashMap<>();
        List<DataResembleVO> dataResembleVOS=new ArrayList<>();
        String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
        bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
        if(resembleMap.size()>0) {
            isCreateUUid=true;
            if(!CollectionUtils.isEmpty(dataResembleVOS)) {
                bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
                createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
            //需要判断是否所有的属性都在模板上了
            List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
                && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//组合规则和分类注入确实没给用户导出去
            ).collect(Collectors.toList());
            if(!CollectionUtils.isEmpty(unExistAttrVOs)){
                throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
            }
        }
        //排除错误的,剩下正确的
        Map<String,String> newErrorMap=new HashMap<>();
        newErrorMap.putAll(resembleMap);
        newErrorMap.putAll(errorMap);
        needSaveCboList = cboList.stream().filter(cbo -> {
            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
            return !newErrorMap.containsKey(rowIndex);
        }).collect(Collectors.toList());
        if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
            isCreateUUid=true;
        }
        createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
        if(newErrorMap.size()>0) {
            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
        }else {
            uuid="";
            List<ClientBusinessObject> cboList = new ArrayList<>();
            String fullPath = getFullPath(classifyFullInfo);
            excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
            //要把以上的错误的都抛出后,再继续处理时间和组合规则
            //都转换完了。需要批量检查
            //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
            //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
            batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
            //3.判断关键属性
            CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
            Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
            Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
            if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
                selfRepeatRowIndexList.stream().forEach(rowIndex->{
                    errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
                });
            }
            if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
                keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
                    errorMap.put(rowIndex,"关键属性与系统中的重复;" + errorMap.getOrDefault(rowIndex,""));
                });
            }
            //分类注入
            batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
            //boolean
            reSwitchBooleanAttrOnOrder(attrVOS,cboList);
            //4.校验规则
            batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
            if(isEnumType) {//是否需要校验枚举/参照
                //5.校验枚举是否正确
                batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
                //7.处理参照的情况
                batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
            }
            //6.时间格式的验证
            //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
            batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
            //最后弄组合规则
            batchSwitchComponentAttrOnOrder(attrVOS,cboList);
            uuid=VciBaseUtil.getPk();
            Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
            if(errorMap.size()>0) {
                createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
            }
            boolean isCreateUUid=false;
            List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                return !errorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
            //相似校验
            Map<String,String>resembleMap=new HashMap<>();
            List<DataResembleVO> dataResembleVOS=new ArrayList<>();
            String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
            bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
            if(resembleMap.size()>0) {
                isCreateUUid=true;
                if(!CollectionUtils.isEmpty(dataResembleVOS)) {
                    bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
                    createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
                }
            }
            //排除错误的,剩下正确的
            Map<String,String> newErrorMap=new HashMap<>();
            newErrorMap.putAll(resembleMap);
            newErrorMap.putAll(errorMap);
            needSaveCboList = cboList.stream().filter(cbo -> {
                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                return !newErrorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
            if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
                isCreateUUid=true;
            }
            createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
            if(newErrorMap.size()>0) {
                createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
            }else {
                uuid="";
            if (!CollectionUtils.isEmpty(needSaveCboList)) {
                //9.我们处理业务数据
                //生成编码的内容
                List<String> dataCBOIdList=new ArrayList<>();
                List<BaseModel> dataCBOList=new ArrayList<>();
                cboList.stream().forEach(clientBusinessObject -> {
                    BaseModel baseModel=new BaseModel();
                    BeanUtil.convert(clientBusinessObject,baseModel);
                    //baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
                    dataCBOList.add(baseModel);
                    dataCBOIdList.add(baseModel.getOid());
                });
                try {
                    codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
                    //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
                    engineService.batchSaveSelectChar(templateVO, dataCBOList);
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("批了申请时失败");
                //要把以上的错误的都抛出后,再继续处理时间和组合规则
                needSaveCboList = cboList.stream().filter(cbo -> {
                    String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                    return !newErrorMap.containsKey(rowIndex);
                }).collect(Collectors.toList());
                if (!CollectionUtils.isEmpty(needSaveCboList)) {
                    //9.我们处理业务数据
                    //生成编码的内容
                    List<String> dataCBOIdList=new ArrayList<>();
                    List<BaseModel> dataCBOList=new ArrayList<>();
                    cboList.stream().forEach(clientBusinessObject -> {
                        BaseModel baseModel=new BaseModel();
                        BeanUtil.convert(clientBusinessObject,baseModel);
                        //baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
                        dataCBOList.add(baseModel);
                        dataCBOIdList.add(baseModel.getOid());
                    });
                    try {
                        codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
                        //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
                        engineService.batchSaveSelectChar(templateVO, dataCBOList);
                    } catch (Exception e) {
                        e.printStackTrace();
                        log.error("批量申请时失败");
                        throw e;
                    }
                }
            }
        }
        if(!isCreateUUid){
            return uuid="";
            if(!isCreateUUid){
                return uuid="";
            }
            saveLogUtil.operateLog("批量申请编码",false, StringUtil.format("批量导入申请成功共{}条数据,生成的码值如下【{}】",codeList.size(),codeList));
        }catch (Exception e){
            saveLogUtil.operateLog("批量申请编码",true,e.getMessage());
            throw e;
        }
        return uuid;
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -183,7 +183,7 @@
                            serialDb = killFillChar(subSecValue,secVO.getCodeFillSeparator(),
                                OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()));
                        }
                        Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(secValue,secVO.getCustomCodeSerialType());
                        Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(serialDb,secVO.getCustomCodeSerialType());
                        HashMap<String, String> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
                        Double maxValue=newSerialDb;
                        if(thisUnitMaxMap.containsKey(secOid)){
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeRuleCharacterWapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.vci.ubcs.code.wrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.vci.ubcs.code.entity.CodeRuleCharacter;
import com.vci.ubcs.code.enumpack.CodeRuleCharacterEnum;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
 * ç¼–码字符包装类,返回视图层所需的字段
 * @author xj
 * @date 2023-11-30
 */
public class CodeRuleCharacterWapper extends BaseEntityWrapper<CodeRuleCharacter, CodeRuleCharacterVO> {
    public static CodeRuleCharacterWapper build() {
        return new CodeRuleCharacterWapper();
    }
    @Override
    public CodeRuleCharacterVO entityVO(CodeRuleCharacter entity) {
        entity.setChartTypeText(CodeRuleCharacterEnum.getTextByValue(entity.getChartType()));
        CodeRuleCharacterVO VO = Objects.requireNonNull(BeanUtil.copy(entity, CodeRuleCharacterVO.class));
        return VO;
    }
    /***
     * æ•°ç»„对象转换
     * @param entitys
     * @return
     */
    public List<CodeRuleCharacterVO> entityVOs(Collection<CodeRuleCharacter> entitys) {
        if(CollectionUtils.isEmpty(entitys)) {return new ArrayList<>();}
        List<CodeRuleCharacterVO> vos=new ArrayList<>();
        if(!CollectionUtils.isEmpty(entitys)) {
            entitys.stream().forEach(vo -> {
                vos.add(entityVO(vo));
            });
        }
        return vos;
    }
    /***
     * æ•°ç»„对象转换
     * @param vos
     * @return
     */
    public List<CodeRuleCharacter> voentitys(Collection<CodeRuleCharacterVO> vos) {
        if(CollectionUtils.isEmpty(vos)) {return new ArrayList<>();}
        List<CodeRuleCharacter>entitys =new ArrayList<>();
        if(!CollectionUtils.isEmpty(vos)) {
            vos.stream().forEach(vo -> {
                entitys.add(voentity(vo));
            });
        }
        return entitys;
    }
    /***
     * æ•°ç»„对象转换
     * @param vo
     * @return
     */
    public CodeRuleCharacter voentity( CodeRuleCharacterVO vo) {
        CodeRuleCharacter entity = Objects.requireNonNull(BeanUtil.copy(vo, CodeRuleCharacter.class));
        return entity;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleCharacterMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vci.ubcs.code.mapper.CodeRuleCharacterMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="CodeResembleRuleResultMap" type="com.vci.ubcs.code.entity.CodeRuleCharacter">
        <id property="oid" column="OID"/>
        <result property="btmname" column="BTMNAME"/>
        <result property="revisionOid" column="REVISIONOID"/>
        <result property="nameOid" column="NAMEOID"/>
        <result property="lastR" column="LASTR"/>
        <result property="firstR" column="FIRSTR"/>
        <result property="lastV" column="LASTV"/>
        <result property="firstV" column="FIRSTV"/>
        <result property="creator" column="CREATOR"/>
        <result property="createTime" column="CREATETIME"/>
        <result property="lastModifier" column="LASTMODIFIER"/>
        <result property="lastModifyTime" column="LASTMODIFYTIME"/>
        <result property="revisionRule" column="REVISIONVALUE"/>
        <result property="versionRule" column="VISIONRULE"/>
        <result property="revisionValue" column="REVISIONRULE"/>
        <result property="versionValue" column="VERSIONVALUE"/>
        <result property="revisionSeq" column="REVISIONSEQ"/>
        <result property="versionSeq" column="VERSIONSEQ"/>
        <result property="lctid" column="LCTID"/>
        <result property="lcStatus" column="LCSTATUS"/>
        <result property="ts" column="TS"/>
        <result property="id" column="ID"/>
        <result property="name" column="NAME"/>
        <result property="description" column="DESCRIPTION"/>
        <result property="owner" column="OWNER"/>
        <result property="copyFromVersion" column="COPYFROMVERSION"/>
        <result property="codeRuleId" column="CODERULEID"/>
        <result property="chartValue" column="CHARTVALUE"/>
        <result property="chartType" column="CHARTTYPE"/>
    </resultMap>
</mapper>
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
@@ -98,19 +98,19 @@
    </update >
    <select id="getNextRevision" resultType="map" >
        select max(revisionSeq) + 1 revisionSeq,
               max(RevisionValue) + 1 revisionVal,
               max(VersionSeq) + 1 VersionSeq,
               max(VersionValue) + 1 VersionVal
        select max(revisionSeq) + 1 REVISIONSEQ,
               max(RevisionValue) + 1 REVISIONVAL,
               max(VersionSeq) + 1 VERSIONSEQ,
               max(VersionValue) + 1 VERSIONVAL
        from ${tableName}
        where nameoid = #{nameoid}
    </select>
    <select id="getCurrentRevision" resultType="map" >
        select max(revisionSeq) revisionSeq,
               max(RevisionValue) revisionVal,
               max(VersionSeq) VersionSeq,
               max(VersionValue) VersionVal
        select max(revisionSeq) REVISIONSEQ,
               max(RevisionValue) REVISIONVAL,
               max(VersionSeq) VERSIONSEQ,
               max(VersionValue) VERSIONVAL
        from ${tableName}
        where nameoid = #{nameoid}
    </select>
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java
@@ -46,6 +46,9 @@
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
@@ -128,7 +131,6 @@
        return R.status(roleService.submit(role));
    }
    /**
     * åˆ é™¤
     */
@@ -150,7 +152,16 @@
    public R grant(@RequestBody GrantVO grantVO) {
        CacheUtil.clear(SYS_CACHE);
        CacheUtil.clear(SYS_CACHE, Boolean.FALSE);
        boolean temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds());
        boolean temp = false;
        try {
            temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds());
            // æ’入授权日志
            roleService.grantLog(roleService.getGrantRoleResString(grantVO.getRoleIds()),false);
        }catch (Exception e){
            // å¤±è´¥æ—¶æ’入异常信息到日志中
            roleService.grantLog(e.getMessage(),true);
            throw e;
        }
        return R.status(temp);
    }
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
@@ -87,6 +87,13 @@
    List<TreeNode> grantTree(BladeUser user);
    /**
     * æ ¹æ®è§’色id获取菜单树形结构
     * @param roleId
     * @return
     */
    List<TreeNode> grantTreeByRoleIds(List<Long> roleId);
    /**
     * é¡¶éƒ¨èœå•树形结构
     *
     * @param user
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java
@@ -68,6 +68,20 @@
    boolean grant(@NotEmpty List<Long> roleIds, List<Long> menuIds, List<Long> dataScopeIds, List<Long> apiScopeIds);
    /**
     * è§’色权限配置日志记录
     * @param roleRes
     * @return
     */
    boolean grantLog(String roleRes, boolean isException);
    /**
     * èŽ·å–è§’è‰²æŽˆæƒæ—¥å¿—çš„ä¿¡æ¯
     * @param roleId
     * @return
     */
    String getGrantRoleResString(List<Long> roleId);
    /**
     * èŽ·å–è§’è‰²ID
     *
     * @param tenantId
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
@@ -162,6 +162,17 @@
        return ForestNodeMerger.merge(tenantPackageTree(menuTree, user.getTenantId()));
    }
    /**
     * æ ¹æ®è§’色id获取菜单树形结构
     * @param roleId
     * @return
     */
    @Override
    public List<TreeNode> grantTreeByRoleIds(List<Long> roleId) {
        List<TreeNode> menuTree = baseMapper.grantTreeByRole(roleId);
        return ForestNodeMerger.merge(menuTree);
    }
    @Override
    public List<TreeNode> grantTopTree(BladeUser user) {
        List<TreeNode> menuTree = user.getTenantId().equals(NacosConfigCache.getAdminUserInfo().getTenantId()) ? baseMapper.grantTopTree() : baseMapper.grantTopTreeByRole(Func.toLongList(user.getRoleId()));
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java
@@ -16,29 +16,34 @@
 */
package com.vci.ubcs.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.system.mapper.RoleMapper;
import com.vci.ubcs.system.service.IMenuService;
import com.vci.ubcs.system.service.IRoleMenuService;
import com.vci.ubcs.system.service.IRoleScopeService;
import com.vci.ubcs.system.service.IRoleService;
import com.vci.ubcs.system.vo.DeptVO;
import com.vci.ubcs.system.wrapper.RoleWrapper;
import lombok.AllArgsConstructor;
import org.springblade.core.log.annotation.GrantLog;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.constant.RoleConstant;
import org.springblade.core.tool.node.ForestNodeMerger;
import org.springblade.core.tool.node.TreeNode;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.Func;
import com.vci.ubcs.system.entity.Role;
import com.vci.ubcs.system.entity.RoleMenu;
import com.vci.ubcs.system.entity.RoleScope;
import com.vci.ubcs.system.vo.RoleVO;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@@ -64,6 +69,7 @@
    private final IRoleMenuService roleMenuService;
    private final IRoleScopeService roleScopeService;
    private final IMenuService menuService;
    @Override
    public IPage<RoleVO> selectRolePage(IPage<RoleVO> page, RoleVO role) {
@@ -93,6 +99,32 @@
        return grantRoleMenu(roleIds, menuIds) && grantDataScope(roleIds, dataScopeIds) && grantApiScope(roleIds, apiScopeIds);
    }
    /**
     * è§’色权限配置日志记录
     * @param roleRes
     * @return
     */
    @Override
    @GrantLog("grantRole")
    public boolean grantLog(String roleRes, boolean isException) {
        return false;
    }
    /**
     * èŽ·å–è§’è‰²æŽˆæƒæ—¥å¿—çš„ä¿¡æ¯
     * @param roleId
     * @return
     */
    @Override
    public String getGrantRoleResString(List<Long> roleId) {
        // èŽ·å–åˆ°èœå•ä¿¡æ¯ï¼Œå†èŽ·å–åˆ°è§’è‰²ä¿¡æ¯ï¼Œè¿›è¡Œæ‹¼æŽ¥
        List<TreeNode> menuTree = menuService.grantTreeByRoleIds(roleId);
        List<String> roleNames = this.baseMapper.getRoleNames(new Long[]{roleId.get(0)});
        String res = roleNames.get(0) + "授权为:{" + JSON.toJSONString(menuTree)+"}";
        return res;
    }
    private boolean grantRoleMenu(List<Long> roleIds, List<Long> menuIds) {
        // é˜²æ­¢è¶Šæƒé…ç½®è¶…管角色
        Long administratorCount = baseMapper.selectCount(Wrappers.<Role>query().lambda().eq(Role::getRoleAlias, RoleConstant.ADMINISTRATOR).in(Role::getId, roleIds));
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java
@@ -191,11 +191,20 @@
     */
    @PostMapping("/grant")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "权限设置", notes = "传入roleId集合以及menuId集合")
    @ApiOperation(value = "权限设置", notes = "传入userIds集合以及roleIds集合")
    //@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
    public R grant(@ApiParam(value = "userId集合", required = true) @RequestParam String userIds,
                   @ApiParam(value = "roleId集合", required = true) @RequestParam String roleIds) {
        boolean temp = userService.grant(userIds, roleIds);
        boolean temp = false;
        try {
             temp = userService.grant(userIds, roleIds);
            // æ’入授权日志
            userService.grantLog(UserWrapper.build().entityVO(userService.getById(userIds)).toString(),false);
        }catch (Exception e){
            // æ’入授权日志
            userService.grantLog(e.getMessage(),true);
            throw e;
        }
        return R.status(temp);
    }
@@ -286,7 +295,6 @@
        ExcelUtil.export(response, "用户数据模板", "用户数据表", list, UserExcel.class);
    }
    /**
     * ç¬¬ä¸‰æ–¹æ³¨å†Œç”¨æˆ·
     */
@@ -296,7 +304,6 @@
    public R registerGuest(User user, Long oauthId) {
        return R.status(userService.registerGuest(user, oauthId));
    }
    /**
     * é…ç½®ç”¨æˆ·å¹³å°ä¿¡æ¯
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java
@@ -186,6 +186,13 @@
    boolean grant(String userIds, String roleIds);
    /**
     * è®°å½•授权日志
     * @param res
     * @return
     */
    boolean grantLog(String res, boolean isException);
    /**
     * åˆå§‹åŒ–密码
     *
     * @param userIds
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
@@ -45,6 +45,7 @@
import com.vci.ubcs.system.user.vo.UserVO;
import com.vci.ubcs.system.user.wrapper.UserWrapper;
import lombok.RequiredArgsConstructor;
import org.springblade.core.log.annotation.GrantLog;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
@@ -127,6 +128,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    @GrantLog("grantUser")
    public boolean updateUser(User user) {
        String tenantId = user.getTenantId();
        Long userCount = baseMapper.selectCount(
@@ -135,6 +137,7 @@
                .eq(User::getAccount, user.getAccount())
                .notIn(User::getId, user.getId())
        );
        // åˆ¤æ–­æ˜¯å¦è¢«ä¿®æ”¹ä¸ºå·²å­˜åœ¨çš„用户名
        if (userCount > 0L) {
            throw new ServiceException(StringUtil.format("当前用户 [{}] å·²å­˜åœ¨!", user.getAccount()));
        }
@@ -179,6 +182,9 @@
    private boolean submitUserDept(User user) {
        List<Long> deptIdList = Func.toLongList(user.getDeptId());
        if(deptIdList.isEmpty()){
            return true;
        }
        List<UserDept> userDeptList = new ArrayList<>();
        deptIdList.forEach(deptId -> {
            UserDept userDept = new UserDept();
@@ -348,6 +354,16 @@
        return this.update(user, Wrappers.<User>update().lambda().in(User::getId, Func.toLongList(userIds)));
    }
    /**
     * æŽˆæƒæ—¥å¿—插入操作
     * @param res
     */
    @Override
    @GrantLog("grantUser")
    public boolean grantLog(String res, boolean isException){
        return true;
    }
    @Override
    public boolean resetPassword(String userIds) {
        User user = new User();