yuxc
2023-05-12 c6a845528d45bfb44591a69dadb44539432d06d0
枚举相关改动
已修改21个文件
已删除11个文件
已重命名4个文件
已复制2个文件
已添加29个文件
7226 ■■■■ 文件已修改
Source/UBCS-WEB/src/api/omd/dict.js 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/enum.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codebutton.js 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/omd/enum.js 119 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/codebutton.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/plCodeKeyattrrepeat.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/original.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/omd/dict.vue 442 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/omd/omd.vue 445 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/DictCache.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/EnumCache.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Dict.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Enum.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/EnumItem.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/enums/EnumEnum.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IDictClient.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumClient.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumFallback.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumItemClient.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumItemFallback.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/EnumItemVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/EnumVO.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/node/ForestNodeManagerOid.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/node/ForestNodeMergerOid.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/node/INodeOid.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/VciSystemVarConstants.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/Md5.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeButtonController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyTemplateAttrController.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeButtonServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java 806 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/FormulaServiceImpl.java 1165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 389 ●●●● 补丁 | 查看 | 原始文档 | 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/CodeButtonWrapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeButtonMapper.xml 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/DictController.java 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/EnumController.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/EnumItemController.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/DictClient.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/EnumClient.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/EnumItemClient.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/EnumItemMapper.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/EnumMapper.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IDictService.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IEnumItemService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IEnumService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/DictServiceImpl.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/EnumItemServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/EnumServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/DictWrapper.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/EnumWrapper.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/EnumitemWrapper.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/DictMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/EnumItemMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/EnumMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/dict.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/src/api/omd/enum.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
import request from '@/router/axios';
export const getList = (current, size, params) => {
  return request({
    url: '/api/ubcs-omd/enum/list',
    method: 'get',
    params: {
      ...params,
      current,
      size,
    }
  })
}
export const getParentList = (current, size, params) => {
  return request({
    url: '/api/ubcs-omd/enum/parent-list',
    method: 'get',
    params: {
      ...params,
      current,
      size,
    }
  })
}
export const getChildList = (current, size, parentoid, params) => {
  debugger;
  return request({
    url: '/api/ubcs-omd/enumItem/listAll',
    method: 'get',
    params: {
      ...params,
      current,
      size,
      parentoid: parentoid,
    }
  })
}
export const remove = (ids) => {
  return request({
    url: '/api/ubcs-omd/enum/remove',
    method: 'post',
    params: {
      ids,
    }
  })
}
export const removeChild = (ids) => {
  return request({
    url: '/api/ubcs-omd/enumItem/remove',
    method: 'post',
    params: {
      ids,
    }
  })
}
export const add = (row) => {
  return request({
    url: '/api/ubcs-omd/enum/submit',
    method: 'post',
    data: row
  })
}
export const addChild = (row) => {
  return request({
    url: '/api/ubcs-omd/enumItem/submit',
    method: 'post',
    data: row
  })
}
export const update = (row) => {
  debugger;
  return request({
    url: '/api/ubcs-omd/enum/submit',
    method: 'post',
    data: row
  })
}
export const updateChild = (row) => {
  return request({
    url: '/api/ubcs-omd/enumItem/submit',
    method: 'post',
    data: row
  })
}
export const getDict = (oid) => {
  return request({
    url: '/api/ubcs-omd/enum/detail',
    method: 'get',
    params: {
      oid,
    }
  })
}
export const getDictChild = (oid) => {
  return request({
    url: '/api/ubcs-omd/enumItem/detail',
    method: 'get',
    params: {
      oid,
    }
  })
}
export const getDictTree  = (current, size, params) => {
  return request({
    url: '/api/ubcs-omd/enum/tree',
    method: 'get',
    params: {
      ...params,
      current,
      size,
    }
  })
}
export const getDictionary = (params) => {
  return request({
    url: '/api/ubcs-omd/enum/dictionary',
    method: 'get',
    params,
  })
}
Source/UBCS-WEB/src/const/code/codebutton.js
@@ -236,23 +236,23 @@
    // },
    {
      label: "状态",
      prop: "lcstatusName",
      prop: "lcStatusText",
      slot: true,
      display: false
    },
    {
      label: "状态",
      type: "select",
      dicUrl: "/api/ubcs-omd/dict/dictionary?code=codeLcstatus",
      dicUrl: "/api/ubcs-omd/enum/dictionary?code=codeLcstatus",
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      dataType: "String",
      search: true,
      hide: true,
      display: true,
      prop: "lcstatus",
      prop: "lcStatus",
      rules: [{
        required: true,
        message: "状态",
@@ -288,7 +288,7 @@
    // },
    {
      label: "按钮的位置",
      prop: "usedpositiontypeName",
      prop: "usedpositiontypeText",
      slot: true,
      display: false
    },
@@ -296,10 +296,10 @@
      label: "按钮的位置",
      type: "select",
      weight :'140px',
      dicUrl: "/api/ubcs-omd/dict/dictionary?code=codeButtonPosition",
      dicUrl: "/api/ubcs-omd/enum/dictionary?code=codeButtonPosition",
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      dataType: "String",
      search: true,
Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js
@@ -256,12 +256,12 @@
      label: "忽略大小写",
      prop: "ignorecaseflag",
      type: "select",
      dicUrl: "/api/ubcs-system/dict/dictionary?code=codeKeyFlag",
      dicUrl: "/api/ubcs-omd/enum/dictionary?code=codeKeyFlag",
      dataType: "String",
      search: true,
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      rules: [{
        required: true,
@@ -273,12 +273,12 @@
      label: "忽略空格",
      prop: "ignorespaceflag",
      type: "select",
      dicUrl: "/api/ubcs-system/dict/dictionary?code=codeKeyFlag",
      dicUrl: "/api/ubcs-omd/enum/dictionary?code=codeKeyFlag",
      dataType: "String",
      search: true,
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      rules: [{
        required: true,
@@ -290,12 +290,12 @@
      label: "忽略全部空格",
      prop: "ignoreallspaceflag",
      type: "select",
      dicUrl: "/api/ubcs-system/dict/dictionary?code=codeKeyFlag",
      dicUrl: "/api/ubcs-omd/enum/dictionary?code=codeKeyFlag",
      dataType: "String",
      search: true,
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      rules: [{
        required: true,
@@ -308,11 +308,11 @@
      prop: "ignorewidthflag",
      type: "select",
      search: true,
      dicUrl: "/api/ubcs-system/dict/dictionary?code=codeKeyFlag",
      dicUrl: "/api/ubcs-omd/enum/dictionary?code=codeKeyFlag",
      dataType: "String",
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      rules: [{
        required: true,
Source/UBCS-WEB/src/const/omd/enum.js
ÎļþÃû´Ó Source/UBCS-WEB/src/const/omd/dict.js ÐÞ¸Ä
@@ -14,7 +14,7 @@
  column: [
    {
      label: "代号",
      prop: "code",
      prop: "name",
      search: true,
      slot: true,
      span: 24,
@@ -28,7 +28,7 @@
    },
    {
      label: "名称",
      prop: "dictValue",
      prop: "label",
      search: true,
      align: "center",
      rules: [
@@ -39,21 +39,21 @@
        }
      ]
    },
    {
      label: "枚举排序",
      prop: "sort",
      type: "number",
      align: "right",
      width: 100,
      hide: true,
      rules: [
        {
          required: true,
          message: "请输入枚举排序",
          trigger: "blur"
        }
      ]
    },
    // {
    //   label: "枚举排序",
    //   prop: "sort",
    //   type: "number",
    //   align: "right",
    //   width: 100,
    //   hide: true,
    //   rules: [
    //     {
    //       required: true,
    //       message: "请输入枚举排序",
    //       trigger: "blur"
    //     }
    //   ]
    // },
    // {
    //   label: "封存",
    //   prop: "isSealed",
@@ -105,25 +105,25 @@
  dialogWidth: 880,
  dialogClickModal: false,
  column: [
    {
      label: "代号",
      prop: "code",
      addDisabled: true,
      editDisabled: true,
      search: true,
      span: 24,
      hide: true,
      rules: [
        {
          required: true,
          message: "请输入代号",
          trigger: "blur"
        }
      ]
    },
    // {
    //   label: "代号",
    //   prop: "value",
    //   addDisabled: true,
    //   editDisabled: true,
    //   search: true,
    //   span: 24,
    //   hide: true,
    //   rules: [
    //     {
    //       required: true,
    //       message: "请输入代号",
    //       trigger: "blur"
    //     }
    //   ]
    // },
    {
      label: "名称",
      prop: "dictValue",
      prop: "name",
      search: true,
      align: "center",
      rules: [
@@ -134,29 +134,30 @@
        }
      ]
    },
    {
      label: "上级",
      prop: "parentId",
      type: "tree",
      dicData: [],
      hide: true,
      props: {
        label: "title"
      },
      addDisabled: true,
      editDisabled: true,
      rules: [
        {
          required: false,
          message: "请选择上级",
          trigger: "click"
        }
      ]
    },
    // {
    //   label: "上级",
    //   prop: "parentoid",
    //   type: "tree",
    //   dicData: [],
    //   hide: true,
    //   props: {
    //     label: "title"
    //   },
    //   addDisabled: true,
    //   editDisabled: true,
    //   rules: [
    //     {
    //       required: false,
    //       message: "请选择上级",
    //       trigger: "click"
    //     }
    //   ]
    // },
    {
      label: "值",
      prop: "dictKey",
      prop: "value",
      width: 80,
      search: true,
      rules: [
        {
          required: true,
@@ -164,6 +165,10 @@
          trigger: "blur"
        }
      ]
    },{
      label: "描述",
      prop: "description",
      // hide: true
    },
    {
      label: "枚举排序",
@@ -205,10 +210,6 @@
    //     }
    //   ]
    // },
    {
      label: "描述",
      prop: "remark",
      // hide: true
    }
  ]
};
Source/UBCS-WEB/src/views/code/codebutton.vue
@@ -68,10 +68,10 @@
      ...mapGetters(["permission"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.codebutton_add, false),
          viewBtn: this.vaildData(this.permission.codebutton_view, false),
          delBtn: this.vaildData(this.permission.codebutton_delete, false),
          editBtn: this.vaildData(this.permission.codebutton_edit, false)
          // addBtn: this.vaildData(this.permission.codebutton_add, false),
          // viewBtn: this.vaildData(this.permission.codebutton_view, false),
          // delBtn: this.vaildData(this.permission.codebutton_delete, false),
          // editBtn: this.vaildData(this.permission.codebutton_edit, false)
        };
      },
      ids() {
Source/UBCS-WEB/src/views/code/plCodeKeyattrrepeat.vue
@@ -56,10 +56,10 @@
      ...mapGetters(["permission"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_add, false),
          viewBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_view, false),
          delBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_delete, false),
          editBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_edit, false)
          // addBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_add, false),
          // viewBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_view, false),
          // delBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_delete, false),
          // editBtn: this.vaildData(this.permission.plCodeKeyattrrepeat_edit, false)
        };
      },
      ids() {
Source/UBCS-WEB/src/views/modeling/original.vue
@@ -94,7 +94,7 @@
  update, getPage
} from "@/api/omd/OmdAttribute";
import { getDictionary } from "@/api/omd/dict";
import { getDictionary } from "@/api/omd/enum";
export default {
  name: "original",
Source/UBCS-WEB/src/views/omd/dict.vue
ÎļþÒÑɾ³ý
Source/UBCS-WEB/src/views/omd/omd.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,445 @@
<template>
  <basic-container>
    <avue-crud
      :option="optionParent"
      :table-loading="loading"
      :data="dataParent"
      :page="pageParent"
      ref="crud"
      v-model="formParent"
      :permission="permissionList"
      :before-open="beforeOpen"
      @row-del="rowDel"
      @row-update="rowUpdate"
      @row-save="rowSave"
      @row-click="handleRowClick"
      @search-change="searchChange"
      @search-reset="searchReset"
      @selection-change="selectionChange"
      @current-change="currentChange"
      @size-change="sizeChange"
      @refresh-change="refreshChange"
      @on-load="onLoadParent"
    >
      <template slot="menuLeft">
        <el-button
          type="danger"
          size="small"
          icon="el-icon-delete"
          v-if="permission.dict_delete"
          plain
          @click="handleDelete"
        >删 é™¤
        </el-button>
      </template>
      <template slot-scope="scope" slot="menu">
        <el-button
          type="text"
          icon="el-icon-setting"
          size="small"
          @click.stop="handleRowClick(scope.row)"
          v-if="userInfo.role_name.includes('admin')"
        >枚举配置
        </el-button>
      </template>
      <template slot-scope="{row}" slot="code">
        <el-tag @click="handleRowClick(row)" style="cursor:pointer">{{ row.code }}</el-tag>
      </template>
      <template slot-scope="{row}" slot="isSealed">
        <el-tag>{{ row.isSealed === 0 ? '否' : '是' }}</el-tag>
      </template>
    </avue-crud>
    <el-dialog :title="`[${name}]枚举项配置`"
               append-to-body
               :visible.sync="box"
               width="1000px">
      <avue-crud
        :option="optionChild"
        :table-loading="loadingChild"
        :data="dataChild"
        ref="crudChild"
        v-model="formChild"
        :permission="permissionList"
        :before-open="beforeOpenChild"
        :before-close="beforeCloseChild"
        @row-del="rowDelChild"
        @row-update="rowUpdateChild"
        @row-save="rowSaveChild"
        @search-change="searchChangeChild"
        @search-reset="searchResetChild"
        @selection-change="selectionChangeChild"
        @current-change="currentChangeChild"
        @size-change="sizeChangeChild"
        @refresh-change="refreshChangeChild"
        @on-load="onLoadChild"
      >
        <template slot="menuLeft">
          <el-button
            type="danger"
            size="small"
            icon="el-icon-delete"
            v-if="permission.dict_delete"
            plain
            @click="handleDeleteChild"
          >删 é™¤
          </el-button>
        </template>
        <!--        <template slot-scope="scope" slot="menu">-->
        <!--          <el-button-->
        <!--            type="text"-->
        <!--            icon="el-icon-circle-plus-outline"-->
        <!--            size="small"-->
        <!--            @click.stop="handleAdd(scope.row,scope.index)"-->
        <!--            v-if="userInfo.role_name.includes('admin')"-->
        <!--          >新增子项-->
        <!--          </el-button>-->
        <!--        </template>-->
        <template slot-scope="{row}" slot="isSealed">
          <el-tag>{{ row.isSealed === 0 ? '否' : '是' }}</el-tag>
        </template>
      </avue-crud>
    </el-dialog>
  </basic-container>
</template>
<script>
import {
  getParentList,
  getChildList,
  remove,
  update,
  add,
  getDict,
  getDictTree, addChild, updateChild, getDictChild, removeChild
} from "@/api/omd/enum";
import {optionParent, optionChild} from "@/const/omd/enum";
import {mapGetters} from "vuex";
export default {
  data() {
    return {
      dictValue: '暂无',
      parentoid: -1,
      formParent: {},
      formChild: {},
      selectionList: [],
      query: {},
      box: false,
      loading: true,
      loadingChild: true,
      pageParent: {
        pageSize: 10,
        pageSizes: [10, 30, 50, 100, 200],
        currentPage: 1,
        total: 0
      },
      pageChild: {
        pageSize: 10,
        pageSizes: [10, 30, 50, 100, 200],
        currentPage: 1,
        total: 0
      },
      dataParent: [],
      dataChild: [],
      optionParent: optionParent,
      optionChild: optionChild,
    };
  },
  computed: {
    ...mapGetters(["userInfo", "permission"]),
    permissionList() {
      return {
        addBtn: this.vaildData(this.permission.dict_add, false),
        delBtn: this.vaildData(this.permission.dict_delete, false),
        editBtn: this.vaildData(this.permission.dict_edit, false),
        viewBtn: false,
      };
    },
    ids() {
      let ids = [];
      this.selectionList.forEach(ele => {
        ids.push(ele.oid);
      });
      return ids.join(",");
    }
  },
  mounted() {
    this.initData();
  },
  methods: {
    initData() {
      getDictTree(this.pageParent.currentPage,
        this.pageParent.pageSize,
        this.query).then(res => {
        const column = this.findObject(this.optionChild.column, "parentoid");
        column.dicData = res.data.data;
      });
    },
    handleAdd(row) {
      this.formChild.value = "";
      this.formChild.name = "";
      this.formChild.sort = 0;
      this.formChild.isSealed = 0;
      this.formChild.remark = "";
      this.formChild.parentoid = row.oid;
      this.$refs.crudChild.rowAdd();
    },
    rowSave(row, done, loading) {
      const form = {
        ...row,
        dictKey: -1,
      };
      add(form).then(() => {
        this.onLoadParent(this.pageParent);
        this.$message({
          type: "success",
          message: "操作成功!"
        });
        done();
      }, error => {
        window.console.log(error);
        loading();
      });
    },
    rowUpdate(row, index, done, loading) {
      update(row).then(() => {
        this.onLoadParent(this.pageParent);
        this.$message({
          type: "success",
          message: "操作成功!"
        });
        this.onLoadChild(this.pageChild);
        done();
      }, error => {
        window.console.log(error);
        loading();
      });
    },
    rowDel(row) {
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return remove(row.oid);
        })
        .then(() => {
          this.onLoadParent(this.pageParent);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
        });
    },
    handleRowClick(row) {
      this.query = {};
      this.parentId = row.oid;
      this.name = row.name;
      const code = this.findObject(this.optionChild.column, "value");
      code.value = row.code;
      // const parentoid = this.findObject(this.optionChild.column, "parentoid");
      this.parentoid = row.oid;
      this.box = true;
      this.onLoadChild(this.pageChild);
    },
    searchReset() {
      this.query = {};
      this.onLoadParent(this.pageParent);
    },
    searchChange(params, done) {
      this.query = params;
      this.pageParent.currentPage = 1;
      this.onLoadParent(this.pageParent, params);
      done();
    },
    selectionChange(list) {
      this.selectionList = list;
    },
    selectionClear() {
      this.selectionList = [];
      this.$refs.crud.toggleSelection();
    },
    handleDelete() {
      if (this.selectionList.length === 0) {
        this.$message.warning("请选择至少一条数据");
        return;
      }
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return remove(this.ids);
        })
        .then(() => {
          this.onLoadParent(this.pageParent);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          this.$refs.crud.toggleSelection();
        });
    },
    beforeOpen(done, type) {
      if (["edit", "view"].includes(type)) {
        getDict(this.formParent.oid).then(res => {
          this.formParent = res.data.data;
        });
      }
      done();
    },
    currentChange(currentPage) {
      this.pageParent.currentPage = currentPage;
    },
    sizeChange(pageSize) {
      this.pageParent.pageSize = pageSize;
    },
    refreshChange() {
      this.onLoadParent(this.pageParent, this.query);
    },
    rowSaveChild(row, done, loading) {
      row.parentoid = this.parentoid;
      addChild(row).then(() => {
        this.onLoadChild(this.pageChild);
        this.$message({
          type: "success",
          message: "操作成功!"
        });
        done();
      }, error => {
        window.console.log(error);
        loading();
      });
    },
    rowUpdateChild(row, index, done, loading) {
      updateChild(row).then(() => {
        this.onLoadChild(this.pageChild);
        this.$message({
          type: "success",
          message: "操作成功!"
        });
        done();
      }, error => {
        window.console.log(error);
        loading();
      });
    },
    rowDelChild(row) {
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return removeChild(row.oid);
        })
        .then(() => {
          this.onLoadChild(this.pageChild);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
        });
    },
    searchResetChild() {
      this.query = {};
      this.onLoadChild(this.pageChild);
    },
    searchChangeChild(params, done) {
      this.query = params;
      this.pageChild.currentPage = 1;
      this.onLoadChild(this.pageChild, params);
      done();
    },
    selectionChangeChild(list) {
      this.selectionList = list;
    },
    selectionClearChild() {
      this.selectionList = [];
      this.$refs.crudChild.toggleSelection();
    },
    handleDeleteChild() {
      if (this.selectionList.length === 0) {
        this.$message.warning("请选择至少一条数据");
        return;
      }
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return removeChild(this.ids);
        })
        .then(() => {
          this.onLoadChild(this.pageChild);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          this.$refs.crudChild.toggleSelection();
        });
    },
    beforeOpenChild(done, type) {
      if (["add", "edit"].includes(type)) {
        this.initData();
      }
      if (["edit", "view"].includes(type)) {
        getDictChild(this.formChild.oid).then(res => {
          this.formChild = res.data.data;
        });
      }
      done();
    },
    beforeCloseChild(done) {
      this.$refs.crudChild.value.parentId = this.parentId;
      this.$refs.crudChild.option.column.filter(item => {
        if (item.prop === "parentId") {
          item.value = this.parentId;
        }
      });
      done();
    },
    currentChangeChild(currentPage) {
      this.pageChild.currentPage = currentPage;
    },
    sizeChangeChild(pageSize) {
      this.pageChild.pageSize = pageSize;
    },
    refreshChangeChild() {
      this.onLoadChild(this.pageChild, this.query);
    },
    onLoadParent(page, params = {}) {
      this.loading = true;
      getParentList(
        page.currentPage,
        page.pageSize,
        Object.assign(params, this.query)
      ).then(res => {
        const data = res.data.data;
        this.pageParent.total = data.total;
        this.dataParent = data.records;
        this.loading = false;
        this.selectionClear();
      });
    },
    onLoadChild(page, params = {}) {
      this.loadingChild = true;
      getChildList(
        page.currentPage,
        page.pageSize,
        this.parentoid,
        Object.assign(params, this.query)
      ).then(res => {
        this.dataChild = res.data.data;
        this.loadingChild = false;
        this.selectionClear();
      });
    }
  }
};
</script>
Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml
@@ -14,4 +14,12 @@
    <version>${bladex.project.version}</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-util-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
    </dependencies>
</project>
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/DictCache.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/EnumCache.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.cache;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.enums.EnumEnum;
import com.vci.ubcs.omd.feign.IEnumClient;
import com.vci.ubcs.omd.vo.EnumVO;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.core.tool.utils.StringPool;
import java.util.List;
/**
 * ä¸šåŠ¡å­—å…¸ç¼“å­˜å·¥å…·ç±»
 *
 * @author Chill
 */
public class EnumCache {
    private static final String ENUM_ID = "enum:id";
    private static final String ENUM_VALUE = "enum:value";
    private static final String ENUM_LIST = "enum:list";
    private static final String ENUM_CACHE = "blade:enum";
    private static IEnumClient iEnumClient;
    private static IEnumClient getIOmdEnumClient() {
        if (iEnumClient == null) {
            iEnumClient = SpringUtil.getBean(IEnumClient.class);
        }
        return iEnumClient;
    }
    /**
     * èŽ·å–å­—å…¸å®žä½“
     *
     * @param oid ä¸»é”®
     * @return Enum
     */
    public static Enum getById(String oid) {
        String keyPrefix = ENUM_ID.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
        return CacheUtil.get(ENUM_CACHE, keyPrefix, oid, () -> {
            R<Enum> result = getIOmdEnumClient().getById(oid);
            return result.getData();
        });
    }
    /**
     * èŽ·å–å­—å…¸å€¼
     *
     * @param name    å­—典编号枚举
     * @param nameChild Integer型字典键
     * @return String
     */
    public static String getValue(EnumEnum name, Integer nameChild) {
        return getValue(name.getName(), nameChild);
    }
    /**
     * èŽ·å–å­—å…¸å€¼
     *
     * @param name    çˆ¶å­—典编号
     * @param nameChild å­å­—典编号
     * @return String
     */
    public static String getValue(String name, Integer nameChild) {
        String keyPrefix = ENUM_VALUE.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
        return CacheUtil.get(ENUM_CACHE, keyPrefix + name + StringPool.COLON, String.valueOf(nameChild), () -> {
            R<String> result = getIOmdEnumClient().getValue(name, String.valueOf(nameChild));
            return result.getData();
        });
    }
    /**
     * èŽ·å–å­—å…¸å€¼
     *
     * @param name    å­—典编号枚举
     * @param nameChild String型字典键
     * @return String
     */
    public static String getValue(EnumEnum name, String nameChild) {
        return getValue(name.getName(), nameChild);
    }
    /**
     * èŽ·å–å­—å…¸å€¼
     *
     * @param code    å­—典编号
     * @param dictKey String型字典键
     * @return String
     */
    public static String getValue(String code, String dictKey) {
        String keyPrefix = ENUM_VALUE.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
        return CacheUtil.get(ENUM_CACHE, keyPrefix + code + StringPool.COLON, dictKey, () -> {
            R<String> result = getIOmdEnumClient().getValue(code, dictKey);
            return result.getData();
        });
    }
    /**
     * èŽ·å–å­—å…¸é›†åˆ
     *
     * @param name å­—典编号
     * @return List<EnumVO>
     */
    public static List<EnumVO> getList(String name) {
        String keyPrefix = ENUM_LIST.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
        return CacheUtil.get(ENUM_CACHE, keyPrefix, name, () -> {
            R<List<EnumVO>> result = getIOmdEnumClient().getList(name);
            return result.getData();
        });
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Dict.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Enum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
 * æžšä¸¾å®šä¹‰ å®žä½“ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
@Data
@TableName("PL_OMD_ENUM")
@ApiModel(value = "OmdEnum对象", description = "枚举定义")
//@EqualsAndHashCode(callSuper = true)
public class Enum implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId(value = "oid", type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "")
    private String oid;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String name;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String label;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Date ts;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String creator;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Date createtime;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String modifier;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Date modifytime;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String remark;
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/EnumItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ å®žä½“ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
@Data
@TableName("PL_OMD_ENUMITEM")
@ApiModel(value = "OmdEnumitem对象", description = "枚举定义子表")
//@EqualsAndHashCode(callSuper = true)
public class EnumItem implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @ApiModelProperty(value = "")
    @TableId(value = "oid", type = IdType.ASSIGN_ID)
    private String oid;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String name;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String value;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String description;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Date ts;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String creator;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Date createtime;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String modifier;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Date modifytime;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private String parentoid;
    /**
     *
     */
    @ApiModelProperty(value = "")
    private Integer sort;
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/enums/EnumEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * ç³»ç»Ÿå­—典枚举类
 *
 * @author Chill
 */
@Getter
@AllArgsConstructor
public enum EnumEnum {
    /**
     * æ€§åˆ«
     */
    SEX("sex"),
    /**
     * é€šçŸ¥ç±»åž‹
     */
    NOTICE("notice"),
    /**
     * èœå•类型
     */
    MENU_CATEGORY("menu_category"),
    /**
     * æŒ‰é’®åŠŸèƒ½
     */
    BUTTON_FUNC("button_func"),
    /**
     * æ˜¯å¦
     */
    YES_NO("yes_no"),
    /**
     * æµç¨‹ç±»åž‹
     */
    FLOW("flow"),
    /**
     * æœºæž„类型
     */
    ORG_CATEGORY("org_category"),
    /**
     * æ•°æ®æƒé™
     */
    DATA_SCOPE_TYPE("data_scope_type"),
    /**
     * æŽ¥å£æƒé™
     */
    API_SCOPE_TYPE("api_scope_type"),
    /**
     * æƒé™ç±»åž‹
     */
    SCOPE_CATEGORY("scope_category"),
    /**
     * å¯¹è±¡å­˜å‚¨ç±»åž‹
     */
    OSS("oss"),
    /**
     * çŸ­ä¿¡æœåŠ¡ç±»åž‹
     */
    SMS("sms"),
    /**
     * å²—位类型
     */
    POST_CATEGORY("post_category"),
    /**
     * è¡Œæ”¿åŒºåˆ’
     */
    REGION("region"),
    /**
     * ç”¨æˆ·å¹³å°
     */
    USER_TYPE("user_type"),
    ;
    final String name;
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IDictClient.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumVO;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * æžšä¸¾å®šä¹‰ Feign接口类
 *
 * @author yuxc
 * @since 2023-05-08
 */
@FeignClient(
    value = AppConstant.APPLICATION_NAME_OMD,
    fallback = IEnumFallback.class
)
public interface IEnumClient {
    String API_PREFIX = "/client";
    String TOP = API_PREFIX + "/enum/top";
    String GET_BY_ID = API_PREFIX + "/enum/get-by-oid";
    String GET_BYCHILD_ID = API_PREFIX + "/enum/get-byChild-oid";
    String GET_VALUE = API_PREFIX + "/enum/get-value";
    String GET_LIST = API_PREFIX + "/enum/get-list";
    /**
     * èŽ·å–æžšä¸¾å®šä¹‰åˆ—è¡¨
     *
     * @param current   é¡µå·
     * @param size      é¡µæ•°
     * @return BladePage
     */
    @GetMapping(TOP)
    BladePage<Enum> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
    /**
     * èŽ·å–æžšä¸¾å®šä¹‰åˆ—è¡¨
     *
     * @param name   çˆ¶èŠ‚ç‚¹name
     * @param nameChild      å­èŠ‚ç‚¹name
     * @return BladePage
     */
    @GetMapping(GET_VALUE)
    R<String> getValue(@RequestParam("name") String name,@RequestParam("nameChild") String nameChild);
    /**
     * èŽ·å–å­—å…¸å®žä½“
     *
     * @param oid ä¸»é”®
     * @return
     */
    @GetMapping(GET_BY_ID)
    R<Enum> getById(@RequestParam("oid") String oid);
    /**
     * èŽ·å–å­—å…¸å®žä½“
     *
     * @param oid ä¸»é”®
     * @return
     */
    @GetMapping(GET_BYCHILD_ID)
    R<EnumItem> getByChildId(@RequestParam("oid") String oid);
    /**
     * èŽ·å–å­—å…¸è¡¨
     *
     * @param name æžšä¸¾ç¼–号
     * @return
     */
    @GetMapping(GET_LIST)
    R<List<EnumVO>> getList(@RequestParam("name") String name);
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumFallback.java
ÎļþÃû´Ó Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IDictClientFallback.java ÐÞ¸Ä
@@ -16,8 +16,11 @@
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumVO;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.tool.api.R;
import com.vci.ubcs.omd.entity.Dict;
import org.springframework.stereotype.Component;
import java.util.List;
@@ -27,25 +30,31 @@
 *
 * @author Chill
 */
@Component("Dictclient2")
public class IDictClientFallback implements IDictClient {
@Component
public class IEnumFallback implements IEnumClient {
    @Override
    public R<Dict> getById(Long id) {
    public BladePage<Enum> top(Integer current, Integer size) {
        return null;
    }
    @Override
    public R<String> getValue(String name, String nameChild) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<String> getValue(String code, String dictKey) {
    public R<Enum> getById(String oid) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<List<Dict>> getList(String code) {
    public R<EnumItem> getByChildId(String oid) {
        return R.fail("获取数据失败");
    }
    @Override
    public R getCheck(Dict dict) {
    public R<List<EnumVO>> getList(String name) {
        return R.fail("获取数据失败");
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumItemClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.entity.EnumItem;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.mp.support.BladePage;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ Feign接口类
 *
 * @author yuxc
 * @since 2023-05-08
 */
@FeignClient(
    value = AppConstant.APPLICATION_NAME_OMD,
    fallback = IEnumItemFallback.class
)
public interface IEnumItemClient {
    String API_PREFIX = "/clientEnumItem";
    String TOP = API_PREFIX + "/top";
    /**
     * èŽ·å–æžšä¸¾å®šä¹‰å­è¡¨åˆ—è¡¨
     *
     * @param current   é¡µå·
     * @param size      é¡µæ•°
     * @return BladePage
     */
    @GetMapping(TOP)
    BladePage<EnumItem> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumItemFallback.java
copy from Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IDictClientFallback.java copy to Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IEnumItemFallback.java
Îļþ´Ó Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IDictClientFallback.java ¸´ÖÆ
@@ -16,8 +16,11 @@
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumVO;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.tool.api.R;
import com.vci.ubcs.omd.entity.Dict;
import org.springframework.stereotype.Component;
import java.util.List;
@@ -27,25 +30,11 @@
 *
 * @author Chill
 */
@Component("Dictclient2")
public class IDictClientFallback implements IDictClient {
@Component
public class IEnumItemFallback implements IEnumItemClient {
    @Override
    public R<Dict> getById(Long id) {
        return R.fail("获取数据失败");
    public BladePage<EnumItem> top(Integer current, Integer size) {
        return null;
    }
    @Override
    public R<String> getValue(String code, String dictKey) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<List<Dict>> getList(String code) {
        return R.fail("获取数据失败");
    }
    @Override
    public R getCheck(Dict dict) {
        return R.fail("获取数据失败");
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/EnumItemVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.vo;
import com.vci.ubcs.omd.entity.EnumItem;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ è§†å›¾å®žä½“ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class EnumItemVO extends EnumItem {
    private static final long serialVersionUID = 1L;
    String parentName;
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/EnumVO.java
ÎļþÃû´Ó Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/DictVO.java ÐÞ¸Ä
@@ -17,55 +17,60 @@
package com.vci.ubcs.omd.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.vci.ubcs.omd.entity.Dict;
import io.swagger.annotations.ApiModel;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.starter.util.node.INodeOid;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import java.util.ArrayList;
import java.util.List;
/**
 * è§†å›¾å®žä½“ç±»
 * æžšä¸¾å®šä¹‰ è§†å›¾å®žä½“ç±»
 *
 * @author Chill
 * @author yuxc
 * @since 2023-05-08
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DictVO对象", description = "DictVO对象")
public class DictVO extends Dict implements INode<Dict> {
public class EnumVO extends Enum implements INodeOid<EnumItem> {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    /**
     * çˆ¶èŠ‚ç‚¹ID
     */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long parentId;
    /**
     * å­å­™èŠ‚ç‚¹
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<Dict> children;
    private List<EnumItem> children = new ArrayList<>();
    /**
     * æ˜¯å¦æœ‰å­å­™èŠ‚ç‚¹
     */
    private Boolean hasChildren = false;
    /**
     * å­èŠ‚ç‚¹OID
     */
    private String itemOid;
    /**
     * å­èŠ‚ç‚¹æžšä¸¾ç¼–ç 
     */
    private String itemName;
    /**
     * å­èŠ‚ç‚¹æžšä¸¾å€¼
     */
    private String itemValue;
    /**
     * å­èŠ‚ç‚¹æžšæè¿°
     */
    private String itemDescription;
    @Override
    public List<Dict> getChildren() {
        if (this.children == null) {
            this.children = new ArrayList<>();
        }
    public String getParentOid() {
        return null;
    }
    @Override
    public List<EnumItem> getChildren() {
        return this.children;
    }
    /**
     * ä¸Šçº§å­—å…¸
     */
    private String parentName;
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.vci.ubcs.starter.util;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternUtil {
    //*${xxx}*
    public static Pattern dynamic = Pattern.compile(".*\\$\\{([a-z]+)\\}.*");
    public static Pattern dynamicLimitCount = Pattern.compile("\\$\\{([a-z]+)\\}");
    /**
     * åˆ¤æ–­å†…容中是否包含动态参数(${key}形式的)
     *
     * @param content è¦åˆ¤æ–­çš„内容
     * @return
     */
    public static boolean isContainsDynamicParameter(String content) {
        if(StringUtils.isBlank(content)){
            return false;
        }
        return dynamic.matcher(content).matches();
    }
    /**
     * æŒ‰ç…§åŠ¨æ€å†…å®¹çš„å‚æ•°å‡ºçŽ°é¡ºåº,将参数放到List中
     *
     * @param content
     * @return
     */
    public static List<String> getKeyListByContent(String content) {
        if(StringUtils.isBlank(content)){
            return new ArrayList<>();
        }
        Set<String> paramSet = new LinkedHashSet<>();
        Matcher m = dynamicLimitCount.matcher(content);
        while (m.find()) {
            paramSet.add(m.group(1));
        }
        return new ArrayList<>(paramSet);
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/node/ForestNodeManagerOid.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.vci.ubcs.starter.util.node;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ForestNodeManagerOid<T extends INodeOid<T>> {
    private final ImmutableMap<String, T> nodeMap;
    private final Map<String, Object> parentIdMap = Maps.newHashMap();
    public ForestNodeManagerOid(List<T> nodes) {
        this.nodeMap = Maps.uniqueIndex(nodes, INodeOid::getOid);
    }
    public INodeOid<T> getTreeNodeAt(String id) {
        return this.nodeMap.containsKey(id) ? (INodeOid)this.nodeMap.get(id) : null;
    }
    public void addParentId(String parentId) {
        this.parentIdMap.put(parentId, "");
    }
    public List<T> getRoot() {
        List<T> roots = new ArrayList();
        this.nodeMap.forEach((key, node) -> {
            if (node.getParentOid() == null || this.parentIdMap.containsKey(node.getOid())) {
                roots.add(node);
            }
        });
        return roots;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/node/ForestNodeMergerOid.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.vci.ubcs.starter.util.node;
import java.util.List;
public class ForestNodeMergerOid {
    public ForestNodeMergerOid() {
    }
    public static <T extends INodeOid<T>> List<T> merge(List<T> items) {
        ForestNodeManagerOid forestNodeManager = new ForestNodeManagerOid(items);
        items.forEach((forestNode) -> {
            if (forestNode.getParentOid() != null) {
                INodeOid<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentOid());
                if (node != null) {
                    node.getChildren().add(forestNode);
                } else {
                    forestNodeManager.addParentId(forestNode.getOid());
                }
            }
        });
        return forestNodeManager.getRoot();
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/node/INodeOid.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.vci.ubcs.starter.util.node;
import java.io.Serializable;
import java.util.List;
public interface INodeOid<T> extends Serializable {
    String getOid();
    String getParentOid();
    List<T> getChildren();
    default Boolean getHasChildren() {
        return false;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/VciSystemVarConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.vci.ubcs.starter.web.constant;
import com.vci.ubcs.starter.web.pagemodel.SessionInfo;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import java.util.*;
import java.util.stream.Collectors;
public class VciSystemVarConstants {
    public static final String CURRENTUSER_OID = "#CURRENTUSER.OID#";
    public static final String CURRENTUSER_ID = "#CURRENTUSER.ID#";
    public static final String CURRENTTIME = "#CURRENTTIME#";
    public static final String CURRENTDATE = "#CURRENTDATE#";
    public static final String CURRENTDATETIME = "#CURRENTDATETIME#";
    public static final String CURRENTUSER_NAME = "#CURRENTUSER_NAME#";
    public static final String CURRENTUSER_SECRETGRADE = "#CURRENTUSER.SECRETGRADE#";
    public static final String CURRENTUSER_IP_SECRET = "#CURRENTUSER.IPSECRET#";
    public static final String CURRENTUSER_BUSINESS_UNIT = "#CURRENTUSER.BUSINESSUNIT#";
    public static final String CURRENTUSER_BUSINESS_UNIT_NAME = "#CURRENTUSER.BUSINESSUNITNAME#";
    public static final String CURRENTUSER_GROUPOID = "#CURRENTUSER.GROUPOID#";
    public static final String CURRENTUSER_GROUPNAME = "#CURRENTUSER.GROUPNAME#";
    public static final String CURRENTUSER_EMAIL = "#CURRENTUSER.EMAIL#";
    public static final String CURRENTUSER_ROLENAME = "#CURRENTUSER.ROLENAME#";
    public static final String[] SYSTEM_VAR_KEYS = new String[]{"#CURRENTUSER.OID#", "#CURRENTUSER.ID#", "#CURRENTDATE#", "#CURRENTTIME#", "#CURRENTDATETIME#", "#CURRENTUSER.GROUPOID#", "#CURRENTUSER_NAME#", "#CURRENTUSER.SECRETGRADE#", "#CURRENTUSER.GROUPNAME#", "#CURRENTUSER.EMAIL#", "#CURRENTUSER.ROLENAME#", "#CURRENTUSER.IPSECRET#", "#CURRENTUSER.BUSINESSUNIT#", "#CURRENTUSER.BUSINESSUNITNAME#"};
    public static final Map<String, String> SYSTEM_VAR_KEYNAMEMAP = new HashMap();
    public VciSystemVarConstants() {
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTTIME#", "当前时间");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTDATE#", "当前日期");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTDATETIME#", "当前日期时间");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.OID#", "当前用户主键");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.ID#", "当前用户账户");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER_NAME#", "当前用户姓名");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.SECRETGRADE#", "当前用户密级");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.IPSECRET#", "当前用户的机器密级");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.GROUPOID#", "当前用户的部门的主键");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.GROUPNAME#", "当前用户所属部门名称");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.EMAIL#", "当前用户邮件地址");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.ROLENAME#", "当前用户所属角色名称");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.BUSINESSUNIT#", "当前用户所属业务单元主键");
        SYSTEM_VAR_KEYNAMEMAP.put("#CURRENTUSER.BUSINESSUNITNAME#", "当前用户所属业务单元");
    }
    public static Map<String, String> getSystemVarValueMap() {
        Map<String, String> systemVarMap = new HashMap();
        SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
        if (sessionInfo != null) {
            systemVarMap.put("#CURRENTUSER.OID#", sessionInfo.getUserOid());
            systemVarMap.put("#CURRENTUSER.ID#", sessionInfo.getUserId());
            systemVarMap.put("#CURRENTUSER_NAME#", sessionInfo.getUserName());
            systemVarMap.put("#CURRENTDATETIME#", VciDateUtil.getNowString());
            systemVarMap.put("#CURRENTDATE#", VciDateUtil.getNowString("yyyy-MM-dd"));
            systemVarMap.put("#CURRENTTIME#", VciDateUtil.getNowString("HH:mm:ss"));
            systemVarMap.put("#CURRENTUSER.SECRETGRADE#", sessionInfo.getUserSecret());
            systemVarMap.put("#CURRENTUSER.GROUPNAME#", sessionInfo.getDeptName());
            systemVarMap.put("#CURRENTUSER.GROUPOID#", sessionInfo.getDeptOid());
            systemVarMap.put("#CURRENTUSER.EMAIL#", sessionInfo.getEmail());
            systemVarMap.put("#CURRENTUSER.ROLENAME#", (String) ((Collection) Optional.ofNullable(sessionInfo.getRolesName().values()).orElseGet(() -> {
                return new ArrayList();
            })).stream().collect(Collectors.joining(",")));
            systemVarMap.put("#CURRENTUSER.IPSECRET#", sessionInfo.getIpSecret());
            systemVarMap.put("#CURRENTUSER.BUSINESSUNIT#", sessionInfo.getOrgsOid());
            systemVarMap.put("#CURRENTUSER.BUSINESSUNITNAME#", sessionInfo.getOrgsName());
        }
        return systemVarMap;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/Md5.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.vci.ubcs.starter.web.util;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
import java.security.MessageDigest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Md5 {
    private static Logger logger = LoggerFactory.getLogger(Md5.class);
    public Md5() {
    }
    public static String md5(String v) {
        if (v == null) {
            return null;
        } else {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                return toHex(md.digest(v.getBytes()));
            } catch (Exception var2) {
                return null;
            }
        }
    }
    public static String twoTimesMd5(String sourceString) throws Exception {
        return sourceString == null ? null : md5(md5(sourceString));
    }
    public static boolean equalMd5(String md5String, String sourceString) {
        if (md5String != null && sourceString != null) {
            try {
                return md5String.equals(twoTimesMd5(sourceString));
            } catch (Exception var3) {
                var3.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }
    public static boolean equalOneMd5(String md5String, String sourceString) {
        if (md5String != null && sourceString != null) {
            try {
                String ms = md5(sourceString);
                return md5String.equals(ms);
            } catch (Exception var3) {
                if (logger.isErrorEnabled()) {
                    logger.error("对比md5的时候出现了错误", var3);
                }
                return false;
            }
        } else {
            return false;
        }
    }
    private static String toHex(byte[] buffer) {
        StringBuffer sb = new StringBuffer(32);
        String s = null;
        for(int i = 0; i < buffer.length; ++i) {
            s = Integer.toHexString(buffer[i] & 255);
            if (s.length() < 2) {
                sb.append('0');
            }
            sb.append(s);
        }
        return sb.toString();
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
@@ -79,7 +79,14 @@
            return 0;
        }
    }
    public static SessionInfo getCurrentUserSessionInfo() throws VciBaseException {
        SessionInfo si = getCurrentUserSessionInfoNotException();
        if (si == null) {
            throw new VciBaseException("noLogin", new String[]{"没有当前用户信息"});
        } else {
            return si;
        }
    }
    public static long getLong(String s) {
        long l = 0L;
        if (s == null) {
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeButtonController.java
@@ -26,7 +26,6 @@
import com.vci.ubcs.code.vo.pagemodel.CodeButtonVO;
import com.vci.ubcs.code.wrapper.CodeButtonWrapper;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -52,11 +51,14 @@
 */
@RestController
@AllArgsConstructor
@RequestMapping("/codeButtonController")
@RequestMapping("/codebutton")
@Api(value = "模板扩展池", tags = "模板扩展池接口")
public class CodeButtonController extends BladeController {
    private final ICodeButtonService codeButtonService;
    CodeButtonMapper codeButtonMapper;
    /**
     * ä¸»æ•°æ®ä¸­çš„æŒ‰é’®æ‰©å±•列表
@@ -136,6 +138,82 @@
        }
        return R.data(codeButtonService.refDataGridCodeButton(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper()));
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  è¯¦æƒ…
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入codebutton")
    public R<CodeButtonVO> detail(CodeButton codebutton) {
        CodeButton detail = codeButtonMapper.selectOne(Condition.getQueryWrapper(codebutton));
        return R.data(CodeButtonWrapper.build().entityVO(detail));
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  åˆ†é¡µ
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入codebutton")
    public R<IPage<CodeButtonVO>> list(CodeButton codebutton, Query query) {
        IPage<CodeButton> pages = codeButtonMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(codebutton));
        return R.data(CodeButtonWrapper.build().pageVO(pages));
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  è‡ªå®šä¹‰åˆ†é¡µ
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入codebutton")
    public R<IPage<CodeButtonVO>> page(CodeButtonVO codebutton, Query query) {
        IPage<CodeButtonVO> pages = codeButtonService.selectcodebuttonPage(Condition.getPage(query), codebutton);
        return R.data(pages);
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  æ–°å¢ž
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入codebutton")
    public R save(@Valid @RequestBody CodeButton codebutton) {
        return R.status(SqlHelper.retBool(codeButtonMapper.insert(codebutton)));
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  ä¿®æ”¹
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入codebutton")
    public R update(@Valid @RequestBody CodeButton codebutton) {
        return R.status(SqlHelper.retBool(codeButtonMapper.updateById(codebutton)));
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  æ–°å¢žæˆ–修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入codebutton")
    public R submit(@Valid @RequestBody CodeButton codebutton) {
        if(codebutton.getOid() != null){
            return R.status(SqlHelper.retBool(codeButtonMapper.updateById(codebutton)));
        }
        return R.status(SqlHelper.retBool(codeButtonMapper.insert(codebutton)));
    }
    /**
     * æ¨¡æ¿æ‰©å±•æ±  åˆ é™¤
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "逻辑删除", notes = "传入ids")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
//        return codebuttonService.deleteCodeButton(ids);
        return R.status(SqlHelper.retBool(codeButtonMapper.deleteBatchIds(Func.toStrList(ids))));
    }
    /**
     * å¯ç”¨
@@ -157,4 +235,5 @@
        return codeButtonService.disableOrgDuty(oid);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyTemplateAttrController.java
@@ -18,10 +18,17 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.code.dto.CodeClstempattrDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
import com.vci.ubcs.code.service.ICodeClassifyTemplateAttrService;
import com.vci.ubcs.code.service.ICodeClstempattrService;
import com.vci.ubcs.code.vo.CodeClstempattrVO;
import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.wrapper.CodeClstempattrWrapper;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -31,9 +38,12 @@
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
 * ç¼–码库定义-模板属性 æŽ§åˆ¶å™¨
@@ -48,6 +58,7 @@
public class CodeClassifyTemplateAttrController extends BladeController {
    private final ICodeClassifyTemplateAttrService CodeClstempattrService;
    private final ICodeClstempattrService iCodeClstempattrService;
    /**
     * ç¼–码库定义-模板属性 è¯¦æƒ…
@@ -120,6 +131,130 @@
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(CodeClstempattrService.removeBatchByIds(Func.toLongList(ids)));
    }
    /**
     * ä¸»é¢˜åº“分类的模板属性列表
     * @param baseQueryObject åŸºç¡€æŸ¥è¯¢å¯¹è±¡ï¼ŒåŒ…含查询条件,分页,排序等
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表
     */
    @GetMapping("/gridCodeClassifyTemplateAttr")
    public DataGrid<CodeClstempattrVO> gridCodeClassifyTemplateAttr(BaseQueryObject baseQueryObject){
        if(baseQueryObject == null){
            baseQueryObject = new BaseQueryObject();
        }
        return iCodeClstempattrService.gridCodeClassifyTemplateAttr(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
    }
    /**
     * å¢žåŠ  ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PostMapping( "/addSave")
    public R<CodeClstempattrVO> addSave(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO){
        CodeClstempattrVO codeClassifyTemplateAttrVO = iCodeClstempattrService.addSave(codeClassifyTemplateAttrDTO);
        return R.data(codeClassifyTemplateAttrVO);
    }
    /**
     * æ‰¹é‡ä¿å­˜åˆ—表数据
     * @param list
     * @return
     */
    @PostMapping( "/batchAddSave")
    public R<List<CodeClstempattrVO>> batchAddSaves(@RequestBody List<CodeClstempattrDTO> list){
        if(CollectionUtils.isEmpty(list)){
            return R.fail("列表不能为空!");
        }
        List<CodeClstempattrVO> codeClassifyTemplateAttrVOs = iCodeClstempattrService.batchAddSave(list);
        return R.data(codeClassifyTemplateAttrVOs);
    }
    /**
     * ä¿®æ”¹ ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PutMapping("/editSave")
    public R<CodeClstempattrVO> editSave(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO){
        return iCodeClstempattrService.editSave(codeClassifyTemplateAttrDTO);
    }
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     */
    @DeleteMapping( "/deleteData")
    public R delCodeClassifyTemplateAttr(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO) {
        return iCodeClstempattrService.deleteCodeClassifyTemplateAttr(codeClassifyTemplateAttrDTO);
    }
    /**
     * ä¸»é”®èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oid ä¸»é”®
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    @GetMapping("/getObjectByOid")
    public R<CodeClstempattrVO> getObjectByOid(String oid){
        CodeClstempattrVO codeClassifyTemplateAttrVO = iCodeClstempattrService.getObjectByOid(oid);
        return R.data(codeClassifyTemplateAttrVO);
    }
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oids ä¸»é”®ï¼Œå¤šä¸ªä»¥é€—号分隔,但是受性能影响,建议一次查询不超过10000个
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    @GetMapping("/listDataByOids")
    public R listCodeClassifyTemplateAttrByOids(String oids){
        Collection<CodeClstempattrVO> voCollection =  iCodeClstempattrService.listCodeClassifyTemplateAttrByOids(VciBaseUtil.str2List(oids));
//        BaseResult baseResult = BaseResult.success();
//        baseResult.setData(voCollection);
        return  R.data(voCollection);
    }
    /**
     * å‚照主题库分类的模板属性列表
     * @param baseQueryObject åŸºç¡€æŸ¥è¯¢å¯¹è±¡ï¼ŒåŒ…含查询条件,分页,排序等
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     */
    @GetMapping("/refDataGrid")
    public DataGrid<CodeClstempattrVO> refDataGridCodeClassifyTemplateAttr(BaseQueryObject baseQueryObject){
        if(baseQueryObject == null){
            baseQueryObject = new BaseQueryObject();
        }
        return iCodeClstempattrService.refDataGridCodeClassifyTemplateAttr(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªä¸šåŠ¡ç±»åž‹ä¸‹çš„æ‰€æœ‰å±žæ€§,排除掉这个模板已经存在的属性
     * @param baseQueryObject
     * @return
     */
    @GetMapping("/codeClassifyTemplateAttrByBtm")
    public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject){
        return iCodeClstempattrService.codeClassifyTemplateAttrByBtm(baseQueryObject);
    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªä¸šåŠ¡ç±»åž‹ä¸‹ã€è¿™ä¸ªæ¨¡æ¿å·²ç»å­˜åœ¨çš„å±žæ€§
     * @param baseQueryObject
     * @return
     */
    @GetMapping("/codeClassifyTemplateAttrByBtmHave")
    public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject){
        return iCodeClstempattrService.codeClassifyTemplateAttrByBtmHave(baseQueryObject);
    }
    /**
     * åŒæ­¥åˆ°å…¶ä»–模板
     * @param codeClassifyAttrDTO   id è‹±æ–‡åç§°
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping( "/copyto")
    public R copyto(@RequestBody CodeClstempattrDTO codeClassifyAttrDTO) {
        return iCodeClstempattrService.copyto(codeClassifyAttrDTO);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java
@@ -25,8 +25,10 @@
import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
import com.vci.ubcs.code.service.ICodeClstemplateService;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.code.wrapper.PlCodeClstemplateWrapper;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.Tree;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import io.swagger.annotations.Api;
@@ -52,7 +54,7 @@
 */
@RestController
@AllArgsConstructor
@RequestMapping("/codeClstemplate")
@RequestMapping("/codeClassifyTemplateController")
@Api(value = "编码库定义-模板管理", tags = "编码库定义-模板管理接口")
public class CodeClstemplateController extends BladeController {
@@ -142,16 +144,37 @@
        return  plCodeClstemplateService.treeCodeClassifyTemplate(treeQueryObject);
    }
//    /**
//     * åˆ†ç±»æ¨¡æ¿åˆ—表
//     * @param baseQueryObject åŸºç¡€æŸ¥è¯¢å¯¹è±¡
//     * @return æ˜¾ç¤ºå¯¹è±¡
//     */
//    @GetMapping("/gridCodeClassifyTemplate")
//    public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(BaseQueryObject baseQueryObject){
//
//        return  plCodeClstemplateService.gridCodeClassifyTemplate(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
//    }
    /**
     * åˆ†ç±»æ¨¡æ¿åˆ—表
     * @param baseQueryObject åŸºç¡€æŸ¥è¯¢å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/gridCodeClassifyTemplate")
    public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(BaseQueryObject baseQueryObject){
        return  plCodeClstemplateService.gridCodeClassifyTemplate(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
    }
    /**
     * å¢žåŠ  åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param codeClassifyTemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PostMapping( "/addSave")
    public R<CodeClstemplateVO> addSave(@RequestBody CodeClstemplateDTO codeClassifyTemplateDTO){
        return plCodeClstemplateService.addSave(codeClassifyTemplateDTO);
    }
    /**
     * ä¿®æ”¹ åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param codeClassifyTemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PutMapping("/editSave")
    public R<CodeClstemplateVO> editSave(@RequestBody CodeClstemplateDTO codeClassifyTemplateDTO){
        return plCodeClstemplateService.editSave(codeClassifyTemplateDTO);
    }
    /**
@@ -234,7 +257,7 @@
     * @return
     */
    @PostMapping( "/editDate")
    public R editDate( CodeClstemplateDTO codeClassifyDTO) {
    public R editDate(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
        return plCodeClstemplateService.updateLcStatus(codeClassifyDTO.getOid(),CodeClassifyTemplateLC.EDITING.getValue());
    }
@@ -248,4 +271,26 @@
        return plCodeClstemplateService.Upgrade(codeClassifyDTO);
    }
    @GetMapping( "/upgrade1")
    public R upgrade1(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
        return Upgrade(codeClassifyDTO);
    }
    /**
     * å…‹éš†
     * @param codeClassifyDTO
     * @return oid模板oid
     */
    @PostMapping( "/copy")
    public R copyTemplate(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
        return plCodeClstemplateService.copyTemplate(codeClassifyDTO);
    }
    @GetMapping( "/copyTemplate1")
    public R copyTemplate1(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
        return copyTemplate(codeClassifyDTO);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java
@@ -18,11 +18,18 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.code.dto.CodeClstempattrDTO;
import com.vci.ubcs.code.entity.CodeClstempattrEntity;
import com.vci.ubcs.code.vo.CodeClstempattrVO;
import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import org.springblade.core.tool.api.R;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
 * ç¼–码库定义-模板属性 æœåŠ¡ç±»
@@ -61,5 +68,77 @@
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstempattrVO codeClassifyTemplateAttrDO2VO(CodeClstempattrEntity codeClassifyTemplateAttrDO);
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„主题库分类的模板属性
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return æ‰§è¡Œç»“æžœ
     */
    DataGrid<CodeClstempattrVO> gridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper);
    /**
     * å¢žåŠ ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“æžœ
     */
    CodeClstempattrVO addSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO);
    List<CodeClstempattrVO> batchAddSave(List<CodeClstempattrDTO> list);
    /**
     * ä¿®æ”¹ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“æžœ
     */
    R<CodeClstempattrVO> editSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO);
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     */
    R deleteCodeClassifyTemplateAttr(CodeClstempattrDTO codeClassifyTemplateAttrDTO);
    /**
     * ä¸»é”®èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oid ä¸»é”®
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    CodeClstempattrVO getObjectByOid(String oid);
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oidCollections ä¸»é”®é›†åˆï¼Œä½†æ˜¯å—性能影响,建议一次查询不超过10000个
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    Collection<CodeClstempattrVO> listCodeClassifyTemplateAttrByOids(Collection<String> oidCollections);
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     */
    DataGrid<CodeClstempattrVO> refDataGridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper);
    /**
     * æŸ¥è¯¢è¿™ä¸ªæ¨¡æ¿ï¼Œä¸šåŠ¡ç±»åž‹ä¸‹çš„æ‰€æœ‰æœªé€‰æ‹©çš„å±žæ€§
     * @param baseQueryObject
     * @return
     */
    DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject);
    /**
     * æŸ¥è¯¢è¿™ä¸ªæ¨¡æ¿ï¼Œä¸šåŠ¡ç±»åž‹ä¸‹å·²é€‰æ‹©çš„å±žæ€§
     * @param baseQueryObject
     * @return
     */
    DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject);
    /**
     * åŒæ­¥åˆ°å…¶ä»–模板
     * @param codeClassifyAttrDTO oid
     * @return
     */
    R copyto(CodeClstempattrDTO codeClassifyAttrDTO);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
@@ -23,6 +23,7 @@
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.pagemodel.Tree;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
@@ -164,11 +165,11 @@
    /**
     * åˆ†ç±»æ¨¡æ¿åˆ—表
     * @param plCodeClstemplate æŸ¥è¯¢æ¡ä»¶
     * @param query åˆ†é¡µå¯¹è±¡
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query);
    DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(Map<String, String> conditionMap, PageHelper pageHelper);
    /**
     * å¢žåŠ åˆ†ç±»æ¨¡æ¿å¯¹è±¡
@@ -212,7 +213,7 @@
     * @param templateOid ä¸»é”®
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstemplateVO getObjectHasAttrByOid(String templateOid);
    CodeClstemplateVO getObjectHasAttrByOid(String templateOid);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
@@ -5,12 +5,18 @@
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
import com.vci.ubcs.code.entity.CodeAllCode;
import com.vci.ubcs.code.entity.CodeRule;
import com.vci.ubcs.code.entity.CodeWupinEntity;
import com.vci.ubcs.code.vo.CodeClstempattrVO;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import java.util.List;
import java.util.Map;
/**
 * ä¸»æ•°æ®å¼•擎服务
@@ -18,7 +24,6 @@
 * @date 2022-2-21
 */
public interface MdmEngineService extends IService<CodeAllCode> {
    /**
     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
     * @param codeClassifyOid åˆ†ç±»çš„主键
@@ -60,4 +65,37 @@
     * @param orderDTO ç¼–码申请的内容
     */
    void checkSecValueOnOrder(CodeRuleVO ruleVO, CodeOrderDTO orderDTO);
    /**
     * å°è£…关键属性的查询语句
     *
     * @param value        å½“前的值
     * @param keyRuleVO    å…³é”®å±žæ€§çš„æŽ§åˆ¶è§„则,可以为空
     * @param attrId       å±žæ€§çš„编号
     * @param trim         æ˜¯å¦åŽ»é™¤ç©ºæ ¼
     * @param ignoreCase   æ˜¯å¦ä¸åŒºåˆ†å¤§å°å†™
     * @param ignoreWidth  æ˜¯å¦å¿½ç•¥å…¨åŠè§’
     * @param trimAll      æ˜¯å¦å¿½ç•¥å…¨éƒ¨ç©ºæ ¼
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     */
    void wrapperKeyAttrConditionMap(String value, CodeKeyattrrepeatVO keyRuleVO, String attrId,
                               boolean trim, boolean ignoreCase, boolean ignoreWidth,
                               boolean trimAll, Map<String, String> conditionMap);
    /**
     * åˆå§‹åŒ–业务类型
     * --创建人默认为当前用户,如果需要修改,可以在获取后自行处理
     * @param btmName ä¸šåŠ¡ç±»åž‹çš„åç§°ï¼Œä¼šè‡ªåŠ¨å˜æˆå°å†™
     * @return CodeWupinEntity
     * @throws VciBaseException åˆå§‹åŒ–出错的是会抛出异常
     */
    CodeWupinEntity createCBOByBtmName(String btmName);
    /**
     * ä¿å­˜å¯è¾“可选的信息
     *
     * @param templateVO æ¨¡æ¿çš„对象
     * @param cboList    æ•°æ®çš„内容
     */
    void batchSaveSelectChar(CodeClstemplateVO templateVO, /*List<ClientBusinessObject> cboList*/
                             List<String> cboList);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
@@ -8,6 +8,7 @@
import java.util.List;
public interface MdmProductCodeService {
    /**
     * ç”Ÿæˆç¼–码--并且保存数据-方法加锁,因此不能返回batchCBO
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeButtonServiceImpl.java
@@ -263,7 +263,7 @@
     * @throws VciBaseException å‚数为空或者不存在的时候会抛出异常
     */
    @Override
    public List<CodeButtonVO> codeButtonDO2VOs(Collection<CodeButton> codeButtonDOs) throws VciBaseException{
    public List<CodeButtonVO> codeButtonDO2VOs(Collection<CodeButton>  codeButtonDOs) throws VciBaseException{
        List<CodeButtonVO> voList = new ArrayList<CodeButtonVO>();
        if(!CollectionUtils.isEmpty(codeButtonDOs)){
            for(CodeButton s: codeButtonDOs){
@@ -289,7 +289,7 @@
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeButtonDO,vo);
            //如果有lcstatus的类的话
            vo.setLcStatusText(FrameworkDataLCStatus.getTextByValue(vo.getLcStatus()));
            vo.setUsedpositiontypeText(CodeUseButtonPositionTypeEnum.getTextByValue(codeButtonDO.getUsedPositionType()));
        }
        return vo;
    }
@@ -319,6 +319,7 @@
        return  codeButtonDOList;
    }
    @Override
    public R enableCodeButton(String id) {
        CodeButton codebutton = codeButtonMapper.selectById(id);
@@ -344,7 +345,7 @@
     * @return æ‰§è¡Œçš„结果
     */
    private R changeLcStatus(CodeButton buttonDTO, boolean disable){
        // VciBaseUtil.alertNotNull(buttonDTO,"数据对象",buttonDTO.getOid(),"主键");
//        VciBaseUtil.alertNotNull(buttonDTO,"数据对象",buttonDTO.getOid(),"主键");
        if(disable){
            buttonDTO.setLcStatus(FrameworkDataLCStatus.ENABLED.getValue());
        }else{
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,806 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.code.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.vci.ubcs.code.dto.CodeClstempattrDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
import com.vci.ubcs.code.entity.CodeClstempattrEntity;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
import com.vci.ubcs.code.mapper.CodeClstempattrMapper;
import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeattributeMapper;
import com.vci.ubcs.code.service.ICodeClstempattrService;
import com.vci.ubcs.code.service.ICodeTempphaseService;
import com.vci.ubcs.code.vo.CodeClstempattrVO;
import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.PatternUtil;
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.*;
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import com.vci.ubcs.system.entity.DictBiz;
import com.vci.ubcs.system.feign.IDictBizClient;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.*;
/**
 * ç¼–码库定义-模板属性 æœåŠ¡å®žçŽ°ç±»
 *
 * @author yuxc
 * @since 2023-04-19
 */
@Service
public class CodeClstempattrServiceImpl extends ServiceImpl<CodeClstempattrMapper, CodeClstempattrEntity> implements ICodeClstempattrService {
    @Resource
    CodeClstempattrMapper codeClstempattrMapper;
    //    @Resource
//    ICodeTempphaseService codeTempphaseService;
    @Resource
    IDictBizClient iDictBizClient;
    @Resource
    CodeClstemplateMapper codeClstemplateMapper;
    @Resource
    CodeOsbtmtypeattributeMapper codeOsbtmtypeattributeMapper;
    @Resource
    ICodeTempphaseService codeTempphaseService;
    /**
     * å¯¹è±¡çš„æ“ä½œ
     */
    @Autowired(required = false)
    private RevisionModelUtil revisionModelUtil;
    @Override
    public IPage<CodeClstempattrVO> selectCodeClstempattrPage(IPage<CodeClstempattrVO> page, CodeClstempattrVO CodeClstempattr) {
        return page.setRecords(baseMapper.selectCodeClstempattrPage(page, CodeClstempattr));
    }
    /**
     * ä½¿ç”¨æ¨¡æ¿çš„主键获取模板的属性--批量
     *
     * @param templateOidCollection æ¨¡æ¿çš„主键
     * @return å±žæ€§çš„信息
     */
    @Override
    public List<CodeClstempattrVO> listCodeClassifyTemplateAttrByTemplateOids(Collection<String> templateOidCollection) {
        if(CollectionUtils.isEmpty(templateOidCollection)){
            return new ArrayList<>();
        }
        List<CodeClstempattrEntity> attrDOList = new ArrayList<>();
        VciBaseUtil.switchCollectionForOracleIn(templateOidCollection).stream().forEach(templateOids->{
//            Map<String,String> conditionMap = new HashMap<>();
//            conditionMap.put("classifytemplateoid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(templateOids.toArray(new String[0])) + ")");
//            PageHelper pageHelper = new PageHelper(-1);
//            pageHelper.addDefaultAsc("orderNum");
            List<CodeClstempattrEntity> attrDOS = baseMapper.selectByClassifytemplateoid(VciBaseUtil.toInSql(templateOids.toArray(new String[0])));
            if(!CollectionUtils.isEmpty(attrDOS)){
                attrDOList.addAll(attrDOS);
            }
        });
        return codeClassifyTemplateAttrDO2VOs(attrDOList);
    }
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeClassifyTemplateAttrDOs æ•°æ®å¯¹è±¡åˆ—表
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<CodeClstempattrVO> codeClassifyTemplateAttrDO2VOs(Collection<CodeClstempattrEntity>  codeClassifyTemplateAttrDOs){
        List<CodeClstempattrVO> voList = new ArrayList<CodeClstempattrVO>();
        if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOs)){
            for(CodeClstempattrEntity s: codeClassifyTemplateAttrDOs){
                CodeClstempattrVO vo =  codeClassifyTemplateAttrDO2VO(s);
                if(vo != null){
                    voList.add(vo);
                }
            }
        }
        return voList;
    }
    /**
     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param  codeClassifyTemplateAttrDO æ•°æ®å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public  CodeClstempattrVO codeClassifyTemplateAttrDO2VO(CodeClstempattrEntity codeClassifyTemplateAttrDO){
        CodeClstempattrVO vo = new CodeClstempattrVO();
        if(codeClassifyTemplateAttrDO != null){
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDO,vo);
            //如果有lcstatus的类的话
            vo.setAttributeDataTypeText(VciFieldTypeEnum.getTextByValue(vo.getAttributedatatype()));
        }
        return vo;
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„主题库分类的模板属性
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    public DataGrid<CodeClstempattrVO> gridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper) {
        DataGrid<CodeClstempattrVO> dataGrid=new DataGrid<CodeClstempattrVO>();
        //没有传递参数,就不执行查询逻辑
        if(conditionMap.size()==0){
            dataGrid.setData(new ArrayList<>());
            dataGrid.setTotal(0);
            return dataGrid;
        }
        if (pageHelper == null) {
            pageHelper = new PageHelper(-1);
        }
        pageHelper.addDefaultAsc("ordernum");
//        IPage iPage = new IPage();
        Query query = new Query();
        query.setAscs("ordernum");
//        query.setSize(100);
        if(pageHelper.getLimit() != -1){
            query.setSize(pageHelper.getLimit());
            query.setCurrent(pageHelper.getPage());
        }
//        Condition.getPage(query)
        CodeClstempattrVO codeClstempattrVO = new CodeClstempattrVO();
//        BeanUtil.toBean(map,codeClstempattrVO);
//        BeanUtil
        BeanMap beanMap = BeanMap.create(codeClstempattrVO);
        beanMap.putAll(conditionMap);
//        Condition.getQueryWrapper(
        IPage<CodeClstempattrEntity> doList = baseMapper.
            selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeClstempattrVO));
        if (!CollectionUtils.isEmpty(doList.getRecords())) {
//            CodeClstempattrEntity codeClstempattrEntity = new CodeClstempattrEntity();
//            BeanUtils.copyProperties(conditionMap, codeClstempattrEntity);
//            List<CodeClstempattrEntity> codeClstempattrEntities = new ArrayList<>();
//            BeanUtils.copyProperties(doList,codeClstempattrEntities);
//            codeClstempattrEntities.addAll(doList);
            dataGrid.setData(codeClassifyTemplateAttrDO2VOs(doList.getRecords()));
            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(baseMapper.selectCount(Condition.getQueryWrapper(codeClstempattrVO)))));
        }
        return dataGrid;
    }
    /**
     * å¢žåŠ ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    public CodeClstempattrVO addSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO){
        VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"需要添加的数据对象");
        //将DTO转换为DO
        CodeClstempattrEntity codeClassifyTemplateAttrDO = new CodeClstempattrEntity();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
        baseMapper.insert(codeClassifyTemplateAttrDO);
        return codeClassifyTemplateAttrDO2VO(codeClassifyTemplateAttrDO);
    }
    /**
     * æ‰¹é‡æ·»åŠ 
     * @param codeClassifyTemplateAttrDTOs æ•°æ®ä¼ è¾“对象
     * @return ä¿å­˜åŽçš„æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    @Transactional
    public List<CodeClstempattrVO> batchAddSave(List<CodeClstempattrDTO> codeClassifyTemplateAttrDTOs) {
        if(CollectionUtils.isEmpty(codeClassifyTemplateAttrDTOs)){
            return new ArrayList<>();
        }
        //取所有属性的英文名称,第三个验证需要用到
        Map<String,CodeClstempattrDTO> attrDTOMap =codeClassifyTemplateAttrDTOs.stream().collect(Collectors.toMap(s->s.getId().toLowerCase(Locale.ROOT), t->t));
        //找属性中文名字重复
        Map<String, Long> nameCountMap = codeClassifyTemplateAttrDTOs.stream().collect(Collectors.groupingBy(s -> s.getName(), Collectors.counting()));
        List<String> repeatNameList = nameCountMap.keySet().stream().filter(s -> nameCountMap.get(s) > 1).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(repeatNameList)){
            throw new VciBaseException("模板属性中文名称【{0}】重复",new String[]{ repeatNameList.stream().collect(Collectors.joining(","))});
        }
        //找属性英文名字重复
        Map<String, Long> idCountMap = codeClassifyTemplateAttrDTOs.stream().collect(Collectors.groupingBy(s -> s.getId().toLowerCase(Locale.ROOT), Collectors.counting()));
        List<String> repeatIdList = idCountMap.keySet().stream().filter(s -> idCountMap.get(s) > 1).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(repeatIdList)){
            throw new VciBaseException("模板属性英文名称【{0}】重复",new String[]{ repeatIdList.stream().collect(Collectors.joining(","))});
        }
        //模板oid
        String CLASSIFYTEMPLATEOID = null;
        //转换
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOInsert = new ArrayList<CodeClstempattrEntity>();
        List<String> prefix = new ArrayList<>();
        List<String> suffix = new ArrayList<>();
        List<String> dateFormates = new ArrayList<>();
        for (CodeClstempattrEntity codeClassifyTemplateAttrDTO:codeClassifyTemplateAttrDTOs){
            VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"需要添加的数据对象");
            //将DTO转换为DO
            CodeClstempattrEntity codeClassifyTemplateAttrDO = new CodeClstempattrEntity();
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
            codeClassifyTemplateAttrDOInsert.add(codeClassifyTemplateAttrDO);
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getPrefixvalue())){
                prefix.add(codeClassifyTemplateAttrDO.getPrefixvalue());
            }
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getSuffixvalue())){
                suffix.add(codeClassifyTemplateAttrDO.getSuffixvalue());
            }
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getCodedateformat())){
                dateFormates.add(codeClassifyTemplateAttrDO.getCodedateformat());
            }
            //判断传过来的枚举注入是否是jsonArr格式
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getEnumstring())&&!checkKVArr(codeClassifyTemplateAttrDO.getEnumstring())){
                throw new VciBaseException("{0}{1}属性的枚举注入数据格式错误!",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
            }
            //分类注入
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getClassifyinvokeattr())
                && !CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(codeClassifyTemplateAttrDO.getClassifyinvokelevel())
                && VciBaseUtil.getInt(codeClassifyTemplateAttrDO.getClassifyinvokelevel()) < 0){
                throw new VciBaseException("{0}{1}属性的是分类注入,但是注入层级不能小于0!",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
            }
            //判断传过来的参照配置是否是json格式
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getReferconfig())&&!checkKVObj(codeClassifyTemplateAttrDO.getReferconfig())){
                throw new VciBaseException("{0}{1}属性的参照配置数据格式错误!",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
            }
            if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getCodedateformat()) && !checkDateFormat(codeClassifyTemplateAttrDO.getCodedateformat())){
                throw new VciBaseException("{0}{1}属性的时间格式不符合要求",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
            }
            //如果是组合规则,里面使用的属性不能缺失,也都得显示
            String componentrule = codeClassifyTemplateAttrDTO.getComponentrule();
            boolean isContainsDynamicParameter = PatternUtil.isContainsDynamicParameter(componentrule);
            if(isContainsDynamicParameter){
                List<String> userdAttrList =  PatternUtil.getKeyListByContent(componentrule);//包含的所有${xxx}中的xxx
                if(!CollectionUtils.isEmpty(userdAttrList)){
                    String unExistAttr = userdAttrList.stream().filter(s -> !attrDTOMap.containsKey(s.toLowerCase(Locale.ROOT))).collect(Collectors.joining(","));
                    if(StringUtils.isNotBlank(unExistAttr)){
                        throw new VciBaseException("{0}属性是组合规则,但是规则里包含的属性[{1}]在当前模板中不存在!",new String[]{codeClassifyTemplateAttrDO.getName(), unExistAttr});
                    }
                    //要看看表单是否显示
                    String unFormDisplayAttr = userdAttrList.stream().filter(s -> !VciBaseUtil.getBoolean(attrDTOMap.getOrDefault(s.toLowerCase(Locale.ROOT),
                        new CodeClstempattrDTO()).getFormdisplayflag())).collect(Collectors.joining(","));
                    if(StringUtils.isNotBlank(unFormDisplayAttr)){
                        throw new VciBaseException("{0}属性是组合规则,但是规则里包含的属性[{1}]在当前模板中没有设置 è¡¨å•显示 ",new String[]{codeClassifyTemplateAttrDO.getName(),unFormDisplayAttr});
                    }
                }
            }
            if(CLASSIFYTEMPLATEOID==null){
                CLASSIFYTEMPLATEOID = codeClassifyTemplateAttrDTO.getClassifytemplateoid();
            }
        }
        //执行数据保存操作
//        WebUtil.setPersistence(false);//不执行保存
        //先都删了
//        VciQueryWrapperForDO deleteAttrWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        deleteAttrWrapper.addQueryMap("CLASSIFYTEMPLATEOID",CLASSIFYTEMPLATEOID);
        Map<String,Object> condition = new HashMap<>();
        condition.put("CLASSIFYTEMPLATEOID",CLASSIFYTEMPLATEOID);
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDODelete = baseMapper.selectByMap(condition);
        //oids
        List<String> oids = new ArrayList<String>();
        for (CodeClstempattrEntity codeClassifyTemplateAttrDO:codeClassifyTemplateAttrDODelete){
            oids.add(codeClassifyTemplateAttrDO.getOid());
        }
//        BatchCBO batchCBOTemplateDelete = new BatchCBO();
        if(!CollectionUtils.isEmpty(oids)){
            baseMapper.deleteBatchIds(oids);
        }
        //再新增
        if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOInsert)){
            this.saveBatch(codeClassifyTemplateAttrDOInsert);
        }
        //调用阶段
        if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOInsert)){
            List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrs = new ArrayList<>();
            for (CodeClstempattrEntity codeClstempattrEntity : codeClassifyTemplateAttrDOInsert) {
                CodeClassifyTemplateAttr codeClassifyTemplateAttr = new CodeClassifyTemplateAttr();
                BeanUtils.copyProperties(codeClstempattrEntity,codeClassifyTemplateAttr);;
                codeClassifyTemplateAttrs.add(codeClassifyTemplateAttr);
            }
            codeTempphaseService.codeTemplateAttrModifyTrigger(codeClassifyTemplateAttrs);
        }
//        SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
        //处理可输可选的字符
        if(!CollectionUtils.isEmpty(prefix)){
            for (String s : prefix) {
                DictBiz dictBiz = new DictBiz();
                dictBiz.setCode(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR);
                dictBiz.setDictKey(s);
                dictBiz.setDictValue("prefix");
                iDictBizClient.getCheck(dictBiz) ;
            }
//                .saveBySameNamespaceAndFlag(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,"prefix",prefix,sessionInfo);
        }
        if(!CollectionUtils.isEmpty(suffix)){
            for (String s : suffix) {
                DictBiz dictBiz = new DictBiz();
                dictBiz.setCode(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR);
                dictBiz.setDictKey(s);
                dictBiz.setDictValue("suffix");
                iDictBizClient.getCheck(dictBiz) ;
            }
//            charService.saveBySameNamespaceAndFlag(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,"suffix",suffix,sessionInfo);
        }
        if(!CollectionUtils.isEmpty(dateFormates)){
            for (String s : dateFormates) {
                DictBiz dictBiz = new DictBiz();
                dictBiz.setCode(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR);
                dictBiz.setDictKey(s);
                dictBiz.setDictValue("dateFormates");
                iDictBizClient.getCheck(dictBiz) ;
            }
//            charService.saveBySameNamespaceAndFlag(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,"dateFormates",dateFormates,sessionInfo);
        }
//        WebUtil.setPersistence(true);//执行保存
//        boService.persistenceBatch(batchCBOTemplateDelete);//一起执行保存
        return codeClassifyTemplateAttrDO2VOs(codeClassifyTemplateAttrDOInsert);
    }
    public boolean checkKVArr(String kvString){
        boolean isKV = true;
        try {
            JSONObject.parseArray(kvString, KeyValue.class);
        }catch (Exception e){
            isKV=false;
        }
        return isKV;
    }
    public boolean checkKVObj(String kvString){
        boolean isKV = true;
        try {
            JSONObject.parseObject(kvString, UIFormReferVO.class);
        }catch (Exception e){
            isKV=false;
        }
        return isKV;
    }
    /**
     * æ ¡éªŒæ—¶é—´æ ¼å¼
     * @param dateFormat æ—¶é—´æ ¼å¼
     * @return true表示校验通过
     */
    public boolean checkDateFormat(String dateFormat){
        try{
            VciDateUtil.date2Str(new Date(),dateFormat);
            return  true;
        }catch (Throwable e){
            return false;
        }
    }
    /**
     * ä¿®æ”¹ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“æžœ
     * @throws VciBaseException å‚数为空,唯一项,必输项不通过时会抛出异常
     */
    @Override
    public R editSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
        VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"数据对象",codeClassifyTemplateAttrDTO.getOid(),"主题库分类的模板属性主键");
        //判断传过来的枚举注入是否是jsonArr格式
        if(StringUtils.isNotBlank(codeClassifyTemplateAttrDTO.getEnumstring())&&!checkKVArr(codeClassifyTemplateAttrDTO.getEnumstring())){
            throw new VciBaseException("枚举注入数据格式错误!");
        }
        //判断传过来的参照配置是否是json格式
        if(StringUtils.isNotBlank(codeClassifyTemplateAttrDTO.getReferbtmid())&&!checkKVObj(codeClassifyTemplateAttrDTO.getReferbtmid())){
            throw new VciBaseException("枚举注入数据格式错误!");
        }
        //检查ts
        CodeClstempattrEntity codeClassifyTemplateAttrDOCopyFromDTO = new CodeClstempattrEntity();
//        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDOCopyFromDTO);
//        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOCopyFromDTO);
        //检查ts
//        Map<String,Object> condition = new HashMap<>(2);
//        condition.put("oid",codeClassifyTemplateAttrDTO.getOid());
//        condition.put("ts",codeClassifyTemplateAttrDTO.getTs());
        CodeClstempattrEntity detail = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
        if(!detail.getTs().toString().equals(codeClassifyTemplateAttrDTO.getTs().toString())){//不是最新的不让改
            return R.fail("当前数据不是最新,请刷新后再修改!");
        }
        //将DTO转换为DO
        CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
        revisionModelUtil.copyFromDTOIgnore(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
        baseMapper.updateById(codeClassifyTemplateAttrDO);
        return R.data(codeClassifyTemplateAttrDO2VO(codeClassifyTemplateAttrDO));
    }
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     * @throws VciBaseException å‚数为空,被引用时抛出异常
     */
    @Override
    public R deleteCodeClassifyTemplateAttr(CodeClstempattrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
        VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"主题库分类的模板属性数据对象",codeClassifyTemplateAttrDTO.getOid(),"主题库分类的模板属性的主键");
        CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
        R baseResult = checkIsCanDeleteForDO(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
        if(baseResult.isSuccess()) {
        }else{
            return baseResult;
        }
        //执行删除操作
        int deleteNum = baseMapper.deleteById(codeClassifyTemplateAttrDO.getOid());
        return deleteNum>0?R.success(DELETE_SUCCESS):R.fail(DELETE_FAIL);
    }
    /**
     * æ ¡éªŒæ˜¯å¦å¯ä»¥åˆ é™¤ï¼Œå¦‚果存在下级,并且下级有数据引用则不能删除
     * @param codeClassifyTemplateAttrDTO æ•°æ®ä¼ è¾“对象
     * @param codeClassifyTemplateAttrDO æ•°æ®åº“中的数据对象
     * @return success为true为可以删除,false表示有数据引用,obj为true表示有下级
     */
    private R checkIsCanDeleteForDO(CodeClstempattrDTO codeClassifyTemplateAttrDTO, CodeClstempattrEntity codeClassifyTemplateAttrDO) {
//        boService.checkTs(codeClassifyTemplateAttrDO);
//        Map<String,Object> condition = new HashMap<>(2);
//        condition.put("oid",codeClassifyTemplateAttrDTO.getOid());
//        condition.put("ts",codeClassifyTemplateAttrDTO.getTs());
        CodeClstempattrEntity detail = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
//        .selectOne(Condition.getQueryWrapper(condition,CodeClstempattrEntity.class));
        if(!detail.getTs().toString().equals(codeClassifyTemplateAttrDTO.getTs().toString())){//不是最新的不让改
            return R.fail("当前数据不是最新,请刷新后再修改!");
        }
        if(!checkIsLinked(codeClassifyTemplateAttrDO.getOid())) {
            return R.success("可以删除!");
        }else{
            return R.fail(DATA_LINKED_NOT_DELETE);
        }
    }
    /**
     * æ ¡éªŒæ˜¯å¦è¢«å¼•用
     * @param oid ä¸»é”®
     * @throws VciBaseException è¢«å¼•用的时候会抛出异常
     */
    private boolean checkIsLinked(String oid) throws VciBaseException{
        //TODO æ·»åŠ éœ€è¦æ ¡éªŒå¼•ç”¨çš„åœ°æ–¹
        return false;
    }
    /**
     * ä¸»é”®èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oid ä¸»é”®
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     * @throws VciBaseException å‚数为空,数据不存在时会抛出异常
     */
    @Override
    public  CodeClstempattrVO getObjectByOid(String oid) throws VciBaseException{
        return codeClassifyTemplateAttrDO2VO(selectByOid(oid));
    }
    /**
     * ä¸»é”®æŸ¥è¯¢æ•°æ®å¯¹è±¡
     * @param oid ä¸»é”®
     * @return  æ•°æ®å¯¹è±¡
     * @throws VciBaseException å‚数为空,并且数据不存在的时候会抛出异常
     */
    private CodeClstempattrEntity selectByOid(String oid) throws VciBaseException{
        VciBaseUtil.alertNotNull(oid,"主键");
        CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(oid.trim());
        if(codeClassifyTemplateAttrDO == null || StringUtils.isBlank(codeClassifyTemplateAttrDO.getOid())){
            throw new VciBaseException(DATA_OID_NOT_EXIST);
        }
        return codeClassifyTemplateAttrDO;
    }
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oidCollections ä¸»é”®é›†åˆï¼Œä½†æ˜¯å—性能影响,建议一次查询不超过10000个
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     * @throws VciBaseException æŸ¥è¯¢å‡ºçŽ°å¼‚å¸¸æ—¶ä¼šæŠ›å‡º
     */
    @Override
    public Collection<CodeClstempattrVO> listCodeClassifyTemplateAttrByOids(Collection<String> oidCollections) {
        VciBaseUtil.alertNotNull(oidCollections,"数据对象主键集合");
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = listCodeClassifyTemplateAttrDOByOidCollections(oidCollections);
        return codeClassifyTemplateAttrDO2VOs(codeClassifyTemplateAttrDOList);
    }
    /**
     * ä½¿ç”¨ä¸»é”®é›†åˆæŸ¥è¯¢æ•°æ®å¯¹è±¡
     * @param oidCollections ä¸»é”®çš„集合
     * @return æ•°æ®å¯¹è±¡åˆ—表
     */
    private List<CodeClstempattrEntity> listCodeClassifyTemplateAttrDOByOidCollections(Collection<String> oidCollections){
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = new ArrayList<CodeClstempattrEntity>();
        if(!CollectionUtils.isEmpty(oidCollections)){
            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
            for(Collection<String> oids: oidCollectionsList){
                List<CodeClstempattrEntity> tempDOList = baseMapper.selectBatchIds(oids);
                if(!CollectionUtils.isEmpty(tempDOList)){
                    codeClassifyTemplateAttrDOList.addAll(tempDOList);
                }
            }
        }
        return  codeClassifyTemplateAttrDOList;
    }
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public DataGrid<CodeClstempattrVO> refDataGridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
        if(conditionMap == null){
            conditionMap = new HashMap<String, String>();
        }
        return gridCodeClassifyTemplateAttr(conditionMap,pageHelper);
    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªæ¨¡æ¿ï¼Œä¸šåŠ¡ç±»åž‹ä¸‹çš„æ‰€æœ‰æœªé€‰æ‹©çš„å±žæ€§
     * @param baseQueryObject
     * @return
     */
    @Override
    public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject){
        if(baseQueryObject.getConditionMap() == null){
            baseQueryObject.setConditionMap(new HashMap<>());
        }
        DataGrid<CodeOsbtmtypeattributeVO> dataGrid=new DataGrid<CodeOsbtmtypeattributeVO>();
        //模板oid
        String templateAttrOid = baseQueryObject.getConditionMap().get("oid");
        String name = baseQueryObject.getConditionMap().getOrDefault("name","");
        String id = baseQueryObject.getConditionMap().getOrDefault("id","");
        //没有oid不执行逻辑
        if(StringUtils.isBlank(templateAttrOid)){
            dataGrid.setData(new ArrayList<>());
            dataGrid.setTotal(0);
            return dataGrid;
        }
        //查询模板对象
        CodeClstemplateEntity codeClassifyTemplateDO = codeClstemplateMapper.selectById(templateAttrOid);
        //这个业务类型下的所有属性
        List<CodeOsbtmtypeattributeVO> boAttrs = (List<CodeOsbtmtypeattributeVO>) codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());// this.btmService.listAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId());
//        codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
//        BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
        //把默认的属性也添加到boAttrs
        if(boAttrs == null){
            boAttrs = new ArrayList<>();
        }
        if(!false){
//            List<CodeOsbtmtypeattributeVO> finalBoAttrs = boAttrs;
//            attributeService.getDefaultAttributeVOs().stream().forEach(attr-> {
//                CodeOsbtmtypeattributeVO attributeVO = new CodeOsbtmtypeattributeVO();
//                BeanUtil.convert(attr, attributeVO);
//                if ("id".equalsIgnoreCase(attributeVO.getId())) {
//                    attributeVO.setName("企业编码");
//                }
//                if ("name".equalsIgnoreCase(attributeVO.getId())) {
//                    attributeVO.setName("集团码");
//                }
//                attributeVO.setAttrDataType(attr.getAttributeDataType());
//                attributeVO.setAttributeLength(attr.getAttrLength());
//                attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
//                attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
//                finalBoAttrs.add(attributeVO);
//            });
//            boAttrs = finalBoAttrs;
            Object o = null;
        }
        //这个模板下已经有的属性
//        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
        Map<String,Object> condition = new HashMap<>(1);
        condition.put("CLASSIFYTEMPLATEOID",templateAttrOid);
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClstempattrMapper.selectByMap(condition);
        List<String> btmOids = new ArrayList<String>();
        for (CodeClstempattrEntity codeClassifyTemplateAttrDO:codeClassifyTemplateAttrDOList){
            btmOids.add(codeClassifyTemplateAttrDO.getId());
        }
        //过滤掉已经存在的属性
        List<CodeOsbtmtypeattributeVO> boAttrss = new ArrayList<CodeOsbtmtypeattributeVO>();
        for (CodeOsbtmtypeattributeVO osBtmTypeAttributeVO:boAttrs){
            if(!btmOids.contains(osBtmTypeAttributeVO.getId())){
                //看看是不是有模糊查询
                boolean inSearch = true;
                if(StringUtils.isNotBlank(name) && !osBtmTypeAttributeVO.getName().contains(name.replace("*",""))){
                    inSearch = false;
                }
                if(StringUtils.isNotBlank(id) && !osBtmTypeAttributeVO.getId().contains(id.replace("*",""))){
                    inSearch = false;
                }
                if(inSearch) {
                    boAttrss.add(osBtmTypeAttributeVO);
                }
            }
        }
        dataGrid.setData(boAttrss);
        dataGrid.setTotal(boAttrss.size());
        return dataGrid;
    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªæ¨¡æ¿ï¼Œä¸šåŠ¡ç±»åž‹ä¸‹å·²é€‰æ‹©çš„å±žæ€§
     * @param baseQueryObject
     * @return
     */
    @Override
    public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject){
        DataGrid<CodeOsbtmtypeattributeVO> dataGrid=new DataGrid<CodeOsbtmtypeattributeVO>();
        //模板oid
        String templateAttrOid = baseQueryObject.getConditionMap().get("oid");
        //没有oid不执行逻辑
        if(StringUtils.isBlank(templateAttrOid)){
            dataGrid.setData(new ArrayList<>());
            dataGrid.setTotal(0);
            return dataGrid;
        }
        //查询模板对象
        CodeClstemplateEntity codeClassifyTemplateDO = codeClstemplateMapper.selectById(templateAttrOid);
        //这个业务类型下的所有属性
        List<CodeOsbtmtypeattributeVO> boAttrs = (List<CodeOsbtmtypeattributeVO>) codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());//this.btmService.listAttributeByBtmIdHasDefault(codeClassifyTemplateDO.getBtmTypeId());
//        codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
//        BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
        //这个模板下已经有的属性
        //把默认的属性也添加到boAttrs
        if(boAttrs == null){
            boAttrs = new ArrayList<>();
        }
//        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
//        Map<String,Object> condition = new HashMap<>(1);
//        condition.put("CLASSIFYTEMPLATEOID",templateAttrOid);
        QueryWrapper<CodeClstempattrEntity> wrapper=new QueryWrapper<>();
        wrapper.eq("CLASSIFYTEMPLATEOID",templateAttrOid);
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClstempattrMapper.selectList(wrapper);
        List<String> btmOids = new ArrayList<String>();
        for (CodeClstempattrEntity codeClassifyTemplateAttrDO:codeClassifyTemplateAttrDOList){
            btmOids.add(codeClassifyTemplateAttrDO.getId());
        }
        //过滤掉除了自身的别的属性
        List<CodeOsbtmtypeattributeVO> boAttrss = new ArrayList<CodeOsbtmtypeattributeVO>();
        for (CodeOsbtmtypeattributeVO osBtmTypeAttributeVO:boAttrs){
            if(btmOids.contains(osBtmTypeAttributeVO.getId())){
                boAttrss.add(osBtmTypeAttributeVO);
            }
        }
        dataGrid.setData(boAttrss);
        dataGrid.setTotal(boAttrss.size());
        return dataGrid;
    }
    /**
     * åŒæ­¥åˆ°å…¶ä»–模板
     * @param codeClassifyTemplateAttrDTO oid
     * @return
     */
    @Override
    public R copyto(CodeClstempattrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
        String templateAttrOid = codeClassifyTemplateAttrDTO.getOid();
        //查询出来要复制的对象
        CodeClstempattrEntity codeClassifyTemplateAttrDO = selectByOid(templateAttrOid);
        String id = codeClassifyTemplateAttrDO.getId();//英文名称
        String classfyTemplateOid = codeClassifyTemplateAttrDO.getClassifytemplateoid();
        //查询其他id=id的模板属性
//        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        queryWrapper.addQueryMap("id",id);
//        Map<String,Object> condition = new HashMap<>(1);
//        condition.put("id",id);
        QueryWrapper<CodeClstempattrEntity> wrapper=new QueryWrapper<>();
        wrapper.eq("id",id);
        //所有id=id的模板属性
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList =codeClstempattrMapper.selectList(wrapper);
        //要删除的模板属性的oids
        List<String> deleteOids = new ArrayList<String>();
        //要修改的模板属性对象
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOListInsert = new ArrayList<CodeClstempattrEntity>();
        for (CodeClstempattrEntity codeClassifyTemplateAttrDOi:codeClassifyTemplateAttrDOList){
            String oid = codeClassifyTemplateAttrDOi.getOid();
            String templateOldOid = codeClassifyTemplateAttrDOi.getClassifytemplateoid();
            CodeClstempattrEntity codeClassifyTemplateAttrDOInsert = new CodeClstempattrEntity();
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDO,codeClassifyTemplateAttrDOInsert);
            codeClassifyTemplateAttrDOInsert.setOid(oid);
            codeClassifyTemplateAttrDOInsert.setClassifytemplateoid(templateOldOid);
            codeClassifyTemplateAttrDOListInsert.add(codeClassifyTemplateAttrDOInsert);
            deleteOids.add(codeClassifyTemplateAttrDOi.getOid());
        }
//        WebUtil.setPersistence(false);//不执行保存
        //删除
//        BatchCBO batchCBOTemplateAttrDelete = codeClassifyTemplateAttrDOissifyTemplateAttrMapper.batchDeleteByOids(deleteOids);
        codeClstempattrMapper.deleteBatchIds(deleteOids);
        //再新增
//        BatchCBO batchCBOTemplateAttrInsert = codeClassifyTemplateAttrMapper.batchInsert(codeClassifyTemplateAttrDOListInsert);
//        batchCBOTemplateAttrDelete.copyFromOther(batchCBOTemplateAttrInsert);
        this.saveBatch(codeClassifyTemplateAttrDOListInsert);
//        WebUtil.setPersistence(true);//执行保存
//        boService.persistenceBatch(batchCBOTemplateAttrDelete);//一起执行保存
        return R.success("操作成功!");
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
@@ -27,8 +27,8 @@
import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
import com.vci.ubcs.code.mapper.*;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.ICodeClassifyTemplateAttrService;
import com.vci.ubcs.code.service.ICodeClstemplateService;
import com.vci.ubcs.code.vo.CodeClstempattrVO;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.starter.exception.VciBaseException;
@@ -36,6 +36,7 @@
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.pagemodel.Tree;
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
@@ -45,6 +46,7 @@
import org.springblade.core.tool.api.R;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -71,7 +73,7 @@
     */
    @Lazy
    @Autowired(required = false)
    ICodeClassifyTemplateAttrService codeClstempattrService;
    CodeClstempattrServiceImpl codeClstempattrService;
    /**
     * å¯¹è±¡çš„æ“ä½œ
@@ -80,7 +82,7 @@
    private RevisionModelUtil revisionModelUtil;
    @Autowired(required = false)
    private CodeClassifyTemplateAttrMapper codeClstempattrMapper;
    private CodeClstempattrMapper codeClstempattrMapper;
    @Autowired(required = false)
    private CodeTempphaseServiceImpl codeTempphaseServiceImpl;
    @Autowired(required = false)
@@ -179,14 +181,20 @@
        if(hasAttr){
            //一个分类里面总不能超过1000个生效的版本吧!!!
            VciBaseUtil.switchCollectionForOracleIn(voList.stream().map(CodeClstemplateVO::getOid).collect(Collectors.toList())).forEach(tempOids->{
                List<CodeClassifyTemplateAttrVO> attrVOList = codeClstempattrService.listCodeClassifyTemplateAttrByTemplateOids(tempOids);
                List<CodeClstempattrVO> attrVOList = codeClstempattrService.listCodeClassifyTemplateAttrByTemplateOids(tempOids);
                if(!CollectionUtils.isEmpty(attrVOList)){
                    Map<String, List<CodeClassifyTemplateAttrVO>> attrVOMap = attrVOList.stream().collect(Collectors.groupingBy(s -> s.getClassifyTemplateOid()));
                    Map<String, List<CodeClstempattrVO>> attrVOMap = attrVOList.stream().collect(Collectors.groupingBy(s -> s.getClassifytemplateoid()));
                    voList.stream().forEach(templateVO->{
                        if(attrVOMap.containsKey(templateVO.getOid())){
                            templateVO.setAttributes(attrVOMap.get(templateVO.getOid()));
                            List<CodeClstempattrVO> codeClstempattrVOS = attrVOMap.get(templateVO.getOid());
                            List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrVOS = new ArrayList<>();
                            for (CodeClstempattrVO codeClstempattrVO : codeClstempattrVOS) {
                                CodeClassifyTemplateAttrVO codeClassifyTemplateAttrVO = new CodeClassifyTemplateAttrVO();
                                BeanUtils.copyProperties(codeClstempattrVO,codeClassifyTemplateAttrVO);
                                codeClassifyTemplateAttrVOS.add(codeClassifyTemplateAttrVO);
                            }
                            templateVO.setAttributes(codeClassifyTemplateAttrVOS);
                        }
                    });
                }
@@ -343,11 +351,11 @@
        //删除模板属性
//        VciQueryWrapperForDO templateQueryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        templateQueryWrapper.addQueryMap("classifyTemplateOid",templateOid);
        List<CodeClassifyTemplateAttr> codeClstempattrEntityList = codeClstempattrMapper.selectRefByOid(templateOid);
        List<CodeClstempattrEntity> codeClstempattrEntityList = codeClstempattrMapper.selectRefByOid(templateOid);
        if(!CollectionUtils.isEmpty(codeClstempattrEntityList)) {
            List<String> templateAttrOids = new ArrayList<String>();
            for (CodeClassifyTemplateAttr codeClstempattrEntity:codeClstempattrEntityList){
            for (CodeClstempattrEntity codeClstempattrEntity:codeClstempattrEntityList){
                templateAttrOids.add(codeClstempattrEntity.getOid());
            }
@@ -487,34 +495,34 @@
//            ClientBusinessObject clientBusinessObject_template_insert = null;
//        try {
//            clientBusinessObject_template_insert = clientBusinessObjectOperation.reviseBusinessObject(clientBusinessObject_template, "");
            codeCls_template_insert.setOid(VciBaseUtil.getPk());
            codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
            codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
            codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
            codeCls_template_insert.setLastR(String.valueOf(1));
            codeCls_template_insert.setFirstR(String.valueOf(0));
            codeCls_template_insert.setFirstV(String.valueOf(1));
            codeCls_template_insert.setLastV(String.valueOf(1));
            codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
            codeCls_template_insert.setCreateTime(new Date());
            codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
            codeCls_template_insert.setLastModifyTime(new Date());
            codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
            codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
            Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
            codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
            codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
        codeCls_template_insert.setOid(VciBaseUtil.getPk());
        codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
        codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
        codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
        codeCls_template_insert.setLastR(String.valueOf(1));
        codeCls_template_insert.setFirstR(String.valueOf(0));
        codeCls_template_insert.setFirstV(String.valueOf(1));
        codeCls_template_insert.setLastV(String.valueOf(1));
        codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
        codeCls_template_insert.setCreateTime(new Date());
        codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
        codeCls_template_insert.setLastModifyTime(new Date());
        codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
        codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
        Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
        codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
        codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
//            VersionValueObject versionObj = this.getVersionValue(item.verRuleName);
            codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
            codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
            codeCls_template_insert.setLctid(codeCls_template.getLctid());
            codeCls_template_insert.setLcStatus("Editing");
            codeCls_template_insert.setId(codeCls_template.getId());
            codeCls_template_insert.setName(codeCls_template.getName());
            codeCls_template_insert.setDescription(codeCls_template.getDescription());
            codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
        codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
        codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
        codeCls_template_insert.setLctid(codeCls_template.getLctid());
        codeCls_template_insert.setLcStatus("Editing");
        codeCls_template_insert.setId(codeCls_template.getId());
        codeCls_template_insert.setName(codeCls_template.getName());
        codeCls_template_insert.setDescription(codeCls_template.getDescription());
        codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
//            codeCls_template_insert.setCheckinBy(userName);
            codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
        codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
//        }catch (VCIError e){
//            e.printStackTrace();
//            logger.error("===============>分类模板-升版复制出错oid: "+templateOldOid+",mes"+e.error_message);
@@ -537,12 +545,12 @@
//        codeClassifyTemplateAttrQuery.addQueryMap("classifyTemplateOid",templateOldOid);
        Map<String,Object> condition = new HashMap<>(1);
        condition.put("classifyTemplateOid",templateOldOid);
        List<CodeClassifyTemplateAttr> codeClstempattrEntities = codeClstempattrMapper.selectByMap(condition);
        List<CodeClstempattrEntity> codeClstempattrEntities = codeClstempattrMapper.selectByMap(condition);
//        List<CodeClassifyTemplateAttrDO> codeClassifyTemplateAttrDOList = codeClassifyTemplateAttrDaoI.selectByWrapper(codeClassifyTemplateAttrQuery);
        for (CodeClassifyTemplateAttr codeClassifyTemplateAttrDO :codeClstempattrEntities){
        for (CodeClstempattrEntity codeClassifyTemplateAttrDO :codeClstempattrEntities){
//            String attrOid = VciBaseUtil.getPk();
            codeClassifyTemplateAttrDO.setOid(null);
            codeClassifyTemplateAttrDO.setClassifyTemplateOid(templateNewOid);
            codeClassifyTemplateAttrDO.setClassifytemplateoid(templateNewOid);
            codeClstempattrMapper.insert(codeClassifyTemplateAttrDO);
        }
@@ -559,7 +567,7 @@
        //一起保存数据
//        WebUtil.setPersistence(false);//不执行保存
        //保存模板——
        //保存模板
//        BatchCBO batchCBOTemplate = new BatchCBO();
        //batchCBO保存的时候没有能够自动update源数据的isLastR
        //batchCBOTemplate.getCreateCbos().add(clientBusinessObject_template_insert);
@@ -646,7 +654,7 @@
        codeClassifyTemplateDOList.add(codeClassifyTemplateDO_old);
        //复制模板属性
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = copyTemplateAttr(oldOid,newOid);
        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = copyTemplateAttr(oldOid,newOid);
        //复制模板流程
        List<CodeClsflowtempEntity> codeClassifyProcessTempDOList = copyTemplateProcess(oldOid,newOid);
@@ -815,23 +823,23 @@
    /**
     * å¤åˆ¶æ¨¡æ¿å±žæ€§
     */
    public List<CodeClassifyTemplateAttr> copyTemplateAttr(String templateOldOid,String templateNewOid){
    public List<CodeClstempattrEntity> copyTemplateAttr(String templateOldOid,String templateNewOid){
//        VciQueryWrapperForDO codeClassifyTemplateAttrQuery = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
//        codeClassifyTemplateAttrQuery.addQueryMap("classifyTemplateOid",templateOldOid);
//        Map<String,Object> condition = new HashMap<>(1);
//        condition.put("classifyTemplateOid",templateOldOid);
        QueryWrapper<CodeClassifyTemplateAttr> wrapper=new QueryWrapper<>();
        QueryWrapper<CodeClstempattrEntity> wrapper=new QueryWrapper<>();
        wrapper.eq("classifyTemplateOid",templateOldOid);
//        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = codeClassifyTemplateAttrDaoI.selectByWrapper(codeClassifyTemplateAttrQuery);
        List<CodeClassifyTemplateAttr> codeClstempattrEntities = codeClstempattrMapper.selectList(wrapper);
//        List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClassifyTemplateAttrDaoI.selectByWrapper(codeClassifyTemplateAttrQuery);
        List<CodeClstempattrEntity> codeClstempattrEntities = codeClstempattrMapper.selectList(wrapper);
        for (CodeClassifyTemplateAttr codeClassifyTemplateAttrDO :codeClstempattrEntities){
        for (CodeClstempattrEntity codeClassifyTemplateAttrDO :codeClstempattrEntities){
//            String attrOid = VciBaseUtil.getPk();
            codeClassifyTemplateAttrDO.setOid(null);
            codeClassifyTemplateAttrDO.setClassifyTemplateOid(templateNewOid);
            codeClassifyTemplateAttrDO.setClassifytemplateoid(templateNewOid);
//            codeClstempattrMapper.insert(codeClassifyTemplateAttrDO);
        }
        return codeClstempattrEntities;
@@ -841,13 +849,13 @@
    /**
     * åˆ†ç±»æ¨¡æ¿åˆ—表
     *
     * @param plCodeClstemplate æŸ¥è¯¢æ¡ä»¶
     * @param query   åˆ†é¡µå¯¹è±¡
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper   åˆ†é¡µå¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query) throws VciBaseException {
    public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
        DataGrid<CodeClstemplateVO> dataGrid=new DataGrid<CodeClstemplateVO>();
        //没有传分类id,不执行查询逻辑,直接返回
//        if(conditionMap.size()==0){
@@ -860,14 +868,36 @@
//        }
//        pageHelper.addDefaultDesc("revisionSeq");
        List<CodeClstemplateVO> doList = codeClstemplateMapper.selectPlCodeClstemplatePage(Condition.getPage(query), plCodeClstemplate);
        if (!CollectionUtils.isEmpty(doList)) {
            // QueryWrapper<CodeClstemplateVO> codeClstemplateVOQueryWrapper = new QueryWrapper<>();
            // codeClstemplateVOQueryWrapper.allEq(plCodeClstemplate);
            List<CodeClstemplateEntity> codeClstemplateEntity = new ArrayList<>();
            BeanUtils.copyProperties(doList,codeClstemplateEntity);
            dataGrid.setData(codeClassifyTemplateDO2VOs(codeClstemplateEntity));
            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(codeClstemplateMapper.selectCount(Condition.getQueryWrapper(plCodeClstemplate)))));
        CodeClstemplateVO codeClstemplateVO = new CodeClstemplateVO();
        CodeClstemplateEntity codeClstemplateQuery = new CodeClstemplateEntity();
//        BeanUtil.toBean(map,codeClstempattrVO);
//        BeanUtil
        BeanMap beanMap = BeanMap.create(codeClstemplateVO);
        beanMap.putAll(conditionMap);
        BeanUtils.copyProperties(codeClstemplateVO,codeClstemplateQuery);
        if (pageHelper == null) {
            pageHelper = new PageHelper(-1);
        }
//        IPage iPage = new IPage();
        Query query = new Query();
//        query.setSize(100);
        if(pageHelper.getLimit() != -1){
            query.setSize(pageHelper.getLimit());
            query.setCurrent(pageHelper.getPage());
        }
//        List<CodeClstemplateVO> doList = codeClstemplateMapper.selectPlCodeClstemplatePage(Condition.getPage(query), codeClstemplateVO);
        IPage<CodeClstemplateEntity> doList = baseMapper.
            selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeClstemplateVO));
        if (!CollectionUtils.isEmpty(doList.getRecords())) {
//            QueryWrapper<CodeClstemplateVO> codeClstemplateVOQueryWrapper = new QueryWrapper<>();
//            codeClstemplateVOQueryWrapper.allEq(plCodeClstemplate);
//            List<CodeClstemplateEntity> codeClstemplateEntity = new ArrayList<>();
//            BeanUtils.copyProperties(doList,codeClstemplateEntity);
            dataGrid.setData(codeClassifyTemplateDO2VOs(doList.getRecords()));
            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(codeClstemplateMapper.selectCount(Condition.getQueryWrapper(codeClstemplateQuery)))));
        }
        return dataGrid;
    }
@@ -1006,7 +1036,7 @@
//            condition.put("ts",codeClassifyTemplateDOCopyFromDTO.getTs());
            CodeClstemplateEntity detail = baseMapper
                .selectById(codeClassifyTemplateDOCopyFromDTO.getOid());
    //        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
            //        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
            if(detail.getTs().compareTo(codeClassifyTemplateDOCopyFromDTO.getTs()) != 0){//不是最新的不让改
                return R.fail("当前数据不是最新,请刷新后再修改!");
            }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/FormulaServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1165 @@
package com.vci.ubcs.code.service.impl;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.starter.web.constant.VciSystemVarConstants;
import com.vci.ubcs.starter.web.toolmodel.DateConverter;
import com.vci.ubcs.starter.web.util.Md5;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * å…¬å¼å¤„理
 * @author weidy
 * @date 2022-02-11
 *
 */
@Service
public class FormulaServiceImpl {
    /**
     * æ—¥å¿—文件
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * é€šç”¨æŸ¥è¯¢
     */
    @Resource
    CommonsMapper commonsMapper;
//    /**
//     * ä¸šåŠ¡æ•°æ®æœåŠ¡
//     */
//    @Autowired
//    private WebBoServiceI boService;
    /**
     * æ˜¯å¦è¿è¡Œå®Œæˆ
     */
    private Boolean formulaBlag = true;
    /**
     * è¿ç®—符
     */
    public static List<String> lc = new ArrayList<String>();
    static {
        lc.add("+");
        lc.add("-");
        lc.add("*");
        lc.add("/");
    }
    /**
     * é€»è¾‘运算符
     */
    public static List<String> lj = new ArrayList<String>();
    static {
        lj.add(">");
        lj.add("<");
        lj.add("=");
        lj.add("!");
    }
    /**
     * å‡½æ•°ï¼Œint数组注释,第一个标识:0自带函数 1自定义函数;第二个标识:参数个数
     */
    public static Map<String, int[]> funMap = new HashMap<String, int[]>();
    // int数组注释,第一个标识:0自带函数 1自定义函数;第二个标识:参数个数
    static {
        // è‡ªå¸¦å‡½æ•°,可利用反射机制
        funMap.put("abs", new int[] { 0, 1 });
        funMap.put("acos", new int[] { 0, 1 });
        funMap.put("asin", new int[] { 0, 1 });
        funMap.put("atan", new int[] { 0, 1 });
        funMap.put("cbrt", new int[] { 0, 1 });
        funMap.put("ceil", new int[] { 0, 1 });
        funMap.put("cos", new int[] { 0, 1 });
        funMap.put("cosh", new int[] { 0, 1 });
        funMap.put("exp", new int[] { 0, 1 });
        funMap.put("expm1", new int[] { 0, 1 });
        funMap.put("floor", new int[] { 0, 1 });
        funMap.put("log", new int[] { 0, 1 });
        funMap.put("log10", new int[] { 0, 1 });
        funMap.put("log1p", new int[] { 0, 1 });
        funMap.put("random", new int[] { 0, 0 });
        funMap.put("rint", new int[] { 0, 1 });
        funMap.put("round", new int[] { 0, 1 });
        funMap.put("signum", new int[] { 0, 1 });
        funMap.put("sin", new int[] { 0, 1 });
        funMap.put("sinh", new int[] { 0, 1 });
        funMap.put("sqrt", new int[] { 0, 1 });
        funMap.put("tan", new int[] { 0, 1 });
        funMap.put("tanh", new int[] { 0, 1 });
        funMap.put("max", new int[] { 0, 2 });
        funMap.put("min", new int[] { 0, 2 });
        // è‡ªå®šä¹‰å‡½æ•°
        funMap.put("if", new int[] { 1, 3 });
        funMap.put("sum", new int[] { 1, 2 });
        funMap.put("sub", new int[] { 1, 2 });
        funMap.put("mul", new int[] { 1, 2 });
        funMap.put("div", new int[] { 1, 2 });
        funMap.put("mod", new int[] { 1, 2 });
        funMap.put("toInt", new int[] { 1, 1 });
        funMap.put("toDouble", new int[] { 1, 1 });
        funMap.put("doubleRound", new int[] { 1, 2 });
        funMap.put("zeroIfNull", new int[] { 1, 1 });
        funMap.put("endsWith", new int[] { 1, 2 });
        funMap.put("startsWith", new int[] { 1, 2 });
        funMap.put("charAt", new int[] { 1, 2 });
        funMap.put("equalsIgnoreCase", new int[] { 1, 2 });
        funMap.put("indexOf", new int[] { 1, 2 });
        funMap.put("isEmpty", new int[] { 1, 1 });
        funMap.put("lastIndexOf", new int[] { 1, 2 });
        funMap.put("leftStr", new int[] { 1, 2 });
        funMap.put("length", new int[] { 1, 1 });
        funMap.put("mid", new int[] { 1, 3 });
        funMap.put("right", new int[] { 1, 2 });
        funMap.put("rightStr", new int[] { 1, 2 });
        funMap.put("tolowercase", new int[] { 1, 1 });
        funMap.put("touppercase", new int[] { 1, 1 });
        funMap.put("trimzero", new int[] { 1, 1 });
        funMap.put("compareDate", new int[] { 1, 2 });
        funMap.put("nowDate", new int[] { 1, 0 });
        funMap.put("chinaDate", new int[] { 1, 1 });
        funMap.put("dateDdd", new int[] { 1, 2 });
        funMap.put("dateBalanceYear",new int[] {1,3});
        funMap.put("dateBalanceDay",new int[] {1,2});
        funMap.put("dateformat", new int[] { 1, 2 });
        funMap.put("nowDatetime", new int[] { 1, 0 });
        funMap.put("dayOf", new int[] { 1, 1 });
        funMap.put("nowMon", new int[] { 1, 1 });
        funMap.put("monOf", new int[] { 1, 1 });
        funMap.put("nowTime", new int[] { 1, 0 });
        funMap.put("nowYear", new int[] { 1, 0 });
        funMap.put("yearOf", new int[] { 1, 1 });
        funMap.put("getChineseCurrency", new int[] { 1, 1 });
        funMap.put("setThmark", new int[] { 1, 1 });
        funMap.put("toChinese", new int[] { 1, 1 });
        funMap.put("getcolvalue", new int[] { 1, 5 });
        funMap.put("MD5", new int[]{1,1});
        funMap.put("getValueByMethod", new int[]{1,3});
    }
    /**
     * å…¬å¼åˆå§‹åŒ–转换
     *
     * @param str å…¬å¼çš„内容
     * @return è½¬æ¢åŽçš„内容
     */
    private  String strCast(String str) {
        // str = str.toLowerCase();// åŽ»é™¤ç©ºæ ¼ï¼Œå˜å°å†™
        if (str == null ? true : str.length() == 0) {
            return "0";
        }
        str = str.trim();
        if (!checkFormula(str)) {
            formulaError();
            return str;
        }
        str = str.replaceAll(",", ",");
        str = str.replaceAll("\\+-", "-");
        str = str.replaceAll("-\\+", "-");
        //str = str.replaceAll(" ", "");
        return str;
    }
    /**
     * æ£€æŸ¥å…¬å¼ä¸­æ‹¬å·å‡ºçŽ°æ¬¡æ•°æ˜¯å¦æ­£ç¡®
     *
     * @param formulaStr å…¬å¼çš„内容
     * @return true è¡¨ç¤ºæ ¡éªŒæˆåŠŸ
     */
    private  boolean checkFormula(String formulaStr) {
        formulaBlag = true;
        int count = 0;
        for (int i = 0; i < formulaStr.length(); i++) {
            String s = String.valueOf(formulaStr.charAt(i));
            if ("(".equals(s)) {
                count++;
            } else if (")".equals(s)) {
                count--;
            }
            if (count < 0) {
                formulaBlag = false;
                break;
            }
        }
        formulaBlag = count == 0;
        return formulaBlag;
    }
    /**
     * åˆ†å‰²å‡½æ•°
     *
     * @param str å­—符串
     * @param bs åˆ†å‰²ç¬¦
     * @return è½¬æ¢åŽçš„内容
     */
    private  String[] spliteFun(String str, String bs) {
        List<String> list = new ArrayList<String>();
        String bds = "";
        int bracket = 0;
        int len = str.length();
        for (int i = 0; i < len; i++) {
            String s = String.valueOf(str.charAt(i));
            if ("(".equals(s)) {
                bracket++;
            } else if (")".equals(s)) {
                bracket--;
            }
            if (bracket == 0 && bs.equals(s)) {
                list.add(bds);
                bds = "";
                continue;
            }
            bds += s;
        }
        list.add(bds);
        String[] ss = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ss[i] = list.get(i);
        }
        return ss;
    }
    /**
     * ç”¨æˆ·è‡ªå®šä¹‰å‡½æ•°
     *
     * @param str å­—符串
     * @param funStr å‡½æ•°çš„内容
     * @return
     */
    private  String customFun(String str, String funStr) {
        String reval = "false";
        String[] gss = spliteFun(str, ",");
        //每一个参数,我都应该去看看是否还有()。这说明里面是方法
        for (int i = 0; i < gss.length; i++) {
            String record = gss[i];
            if(StringUtils.isNotBlank(record) && record.contains("(") && record.contains(")")){
                gss[i] = calculate(gss[i]);
            }
        }
        if ("if".equals(funStr)) {
            //logger.debug("第一个参数:" + gss[0]);
            if (compare(gss[0])) {
                reval = calculate(gss[1]);
            } else {
                reval = calculate(gss[2]);
            }
        } else if ("sum".equals(funStr)) {
            BigDecimal ln = new BigDecimal(gss[0]);
            BigDecimal rn = new BigDecimal(gss[1]);
            reval = ln.add(rn).doubleValue() + "";
        } else if ("sub".equals(funStr)) {
            BigDecimal ln = new BigDecimal(gss[0]);
            BigDecimal rn = new BigDecimal(gss[1]);
            reval = ln.subtract(rn).doubleValue() + "";
        } else if ("mul".equals(funStr)) {
            BigDecimal ln = new BigDecimal(gss[0]);
            BigDecimal rn = new BigDecimal(gss[1]);
            reval = ln.multiply(rn).doubleValue() + "";
        } else if ("div".equals(funStr)) {
            BigDecimal ln = new BigDecimal(gss[0]);
            BigDecimal rn = new BigDecimal(gss[1]);
            if (rn.doubleValue() == 0) {
                formulaError();
                //reval = "0";
                return reval;
            } else {
                reval = ln.divide(rn, 10, BigDecimal.ROUND_HALF_UP) + "";
            }
        } else if ("mod".equals(funStr)) {
            int rn = Integer.parseInt(gss[1]);
            if (rn == 0) {
                formulaError();
                return reval;
            }
            int ln = Integer.parseInt(gss[0]);
            reval = (ln % rn) + "";
        } else if ("toInt".equals(funStr)) {
            reval = (int) Math.floor(new Double(calculate(gss[0]))) + "";
        } else if("toDouble".equals(funStr)){
            reval = new Double(calculate(gss[0])) + "";
        }else if("MD5".equals(funStr)){
            reval = Md5.md5(calculate(gss[0]));
        }else if ("doubleRound".equals(funStr)) {
            try {
                BigDecimal b = new BigDecimal(calculate(gss[0]));
                reval = b.setScale(Integer.parseInt(gss[1]),
                    BigDecimal.ROUND_HALF_UP).doubleValue()
                    + "";
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("zeroIfNull".equals(funStr)) {
            logger.debug(gss[0]);
            if ("null".equals(gss[0]) || gss[0].trim().length() == 0) {
                reval = "0";
                return reval;
            }
            reval = gss[0];
        } else if ("endsWith".equals(funStr)) {
            reval = "false";
            if (gss[0].endsWith(gss[1])) {
                reval = "true";
            }
        } else if ("startsWith".equals(funStr)) {
            reval = "false";
            if (gss[0].startsWith(gss[1])) {
                reval = "true";
            }
        } else if ("charAt".equals(funStr)) {
            try {
                reval = String.valueOf(gss[0].charAt(Integer.parseInt(gss[1])));
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
                reval = "";
            }
        } else if ("equalsignoreCase".equals(funStr)) {
            if (gss[0].equalsIgnoreCase(gss[1])) {
                reval = "true";
            }
        } else if ("indexOf".equals(funStr)) {
            reval = gss[0].indexOf(gss[1]) + "";
        } else if ("isEmpty".equals(funStr)) {
            if (gss[0].trim().length() == 0 || "".equals(gss[0])
                || "null".equals(gss[0])) {
                reval = "true";
            }
        } else if ("lastIndexOf".equals(funStr)) {
            reval = gss[0].lastIndexOf(gss[1]) + "";
        } else if ("leftStr".equals(funStr)) {
            reval = gss[0].substring(0, Integer.parseInt(gss[1]));
        } else if ("length".equals(funStr)) {
            reval = gss[0].length() + "";
        } else if ("right".equals(funStr)) {
            reval = String.valueOf(gss[0].charAt(gss[0].length()
                - Integer.parseInt(gss[1])));
        } else if ("rightStr".equals(funStr)) {
            reval = gss[0]
                .substring(gss[0].length() - Integer.parseInt(gss[1]));
        } else if ("mid".equals(funStr)) {
            try {
                reval = gss[0].substring(Integer.parseInt(gss[1]),
                    Integer.parseInt(gss[2]));
            }catch (Exception e) {
                e.printStackTrace();
                formulaError();
                reval = "";
            }
        } else if ("tolowercase".equals(funStr)) {
            reval = gss[0].toLowerCase();
        } else if ("touppercase".equals(funStr)) {
            reval = gss[0].toUpperCase();
        } else if ("trimZero".equals(funStr)) {
            int len = gss[0].length() - 1;
            for (int i = len; i >= 0; i--) {
                if (gss[0].charAt(i) == '0') {
                    gss[0] = gss[0].substring(0, gss[0].length() - 1);
                } else {
                    reval = gss[0];
                    break;
                }
            }
        } else if ("compareDate".equals(funStr)) {
            if (gss[0].indexOf("date") != -1) {
                gss[0] = calculate(gss[0]);
            }
            if (gss[1].indexOf("date") != -1) {
                gss[1] = calculate(gss[1]);
            }
            gss[0] = gss[0].replaceAll("`", "-");
            gss[1] = gss[1].replaceAll("`", "-");
            String result;
            try {
                result = VciDateUtil.compareDate(gss[0], gss[1]);
                if ("=".equals(result)) {
                    reval = "true";
                }
                ;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("nowDate".equals(funStr)) {
            reval = VciDateUtil.getNowString("yyyy-MM-dd");
        } else if ("chinaDate".equals(funStr)) {
            try {
                if (gss[0].indexOf("date") != -1) {
                    gss[0] = calculate(gss[0]);
                }
                gss[0] = gss[0].replaceAll("`", "-");
                reval = VciDateUtil.getChinaDate(gss[0]);
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("dateAdd".equals(funStr)) {
            try {
                if (gss[0].indexOf("date") != -1) {
                    gss[0] = calculate(gss[0]);
                }
                gss[0] = gss[0].replaceAll("`", "-");
                DateConverter dateConverter = new DateConverter();
                dateConverter.setAsText(gss[0]);
                Date date = VciDateUtil.getDateAddDay(dateConverter.getValue(),
                    Integer.parseInt(gss[1]));
                reval = VciDateUtil.date2Str(date, VciDateUtil.DateTimeFormat);
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if("dateBalanceYear".equals(funStr)) {
            //求时间的差额
            //3个参数,对比的源值,对比的目标值,是否进一
            String sourceDate = gss[0];
            String targetDate = gss[1];
            boolean remainderType = "true".equalsIgnoreCase(gss[2]) ? true : false;
            DateConverter dateConverter = new DateConverter();
            dateConverter.setAsText(sourceDate);
            Date sDate = dateConverter.getValue();
            Date tDate = new Date();
            if (StringUtils.isBlank(targetDate)) {
                dateConverter.setAsText(targetDate);
                tDate = dateConverter.getValue();
            }
            Period p = Period.between(LocalDate.parse(VciDateUtil.date2Str(sDate, VciDateUtil.DateTimeMillFormat), DateTimeFormatter.ofPattern(VciDateUtil.DateTimeMillFormat)),
                LocalDate.parse(VciDateUtil.date2Str(tDate, VciDateUtil.DateTimeMillFormat), DateTimeFormatter.ofPattern(VciDateUtil.DateTimeMillFormat)));
            reval = String.valueOf((remainderType && (p.getMonths() > 0 || p.getDays() > 0)) ? (p.getYears() + 1) : p.getYears());
            //月份相差是没办法计算
        }else if("dateBalanceDay".equals(funStr)){
            String sourceDate = gss[0];
            String targetDate = gss[1];
            DateConverter dateConverter = new DateConverter();
            dateConverter.setAsText(sourceDate);
            Date sDate = dateConverter.getValue();
            Date tDate = new Date();
            if (StringUtils.isNotBlank(targetDate)) {
                dateConverter.setAsText(targetDate);
                tDate = dateConverter.getValue();
            }
            reval = String.valueOf(TimeUnit.DAYS.convert(Math.abs(sDate.getTime()-tDate.getTime()),TimeUnit.MILLISECONDS));
        }else if ("dateformat".equals(funStr)) {
            if (gss[0].indexOf("date") != -1) {
                gss[0] = calculate(gss[0]);
            }
            gss[0] = gss[0].replaceAll("`", "-");
            gss[1] = gss[1].replaceAll("`", "-");
            Date date;
            try {
                if("''".equalsIgnoreCase(gss[0])) {
                    gss[0] = VciDateUtil.getNowString();
                }
                DateConverter dateConverter =new DateConverter();
                dateConverter.setAsText(gss[0]);
                date = dateConverter.getValue();
                reval = VciDateUtil.date2Str(date, gss[1].replace("&"," "));
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("nowDatetime".equals(funStr)) {
            reval = VciDateUtil.getNowString();
        } else if ("dayOf".equals(funStr)) {
            if (gss[0].indexOf("date") != -1) {
                gss[0] = calculate(gss[0]);
            }
            gss[0] = gss[0].replaceAll("`", "-");
            try {
                Date date = VciDateUtil.str2Date(gss[0], "yyyy-MM-dd");
                reval = date.getDate() + "";
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("nowNon".equals(funStr)) {
            try {
                reval = VciDateUtil.getNowString("MM");
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("monOf".equals(funStr)) {
            if (gss[0].indexOf("date") != -1) {
                gss[0] = calculate(gss[0]);
            }
            gss[0] = gss[0].replaceAll("`", "-");
            try {
                Date date = VciDateUtil.str2Date(gss[0], "yyyy-MM-dd");
                reval = date.getMonth() + "";
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("nowTime".equals(funStr)) {
            reval = VciDateUtil.getNowString("HH:mm:ss");
            return reval;
        } else if ("nowYear".equals(funStr)) {
            reval = VciDateUtil.getNowString("yyyy");
            return reval;
        } else if ("yearOf".equals(funStr)) {
            if (gss[0].indexOf("date") != -1) {
                gss[0] = calculate(gss[0]);
            }
            gss[0] = gss[0].replaceAll("`", "-");
            try {
                Date date = VciDateUtil.str2Date(gss[0], "yyyy-MM-dd");
                reval = date.getYear() + 1900 + "";
                return reval;
            } catch (Exception e) {
                e.printStackTrace();
                formulaError();
            }
        } else if ("getChineseCurrency".equals(funStr)) {
            gss[0] = calculate(gss[0]);
            reval = toChineseCurrency(gss[0]);
        } else if ("setThmark".equals(funStr)) {
            String numstr = "";
            String[] number = gss[0].split("\\.");
            //logger.debug(number[0]);
            for (int i = number[0].length() - 1; i >= 0; i--) {
                if (i % 3 == 2 && i < number[0].length() - 1) {
                    numstr += ",";
                }
                numstr += number[0].charAt(i);
            }
            reval = "";
            for (int i = numstr.toCharArray().length - 1; i >= 0; i--) {
                reval += numstr.toCharArray()[i];
            }
            if (gss[0].indexOf(".") != -1) {
                reval += "." + number[1];
            }
        } else if ("toChinese".equals(funStr)) {
            gss[0] = calculate(gss[0]);
            //logger.debug(gss[0]);
            reval = toChinese(gss[0]);
        } else if ("getcolvalue".equals(funStr)) {
            if (gss[0].trim().length() == 0 || gss[1].trim().length() == 0
                || gss[2].trim().length() == 0
                || gss[3].trim().length() == 0
                || gss[4].trim().length() == 0) {
                formulaError();
                return reval;
            }
            reval = getColValue(gss[0], gss[1], gss[2], gss[3], gss[4]);
        }else if("getValueByMethod".equalsIgnoreCase(funStr)){
            if (gss[0].trim().length() == 0 || gss[1].trim().length() == 0
                || gss[2].trim().length() == 0) {
                formulaError();
                return reval;
            }
            reval = getValueByMethod(gss[0], gss[1], gss[2]);
        }
        return reval;
    }
    // é€»è¾‘表达式判断
    private  boolean compare(String str) {
        if ("true".equals(calculate(str))) {
            return true;
        } else if ("false".equals(calculate(str))) {
            return false;
        }
        boolean flag = false;
        boolean bs = false;
        int len = str.length();
        int bracket = 0;
        String ljbds = "";
        double d_left = 0;
        double d_right = 0;
        for (int i = 0; i < len; i++) {
            String s = String.valueOf(str.charAt(i));
            if ("(".equals(s)) {
                bracket++;
            } else if (")".equals(s)) {
                bracket--;
            }
            if (bracket == 0 && lj.contains(s)) {
                for (int j = i; j < len; j++) {
                    String ts = String.valueOf(str.charAt(j));
                    if (lj.contains(ts)) {
                        ljbds += ts;
                    } else {
                        bs = true;
                        break;
                    }
                }
            }
            if (bs) {
                break;
            }
        }
        //logger.debug("逻辑表达式:" + ljbds);
        String[] s = str.split(ljbds);
        //logger.debug("左边:" + (s[0]));
        //logger.debug("右边:" + (s[1]));
        if (isNumber(calculate(s[0])) && isNumber(calculate(s[1]))) {
            d_left = new Double(calculate(s[0]));
            d_right = new Double(calculate(s[1]));
        } else {
            formulaError();
            return false;
        }
        if ("<".equals(ljbds)) {
            if (d_left < d_right) {
                return true;
            }
        } else if (">".equals(ljbds)) {
            if (d_left > d_right) {
                return true;
            }
        } else if ("=".equals(ljbds)) {
            if (d_left == d_right) {
                return true;
            }
        } else if (">=".equals(ljbds)) {
            if (d_left >= d_right) {
                return true;
            }
        } else if ("<=".equals(ljbds)) {
            if (d_left <= d_right) {
                return true;
            }
        } else if ("<>".equals(ljbds) || "!=".equals(ljbds)) {
            if (d_left != d_right) {
                return true;
            }
        } else {
            formulaError();
        }
        return flag;
    }
    /**
     * ä½¿ç”¨å…¬å¼è®¡ç®—结果
     * @param dataMap æœ¬åœºæ™¯å˜é‡çš„值
     * @param calculateString å…¬å¼çš„内容
     * @return æ‰§è¡ŒåŽçš„值
     */
    public String getValueByFormula(Map<String,String> dataMap,String calculateString){
        final String[] finalRule = new String[]{calculateString};
        if(!CollectionUtils.isEmpty(dataMap)){
            dataMap.forEach((key,value)->{
                if(value == null){
                    value = "";
                }
                finalRule[0] = finalRule[0].replace("${" + key + "}",value);
            });
        }
        return calculate(finalRule[0]);
    }
    /**
     * é€’归调用运算,注意变量需要自行替换
     *
     * @param str
     * @return
     */
    public  String calculate(String str) {
        str = this.strCast(str);
        if (!formulaBlag) {
            //logger.debug("公式不正确");
            return str;
        }
        boolean onlyFunction = str.length()>2 && str.startsWith("->");
        if(onlyFunction){
            str = str.substring(2);
        }
        //需要替换系统变量
        Map<String, String> systemVarValueMap = VciSystemVarConstants.getSystemVarValueMap();
        if(!CollectionUtils.isEmpty(systemVarValueMap)){
            final String[] finalStr = new String[]{str};
            systemVarValueMap.forEach((key,value)->{
                if(value == null){
                    value = "";
                }
                finalStr[0] = finalStr[0].replace( key,value);
            });
            str = finalStr[0];
        }
        String reval = "";
        String bds = "";
        int bracket = 0;// å¯¹åº”括号个数
        int pos = 0;
        boolean title = false;
        // å¦‚果以负数开头,先去掉负号
        if (str.substring(0, 1).equals("-")) {
            str = str.substring(1);
            title = true;
        }
        int len = str.length();
        for (int i = 0; i < len; i++) {
            String s = String.valueOf(str.charAt(i));
            pos = i;
            bracket = 0;
            if (!lc.contains(s)) {// å¦‚果没遇到运算符
                if ("(".equals(s)) {// å¦‚果遇到左括号
                    if (funMap.containsKey(bds)) {// å¦‚果左括号前是函数
                        for (int j = i + 1; j < len; j++) {// ä»Žå·¦æ‹¬å·åŽå¼€å§‹å¾ªçޝ
                            pos++;// ç´¯è®¡ç§»åŠ¨å­—ç¬¦ä½æ•°
                            String ts = String.valueOf(str.charAt(j));// å•个字符
                            // reval+=ts;
                            if ("(".equals(ts))// å¦‚果是左括号累计
                            {
                                bracket++;
                            } else if (")".equals(ts)) {// å¦‚果是右括号进行减少
                                bracket--;
                                if (bracket == -1) {// å¦‚果是-1,标识括号结束
                                    reval = reval.substring(0, reval.length()
                                        - bds.length());// é‡æ–°èŽ·å¾—åŽ»æŽ‰å‡½æ•°å¤´çš„è¡¨è¾¾å¼
                                    reval += this.funCalculate(
                                        str.substring(i + 1, j), bds);// è¡¨è¾¾å¼åŠ ä¸Šå‡½æ•°ç»“æžœ,形成新表达式
                                    i = pos;// è®¡æ•°å™¨å¢žåŠ 
                                    bds = "";// å‡½æ•°å¤´æ¸…空
                                    break;// é€€å‡ºæœ¬æ¬¡å¾ªçޝ
                                }
                            }
                        }
                    } else if ("".equals(bds) || lc.contains(bds)) {// å¦‚果是普通运算
                        //logger.debug("普通运算");
                        for (int j = i + 1; j < len; j++) {
                            pos++;
                            String ts = String.valueOf(str.charAt(j));
                            if ("(".equals(ts)) {
                                bracket++;
                            } else if (")".equals(ts)) {
                                bracket--;
                                if (bracket == -1) {
                                    logger.debug("当前计算的字符串为:"
                                        + str.substring(i + 1, pos));
                                    reval += calculate(str
                                        .substring(i + 1, pos));
                                    i = pos;
                                    bds = "";
                                    break;
                                }
                            }
                        }
                    } else {
                        logger.debug("没有此函数");
                        formulaError();
                    }
                } else {// ç´¯åŠ æ€»è¡¨è¾¾å¼å’Œæœ€åŽä¸€ä¸ªè¿ç®—æ•°(或函数)
                    bds += s;
                    reval += s;
                }
            } else {// é‡åˆ°è¿ç®—符最后一个运算数(或函数)清空
                bds = "";
                reval += s;
            }
        }
        // å¦‚果为负数 åœ¨å‰é¢åŠ è´Ÿå·
        if (title) {
            reval = "0-" + reval;
        }
        if(onlyFunction){
            return reval;
        }
        String result =  basicOperation(reval);
        logger.debug("计算结果" + result);
        return result;
    }
    /**
     * å‡½æ•°è¿ç®—
     *
     * @param gs
     * @param funStr
     * @return
     */
    private  String funCalculate(String gs, String funStr) {
        String rval = "0";
        logger.debug("函数名:" + funStr);
        if (funMap.containsKey(funStr)) {
            int[] csi = funMap.get(funStr);
            try {
                if (csi[0] == 0) {// java内部函数,通过反射调用
                    Class[] cs = new Class[csi[1]];
                    Object[] objs = new Object[csi[1]];
                    String[] gss = splitParameter(gs);
                    for (int i = 0; i < csi[1]; i++) {
                        cs[i] = double.class;
                        objs[i] = new Double(calculate(gss[i]));
                    }
                    Class cls = Class.forName("java.lang.Math");
                    Method m = cls.getMethod(funStr, cs);
                    logger.debug("方法名:" + m);
                    rval = String.valueOf(m.invoke(cls, objs));
                } else if (csi[0] == 1) {// è‡ªå®šä¹‰å‡½æ•°
                    rval = customFun(gs, funStr);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return rval;
    }
    // å…¬å¼é‡Œçš„参数分割
    public static String[] splitParameter(String str) {
        int len = str.length();
        boolean flag = true;
        String tstr = "";
        for (int i = 0; i < len; i++) {
            String s = String.valueOf(str.charAt(i));
            if ("(".equals(s)) {
                flag = false;
            } else if (")".equals(s)) {
                flag = true;
            }
            if (flag && ",".equals(s)) {
                tstr += "@";
            } else {
                tstr += s;
            }
        }
        return tstr.split("@");
    }
    /**
     * å››åˆ™è¿ç®—表达式处理
     *
     * @param gs
     * @return
     */
    private  String basicOperation(String gs) {
        gs = gs + "+0"; // å› ä¸ºä¸‹é¢çš„计算是遇到符号才进行,所以多加入一个计算符号,不影响值.
        if(gs.indexOf("-")>-1){//包含有-号或者是负数
            if(gs.startsWith("-")) {
                gs = "0" + gs;
            }
//            if(gs.indexOf("-")>0&&lc.contains(gs.substring(gs.indexOf("-")-1,gs.indexOf("-")))){//紧挨着旁边就是运算符,怎么办啊
//                //gs = gs.substring(0,gs.indexOf("-")-1) + "(0" + gs.substring(gs.indexOf("-"))
//            }
        }
        String c1 = "";// ç¬¬ä¸€ä¸ªè¿ç®—符号
        String c2 = "";// ç¬¬äºŒä¸ªè¿ç®—符号
        String s1 = "";// ç¬¬ä¸€ä¸ªè¿ç®—æ•°
        String s2 = "";// ç¬¬äºŒä¸ªè¿ç®—æ•°
        String s3 = "";// ç¬¬ä¸‰ä¸ªè¿ç®—æ•°
        int len = gs.length();
        for (int i = 0; i < len; i++) {
            String s = String.valueOf(gs.charAt(i));// èŽ·å¾—è¯¥ä½ç½®å­—ç¬¦å¹¶è½¬æ¢æˆå­—ç¬¦ä¸²åšæ¯”è¾ƒ
            if (lc.contains(s)) { // å¦‚果是运算符号
                if (c1.length() == 0)// å¦‚果第一个运算符号为空,加入
                {
                    c1 = s;
                } else if (c2.length() == 0) {// å¦åˆ™,如果第二个运算符号为空,加入
                    c2 = s;// ç¬¬äºŒä¸ªè¿ç®—符号
                    if ("+".equals(c2) || "-".equals(c2)) {// å¦‚果第二个运算符号级别低,那么进行计算
                        if(s2.trim().length()>0){
                            s1 = this.operation(s1, c1, s2);// ç¬¬ä¸€ä¸ªå’Œç¬¬äºŒä¸ªæ•°è®¡ç®—
                            c1 = c2;// ä¿å­˜ç¬¬äºŒä¸ªè¿ç®—符,其他为空
                            c2 = "";
                            s2 = "";
                        }else{//s2还没出现
                            s2=this.calculate(gs.substring(i));
                            s1 = this.operation(s1, c1, s2);
                            break;
                        }
                    }
                } else {// ä¸Šè¿°éƒ½ä¿å­˜è¿‡
                    if ("+".equals(s) || "-".equals(s)) {// å¦‚果第三个运算符级别低,进行运算
                        s2 = this.operation(s2, c2, s3);// å…ˆç®—第二三个数,保存至第二个
                        s1 = this.operation(s1, c1, s2);// å†ç®—第一二个,保存至第一个
                        c1 = s;// ä¿å­˜å½“前运算符,其他为空
                        s2 = "";
                        c2 = "";
                        s3 = "";
                    } else {// å¦‚果第三个运算符级别高
                        s2 = this.operation(s2, c2, s3);// å…ˆç®—第二三个数,保存至第二个
                        c2 = s;// å‰é¢ä¸åЍ,保存运算符
                        s3 = "";
                    }
                }
            } else if (s1.length() > 0 && c1.length() > 0 && c2.length() == 0) {// å¦‚果第一个数,第一个运算符已保存,第二个运算符未保存,保存第二哥数
                s2 += s;
            } else if (c1.length() == 0) {// å¦‚果没有运算符,保存第一个数
                s1 += s;
            } else if (s1.length() > 0 && s2.length() > 0 && c1.length() > 0
                && c2.length() > 0) {// å¦‚果第一二个数和运算符都有,保存第三个数
                s3 += s;
            }
        }
        return s1;
    }
    /**
     * åŸºæœ¬å››åˆ™è¿ç®—
     *
     * @param c1
     *            è¿ç®—æ•°1
     * @param s1
     *            è¿ç®—符(加减乘除)
     * @param c2
     *            è¿ç®—æ•°2
     * @return
     */
    private  String operation(String c1, String s1, String c2) {
        String reval = "0";
        String c22 = "";
        try {
            for (int i = 0; i < c2.length(); i++) {
                String s = String.valueOf(c2.charAt(i));
                if (lj.contains(s)) {
                    break;
                }
                c22 += s;
            }
            if (isNumber(c1) && isNumber(c22)) {
                BigDecimal ln = new BigDecimal(c1.trim());
                BigDecimal rn = new BigDecimal(c2.trim());
                if ("+".equals(s1)) {
                    return ln.add(rn).doubleValue() + "";
                } else if ("-".equals(s1)) {
                    return ln.subtract(rn).doubleValue() + "";
                } else if ("*".equals(s1)) {
                    return ln.multiply(rn).doubleValue() + "";
                } else if ("/".equals(s1)) {
                    if (rn.doubleValue() == 0) {
                        return reval;
                    }
                    else {
                        return ln.divide(rn, 10, BigDecimal.ROUND_HALF_UP) + "";
                    }
                }
            } else {
                this.formulaError();
                return c1+s1+c2;
            }
        } catch (Exception e) {
            this.formulaError();
            e.printStackTrace();
        } finally {
        }
        return reval;
    }
    private  Boolean isNumber(String str) {
        return StringUtils.isNotBlank(str) && str.matches("(-)?([1-9]+[0-9]*|0)(\\.[\\d]+)?");
    }
    private  String formulaError() {
        formulaBlag = false;
        //logger.debug("公式验证失败,请重新输入");
        return "fail";
    }
    public  String toChineseCurrency(String value) {
        String doubleValue = this.calculate("doubleround(" + value + ",2)");
        String fushu = "";
        if (doubleValue.indexOf("-") == 0) {
            fushu = "负";
            doubleValue = doubleValue.substring(1);
//            formulaError();
//            return "";
        }
        char[] hunit = { '拾', 'ä½°', '仟' }; // æ®µå†…位置表示
        char[] vunit = { '万', '亿' }; // æ®µåè¡¨ç¤º
        char[] digit = { '零', '壹', 'è´°', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // æ•°å­—表示
        //double midVal =  (Double.parseDouble(doubleValue) * 100); // è½¬åŒ–成整形
        //String valStr = String.valueOf(midVal); // è½¬åŒ–成字符串
        //String head = valStr.substring(0, valStr.length() - 2); // å–整数部分
        //String rail = valStr.substring(valStr.length() - 2); // å–小数部分
        String head = "";
        String rail = "00";
        if(doubleValue.indexOf(".")>-1){
            head = doubleValue.substring(0,doubleValue.indexOf("."));
            rail = doubleValue.substring(doubleValue.indexOf(".")+1);
            if(rail.trim().length() == 1) {
                rail += "0";//必须要保证有分
            }
        }
        else {
            head = doubleValue;
        }
        String prefix = ""; // æ•´æ•°éƒ¨åˆ†è½¬åŒ–的结果
        String suffix = ""; // å°æ•°éƒ¨åˆ†è½¬åŒ–的结果
        // å¤„理小数点后面的数
        if (rail.equals("00")) { // å¦‚果小数部分为0
            suffix = "整";
        } else {
            suffix = digit[rail.charAt(0) - '0'] + "角"
                + digit[rail.charAt(1) - '0'] + "分"; // å¦åˆ™æŠŠè§’分转化出来
        }
        // å¤„理小数点前面的数
        char[] chDig = head.toCharArray(); // æŠŠæ•´æ•°éƒ¨åˆ†è½¬åŒ–成字符数组
        char zero = '0'; // æ ‡å¿—'0'表示出现过0
        byte zeroSerNum = 0; // è¿žç»­å‡ºçް0的次数
        for (int i = 0; i < chDig.length; i++) { // å¾ªçŽ¯å¤„ç†æ¯ä¸ªæ•°å­—
            int idx = (chDig.length - i - 1) % 4; // å–段内位置
            int vidx = (chDig.length - i - 1) / 4; // å–段位置
            if (chDig[i] == '0') { // å¦‚果当前字符是0
                zeroSerNum++; // è¿žç»­0次数递增
                if (zero == '0') { // æ ‡å¿—
                    zero = digit[0];
                } else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
                    prefix += vunit[vidx - 1];
                    zero = '0';
                }
                continue;
            }
            zeroSerNum = 0; // è¿žç»­0次数清零
            if (zero != '0') { // å¦‚果标志不为0,则加上,例如万,亿什么的
                prefix += zero;
                zero = '0';
            }
            prefix += digit[chDig[i] - '0']; // è½¬åŒ–该数字表示
            if (idx > 0) {
                prefix += hunit[idx - 1];
            }
            if (idx == 0 && vidx > 0) {
                prefix += vunit[vidx - 1]; // æ®µç»“束位置应该加上段名如万,亿
            }
        }
        if (prefix.length() > 0) {
            prefix += '圆'; // å¦‚果整数部分存在,则有圆的字样
        }
        return fushu + prefix + suffix; // è¿”回正确表示
    }
    private String toChinese(String value) {
        if (!isNumber(value)) {
            this.formulaError();
            return "";
        }
        String fu = "";
        // å¦‚果是负数前面加负
        if (value.indexOf("-") == 0) {
            value = value.substring(1);
            fu += "负";
        }
        char[] hunit = { '拾', 'ä½°', '仟' }; // æ®µå†…位置表示
        char[] vunit = { '万', '亿' }; // æ®µåè¡¨ç¤º
        char[] digit = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' }; // æ•°å­—表示
        String head = "";
        String rail = "";
        String prefix = ""; // æ•´æ•°éƒ¨åˆ†è½¬åŒ–的结果
        String suffix = ""; // å°æ•°éƒ¨åˆ†è½¬åŒ–的结果
        if (value.indexOf(".") != -1 && value.indexOf(".") < value.length() - 1) {
            String[] number = value.split("\\.");
            head = number[0]; // å–整数部分
            rail = number[1];
            suffix += "点";
        } else {
            head = value;
        }
        // å¤„理小数点后面的数
        for (int i = 0; i < rail.length(); i++) {
            suffix += digit[rail.charAt(i) - '0'];
        }
        // å¤„理小数点前面的数
        char[] chDig = head.toCharArray(); // æŠŠæ•´æ•°éƒ¨åˆ†è½¬åŒ–成字符数组
        char zero = '0'; // æ ‡å¿—'0'表示出现过0
        byte zeroSerNum = 0; // è¿žç»­å‡ºçް0的次数
        for (int i = 0; i < chDig.length; i++) { // å¾ªçŽ¯å¤„ç†æ¯ä¸ªæ•°å­—
            int idx = (chDig.length - i - 1) % 4; // å–段内位置
            int vidx = (chDig.length - i - 1) / 4; // å–段位置
            if (chDig[i] == '0') { // å¦‚果当前字符是0
                zeroSerNum++; // è¿žç»­0次数递增
                if (zero == '0') { // æ ‡å¿—
                    zero = digit[0];
                } else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
                    prefix += vunit[vidx - 1];
                    zero = '0';
                }
                continue;
            }
            zeroSerNum = 0; // è¿žç»­0次数清零
            if (zero != '0') { // å¦‚果标志不为0,则加上,例如万,亿什么的
                prefix += zero;
                zero = '0';
            }
            prefix += digit[chDig[i] - '0']; // è½¬åŒ–该数字表示
            if (idx > 0) {
                prefix += hunit[idx - 1];
            }
            if (idx == 0 && vidx > 0) {
                prefix += vunit[vidx - 1]; // æ®µç»“束位置应该加上段名如万,亿
            }
        }
        return fu + prefix + suffix; // è¿”回正确表示
    }
    private  String getColValue(String servername, String tableName,
                                String fieldname, String pkfield, String pkvalue) {
        //暂时不支持server的方式
        String sql = "select " + fieldname.trim() + " from " +  tableName.trim() + " where " + pkfield + " = '" + pkvalue+"'";
//        Map<String,String> param = new HashMap<String, String>();
//        param.put(pkfield, pkvalue);
        String str = "";
        try{
            List data = commonsMapper.selectById(sql);
            if(data != null || data.size() > 0) {
                str = (String) ((HashMap) data.get(0)).get(fieldname.trim());
            }
        }catch(Exception e){
        }
        return str;
    }
    private String getValueByMethod(String serviceName,String methods,String paramsString){
        //暂时不支持通过方法来获取值
        return paramsString;
    }
    public static void main(String[] args) {
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -3,32 +3,28 @@
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sun.corba.se.impl.orbutil.ObjectUtility;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
import com.vci.ubcs.code.entity.CodeAllCode;
import com.vci.ubcs.code.entity.CodeOsbtmtypeEntity;
import com.vci.ubcs.code.entity.CodeRule;
import com.vci.ubcs.code.entity.CodeWupinEntity;
import com.vci.ubcs.code.enumpack.CodeDefaultLC;
import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
import com.vci.ubcs.code.enumpack.CodeSecTypeEnum;
import com.vci.ubcs.code.mapper.CodeAllCodeMapper;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeMapper;
import com.vci.ubcs.code.mapper.CodeRuleMapper;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.code.service.*;
import com.vci.ubcs.code.vo.CodeClstempattrVO;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.omd.entity.Dict;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.toolmodel.DateConverter;
@@ -40,7 +36,6 @@
import com.vci.ubcs.system.feign.IDictBizClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springframework.beans.BeanUtils;
@@ -50,7 +45,6 @@
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
@@ -61,6 +55,7 @@
 */
@Service
public class MdmEngineServiceImpl extends ServiceImpl<CodeAllCodeMapper, CodeAllCode> implements MdmEngineService {
    /**
     * æ¨¡æ¿çš„æœåŠ¡
@@ -96,6 +91,17 @@
    private ICodeClassifyService classifyService;
    /**
     * å…¬å¼çš„æœåŠ¡
     */
    @Autowired
    private FormulaServiceImpl formulaService;
    /**
     * é€šç”¨æŸ¥è¯¢
     */
    @Resource
    CommonsMapper commonsMapper;
    /**
     * å…³é”®å±žæ€§çš„配置
     */
    @Autowired
@@ -105,8 +111,10 @@
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    //    @Autowired
    //    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
//    @Autowired
//    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
    /**
     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
@@ -184,14 +192,14 @@
        List<CodeAllCode> codeCbos = baseMapper.selectList(allCodeWrapper);
//        List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
        // å›žæ”¶éœ€è¦ä¸šåŠ¡æ•°æ®åˆ é™¤
//        if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
////            BatchCBO batchCBO = new BatchCBO();
////            batchCBO.getDeleteCbos().addAll(cboList);
//            codeOsbtmtypeMapper.deleteBatchIds(cboList);
////            boService.persistenceBatch(batchCBO);
//        } else {
        if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
//            BatchCBO batchCBO = new BatchCBO();
//            batchCBO.getDeleteCbos().addAll(cboList);
            codeOsbtmtypeMapper.deleteBatchIds(cboList);
//            boService.persistenceBatch(batchCBO);
        } else {
//            lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
//        }
        }
//        lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
    }
@@ -227,23 +235,30 @@
        switchDateAttrOnOrder(templateVO, orderDTO);
        //9.生成编码的信息
//        ClientBusinessObject cbo = boService.createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
//        CodeWupinEntity cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
        CodeWupinEntity cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
//        //默认的属性都不用从前端拷贝
//        //设置编码需要的默认属性的内容
//        copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
        copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
//        //TODO:因为默认的属性都不拷贝,目前集团码叫name,并没有从DTO拷贝到cbo里。增加一个单独处理,以后再看要不要调整
//        cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
        cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
//        //end -- modify by lihang @20220407
//        List<CodeWupinEntity> cboList = new ArrayList<>();
//
//        //备注
//        cbo.setDescription(orderDTO.getDescription());
        List<CodeWupinEntity> cboList = new ArrayList<>();
        //备注
        cbo.setDescription(orderDTO.getDescription());
        cboList.add(cbo);
//
//        cboList.add(cbo);
//        List<String> codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(),cboList);
////        batchSaveSelectChar(templateVO, cboList);
//        return codeList.size() > 0 ? codeList.get(0) : "";
        return null;
        List<String> codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(),cboList);
        List<String> charList = new ArrayList<>();
        for (CodeWupinEntity wupinEntity : cboList) {
            charList.add(wupinEntity.getId());
        }
        batchSaveSelectChar(templateVO, charList);
        return codeList.size() > 0 ? codeList.get(0) : "";
//        return null;
    }
    /**
@@ -378,7 +393,7 @@
            }
            dataLowMap.putAll(orderDTO.getData());
            compAttrVOMap.forEach((attrId, attrVO) -> {
//                dataLowMap.put(attrId, formulaService.getValueByFormula(dataLowMap, attrVO.getComponentrule()));
                dataLowMap.put(attrId, formulaService.getValueByFormula(dataLowMap, attrVO.getComponentRule()));
            });
            dataLowMap.forEach((key, value) -> {
                setValueToOrderDTO(orderDTO, key, value);
@@ -446,29 +461,30 @@
            if (value == null) {
                value = "";
            }
//            wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
            wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
        });
        //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
//        if (!CollectionUtils.isEmpty(conditionMap)) {
//            final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
//            conditionMap.forEach((key, value) -> {
//                sql[0] += " and " + key + " = " + value;
//            });
//            if (StringUtils.isNotBlank(orderDTO.getOid())) {
//                //修改的时候,需要排除自己
//                sql[0] += " and oid != '" + orderDTO.getOid() + "'";
//            } else if (StringUtils.isNotBlank(orderDTO.getCopyFromVersion())) {
//                sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
//            }
//            sql[0] += " and islastR = '1' and islastV = '1' ";
        if (!CollectionUtils.isEmpty(conditionMap)) {
            final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
            conditionMap.forEach((key, value) -> {
                sql[0] += " and " + key + " = " + value;
            });
            if (StringUtils.isNotBlank(orderDTO.getOid())) {
                //修改的时候,需要排除自己
                sql[0] += " and oid != '" + orderDTO.getOid() + "'";
            } else if (StringUtils.isNotBlank(orderDTO.getCopyFromVersion())) {
                sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
            }
            sql[0] += " and islastR = '1' and islastV = '1' ";
//            if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
//                String ruleInfoMsg = keyRuleVO == null ? "" : "查询规则:去除空格--{0},忽略大小写--{1},忽略全半角--{2},忽略全部空格--{3}";
//                String[] objs = new String[]{trim ? "是" : "否", ignoreCase ? "是" : "否", ignoreWidth ? "是" : "否", trimAll ? "是" : "否"};
//                throw new VciBaseException("根据您填写的关键属性的内容,结合关键属性查询规则,发现这个数据已经在系统中存在了。请修正!。" + ruleInfoMsg, objs);
//            }
//        }
            if (Integer.parseInt(commonsMapper.selectById(sql[0]).get(0)) > 0) {
                String ruleInfoMsg = keyRuleVO == null ? "" : "查询规则:去除空格--{0},忽略大小写--{1},忽略全半角--{2},忽略全部空格--{3}";
                String[] objs = new String[]{trim ? "是" : "否", ignoreCase ? "是" : "否", ignoreWidth ? "是" : "否", trimAll ? "是" : "否"};
                throw new VciBaseException("根据您填写的关键属性的内容,结合关键属性查询规则,发现这个数据已经在系统中存在了。请修正!。" + ruleInfoMsg, objs);
            }
        }
    }
    /**
@@ -483,54 +499,54 @@
     * @param trimAll      æ˜¯å¦å¿½ç•¥å…¨éƒ¨ç©ºæ ¼
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     */
//    @Override
//    public void wrapperKeyAttrConditionMap(String value, CodeKeyattrrepeatVO keyRuleVO, String attrId,
//                                           boolean trim, boolean ignoreCase, boolean ignoreWidth,
//                                           boolean trimAll, Map<String, String> conditionMap) {
//        boolean ignoreSpace = trim || trimAll;
//        if (StringUtils.isBlank(value)) {
//            //为空的时候,不能用QueryOperation.ISNULL,平台不知道啥时候不处理这种了
//            conditionMap.put("t."+attrId, "null");
//        } else {
//            if (keyRuleVO != null) {
//                String queryKey = "";
//                String queryValue = "";
//
//                String temp = "";
//                if (ignoreCase && ignoreSpace && ignoreWidth) {
//                    //忽略大小写,且去空,忽略全半角
//                    temp = (trimAll ? "REPLACE" : "TRIM") + "(UPPER(to_single_byte(%s)) " + (trimAll ? ",' ','')" : ")");
//                } else if (ignoreCase && ignoreSpace && !ignoreWidth) {
//                    //忽略大小写、去空、不忽略全半角
//                    temp = (trimAll ? "REPLACE" : "TRIM") + "(UPPER(%s) " + (trimAll ? ",' ','')" : ")");
//                } else if (ignoreCase && !ignoreSpace && ignoreWidth) {
//                    //忽略大小写、不去空、忽略全半角
//                    temp = "UPPER(to_single_byte(%s))";
//                } else if (!ignoreCase && ignoreSpace && ignoreWidth) {
//                    //不忽略大小写、去空、忽略全半角
//                    temp = (trimAll ? "REPLACE" : "TRIM") + "(to_single_byte(%s) " + (trimAll ? ",' ','')" : ")");
//                } else if (ignoreCase && !ignoreSpace && !ignoreWidth) {
//                    //忽略大小写、不去空、不忽略全半角
//                    temp = "UPPER(%s)";
//                } else if (!ignoreCase && !ignoreCase && ignoreWidth) {
//                    //不忽略大小写、不去空、忽略全半角
//                    temp = "to_single_byte(%s)";
//                } else if (!ignoreCase && ignoreSpace && !ignoreWidth) {
//                    //不忽略大小写、去空、不忽略全半角
//                    temp = (trimAll ? "REPLACE" : "TRIM") + "(%s " + (trimAll ? ",' ','')" : ")");
//                } else if (!ignoreCase && !ignoreSpace && !ignoreWidth) {
//                    //不忽略大小写、不去空、不忽略全半角
//                    temp = "%s";
//                }
//                queryKey = String.format(temp, "t."+attrId);
//                queryValue = String.format(temp, "'" + (trim ? value.trim() : value) + "'");
//                conditionMap.put(queryKey, queryValue);
//            } else {
//                //为空的时候不代表不校验,只是不去除相关的信息
//                conditionMap.put("t."+attrId, value);
//            }
//        }
//    }
    @Override
    public void wrapperKeyAttrConditionMap(String value, CodeKeyattrrepeatVO keyRuleVO, String attrId,
                                           boolean trim, boolean ignoreCase, boolean ignoreWidth,
                                           boolean trimAll, Map<String, String> conditionMap) {
        boolean ignoreSpace = trim || trimAll;
        if (StringUtils.isBlank(value)) {
            //为空的时候,不能用QueryOperation.ISNULL,平台不知道啥时候不处理这种了
            conditionMap.put("t."+attrId, "null");
        } else {
            if (keyRuleVO != null) {
                String queryKey = "";
                String queryValue = "";
                String temp = "";
                if (ignoreCase && ignoreSpace && ignoreWidth) {
                    //忽略大小写,且去空,忽略全半角
                    temp = (trimAll ? "REPLACE" : "TRIM") + "(UPPER(to_single_byte(%s)) " + (trimAll ? ",' ','')" : ")");
                } else if (ignoreCase && ignoreSpace && !ignoreWidth) {
                    //忽略大小写、去空、不忽略全半角
                    temp = (trimAll ? "REPLACE" : "TRIM") + "(UPPER(%s) " + (trimAll ? ",' ','')" : ")");
                } else if (ignoreCase && !ignoreSpace && ignoreWidth) {
                    //忽略大小写、不去空、忽略全半角
                    temp = "UPPER(to_single_byte(%s))";
                } else if (!ignoreCase && ignoreSpace && ignoreWidth) {
                    //不忽略大小写、去空、忽略全半角
                    temp = (trimAll ? "REPLACE" : "TRIM") + "(to_single_byte(%s) " + (trimAll ? ",' ','')" : ")");
                } else if (ignoreCase && !ignoreSpace && !ignoreWidth) {
                    //忽略大小写、不去空、不忽略全半角
                    temp = "UPPER(%s)";
                } else if (!ignoreCase && !ignoreCase && ignoreWidth) {
                    //不忽略大小写、不去空、忽略全半角
                    temp = "to_single_byte(%s)";
                } else if (!ignoreCase && ignoreSpace && !ignoreWidth) {
                    //不忽略大小写、去空、不忽略全半角
                    temp = (trimAll ? "REPLACE" : "TRIM") + "(%s " + (trimAll ? ",' ','')" : ")");
                } else if (!ignoreCase && !ignoreSpace && !ignoreWidth) {
                    //不忽略大小写、不去空、不忽略全半角
                    temp = "%s";
                }
                queryKey = String.format(temp, "t."+attrId);
                queryValue = String.format(temp, "'" + (trim ? value.trim() : value) + "'");
                conditionMap.put(queryKey, queryValue);
            } else {
                //为空的时候不代表不校验,只是不去除相关的信息
                conditionMap.put("t."+attrId, value);
            }
        }
    }
    /**
     * æ ¡éªŒæžšä¸¾çš„内容
@@ -657,77 +673,77 @@
     * @return CodeWupinEntity
     * @throws VciBaseException åˆå§‹åŒ–出错的是会抛出异常
     */
//    @Override
//    public CodeWupinEntity createCBOByBtmName(String btmName)
//        throws VciBaseException {
//        if(btmName!=null){
//            btmName = btmName.trim().toLowerCase();
    @Override
    public CodeWupinEntity createCBOByBtmName(String btmName)
        throws VciBaseException {
        if(btmName!=null){
            btmName = btmName.trim().toLowerCase();
        }
        String userid = AuthUtil.getUser().getUserName();
//        if(!hasCreatedCbos.containsKey(btmName)){
//            if(StringUtils.isEmpty(userid)){
//                throw new VciBaseException(msgCodePrefix +"noHasUserid");
//            }
//            try {
//                hasCreatedCbos.put(btmName, createBusinessObject(btmName));
//            } catch (Exception e) {
//                logger.error("创建业务类型对象",e);
//                throw new VciBaseException(msgCodePrefix + "initBoError",new String[]{btmName});
//            }
//        }
//        String userid = AuthUtil.getUser().getUserName();
////        if(!hasCreatedCbos.containsKey(btmName)){
////            if(StringUtils.isEmpty(userid)){
////                throw new VciBaseException(msgCodePrefix +"noHasUserid");
////            }
////            try {
////                hasCreatedCbos.put(btmName, createBusinessObject(btmName));
////            } catch (Exception e) {
////                logger.error("创建业务类型对象",e);
////                throw new VciBaseException(msgCodePrefix + "initBoError",new String[]{btmName});
////            }
////        }
////        ClientBusinessObject cbo = cloneClientBusinessObject(hasCreatedCbos.get(btmName));
//
//        QueryWrapper<CodeOsbtmtypeEntity> btmWrapper = new QueryWrapper<>();
//        btmWrapper.eq("ID",btmName);
//        CodeOsbtmtypeEntity btmTypeVO = codeOsbtmtypeMapper.selectOne(btmWrapper);
////        OsBtmTypeVO btmTypeVO = btmService.getBtmById(boName);
//        String userName = AuthUtil.getUser().getUserName();
//        CodeWupinEntity wupinEntity = new CodeWupinEntity();
//        wupinEntity.setOid(null);
////        bo.setRevisionid((new ObjectUtility()).getNewObjectID36());
////        bo.setNameoid((new ObjectUtility()).getNewObjectID36());
//        wupinEntity.setBtmname(btmName);
//        wupinEntity.setLastR(String.valueOf(1));
//        wupinEntity.setFirstR(String.valueOf(1));
//        wupinEntity.setFirstV(String.valueOf(1));
//        wupinEntity.setLastV(String.valueOf(1));
//        wupinEntity.setCreator(userName);
//        wupinEntity.setCreateTime(new Date());
//        wupinEntity.setLastModifier(userName);
//        wupinEntity.setLastModifyTime(new Date());
//        wupinEntity.setRevisionRule(btmTypeVO.getRevisionruleid());
//        wupinEntity.setVersionRule(String.valueOf(btmTypeVO.getVersionRule()));
//        if(StringUtils.isNotBlank(btmTypeVO.getRevisionruleid())){
//            //插个点,需要问勇哥版本问题,展示默认为1
////            OsRevisionRuleVO revisionRuleVO = revisionRuleService.getRevisionRuleById(btmTypeVO.getRevisionruleid());
//            wupinEntity.setRevisionValue("1");
//        }
//
//        wupinEntity.setRevisionSeq(1);
//        wupinEntity.setVersionSeq(1);
//        //插个点,需要问勇哥版本问题,展示默认为1
//        wupinEntity.setVersionValue("1");
//        wupinEntity.setLctid("wupinLC");
//        wupinEntity.setLcStatus("Editing");
//        wupinEntity.setId("");
//        wupinEntity.setName("");
//        wupinEntity.setDescription("");
//        wupinEntity.setOwner(userName);
//        wupinEntity.setCheckinby(userName);
//        wupinEntity.setCopyFromVersion("");
//        wupinEntity.setMaterialtype((short) 1001);
//        wupinEntity.setCaigouwl("true");
//        wupinEntity.setShifoupihaoguanli("true");
//        wupinEntity.setKucunwl("true");
//        wupinEntity.setXiaoshouwl("false");
//        wupinEntity.setPassing("true");
//
////        this.initTypeAttributeValue(wupinEntity,btmTypeVO);
//        return wupinEntity;
//
//
////        return cbo;
//    }
//        ClientBusinessObject cbo = cloneClientBusinessObject(hasCreatedCbos.get(btmName));
        QueryWrapper<CodeOsbtmtypeEntity> btmWrapper = new QueryWrapper<>();
        btmWrapper.eq("ID",btmName);
        CodeOsbtmtypeEntity btmTypeVO = codeOsbtmtypeMapper.selectOne(btmWrapper);
//        OsBtmTypeVO btmTypeVO = btmService.getBtmById(boName);
        String userName = AuthUtil.getUser().getUserName();
        CodeWupinEntity wupinEntity = new CodeWupinEntity();
        wupinEntity.setOid(null);
//        bo.setRevisionid((new ObjectUtility()).getNewObjectID36());
//        bo.setNameoid((new ObjectUtility()).getNewObjectID36());
        wupinEntity.setBtmname(btmName);
        wupinEntity.setLastR(String.valueOf(1));
        wupinEntity.setFirstR(String.valueOf(1));
        wupinEntity.setFirstV(String.valueOf(1));
        wupinEntity.setLastV(String.valueOf(1));
        wupinEntity.setCreator(userName);
        wupinEntity.setCreateTime(new Date());
        wupinEntity.setLastModifier(userName);
        wupinEntity.setLastModifyTime(new Date());
        wupinEntity.setRevisionRule(btmTypeVO.getRevisionruleid());
        wupinEntity.setVersionRule(String.valueOf(btmTypeVO.getVersionRule()));
        if(StringUtils.isNotBlank(btmTypeVO.getRevisionruleid())){
            //插个点,需要问勇哥版本问题,展示默认为1
//            OsRevisionRuleVO revisionRuleVO = revisionRuleService.getRevisionRuleById(btmTypeVO.getRevisionruleid());
            wupinEntity.setRevisionValue("1");
        }
        wupinEntity.setRevisionSeq(1);
        wupinEntity.setVersionSeq(1);
        //插个点,需要问勇哥版本问题,展示默认为1
        wupinEntity.setVersionValue("1");
        wupinEntity.setLctid("wupinLC");
        wupinEntity.setLcStatus("Editing");
        wupinEntity.setId("");
        wupinEntity.setName("");
        wupinEntity.setDescription("");
        wupinEntity.setOwner(userName);
        wupinEntity.setCheckinby(userName);
        wupinEntity.setCopyFromVersion("");
        wupinEntity.setMaterialtype((short) 1001);
        wupinEntity.setCaigouwl("true");
        wupinEntity.setShifoupihaoguanli("true");
        wupinEntity.setKucunwl("true");
        wupinEntity.setXiaoshouwl("false");
        wupinEntity.setPassing("true");
//        this.initTypeAttributeValue(wupinEntity,btmTypeVO);
        return wupinEntity;
//        return cbo;
    }
    /**
     * æ˜¯å¦ä¸ºä¿®æ”¹å¿½ç•¥çš„属性
@@ -750,27 +766,36 @@
     * @param templateVO æ¨¡æ¿çš„对象
     * @param cboList    æ•°æ®çš„内容
     */
//    @Override
//    public void batchSaveSelectChar(CodeClstemplateVO templateVO, List<ClientBusinessObject> cboList) {
//        if (templateVO != null && !CollectionUtils.isEmpty(cboList)) {
//            //是异步的,所以直接循环
//            List<CodeClassifyTemplateAttrVO> selectAttrVOs = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getLibraryidentification())).collect(Collectors.toList());
//
//            if (!CollectionUtils.isEmpty(selectAttrVOs)) {
////                SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
//                selectAttrVOs.parallelStream().forEach(attrVO -> {
//                    List<String> valuesList = new CopyOnWriteArrayList<>();
    @Override
    public void batchSaveSelectChar(CodeClstemplateVO templateVO, /*List<ClientBusinessObject> cboList*/
                                    List<String> cboList) {
        if (templateVO != null && !CollectionUtils.isEmpty(cboList)) {
            //是异步的,所以直接循环
            List<CodeClassifyTemplateAttrVO> selectAttrVOs = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getLibraryIdentification())).collect(Collectors.toList());
            if (!CollectionUtils.isEmpty(selectAttrVOs)) {
//                SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
                selectAttrVOs.parallelStream().forEach(attrVO -> {
                    List<String> valuesList = cboList;
//                    cboList.parallelStream().forEach(cbo -> {
//                        String value = cbo.getAttributeValue(attrVO.getId());
//                        String value = cbo.get.getAttributeValue(attrVO.getId());
//                        if (StringUtils.isNotBlank(value)) {
//                            valuesList.add(value);
//                        }
//                    });
//                    if (!CollectionUtils.isEmpty(valuesList)) {
                    if (!CollectionUtils.isEmpty(valuesList)) {
                        for (String s : valuesList) {
                            DictBiz dictBiz = new DictBiz();
                            dictBiz.setCode(templateVO.getBtmTypeId());
                            dictBiz.setDictKey(s);
                            dictBiz.setDictValue(s);
                            //从原来的charService(可输可选)更改为调用omd中的接口来实现
                            iDictBizClient.getCheck(dictBiz);
                        }
//                        charService.saveBySameNamespaceAndFlag(templateVO.getBtmTypeId(), attrVO.getLibraryIdentification(), valuesList, sessionInfo);
//                    }
//                });
//            }
//        }
//    }
                    }
                });
            }
        }
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -35,6 +35,7 @@
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
@Service
public class MdmProductCodeServiceImpl  implements MdmProductCodeService {
@@ -303,7 +304,6 @@
            Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
            allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
                s.setLcStatus(statusMap.get(s.getOid()));
            });
            codeAllCodeService.saveBatch(allCodeDOList);
            iCodeWupinService.saveBatch(dataCBOList);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
@@ -16,6 +16,7 @@
 */
package com.vci.ubcs.code.wrapper;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.system.cache.DictCache;
import com.vci.ubcs.code.entity.CodeButton;
import com.vci.ubcs.code.vo.pagemodel.CodeButtonVO;
@@ -43,8 +44,8 @@
    @Override
    public CodeButtonVO entityVO(CodeButton codebutton) {
        CodeButtonVO codebuttonVO = Objects.requireNonNull(BeanUtil.copy(codebutton, CodeButtonVO.class));
        codebuttonVO.setUsedpositiontypeText(DictCache.getValue("codeButtonPosition", codebutton.getUsedPositionType()));
        codebuttonVO.setLcStatusText(DictCache.getValue("codeLcstatus", codebutton.getLcStatus()));
        codebuttonVO.setUsedpositiontypeText(EnumCache.getValue("codeButtonPosition", codebutton.getUsedPositionType()));
        codebuttonVO.setLcStatusText(EnumCache.getValue("codeLcstatus", codebutton.getLcStatus()));
        return codebuttonVO;
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeButtonMapper.xml
@@ -5,34 +5,34 @@
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="codebuttonResultMap" type="com.vci.ubcs.code.entity.CodeButton">
        <result column="OID" property="oid"/>
        <result column="REVISIONOID" property="revisionoid"/>
        <result column="NAMEOID" property="nameoid"/>
        <result column="REVISIONOID" property="revisionOid"/>
        <result column="NAMEOID" property="nameOid"/>
        <result column="BTMNAME" property="btmname"/>
        <result column="LASTR" property="lastr"/>
        <result column="FIRSTR" property="firstr"/>
        <result column="LASTV" property="lastv"/>
        <result column="FIRSTV" property="firstv"/>
        <result column="LASTR" property="lastR"/>
        <result column="FIRSTR" property="firstR"/>
        <result column="LASTV" property="lastV"/>
        <result column="FIRSTV" property="firstV"/>
        <result column="CREATOR" property="creator"/>
        <result column="CREATETIME" property="createtime"/>
        <result column="LASTMODIFIER" property="lastmodifier"/>
        <result column="LASTMODIFYTIME" property="lastmodifytime"/>
        <result column="REVISIONRULE" property="revisionrule"/>
        <result column="VERSIONRULE" property="versionrule"/>
        <result column="REVISIONSEQ" property="revisionseq"/>
        <result column="REVISIONVALUE" property="revisionvalue"/>
        <result column="VERSIONSEQ" property="versionseq"/>
        <result column="VERSIONVALUE" property="versionvalue"/>
        <result column="CREATETIME" property="createTime"/>
        <result column="LASTMODIFIER" property="lastModifier"/>
        <result column="LASTMODIFYTIME" property="lastModifyTime"/>
        <result column="REVISIONRULE" property="revisionRule"/>
        <result column="VERSIONRULE" property="versionRule"/>
        <result column="REVISIONSEQ" property="revisionSeq"/>
        <result column="REVISIONVALUE" property="revisionValue"/>
        <result column="VERSIONSEQ" property="versionSeq"/>
        <result column="VERSIONVALUE" property="versionValue"/>
        <result column="LCTID" property="lctid"/>
        <result column="LCSTATUS" property="lcstatus"/>
        <result column="LCSTATUS" property="lcStatus"/>
        <result column="TS" property="ts"/>
        <result column="ID" property="id"/>
        <result column="NAME" property="name"/>
        <result column="DESCRIPTION" property="description"/>
        <result column="OWNER" property="owner"/>
        <result column="COPYFROMVERSION" property="copyfromversion"/>
        <result column="ICONCLS" property="iconcls"/>
        <result column="EXECUTEJS" property="executejs"/>
        <result column="USEDPOSITIONTYPE" property="usedpositiontype"/>
        <result column="COPYFROMVERSION" property="copyFromVersion"/>
        <result column="ICONCLS" property="iconCls"/>
        <result column="EXECUTEJS" property="executeJs"/>
        <result column="USEDPOSITIONTYPE" property="usedPositionType"/>
    </resultMap>
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
@@ -37,7 +37,7 @@
    <select id="selectPlCodeClstemplatePage" resultMap="plCodeClstemplateResultMap">
        select * from PL_CODE_CLSTEMPLATE where is_deleted = 0 order by revisionSeq
        select * from PL_CODE_CLSTEMPLATE where 0 = 0 order by revisionSeq
    </select>
    <select id="selectAllLevelChildOid" resultType="java.lang.String" >
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/DictController.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/EnumController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.controller;
import com.vci.ubcs.omd.wrapper.EnumWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
import javax.validation.Valid;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.vo.EnumVO;
import com.vci.ubcs.omd.service.IEnumService;
import org.springblade.core.boot.ctrl.BladeController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
import java.util.Map;
/**
 * æžšä¸¾å®šä¹‰ æŽ§åˆ¶å™¨
 *
 * @author yuxc
 * @since 2023-05-08
 */
@RestController
@AllArgsConstructor
@RequestMapping("/enum")
@Api(value = "枚举定义", tags = "枚举定义接口")
public class EnumController extends BladeController {
    private final IEnumService omdEnumService;
    /**
     * æžšä¸¾å®šä¹‰ è¯¦æƒ…
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入omdEnum")
    public R<EnumVO> detail(Enum omdEnum) {
        Enum detail = omdEnumService.getOne(Condition.getQueryWrapper(omdEnum));
        return R.data(EnumWrapper.build().entityVO(detail));
    }
    /**
     * æžšä¸¾å®šä¹‰ åˆ†é¡µ
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入omdEnum")
    public R<IPage<EnumVO>> list(Enum omdEnum, Query query) {
        IPage<Enum> pages = omdEnumService.page(Condition.getPage(query), Condition.getQueryWrapper(omdEnum));
        return R.data(EnumWrapper.build().pageVO(pages));
    }
    /**
     * æžšä¸¾å®šä¹‰ è‡ªå®šä¹‰åˆ†é¡µ
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入omdEnum")
    public R<IPage<EnumVO>> page(EnumVO omdEnum, Query query) {
        IPage<EnumVO> pages = omdEnumService.selectOmdEnumPage(Condition.getPage(query), omdEnum);
        return R.data(pages);
    }
    /**
     * æžšä¸¾å®šä¹‰ æ–°å¢ž
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入omdEnum")
    public R save(@Valid @RequestBody Enum omdEnum) {
        return R.status(omdEnumService.save(omdEnum));
    }
    /**
     * æžšä¸¾å®šä¹‰ ä¿®æ”¹
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入omdEnum")
    public R update(@Valid @RequestBody Enum omdEnum) {
        return R.status(omdEnumService.updateById(omdEnum));
    }
    /**
     * æžšä¸¾å®šä¹‰ æ–°å¢žæˆ–修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入omdEnum")
    public R submit(@Valid @RequestBody Enum omdEnum) {
        return R.status(omdEnumService.saveOrUpdate(omdEnum));
    }
    /**
     * æžšä¸¾å®šä¹‰ åˆ é™¤
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "逻辑删除", notes = "传入ids")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(omdEnumService.deleteLogic(Func.toStrList(ids)));
    }
    /**
     * æžšä¸¾å®šä¹‰ åˆ†é¡µ
     */
    @GetMapping("/parent-list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入omdEnum")
    public R<IPage<EnumVO>> parentList(@ApiIgnore @RequestParam Map<String, Object> dict , Query query) {
        return R.data(omdEnumService.parentList(dict, query));
    }
    /**
     * èŽ·å–å­—å…¸æ ‘å½¢ç»“æž„
     */
    @GetMapping("/tree")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "树形结构", notes = "树形结构")
    public R<List<EnumVO>> tree(@ApiIgnore @RequestParam Map<String, Object> dict , Query query) {
        List<EnumVO> tree = omdEnumService.tree(dict, query);
        return R.data(tree);
    }
    /**
     * èŽ·å–æžšä¸¾
     */
    @GetMapping("/dictionary")
    @ApiOperationSupport(order = 8)
    @ApiOperation(value = "获取枚举", notes = "获取枚举")
    public R<List<EnumVO>> dictionary(String code) {
        List<EnumVO> tree = omdEnumService.getList(code);
        return R.data(tree);
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/EnumItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,149 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.controller;
import com.vci.ubcs.omd.wrapper.EnumitemWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
import javax.validation.Valid;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumItemVO;
import com.vci.ubcs.omd.service.IEnumItemService;
import org.springblade.core.boot.ctrl.BladeController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ æŽ§åˆ¶å™¨
 *
 * @author yuxc
 * @since 2023-05-08
 */
@RestController
@AllArgsConstructor
@RequestMapping("/enumItem")
@Api(value = "枚举定义子表", tags = "枚举定义子表接口")
public class EnumItemController extends BladeController {
    private final IEnumItemService omdEnumitemService;
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ è¯¦æƒ…
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入omdEnumitem")
    public R<EnumItemVO> detail(EnumItem enumitem) {
        EnumItem detail = omdEnumitemService.getOne(Condition.getQueryWrapper(enumitem));
        return R.data(EnumitemWrapper.build().entityVO(detail));
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ åˆ†é¡µ
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入omdEnumitem")
    public R<IPage<EnumItemVO>> list(EnumItem enumitem, Query query) {
        IPage<EnumItem> pages = omdEnumitemService.page(Condition.getPage(query), Condition.getQueryWrapper(enumitem).orderByAsc("sort"));
        return R.data(EnumitemWrapper.build().pageVO(pages));
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ åˆ†é¡µ
     */
    @GetMapping("/listAll")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入omdEnumitem")
    public R<List<EnumItemVO>> listAll(@ApiIgnore @RequestParam Map<String, Object> omdEnumitem, Query query) {
        return R.data(omdEnumitemService.childList(Condition.getQueryWrapper(omdEnumitem, EnumItem.class).orderByAsc("sort")));
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ è‡ªå®šä¹‰åˆ†é¡µ
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入omdEnumitem")
    public R<IPage<EnumItemVO>> page(EnumItemVO omdEnumitem, Query query) {
        IPage<EnumItemVO> pages = omdEnumitemService.selectOmdEnumitemPage(Condition.getPage(query), omdEnumitem);
        return R.data(pages);
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ æ–°å¢ž
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入omdEnumitem")
    public R save(@Valid @RequestBody EnumItem enumitem) {
        return R.status(omdEnumitemService.save(enumitem));
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ ä¿®æ”¹
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入omdEnumitem")
    public R update(@Valid @RequestBody EnumItem enumitem) {
        return R.status(omdEnumitemService.updateById(enumitem));
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ æ–°å¢žæˆ–修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入omdEnumitem")
    public R submit(@Valid @RequestBody EnumItem enumitem) {
        if(enumitem.getOid() == null){
            enumitem.setCreatetime(new Date());
            enumitem.setCreator(AuthUtil.getUser().getUserName());
        }
        enumitem.setModifier(AuthUtil.getUser().getUserName());
        enumitem.setModifytime(new Date());
        enumitem.setTs(new Date());
        return R.status(omdEnumitemService.saveOrUpdate(enumitem));
    }
    /**
     * æžšä¸¾å®šä¹‰å­è¡¨ åˆ é™¤
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "逻辑删除", notes = "传入ids")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(omdEnumitemService.deleteLogic(Func.toStrList(ids)));
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/DictClient.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/EnumClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.mapper.EnumMapper;
import com.vci.ubcs.omd.service.IEnumItemService;
import com.vci.ubcs.omd.service.IEnumService;
import com.vci.ubcs.omd.vo.EnumVO;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
/**
 * æžšä¸¾å®šä¹‰ Feign实现类
 *
 * @author yuxc
 * @since 2023-05-08
 */
@ApiIgnore()
@RestController
@AllArgsConstructor
public class EnumClient implements IEnumClient {
    private final EnumMapper enumMapper;
    private IEnumService iEnumService;
    private IEnumItemService iEnumItemService;
    @Override
    @GetMapping(TOP)
    public BladePage<Enum> top(Integer current, Integer size) {
        Query query = new Query();
        query.setCurrent(current);
        query.setSize(size);
        IPage<Enum> page = enumMapper.selectPage(Condition.getPage(query),
            Wrappers.emptyWrapper());
//            service.page(Condition.getPage(query));
        return BladePage.of(page);
    }
    /**
     * èŽ·å–æžšä¸¾å®šä¹‰åˆ—è¡¨
     *
     * @param name   çˆ¶èŠ‚ç‚¹name
     * @param nameChild      å­èŠ‚ç‚¹name
     * @return BladePage
     */
    @Override
    public R<String> getValue(String name,String nameChild) {
        return R.data(iEnumService.getValue(name, nameChild));
    }
    @Override
    public R<Enum> getById(String oid) {
        return R.data(iEnumService.getById(oid));
    }
    @Override
    public R<EnumItem> getByChildId(String oid) {
        return R.data(iEnumItemService.getById(oid));
    }
    @Override
    public R<List<EnumVO>> getList(String name) {
        return R.data(iEnumService.getList(name));
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/EnumItemClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.mapper.EnumItemMapper;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ Feign实现类
 *
 * @author yuxc
 * @since 2023-05-08
 */
@ApiIgnore()
@RestController
@AllArgsConstructor
public class EnumItemClient implements IEnumItemClient {
    private final EnumItemMapper enumItemMapper;
    @Override
    @GetMapping(TOP)
    public BladePage<EnumItem> top(Integer current, Integer size) {
        Query query = new Query();
        query.setCurrent(current);
        query.setSize(size);
        IPage<EnumItem> page = enumItemMapper.selectPage(Condition.getPage(query),
            Wrappers.emptyWrapper());
//        service.page(Condition.getPage(query));
        return BladePage.of(page);
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/EnumItemMapper.java
copy from Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/DictMapper.java copy to Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/EnumItemMapper.java
Îļþ´Ó Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/DictMapper.java ¸´ÖÆ
@@ -16,49 +16,27 @@
 */
package com.vci.ubcs.omd.mapper;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumItemVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.omd.entity.Dict;
import com.vci.ubcs.omd.vo.DictVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
 * Mapper æŽ¥å£
 * æžšä¸¾å®šä¹‰å­è¡¨ Mapper æŽ¥å£
 *
 * @author Chill
 * @author yuxc
 * @since 2023-05-08
 */
public interface DictMapper extends BaseMapper<Dict> {
public interface EnumItemMapper extends BaseMapper<EnumItem> {
    /**
     * èŽ·å–å­—å…¸è¡¨å¯¹åº”ä¸­æ–‡
     * è‡ªå®šä¹‰åˆ†é¡µ
     *
     * @param code    å­—典编号
     * @param dictKey å­—典序号
     * @param page
     * @param omdEnumitem
     * @return
     */
    String getValue(String code, String dictKey);
    /**
     * èŽ·å–å­—å…¸è¡¨
     *
     * @param code å­—典编号
     * @return
     */
    List<Dict> getList(String code);
    /**
     * èŽ·å–æ ‘å½¢èŠ‚ç‚¹
     *
     * @return
     */
    List<DictVO> tree();
    /**
     * èŽ·å–æ ‘å½¢èŠ‚ç‚¹
     *
     * @return
     */
    List<DictVO> parentTree();
    List<EnumItemVO> selectOmdEnumitemPage(IPage page, EnumItemVO omdEnumitem);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/EnumMapper.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/DictMapper.java ÐÞ¸Ä
@@ -16,49 +16,31 @@
 */
package com.vci.ubcs.omd.mapper;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.vo.EnumVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.omd.entity.Dict;
import com.vci.ubcs.omd.vo.DictVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
 * Mapper æŽ¥å£
 * æžšä¸¾å®šä¹‰ Mapper æŽ¥å£
 *
 * @author Chill
 * @author yuxc
 * @since 2023-05-08
 */
public interface DictMapper extends BaseMapper<Dict> {
public interface EnumMapper extends BaseMapper<Enum> {
    /**
     * èŽ·å–å­—å…¸è¡¨å¯¹åº”ä¸­æ–‡
     * è‡ªå®šä¹‰åˆ†é¡µ
     *
     * @param code    å­—典编号
     * @param dictKey å­—典序号
     * @param page
     * @param omdEnum
     * @return
     */
    String getValue(String code, String dictKey);
    List<EnumVO> selectOmdEnumPage(IPage page, EnumVO omdEnum);
    /**
     * èŽ·å–å­—å…¸è¡¨
     *
     * @param code å­—典编号
     * @return
     */
    List<Dict> getList(String code);
    /**
     * èŽ·å–æ ‘å½¢èŠ‚ç‚¹
     *
     * @return
     */
    List<DictVO> tree();
    String getValue(String name, String nameChild);
    /**
     * èŽ·å–æ ‘å½¢èŠ‚ç‚¹
     *
     * @return
     */
    List<DictVO> parentTree();
    List<EnumVO> getList(String name);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IDictService.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IEnumItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumItemVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ æœåŠ¡ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
public interface IEnumItemService extends IService<EnumItem> {
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
     *
     * @param page
     * @param omdEnumitem
     * @return
     */
    IPage<EnumItemVO> selectOmdEnumitemPage(IPage<EnumItemVO> page, EnumItemVO omdEnumitem);
    boolean deleteLogic(List<String> toStringList);
    List<EnumItemVO> childList(QueryWrapper<EnumItem> queryWrapper);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IEnumService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.vo.EnumVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.support.Query;
import java.util.List;
import java.util.Map;
/**
 * æžšä¸¾å®šä¹‰ æœåŠ¡ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
public interface IEnumService extends IService<Enum> {
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
     *
     * @param page
     * @param omdEnum
     * @return
     */
    IPage<EnumVO> selectOmdEnumPage(IPage<EnumVO> page, EnumVO omdEnum);
    boolean deleteLogic(List<String> toStringList);
    IPage<EnumVO> parentList(Map<String, Object> dict, Query query);
    /**
     * æ ‘形结构
     *
     * @return
     */
    List<EnumVO> tree(Map<String, Object> dict , Query query);
    /**
     * èŽ·å–æžšä¸¾å®šä¹‰åˆ—è¡¨
     *
     * @param name   çˆ¶èŠ‚ç‚¹name
     * @param nameChild      å­èŠ‚ç‚¹name
     * @return BladePage
     */
    String getValue(String name, String nameChild);
    List<EnumVO> getList(String name);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/DictServiceImpl.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/EnumItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumItemVO;
import com.vci.ubcs.omd.mapper.EnumItemMapper;
import com.vci.ubcs.omd.service.IEnumItemService;
import com.vci.ubcs.omd.wrapper.EnumitemWrapper;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ æœåŠ¡å®žçŽ°ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
@Service
public class EnumItemServiceImpl extends ServiceImpl<EnumItemMapper, EnumItem> implements IEnumItemService {
    @Override
    public IPage<EnumItemVO> selectOmdEnumitemPage(IPage<EnumItemVO> page, EnumItemVO omdEnumitem) {
        return page.setRecords(baseMapper.selectOmdEnumitemPage(page, omdEnumitem));
    }
    @Override
    public boolean deleteLogic(List<String> toStringList) {
        return SqlHelper.retBool(baseMapper.deleteBatchIds(toStringList));
    }
    @Override
    public List<EnumItemVO> childList(QueryWrapper<EnumItem> queryWrapper) {
        return EnumitemWrapper.build().listVO(baseMapper.selectList(queryWrapper));
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/EnumServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.mapper.EnumItemMapper;
import com.vci.ubcs.omd.vo.EnumVO;
import com.vci.ubcs.omd.mapper.EnumMapper;
import com.vci.ubcs.omd.service.IEnumService;
import com.vci.ubcs.omd.wrapper.EnumWrapper;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import javax.annotation.Resource;
import java.util.*;
/**
 * æžšä¸¾å®šä¹‰ æœåŠ¡å®žçŽ°ç±»
 *
 * @author yuxc
 * @since 2023-05-08
 */
@Service
public class EnumServiceImpl extends ServiceImpl<EnumMapper, Enum> implements IEnumService {
    @Resource
    EnumItemMapper enumItemMapper;
    @Override
    public IPage<EnumVO> selectOmdEnumPage(IPage<EnumVO> page, EnumVO omdEnum) {
        return page.setRecords(baseMapper.selectOmdEnumPage(page, omdEnum));
    }
    @Override
    public boolean deleteLogic(List<String> toStringList) {
        return SqlHelper.retBool(baseMapper.deleteBatchIds(toStringList));
    }
    @Override
    public IPage<EnumVO> parentList(Map<String, Object> dict, Query query) {
        IPage<Enum> page = this.page(Condition.getPage(query),
            Condition.getQueryWrapper(dict, Enum.class).lambda()
                .orderByDesc(Enum::getCreatetime));
        return EnumWrapper.build().pageVO(page);
    }
    @Override
    public List<EnumVO> tree(Map<String, Object> dict, Query query) {
        List<Enum> pages = this.page(Condition.getPage(query),Condition.getQueryWrapper(dict, Enum.class).lambda()
                .orderByDesc(Enum::getCreatetime)).getRecords();
        List<EnumVO> listVo = new ArrayList<>();
        pages.stream().forEach(page->{
            EnumVO enumVO = new EnumVO();
            QueryWrapper<EnumItem> wrapper = new QueryWrapper<>();
            wrapper.eq("parentOid",page.getOid());
            List<EnumItem> enumItems = enumItemMapper.selectList(wrapper);
            BeanUtils.copyProperties(page, enumVO);
            if(enumItems.size()>0){
                enumVO.setChildren(enumItems);
                enumVO.setHasChildren(true);
            }
            listVo.add(enumVO);
        });
        return listVo;
    }
    @Override
    public String getValue(String name, String nameChild) {
        return Func.toStr(baseMapper.getValue(name, nameChild), StringPool.EMPTY);
    }
    @Override
    public List<EnumVO> getList(String name) {
        return baseMapper.getList(name);
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/DictWrapper.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/EnumWrapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.vo.EnumVO;
import java.util.Objects;
/**
 * æžšä¸¾å®šä¹‰ åŒ…装类,返回视图层所需的字段
 *
 * @author yuxc
 * @since 2023-05-08
 */
public class EnumWrapper extends BaseEntityWrapper<Enum, EnumVO>  {
    public static EnumWrapper build() {
        return new EnumWrapper();
     }
    @Override
    public EnumVO entityVO(Enum omdEnum) {
        EnumVO enumVO = Objects.requireNonNull(BeanUtil.copy(omdEnum, EnumVO.class));
        //User createUser = UserCache.getUser(omdEnum.getCreateUser());
        //User updateUser = UserCache.getUser(omdEnum.getUpdateUser());
        //omdEnumVO.setCreateUserName(createUser.getName());
        //omdEnumVO.setUpdateUserName(updateUser.getName());
        return enumVO;
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/EnumitemWrapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.wrapper;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.vo.EnumVO;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.node.ForestNodeMerger;
import org.springblade.core.tool.utils.BeanUtil;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumItemVO;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * æžšä¸¾å®šä¹‰å­è¡¨ åŒ…装类,返回视图层所需的字段
 *
 * @author yuxc
 * @since 2023-05-08
 */
public class EnumitemWrapper extends BaseEntityWrapper<EnumItem, EnumItemVO>  {
    public static EnumitemWrapper build() {
        return new EnumitemWrapper();
     }
    @Override
    public EnumItemVO entityVO(EnumItem enumitem) {
        EnumItemVO enumItemVO = Objects.requireNonNull(BeanUtil.copy(enumitem, EnumItemVO.class));
        if (enumitem.getParentoid() == null ) {
            enumItemVO.setParentName(BladeConstant.TOP_PARENT_NAME);
        } else {
            Enum parent = EnumCache.getById(enumitem.getParentoid());
            enumItemVO.setParentName(parent.getLabel());
        }
        return enumItemVO;
    }
    public List<EnumVO> listNodeVO(List<EnumItem> list) {
        List<EnumItem> collect = list.stream().map(omdEnumItem -> BeanUtil.copy(omdEnumItem, EnumItem.class)).collect(Collectors.toList());
        return ForestNodeMerger.merge((List)collect);
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/DictMapper.xml
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/EnumItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
<?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.omd.mapper.EnumItemMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="enumitemResultMap" type="com.vci.ubcs.omd.entity.EnumItem">
        <result column="OID" property="oid"/>
        <result column="NAME" property="name"/>
        <result column="VALUE" property="value"/>
        <result column="DESCRIPTION" property="description"/>
        <result column="TS" property="ts"/>
        <result column="CREATOR" property="creator"/>
        <result column="CREATETIME" property="createtime"/>
        <result column="MODIFIER" property="modifier"/>
        <result column="MODIFYTIME" property="modifytime"/>
        <result column="PARENTOID" property="parentoid"/>
        <result column="SORT" property="sort"/>
    </resultMap>
    <select id="selectOmdEnumitemPage" resultMap="enumitemResultMap">
        select * from PL_OMD_ENUMITEM where 1 = 1
    </select>
</mapper>
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/EnumMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
<?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.omd.mapper.EnumMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="enumResultMap" type="com.vci.ubcs.omd.entity.Enum">
        <result column="OID" property="oid"/>
        <result column="NAME" property="name"/>
        <result column="LABEL" property="label"/>
        <result column="TS" property="ts"/>
        <result column="CREATOR" property="creator"/>
        <result column="CREATETIME" property="createtime"/>
        <result column="MODIFIER" property="modifier"/>
        <result column="MODIFYTIME" property="modifytime"/>
        <result column="REMARK" property="remark"/>
    </resultMap>
    <select id="selectOmdEnumPage" resultMap="enumResultMap">
        select * from PL_OMD_ENUM where 1 = 0
    </select>
    <select id="getValue" resultType="java.lang.String">
        select POE.NAME
        from PL_OMD_ENUM PO, PL_OMD_ENUMITEM POE
        WHERE PO.OID = POE.PARENTOID
          AND PO.NAME = #{param1}
          AND POE.VALUE = #{param2}
    </select>
    <select id="getList" resultType="com.vci.ubcs.omd.vo.EnumVO">
        select PO.OID,
               PO.NAME,
               PO.LABEL,
               PO.TS,
               PO.CREATOR,
               PO.CREATOR,
               PO.CREATETIME,
               PO.MODIFIER,
               PO.MODIFYTIME,
               PO.REMARK,
               POE.OID ITEM_OID,
               POE.NAME ITEM_NAME,
               POE.VALUE ITEM_VALUE,
               POE.DESCRIPTION ITEM_DESCRIPTION
        from PL_OMD_ENUM PO, PL_OMD_ENUMITEM POE
        WHERE PO.OID = POE.PARENTOID
          AND PO.NAME = #{param1}
    </select>
</mapper>