主要完成修改Class统一命名,与老平台命名一致,删除多余VOClass等。
已修改23个文件
已删除19个文件
已重命名28个文件
已添加9个文件
9520 ■■■■■ 文件已修改
Source/UBCS-WEB/src/api/code/codeKeyAttrRepeat.js 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codeKeyAttrRepeat.js 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/codeKeyAttrRepeat.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClsflowtempDTO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClstempattrDTO.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClstemplateDTO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeKeyAttrRepeatDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplate.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeKeyAttrRepeat.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseattrEntity.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeClsflowtempVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeClstempattrVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeClstemplateVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeKeyAttrRepeatVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeImportTemplateVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeImprotDataVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/MdmUIInfoVO.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SmOperationVO.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SmUserVO.java 393 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UIFormDefineVO.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UIFormItemVO.java 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UITableDefineVO.java 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UITableFieldVO.java 402 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UITablePageVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyTemplateAttrController.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyTemplateController.java 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClsflowtempController.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeKeyAttrRepeatController.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseAttrController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeButtonClient.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClassifyTemplateAttrClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClassifyTemplateClient.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClsflowtempClient.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeKeyAttrRepeatClient.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseAttrClient.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempButtonClient.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeClassifyTemplateAttrClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeClsflowtempClient.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseAttrClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempButtonClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/lCodeClassifyTemplateClient.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/lCodeKeyAttrRepeatClient.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyTemplateMapper.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClsflowtempMapper.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeKeyAttrRepeatMapper.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyProcessTempService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClsflowtempService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyAttrRepeatService.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java 791 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClsflowtempServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyAttrRepeatServiceImpl.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | 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 2230 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 764 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyProcessTempWrapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyTemplateAttrWrapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyTemplateWrapper.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClsflowtempWrapper.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeKeyAttrRepeatWrapper.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClassifyTemplateMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeKeyAttrRepeatMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/code/codeKeyAttrRepeat.js
Source/UBCS-WEB/src/const/code/codeKeyAttrRepeat.js
ÎļþÃû´Ó 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-system/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-system/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-system/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-system/enum/dictionary?code=codeKeyFlag",
      dataType: "String",
      props: {
        label: "dictValue",
        value: "dictKey"
        label: "itemName",
        value: "itemValue"
      },
      rules: [{
        required: true,
Source/UBCS-WEB/src/views/code/codeKeyAttrRepeat.vue
ÎļþÃû´Ó Source/UBCS-WEB/src/views/code/plCodeKeyattrrepeat.vue ÐÞ¸Ä
@@ -32,8 +32,8 @@
</template>
<script>
  import {getList, getDetail, add, update, remove} from "@/api/code/plCodeKeyattrrepeat";
  import option from "@/const/code/plCodeKeyattrrepeat";
  import {getList, getDetail, add, update, remove} from "@/api/code/codeKeyAttrRepeat";
  import option from "@/const/code/codeKeyAttrRepeat";
  import {mapGetters} from "vuex";
  export default {
@@ -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/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClsflowtempDTO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClstempattrDTO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClstemplateDTO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeKeyAttrRepeatDTO.java
ÎļþÃû´Ó Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeKeyattrrepeatDTO.java ÐÞ¸Ä
@@ -16,7 +16,7 @@
 */
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -28,7 +28,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CodeKeyattrrepeatDTO extends CodeKeyattrrepeatEntity {
public class CodeKeyAttrRepeatDTO extends CodeKeyAttrRepeat {
    private static final long serialVersionUID = 1L;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplate.java
ÎļþÃû´Ó Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java ÐÞ¸Ä
@@ -35,7 +35,7 @@
@TableName("PL_CODE_CLSTEMPLATE")
@ApiModel(value = "PlCodeClstemplate对象", description = "编码库定义-模板管理")
@EqualsAndHashCode(callSuper = true)
public class CodeClstemplateEntity  extends BaseModel {
public class CodeClassifyTemplate extends BaseModel {
    /**
     * ä¸»é¢˜åº“分类主键
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeKeyAttrRepeat.java
ÎļþÃû´Ó Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeKeyattrrepeatEntity.java ÐÞ¸Ä
@@ -38,7 +38,7 @@
@TableName("PL_CODE_KEYATTRREPEAT")
@ApiModel(value = "PlCodeKeyattrrepeat对象", description = "关键属性查重规则")
//@EqualsAndHashCode(callSuper = true)
public class CodeKeyattrrepeatEntity  implements Serializable {
public class CodeKeyAttrRepeat implements Serializable {
    /**
     *
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseattrEntity.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeClsflowtempVO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeClstempattrVO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeClstemplateVO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeKeyAttrRepeatVO.java
ÎļþÃû´Ó Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeKeyattrrepeatVO.java ÐÞ¸Ä
@@ -16,7 +16,7 @@
 */
package com.vci.ubcs.code.vo;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -28,7 +28,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CodeKeyattrrepeatVO extends CodeKeyattrrepeatEntity {
public class CodeKeyAttrRepeatVO extends CodeKeyAttrRepeat {
    private static final long serialVersionUID = 1L;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeImportTemplateVO.java
@@ -1,14 +1,12 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import java.util.ArrayList;
import java.util.List;
public class CodeImportTemplateVO {
    private List<ColumnVO> cloNamesList=new ArrayList<>();
    private CodeClstemplateVO codeClstemplateVO;
    private CodeClassifyTemplateVO codeClstemplateVO;
    private CodeClassifyVO codeClassifyVO;
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeImprotDataVO.java
@@ -1,8 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@@ -49,14 +47,14 @@
     * æ•°æ®
     */
    private List<Map<String,String>> datas = new ArrayList<>();
    private CodeClstemplateVO codeClstemplateVO;
    private CodeClassifyTemplateVO codeClstemplateVO;
    private CodeClassifyVO codeClassifyVO;
    public CodeClstemplateVO getCodeClassifyTemplateVO() {
    public CodeClassifyTemplateVO getCodeClassifyTemplateVO() {
        return codeClstemplateVO;
    }
    public void setCodeClassifyTemplateVO(CodeClstemplateVO codeClstemplateVO) {
    public void setCodeClassifyTemplateVO(CodeClassifyTemplateVO codeClstemplateVO) {
        this.codeClstemplateVO = codeClstemplateVO;
    }
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/MdmUIInfoVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.vci.ubcs.code.vo.pagemodel;
import java.util.List;
public class MdmUIInfoVO implements java.io.Serializable {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 4192521596336111375L;
    /**
     * æ¨¡æ¿çš„信息
     */
    private CodeClassifyTemplateVO templateVO;
    /**
     * è¡¨æ ¼çš„信息
     */
    private UITableDefineVO tableDefineVO;
    /**
     * è¡¨å•的信息
     */
    private UIFormDefineVO formDefineVO;
    /**
     * æŸ¥é‡å±žæ€§çš„相关表格的信息
     */
    private UITableDefineVO resembleTableVO;
    /**
     * æŒ‰é’®çš„内容
     */
    private List<SmOperationVO> buttons;
    /**
     * å½“前分类是否为叶子节点
     */
    private boolean leaf;
    public List<SmOperationVO> getButtons() {
        return buttons;
    }
    public void setButtons(List<SmOperationVO> buttons) {
        this.buttons = buttons;
    }
    public CodeClassifyTemplateVO getTemplateVO() {
        return templateVO;
    }
    public void setTemplateVO(CodeClassifyTemplateVO templateVO) {
        this.templateVO = templateVO;
    }
    public UITableDefineVO getTableDefineVO() {
        return tableDefineVO;
    }
    public void setTableDefineVO(UITableDefineVO tableDefineVO) {
        this.tableDefineVO = tableDefineVO;
    }
    public UIFormDefineVO getFormDefineVO() {
        return formDefineVO;
    }
    public void setFormDefineVO(UIFormDefineVO formDefineVO) {
        this.formDefineVO = formDefineVO;
    }
    public boolean isLeaf() {
        return leaf;
    }
    public void setLeaf(boolean leaf) {
        this.leaf = leaf;
    }
    public UITableDefineVO getResembleTableVO() {
        return resembleTableVO;
    }
    public void setResembleTableVO(UITableDefineVO resembleTableVO) {
        this.resembleTableVO = resembleTableVO;
    }
    @Override
    public String toString() {
        return "MdmUIInfoVO{" +
            "templateVO=" + templateVO +
            ", tableDefineVO=" + tableDefineVO +
            ", formDefineVO=" + formDefineVO +
            ", resembleTableVO=" + resembleTableVO +
            ", buttons=" + buttons +
            ", leaf=" + leaf +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SmOperationVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.vci.ubcs.code.vo.pagemodel;
/**
 * èœå•的按钮对象
 * @author weidy
 * @date 2022-2-23
 */
public class SmOperationVO implements java.io.Serializable{
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 8193579608741643735L;
    /**
     * åŠŸèƒ½çš„ä¸»é”®
     */
    private String functionOid;
    /**
     * åŠŸèƒ½çš„ç¼–å·
     */
    private String moduleNo;
    /**
     * åŠŸèƒ½å’ŒæŒ‰é’®å…³è”çš„ä¸»é”®
     */
    private String oid;
    /**
     * å”¯ä¸€æ ‡è¯†ç¬¦
     */
    private String uniqueFlag;
    /**
     * æè¿°
     */
    private String description;
    /**
     * åœ¨åŠŸèƒ½ä¸­çš„æŽ’åºå·
     */
    private String orderNo;
    /**
     * æŒ‰é’®åç§°ï¼Œæ˜¯æ“ä½œç±»åž‹çš„名称
     */
    private String name;
    /**
     * æŒ‰é’®æ˜µç§°ï¼Œæ˜¯åœ¨åŠŸèƒ½å’ŒæŒ‰é’®çš„å…³è”ä¸­çš„æ˜µç§°ï¼Œå‰ç«¯ä½¿ç”¨è¿™ä¸ªæ¥æ˜¾ç¤ºæŒ‰é’®
     */
    private String alias;
    /**
     * æ‰§è¡Œçš„js内容
     */
    private String executeJs;
    /**
     * å›¾æ ‡æ ·å¼
     */
    private String iconCls;
    public String getFunctionOid() {
        return functionOid;
    }
    public void setFunctionOid(String functionOid) {
        this.functionOid = functionOid;
    }
    public String getOid() {
        return oid;
    }
    public void setOid(String oid) {
        this.oid = oid;
    }
    public String getUniqueFlag() {
        return uniqueFlag;
    }
    public void setUniqueFlag(String uniqueFlag) {
        this.uniqueFlag = uniqueFlag;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAlias() {
        return alias;
    }
    public void setAlias(String alias) {
        this.alias = alias;
    }
    public String getModuleNo() {
        return moduleNo;
    }
    public void setModuleNo(String moduleNo) {
        this.moduleNo = moduleNo;
    }
    public String getExecuteJs() {
        return executeJs;
    }
    public void setExecuteJs(String executeJs) {
        this.executeJs = executeJs;
    }
    public String getIconCls() {
        return iconCls;
    }
    public void setIconCls(String iconCls) {
        this.iconCls = iconCls;
    }
    @Override
    public String toString() {
        return "SmOperationVO{" +
            "functionOid='" + functionOid + '\'' +
            ", moduleNo='" + moduleNo + '\'' +
            ", oid='" + oid + '\'' +
            ", uniqueFlag='" + uniqueFlag + '\'' +
            ", description='" + description + '\'' +
            ", orderNo='" + orderNo + '\'' +
            ", name='" + name + '\'' +
            ", alias='" + alias + '\'' +
            ", executeJs='" + executeJs + '\'' +
            ", iconCls='" + iconCls + '\'' +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SmUserVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,393 @@
package com.vci.ubcs.code.vo.pagemodel;
import java.util.Date;
/**
 * ç”¨æˆ·æ˜¾ç¤ºå¯¹è±¡ï¼Œæ³¨æ„å’Œè¿™ä¸ªä¸åŒ…含密码字段
 * @author weidy
 * @date 2020/1/29
 */
public class SmUserVO extends BaseModelVO {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = -8583106405033336802L;
    /**
     * ç”¨æˆ·å
     */
    private String id;
    /**
     * ç”¨æˆ·å§“名
     */
    private String name;
    /**
     * ç”¨æˆ·ç±»åž‹
     */
    private String userType;
    /**
     * ç”¨æˆ·ç±»åž‹æ˜¾ç¤ºæ–‡æœ¬
     */
    private String userTypeText;
    /**
     * æ‰€å±žäººå‘˜
     */
    private String pkPerson;
    /**
     * æ‰€å±žäººå‘˜åç§°
     */
    private String pkPersonName;
    /**
     * å¤±æ•ˆæ—¥æœŸ
     */
    private Date disabledate;
    /**
     * é‚®ä»¶åœ°å€
     */
    private String email;
    /**
     * ç”µè¯
     */
    private String tel;
    /**
     * RTX联系号
     */
    private String rtxNo;
    /**
     * å®žæ—¶é€šè®¯è½¯ä»¶è´¦å·
     */
    private String IMNo;
    /**
     * æ‰€å±žéƒ¨é—¨
     */
    private String pkDepartment;
    /**
     * æ‰€å±žéƒ¨é—¨åç§°
     */
    private String pkDepartmentName;
    /**
     * æ‰€å±žèŒåŠ¡
     */
    private String pkDuty;
    /**
     * æ‰€å±žèŒåŠ¡åç§°
     */
    private String pkDutyName;
    /**
     * æ‰€å±žå¯†ç å®‰å…¨ç­–ç•¥
     */
    private String pkPasswordStrategy;
    /**
     * æ‰€å±žå¯†ç å®‰å…¨ç­–ç•¥
     */
    private String pkPasswordStrategyName;
    /**
     * æœ€åŽç™»å½•æ—¶é—´
     */
    private Date lastLoginTime;
    /**
     * æœ€åŽä¿®æ”¹å¯†ç æ—¶é—´
     */
    private Date lastModifyPasswordTime;
    /**
     * å¯†ç é”™è¯¯æ¬¡æ•°
     */
    private Integer pwdWrongCount;
    /**
     * æ€§åˆ«
     */
    private String sex;
    /**
     * æ€§åˆ«æ˜¾ç¤ºåç§°
     */
    private String sexText;
    /**
     * é»˜è®¤çš„语言编码
     */
    private String langCode;
    /**
     * é»˜è®¤çš„语言名称
     */
    private String langCodeText;
    /**
     * æ˜¯å¦é”å®š
     */
    private boolean lockFlag;
    /**
     * å¤´åƒ
     */
    private String photo;
    @Override
    public String getId() {
        return id;
    }
    @Override
    public void setId(String id) {
        this.id = id;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public void setName(String name) {
        this.name = name;
    }
    public String getUserType() {
        return userType;
    }
    public void setUserType(String userType) {
        this.userType = userType;
    }
    public String getUserTypeText() {
        return userTypeText;
    }
    public void setUserTypeText(String userTypeText) {
        this.userTypeText = userTypeText;
    }
    public String getPkPerson() {
        return pkPerson;
    }
    public void setPkPerson(String pkPerson) {
        this.pkPerson = pkPerson;
    }
    public String getPkPersonName() {
        return pkPersonName;
    }
    public void setPkPersonName(String pkPersonName) {
        this.pkPersonName = pkPersonName;
    }
    public Date getDisabledate() {
        return disabledate;
    }
    public void setDisabledate(Date disabledate) {
        this.disabledate = disabledate;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getRtxNo() {
        return rtxNo;
    }
    public void setRtxNo(String rtxNo) {
        this.rtxNo = rtxNo;
    }
    public String getIMNo() {
        return IMNo;
    }
    public void setIMNo(String IMNo) {
        this.IMNo = IMNo;
    }
    public String getPkDepartment() {
        return pkDepartment;
    }
    public void setPkDepartment(String pkDepartment) {
        this.pkDepartment = pkDepartment;
    }
    public String getPkDepartmentName() {
        return pkDepartmentName;
    }
    public void setPkDepartmentName(String pkDepartmentName) {
        this.pkDepartmentName = pkDepartmentName;
    }
    public String getPkDuty() {
        return pkDuty;
    }
    public void setPkDuty(String pkDuty) {
        this.pkDuty = pkDuty;
    }
    public String getPkDutyName() {
        return pkDutyName;
    }
    public void setPkDutyName(String pkDutyName) {
        this.pkDutyName = pkDutyName;
    }
    public String getPkPasswordStrategy() {
        return pkPasswordStrategy;
    }
    public void setPkPasswordStrategy(String pkPasswordStrategy) {
        this.pkPasswordStrategy = pkPasswordStrategy;
    }
    public String getPkPasswordStrategyName() {
        return pkPasswordStrategyName;
    }
    public void setPkPasswordStrategyName(String pkPasswordStrategyName) {
        this.pkPasswordStrategyName = pkPasswordStrategyName;
    }
    public Date getLastLoginTime() {
        return lastLoginTime;
    }
    public void setLastLoginTime(Date lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }
    public Date getLastModifyPasswordTime() {
        return lastModifyPasswordTime;
    }
    public void setLastModifyPasswordTime(Date lastModifyPasswordTime) {
        this.lastModifyPasswordTime = lastModifyPasswordTime;
    }
    public Integer getPwdWrongCount() {
        return pwdWrongCount;
    }
    public void setPwdWrongCount(Integer pwdWrongCount) {
        this.pwdWrongCount = pwdWrongCount;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getSexText() {
        return sexText;
    }
    public void setSexText(String sexText) {
        this.sexText = sexText;
    }
    public String getLangCode() {
        return langCode;
    }
    public void setLangCode(String langCode) {
        this.langCode = langCode;
    }
    public String getLangCodeText() {
        return langCodeText;
    }
    public void setLangCodeText(String langCodeText) {
        this.langCodeText = langCodeText;
    }
    public boolean isLockFlag() {
        return lockFlag;
    }
    public void setLockFlag(boolean lockFlag) {
        this.lockFlag = lockFlag;
    }
    public String getPhoto() {
        return photo;
    }
    public void setPhoto(String photo) {
        this.photo = photo;
    }
    @Override
    public String toString() {
        return "SmUserVO{" +
            "oid='" + getOid() + '\'' +
            ",id='" + id + '\'' +
            ", name='" + name + '\'' +
            ", userType='" + userType + '\'' +
            ", userTypeText='" + userTypeText + '\'' +
            ", pkPerson='" + pkPerson + '\'' +
            ", pkPersonName='" + pkPersonName + '\'' +
            ", disabledate=" + disabledate +
            ", email='" + email + '\'' +
            ", tel='" + tel + '\'' +
            ", rtxNo='" + rtxNo + '\'' +
            ", IMNo='" + IMNo + '\'' +
            ", pkDepartment='" + pkDepartment + '\'' +
            ", pkDepartmentName='" + pkDepartmentName + '\'' +
            ", pkDuty='" + pkDuty + '\'' +
            ", pkDutyName='" + pkDutyName + '\'' +
            ", pkPasswordStrategy='" + pkPasswordStrategy + '\'' +
            ", pkPasswordStrategyName='" + pkPasswordStrategyName + '\'' +
            ", lastLoginTime=" + lastLoginTime +
            ", lastModifyPasswordTime=" + lastModifyPasswordTime +
            ", pwdWrongCount=" + pwdWrongCount +
            ", sex='" + sex + '\'' +
            ", sexText='" + sexText + '\'' +
            ", langCode='" + langCode + '\'' +
            ", langCodeText='" + langCodeText + '\'' +
            ", lockFlag='" + lockFlag + '\'' +
            ", photo='" + photo + '\'' +
            ",description='" + getDescription() + '\'' +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UIFormDefineVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
package com.vci.ubcs.code.vo.pagemodel;
import java.util.ArrayList;
import java.util.List;
/**
 * è¡¨å•的定义信息
 * @author weidy
 * @date 2021/2/15
 */
public class UIFormDefineVO implements java.io.Serializable {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 4870957433172577436L;
    /**
     * è¡¨å•的主键
     */
    private String oid;
    /**
     * è¡¨å•的编号
     */
    private String id;
    /**
     * ä¸šåŠ¡ç±»åž‹
     */
    private String btmType;
    /**
     * æ˜¯å¦ä¸ºé“¾æŽ¥ç±»åž‹
     */
    private boolean linkTypeFlag;
    /**
     * æ¯è¡Œæ˜¾ç¤ºå¤šå°‘列
     */
    private int columnOneRow;
    /**
     * æŸ¥è¯¢æ¨¡æ¿åç§°
     */
    private String queryTemplateName;
    /**
     * åŒ…含的明细
     */
    private List<UIFormItemVO> items = new ArrayList();
    /**
     * freeMarker的表达式的值
     */
    private List<String> freeMarkerEls = new ArrayList<>();
    public String getOid() {
        return oid;
    }
    public void setOid(String oid) {
        this.oid = oid;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getBtmType() {
        return btmType;
    }
    public void setBtmType(String btmType) {
        this.btmType = btmType;
    }
    public int getColumnOneRow() {
        return columnOneRow;
    }
    public void setColumnOneRow(int columnOneRow) {
        this.columnOneRow = columnOneRow;
    }
    public String getQueryTemplateName() {
        return queryTemplateName;
    }
    public void setQueryTemplateName(String queryTemplateName) {
        this.queryTemplateName = queryTemplateName;
    }
    public List<UIFormItemVO> getItems() {
        return items;
    }
    public void setItems(List<UIFormItemVO> items) {
        this.items = items;
    }
    public boolean isLinkTypeFlag() {
        return linkTypeFlag;
    }
    public void setLinkTypeFlag(boolean linkTypeFlag) {
        this.linkTypeFlag = linkTypeFlag;
    }
    public List<String> getFreeMarkerEls() {
        return freeMarkerEls;
    }
    public void setFreeMarkerEls(List<String> freeMarkerEls) {
        this.freeMarkerEls = freeMarkerEls;
    }
    @Override
    public String toString() {
        return "UIFormDefineVO{" +
            "oid='" + oid + '\'' +
            ", id='" + id + '\'' +
            ", btmType='" + btmType + '\'' +
            ", linkTypeFlag=" + linkTypeFlag +
            ", columnOneRow=" + columnOneRow +
            ", queryTemplateName='" + queryTemplateName + '\'' +
            ", items=" + items +
            ", freeMarkerEls=" + freeMarkerEls +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UIFormItemVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,350 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.pagemodel.UIFormReferVO;
import java.util.List;
import java.util.Map;
/**
 * è¡¨å•的字段
 * @author weidy
 * @date 2021/2/24
 */
public class UIFormItemVO implements java.io.Serializable {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 3589862839886943864L;
    /**
     * å­—段名
     */
    private String field;
    /**
     * æ˜¾ç¤ºç±»åž‹
     */
    private String text;
    /**
     * åªè¯»
     */
    private boolean readOnly;
    /**
     * å¿…å¡«
     */
    private boolean required;
    /**
     * å”¯ä¸€
     */
    private boolean unique;
    /**
     * å…³é”®å±žæ€§
     */
    private boolean keyAttr;
    /**
     * é»˜è®¤å€¼
     */
    private String defaultValue;
    /**
     * ç±»åž‹
     */
    private String type = "text";
    /**
     * æ˜¾ç¤ºè¡¨è¾¾å¼
     */
    private String displayExtension;
    /**
     * æ—¶é—´æ ¼å¼
     */
    private String dateFormate;
    /**
     * æ˜¯å¦éšè—
     */
    private boolean hidden = false;
    /**
     * æ ¡éªŒè§„则
     */
    private String verify;
    /**
     * æç¤ºä¿¡æ¯
     */
    private String tooltips;
    /**
     * è‡ªå®šä¹‰ç±»åç§°
     */
    private String customClass;
    /**
     * ä¸‹æ‹‰èœå•的名称
     */
    private String comboxKey;
    /**
     * ä¸‹æ‹‰èœå•的选项值
     */
    private List<KeyValue> data = null;
    /**
     * é€‰æ‹©åº“的标记
     */
    private String selectLibFlag;
    /**
     * å‚照显示的字段
     */
    private String showField;
    /**
     * å‚照的信息
     */
    private UIFormReferVO referConfig;
    /**
     * é™„加属性
     */
    private Map<String,String> extendAttrMap;
    /**
     * åŽŸæœ¬çš„å±žæ€§
     */
    private String extendAttrString;
    /**
     * å‰ç¼€
     */
    private String prefix;
    /**
     * åŽç¼€
     */
    private String suffix;
    public boolean isKeyAttr() {
        return keyAttr;
    }
    public void setKeyAttr(boolean keyAttr) {
        this.keyAttr = keyAttr;
    }
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public boolean isReadOnly() {
        return readOnly;
    }
    public void setReadOnly(boolean readOnly) {
        this.readOnly = readOnly;
    }
    public boolean isRequired() {
        return required;
    }
    public void setRequired(boolean required) {
        this.required = required;
    }
    public String getDefaultValue() {
        return defaultValue;
    }
    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getDisplayExtension() {
        return displayExtension;
    }
    public void setDisplayExtension(String displayExtension) {
        this.displayExtension = displayExtension;
    }
    public String getDateFormate() {
        return dateFormate;
    }
    public void setDateFormate(String dateFormate) {
        this.dateFormate = dateFormate;
    }
    public boolean isHidden() {
        return hidden;
    }
    public void setHidden(boolean hidden) {
        this.hidden = hidden;
    }
    public String getVerify() {
        return verify;
    }
    public void setVerify(String verify) {
        this.verify = verify;
    }
    public String getTooltips() {
        return tooltips;
    }
    public void setTooltips(String tooltips) {
        this.tooltips = tooltips;
    }
    public String getCustomClass() {
        return customClass;
    }
    public void setCustomClass(String customClass) {
        this.customClass = customClass;
    }
    public String getComboxKey() {
        return comboxKey;
    }
    public void setComboxKey(String comboxKey) {
        this.comboxKey = comboxKey;
    }
    public List<KeyValue> getData() {
        return data;
    }
    public void setData(List<KeyValue> data) {
        this.data = data;
    }
    public String getShowField() {
        return showField;
    }
    public void setShowField(String showField) {
        this.showField = showField;
    }
    public UIFormReferVO getReferConfig() {
        return referConfig;
    }
    public void setReferConfig(UIFormReferVO referConfig) {
        this.referConfig = referConfig;
    }
    public Map<String, String> getExtendAttrMap() {
        return extendAttrMap;
    }
    public void setExtendAttrMap(Map<String, String> extendAttrMap) {
        this.extendAttrMap = extendAttrMap;
    }
    public String getExtendAttrString() {
        return extendAttrString;
    }
    public void setExtendAttrString(String extendAttrString) {
        this.extendAttrString = extendAttrString;
    }
    public boolean isUnique() {
        return unique;
    }
    public void setUnique(boolean unique) {
        this.unique = unique;
    }
    public String getPrefix() {
        return prefix;
    }
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
    public String getSuffix() {
        return suffix;
    }
    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
    public String getSelectLibFlag() {
        return selectLibFlag;
    }
    public void setSelectLibFlag(String selectLibFlag) {
        this.selectLibFlag = selectLibFlag;
    }
    @Override
    public String toString() {
        return "UIFormItemVO{" +
            "field='" + field + '\'' +
            ", text='" + text + '\'' +
            ", readOnly=" + readOnly +
            ", required=" + required +
            ", unique=" + unique +
            ", keyAttr=" + keyAttr +
            ", defaultValue='" + defaultValue + '\'' +
            ", type='" + type + '\'' +
            ", displayExtension='" + displayExtension + '\'' +
            ", dateFormate='" + dateFormate + '\'' +
            ", hidden=" + hidden +
            ", verify='" + verify + '\'' +
            ", tooltips='" + tooltips + '\'' +
            ", customClass='" + customClass + '\'' +
            ", comboxKey='" + comboxKey + '\'' +
            ", data=" + data +
            ", selectLibFlag='" + selectLibFlag + '\'' +
            ", showField='" + showField + '\'' +
            ", referConfig=" + referConfig +
            ", extendAttrMap=" + extendAttrMap +
            ", extendAttrString='" + extendAttrString + '\'' +
            ", prefix='" + prefix + '\'' +
            ", suffix='" + suffix + '\'' +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UITableDefineVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,237 @@
package com.vci.ubcs.code.vo.pagemodel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * è¡¨æ ¼å®šä¹‰
 * @author weidy
 * @date 2021/2/15
 */
public class UITableDefineVO implements java.io.Serializable {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 1664618940805858993L;
    /**
     * è¡¨æ ¼çš„主键
     */
    private String oid;
    /**
     * è¡¨å•的编号
     */
    private String id;
    /**
     * ä¸šåŠ¡ç±»åž‹
     */
    private String btmType;
    /**
     * æ˜¯å¦ä¸ºé“¾æŽ¥ç±»åž‹
     */
    private boolean linkTypeFlag;
    /**
     * æŸ¥è¯¢æ¨¡æ¿åç§°
     */
    private String queryTemplateName;
    /**
     * é¡µé¢
     */
    private UITablePageVO pageVO;
    /**
     * åˆ†é¡µçš„内容
     */
    private Integer[] limits;
    /**
     * é™„加条件
     */
    private String whereSql;
    /**
     * æ˜¯å¦æ˜¾ç¤ºæŸ¥è¯¢åŒºåŸŸ
     */
    private boolean displayQueryArea;
    /**
     * æ˜¾ç¤ºæ–‡ä»¶å¤¹
     */
    private boolean displayFolder ;
    /**
     * çˆ¶åç§°çš„字段
     */
    private String folderParentField;
    /**
     * åŒ…含的列
     */
    private List<List<UITableFieldVO>> cols;
    /**
     * æ˜¯å¦åŒ…含
     */
    private boolean hasEditor;
    /**
     * é«˜çº§æŸ¥è¯¢çš„列
     */
    private List<UITableFieldVO> seniorQueryColumns;
    /**
     * æŸ¥è¯¢çš„列
     */
    private List<UITableFieldVO> queryColumns;
    /**
     * freeMarker的表达式的值
     */
    private List<String> freeMarkerEls = new ArrayList<>();
    public boolean isDisplayQueryArea() {
        return displayQueryArea;
    }
    public void setDisplayQueryArea(boolean displayQueryArea) {
        this.displayQueryArea = displayQueryArea;
    }
    public boolean isDisplayFolder() {
        return displayFolder;
    }
    public void setDisplayFolder(boolean displayFolder) {
        this.displayFolder = displayFolder;
    }
    public String getFolderParentField() {
        return folderParentField;
    }
    public void setFolderParentField(String folderParentField) {
        this.folderParentField = folderParentField;
    }
    public String getOid() {
        return oid;
    }
    public void setOid(String oid) {
        this.oid = oid;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getBtmType() {
        return btmType;
    }
    public void setBtmType(String btmType) {
        this.btmType = btmType;
    }
    public boolean isLinkTypeFlag() {
        return linkTypeFlag;
    }
    public void setLinkTypeFlag(boolean linkTypeFlag) {
        this.linkTypeFlag = linkTypeFlag;
    }
    public String getQueryTemplateName() {
        return queryTemplateName;
    }
    public void setQueryTemplateName(String queryTemplateName) {
        this.queryTemplateName = queryTemplateName;
    }
    public List<List<UITableFieldVO>> getCols() {
        return cols;
    }
    public void setCols(List<List<UITableFieldVO>> cols) {
        this.cols = cols;
    }
    public List<UITableFieldVO> getQueryColumns() {
        return queryColumns;
    }
    public void setQueryColumns(List<UITableFieldVO> queryColumns) {
        this.queryColumns = queryColumns;
    }
    public UITablePageVO getPageVO() {
        return pageVO;
    }
    public void setPageVO(UITablePageVO pageVO) {
        this.pageVO = pageVO;
    }
    public Integer[] getLimits() {
        return limits;
    }
    public void setLimits(Integer[] limits) {
        this.limits = limits;
    }
    public String getWhereSql() {
        return whereSql;
    }
    public void setWhereSql(String whereSql) {
        this.whereSql = whereSql;
    }
    public List<UITableFieldVO> getSeniorQueryColumns() {
        return seniorQueryColumns;
    }
    public void setSeniorQueryColumns(List<UITableFieldVO> seniorQueryColumns) {
        this.seniorQueryColumns = seniorQueryColumns;
    }
    public boolean isHasEditor() {
        return hasEditor;
    }
    public void setHasEditor(boolean hasEditor) {
        this.hasEditor = hasEditor;
    }
    @Override
    public String toString() {
        return "UITableDefineVO{" +
            "oid='" + oid + '\'' +
            ", id='" + id + '\'' +
            ", btmType='" + btmType + '\'' +
            ", linkTypeFlag=" + linkTypeFlag +
            ", queryTemplateName='" + queryTemplateName + '\'' +
            ", pageVO=" + pageVO +
            ", limits=" + Arrays.toString(limits) +
            ", whereSql='" + whereSql + '\'' +
            ", displayQueryArea=" + displayQueryArea +
            ", displayFolder=" + displayFolder +
            ", folderParentField='" + folderParentField + '\'' +
            ", cols=" + cols +
            ", queryColumns=" + queryColumns +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UITableFieldVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,402 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.pagemodel.UIFormReferVO;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * åˆ—表的列的信息
 * @author weidy
 * @date 2021/2/25
 */
public class UITableFieldVO implements java.io.Serializable{
    /**
     * åˆ—名
     */
    private String field;
    /**
     * æ˜¾ç¤ºçš„名称
     */
    private String title;
    /**
     * å­—段类型
     */
    private String fieldType;
    /**
     * æ˜¯å¦æŽ’序
     */
    private boolean sort = false;
    /**
     * æŽ’序字段
     */
    private String sortField ;
    /**
     * éšè—çš„字段
     */
    private boolean hidden = false;
    /**
     * å®½åº¦
     */
    private Integer width;
    /**
     * æœ€å°çš„宽度
     */
    private Integer minWidth;
    /**
     * å›ºå®šä½ç½®ï¼Œæ”¯æŒright和left
     */
    private String fixed;
    /**
     * æ‰€å çš„列
     */
    private Integer colspan = 1;
    /**
     * æ‰€ç«™çš„行
     */
    private Integer rowspan = 1;
    /**
     * æ¨¡æ¿çš„的内容
     */
    private String templet;
    /**
     * æ—¶é—´æ ¼å¼
     */
    private String dateFormate;
    /**
     * æ˜¯å¦æ“ä½œåˆ—
     */
    private boolean optionField = false;
    /**
     * æ“ä½œåˆ—包含的按钮
     */
    private List<KeyValue> optionButtons;
    /**
     * äº‹ä»¶-执行js的映射
     */
    private Map<String,String> optionJsMap;
    /**
     * æ˜¯å¦ç¼–辑
     */
    private String edit;
    /**
     * ç¼–辑的配置
     */
    private String editConfig ;
    /**
     * å¯¹é½æ–¹å¼
     */
    private String align = "left";
    /**
     * ç‰¹æ®Šæ ·å¼
     */
    private String style;
    /**
     * å•元格点击事件
     */
    private String event;
    /**
     * ç¦ç”¨æ‹–拽列宽
     */
    private boolean unresize = false;
    /**
     * ä¸‹æ‹‰èœå•的名称
     */
    private String comboxKey;
    /**
     * ä¸‹æ‹‰èœå•的选项值
     */
    private List<KeyValue> data = new ArrayList<>();
    /**
     * å‚照显示的字段
     */
    private String showField;
    /**
     * æŸ¥è¯¢çš„字段
     */
    private String queryField;
    /**
     * å‚照的信息
     */
    private UIFormReferVO referConfig;
    public Map<String, String> getOptionJsMap() {
        return optionJsMap;
    }
    public void setOptionJsMap(Map<String, String> optionJsMap) {
        this.optionJsMap = optionJsMap;
    }
    public String getFieldType() {
        return fieldType;
    }
    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }
    public String getDateFormate() {
        return dateFormate;
    }
    public void setDateFormate(String dateFormate) {
        this.dateFormate = dateFormate;
    }
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public boolean isSort() {
        return sort;
    }
    public void setSort(boolean sort) {
        this.sort = sort;
    }
    public String getSortField() {
        return sortField;
    }
    public void setSortField(String sortField) {
        this.sortField = sortField;
    }
    public boolean isHidden() {
        return hidden;
    }
    public void setHidden(boolean hidden) {
        this.hidden = hidden;
    }
    public Integer getWidth() {
        return width;
    }
    public void setWidth(Integer width) {
        this.width = width;
    }
    public Integer getMinWidth() {
        return minWidth;
    }
    public void setMinWidth(Integer minWidth) {
        this.minWidth = minWidth;
    }
    public String getFixed() {
        return fixed;
    }
    public void setFixed(String fixed) {
        this.fixed = fixed;
    }
    public Integer getColspan() {
        return colspan;
    }
    public void setColspan(Integer colspan) {
        this.colspan = colspan;
    }
    public Integer getRowspan() {
        return rowspan;
    }
    public void setRowspan(Integer rowspan) {
        this.rowspan = rowspan;
    }
    public String getTemplet() {
        return templet;
    }
    public void setTemplet(String templet) {
        this.templet = templet;
    }
    public boolean isOptionField() {
        return optionField;
    }
    public void setOptionField(boolean optionField) {
        this.optionField = optionField;
    }
    public List<KeyValue> getOptionButtons() {
        return optionButtons;
    }
    public void setOptionButtons(List<KeyValue> optionButtons) {
        this.optionButtons = optionButtons;
    }
    public String getEdit() {
        return edit;
    }
    public void setEdit(String edit) {
        this.edit = edit;
    }
    public String getEditConfig() {
        return editConfig;
    }
    public void setEditConfig(String editConfig) {
        this.editConfig = editConfig;
    }
    public String getAlign() {
        return align;
    }
    public void setAlign(String align) {
        this.align = align;
    }
    public String getStyle() {
        return style;
    }
    public void setStyle(String style) {
        this.style = style;
    }
    public String getEvent() {
        return event;
    }
    public void setEvent(String event) {
        this.event = event;
    }
    public boolean isUnresize() {
        return unresize;
    }
    public void setUnresize(boolean unresize) {
        this.unresize = unresize;
    }
    public String getComboxKey() {
        return comboxKey;
    }
    public void setComboxKey(String comboxKey) {
        this.comboxKey = comboxKey;
    }
    public List<KeyValue> getData() {
        return data;
    }
    public void setData(List<KeyValue> data) {
        this.data = data;
    }
    public String getShowField() {
        return showField;
    }
    public void setShowField(String showField) {
        this.showField = showField;
    }
    public UIFormReferVO getReferConfig() {
        return referConfig;
    }
    public void setReferConfig(UIFormReferVO referConfig) {
        this.referConfig = referConfig;
    }
    public String getQueryField() {
        return queryField;
    }
    public void setQueryField(String queryField) {
        this.queryField = queryField;
    }
    @Override
    public String toString() {
        return "UITableFieldVO{" +
            "field='" + field + '\'' +
            ", title='" + title + '\'' +
            ", fieldType='" + fieldType + '\'' +
            ", sort=" + sort +
            ", sortField='" + sortField + '\'' +
            ", hidden=" + hidden +
            ", width=" + width +
            ", minWidth=" + minWidth +
            ", fixed='" + fixed + '\'' +
            ", colspan=" + colspan +
            ", rowspan=" + rowspan +
            ", templet='" + templet + '\'' +
            ", dateFormate='" + dateFormate + '\'' +
            ", optionField=" + optionField +
            ", optionButtons=" + optionButtons +
            ", optionJsMap=" + optionJsMap +
            ", edit='" + edit + '\'' +
            ", editConfig='" + editConfig + '\'' +
            ", align='" + align + '\'' +
            ", style='" + style + '\'' +
            ", event='" + event + '\'' +
            ", unresize=" + unresize +
            ", comboxKey='" + comboxKey + '\'' +
            ", data=" + data +
            ", showField='" + showField + '\'' +
            ", queryField='" + queryField + '\'' +
            ", referConfig=" + referConfig +
            '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/UITablePageVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.vci.ubcs.code.vo.pagemodel;
/**
 * è¡¨æ ¼çš„分页对象
 * @author weidy
 * @date 2021/2/25
 */
public class UITablePageVO implements java.io.Serializable{
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = -6338518925812603615L;
    /**
     * æ¯é¡µæ˜¾ç¤ºæ•°é‡
     */
    private Integer limit = -1;
    /**
     * å½“前页数
     */
    private Integer page = 1;
    public Integer getLimit() {
        return limit;
    }
    public void setLimit(Integer limit) {
        this.limit = limit;
    }
    public Integer getPage() {
        return page;
    }
    public void setPage(Integer page) {
        this.page = page;
    }
    @Override
    public String toString() {
        return "UITablePageVO{" +
            "limit=" + limit +
            ", page=" + page +
            '}';
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyTemplateAttrController.java
@@ -18,10 +18,15 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.code.dto.CodeClassifyTemplateAttrDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
import com.vci.ubcs.code.service.ICodeClassifyTemplateAttrService;
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.code.wrapper.CodeClassifyTemplateAttrWrapper;
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 +36,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;
/**
 * ç¼–码库定义-模板属性 æŽ§åˆ¶å™¨
@@ -57,7 +65,7 @@
    @ApiOperation(value = "详情", notes = "传入CodeClstempattr")
    public R<CodeClassifyTemplateAttrVO> detail(CodeClassifyTemplateAttr CodeClstempattr) {
        CodeClassifyTemplateAttr detail = CodeClstempattrService.getOne(Condition.getQueryWrapper(CodeClstempattr));
        return R.data(CodeClstempattrWrapper.build().entityVO(detail));
        return R.data(CodeClassifyTemplateAttrWrapper.build().entityVO(detail));
    }
    /**
     * ç¼–码库定义-模板属性 åˆ†é¡µ
@@ -67,7 +75,7 @@
    @ApiOperation(value = "分页", notes = "传入CodeClstempattr")
    public R<IPage<CodeClassifyTemplateAttrVO>> list(CodeClassifyTemplateAttr CodeClstempattr, Query query) {
        IPage<CodeClassifyTemplateAttr> pages = CodeClstempattrService.page(Condition.getPage(query), Condition.getQueryWrapper(CodeClstempattr));
        return R.data(CodeClstempattrWrapper.build().pageVO(pages));
        return R.data(CodeClassifyTemplateAttrWrapper.build().pageVO(pages));
    }
    /**
@@ -122,4 +130,131 @@
    }
    /**
     * ä¸»é¢˜åº“分类的模板属性列表
     * @param baseQueryObject åŸºç¡€æŸ¥è¯¢å¯¹è±¡ï¼ŒåŒ…含查询条件,分页,排序等
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表
     */
    @GetMapping("/gridCodeClassifyTemplateAttr")
    public DataGrid<CodeClassifyTemplateAttrVO> gridCodeClassifyTemplateAttr(BaseQueryObject baseQueryObject){
        if(baseQueryObject == null){
            baseQueryObject = new BaseQueryObject();
        }
        return CodeClstempattrService.gridCodeClassifyTemplateAttr(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
    }
    /**
     * å¢žåŠ  ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PostMapping( "/addSave")
    public R<CodeClassifyTemplateAttrVO> addSave(@RequestBody CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO){
        CodeClassifyTemplateAttrVO codeClassifyTemplateAttrVO = CodeClstempattrService.addSave(codeClassifyTemplateAttrDTO);
        return R.data(codeClassifyTemplateAttrVO);
    }
    /**
     * æ‰¹é‡ä¿å­˜åˆ—表数据
     * @param list
     * @return
     */
    @PostMapping( "/batchAddSave")
    public R<List<CodeClassifyTemplateAttrVO>> batchAddSaves(@RequestBody List<CodeClassifyTemplateAttrDTO> list){
        if(CollectionUtils.isEmpty(list)){
            return R.fail("列表不能为空!");
        }
        List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrVOs = CodeClstempattrService.batchAddSave(list);
        return R.data(codeClassifyTemplateAttrVOs);
    }
    /**
     * ä¿®æ”¹ ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PutMapping("/editSave")
    public R<CodeClassifyTemplateAttrVO> editSave(@RequestBody CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO){
        return CodeClstempattrService.editSave(codeClassifyTemplateAttrDTO);
    }
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     */
    @DeleteMapping( "/deleteData")
    public R delCodeClassifyTemplateAttr(@RequestBody CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO) {
        return CodeClstempattrService.deleteCodeClassifyTemplateAttr(codeClassifyTemplateAttrDTO);
    }
    /**
     * ä¸»é”®èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oid ä¸»é”®
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    @GetMapping("/getObjectByOid")
    public R<CodeClassifyTemplateAttrVO> getObjectByOid(String oid){
        CodeClassifyTemplateAttrVO codeClassifyTemplateAttrVO = CodeClstempattrService.getObjectByOid(oid);
        return R.data(codeClassifyTemplateAttrVO);
    }
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oids ä¸»é”®ï¼Œå¤šä¸ªä»¥é€—号分隔,但是受性能影响,建议一次查询不超过10000个
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    @GetMapping("/listDataByOids")
    public R listCodeClassifyTemplateAttrByOids(String oids){
        Collection<CodeClassifyTemplateAttrVO> voCollection =  CodeClstempattrService.listCodeClassifyTemplateAttrByOids(VciBaseUtil.str2List(oids));
//        BaseResult baseResult = BaseResult.success();
//        baseResult.setData(voCollection);
        return  R.data(voCollection);
    }
    /**
     * å‚照主题库分类的模板属性列表
     * @param baseQueryObject åŸºç¡€æŸ¥è¯¢å¯¹è±¡ï¼ŒåŒ…含查询条件,分页,排序等
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     */
    @GetMapping("/refDataGrid")
    public DataGrid<CodeClassifyTemplateAttrVO> refDataGridCodeClassifyTemplateAttr(BaseQueryObject baseQueryObject){
        if(baseQueryObject == null){
            baseQueryObject = new BaseQueryObject();
        }
        return CodeClstempattrService.refDataGridCodeClassifyTemplateAttr(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªä¸šåŠ¡ç±»åž‹ä¸‹çš„æ‰€æœ‰å±žæ€§,排除掉这个模板已经存在的属性
     * @param baseQueryObject
     * @return
     */
    @GetMapping("/codeClassifyTemplateAttrByBtm")
    public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject){
        return CodeClstempattrService.codeClassifyTemplateAttrByBtm(baseQueryObject);
    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªä¸šåŠ¡ç±»åž‹ä¸‹ã€è¿™ä¸ªæ¨¡æ¿å·²ç»å­˜åœ¨çš„å±žæ€§
     * @param baseQueryObject
     * @return
     */
    @GetMapping("/codeClassifyTemplateAttrByBtmHave")
    public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject){
        return CodeClstempattrService.codeClassifyTemplateAttrByBtmHave(baseQueryObject);
    }
    /**
     * åŒæ­¥åˆ°å…¶ä»–模板
     * @param codeClassifyAttrDTO   id è‹±æ–‡åç§°
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping( "/copyto")
    public R copyto(@RequestBody CodeClassifyTemplateAttrDTO codeClassifyAttrDTO) {
        return CodeClstempattrService.copyto(codeClassifyAttrDTO);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyTemplateController.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java ÐÞ¸Ä
@@ -19,14 +19,16 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.code.dto.CodeClstemplateDTO;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.dto.CodeClassifyTemplateDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import com.vci.ubcs.code.enumpack.CodeClassifyTemplateLC;
import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
import com.vci.ubcs.code.mapper.CodeClassifyTemplateMapper;
import com.vci.ubcs.code.service.ICodeClstemplateService;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.code.wrapper.PlCodeClstemplateWrapper;
import com.vci.ubcs.code.wrapper.CodeClassifyTemplateWrapper;
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,13 +54,13 @@
 */
@RestController
@AllArgsConstructor
@RequestMapping("/codeClstemplate")
@RequestMapping("/codeClassifyTemplateController")
@Api(value = "编码库定义-模板管理", tags = "编码库定义-模板管理接口")
public class CodeClstemplateController extends BladeController {
public class CodeClassifyTemplateController extends BladeController {
    private final ICodeClstemplateService plCodeClstemplateService;
    CodeClstemplateMapper codeClstemplateMapper;
    CodeClassifyTemplateMapper codeClassifyTemplateMapper;
    /**
     * ç¼–码库定义-模板管理 è¯¦æƒ…
@@ -66,9 +68,9 @@
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入plCodeClstemplate")
    public R<CodeClstemplateVO> detail(CodeClstemplateEntity plCodeClstemplate) {
        CodeClstemplateEntity detail = plCodeClstemplateService.getOne(Condition.getQueryWrapper(plCodeClstemplate));
        return R.data(PlCodeClstemplateWrapper.build().entityVO(detail));
    public R<CodeClassifyTemplateVO> detail(CodeClassifyTemplate plCodeClstemplate) {
        CodeClassifyTemplate detail = plCodeClstemplateService.getOne(Condition.getQueryWrapper(plCodeClstemplate));
        return R.data(CodeClassifyTemplateWrapper.build().entityVO(detail));
    }
    /**
     * ç¼–码库定义-模板管理 åˆ†é¡µ,分类模板列表对应以前平台的gridCodeClassifyTemplate
@@ -76,9 +78,9 @@
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入plCodeClstemplate")
    public R<IPage<CodeClstemplateVO>> list(CodeClstemplateEntity plCodeClstemplate, Query query) {
        IPage<CodeClstemplateEntity> pages = plCodeClstemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(plCodeClstemplate));
        return R.data(PlCodeClstemplateWrapper.build().pageVO(pages));
    public R<IPage<CodeClassifyTemplateVO>> list(CodeClassifyTemplate plCodeClstemplate, Query query) {
        IPage<CodeClassifyTemplate> pages = plCodeClstemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(plCodeClstemplate));
        return R.data(CodeClassifyTemplateWrapper.build().pageVO(pages));
    }
    /**
@@ -87,8 +89,8 @@
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入plCodeClstemplate")
    public R<IPage<CodeClstemplateVO>> page(CodeClstemplateVO plCodeClstemplate, Query query) {
        IPage<CodeClstemplateVO> pages = plCodeClstemplateService.selectPlCodeClstemplatePage(Condition.getPage(query), plCodeClstemplate);
    public R<IPage<CodeClassifyTemplateVO>> page(CodeClassifyTemplateVO plCodeClstemplate, Query query) {
        IPage<CodeClassifyTemplateVO> pages = plCodeClstemplateService.selectPlCodeClstemplatePage(Condition.getPage(query), plCodeClstemplate);
        return R.data(pages);
    }
@@ -98,7 +100,7 @@
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入plCodeClstemplate")
    public R save(@Valid @RequestBody CodeClstemplateEntity plCodeClstemplate) {
    public R save(@Valid @RequestBody CodeClassifyTemplate plCodeClstemplate) {
        return R.status(plCodeClstemplateService.save(plCodeClstemplate));
    }
@@ -108,7 +110,7 @@
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入plCodeClstemplate")
    public R update(@Valid @RequestBody CodeClstemplateEntity plCodeClstemplate) {
    public R update(@Valid @RequestBody CodeClassifyTemplate plCodeClstemplate) {
        return R.status(plCodeClstemplateService.updateById(plCodeClstemplate));
    }
@@ -118,7 +120,7 @@
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入plCodeClstemplate")
    public R submit(@Valid @RequestBody CodeClstemplateEntity plCodeClstemplate) {
    public R submit(@Valid @RequestBody CodeClassifyTemplate plCodeClstemplate) {
        return R.status(plCodeClstemplateService.saveOrUpdate(plCodeClstemplate));
    }
@@ -129,7 +131,7 @@
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "逻辑删除", notes = "传入ids")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
        return R.status(SqlHelper.retBool(codeClstemplateMapper.deleteBatchIds(Func.toLongList(ids))));
        return R.status(SqlHelper.retBool(codeClassifyTemplateMapper.deleteBatchIds(Func.toLongList(ids))));
    }
    /**
@@ -142,16 +144,16 @@
        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<CodeClassifyTemplateVO> gridCodeClassifyTemplate(BaseQueryObject baseQueryObject){
        return  plCodeClstemplateService.gridCodeClassifyTemplate(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
    }
    /**
@@ -160,7 +162,7 @@
     * @return æ‰§è¡Œç»“æžœ success为true为可以删除,false表示有数据引用,obj为true表示有下级
     */
    @PostMapping( "/checkIsCanDelete")
    public R checkIsCanDelete(@RequestBody CodeClstemplateDTO codeClstemplateDTO)  {
    public R checkIsCanDelete(@RequestBody CodeClassifyTemplateDTO codeClstemplateDTO)  {
        return plCodeClstemplateService.checkIsCanDelete(codeClstemplateDTO);
    }
@@ -171,7 +173,7 @@
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     */
    @DeleteMapping( "/deleteData")
    public R delCodeClassifyTemplate(@Valid @RequestBody CodeClstemplateDTO codeClstemplateDTO) {
    public R delCodeClassifyTemplate(@Valid @RequestBody CodeClassifyTemplateDTO codeClstemplateDTO) {
        return plCodeClstemplateService.deleteCodeClassifyTemplate(codeClstemplateDTO);
    }
@@ -181,8 +183,8 @@
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/getObjectByOid")
    public R<CodeClstemplateVO> getObjectByOid(String oid){
        CodeClstemplateVO codeClassifyTemplateVO = plCodeClstemplateService.getObjectByOid(oid);
    public R<CodeClassifyTemplateVO> getObjectByOid(String oid){
        CodeClassifyTemplateVO codeClassifyTemplateVO = plCodeClstemplateService.getObjectByOid(oid);
        return R.data(codeClassifyTemplateVO);
    }
@@ -192,8 +194,8 @@
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/listDataByOids")
    public R<Collection<CodeClstemplateVO>> listCodeClassifyTemplateByOids(String oids){
        Collection<CodeClstemplateVO> voCollection =  plCodeClstemplateService.listCodeClassifyTemplateByOids(VciBaseUtil.str2List(oids));
    public R<Collection<CodeClassifyTemplateVO>> listCodeClassifyTemplateByOids(String oids){
        Collection<CodeClassifyTemplateVO> voCollection =  plCodeClstemplateService.listCodeClassifyTemplateByOids(VciBaseUtil.str2List(oids));
        return  R.data(voCollection) ;
    }
@@ -214,7 +216,7 @@
     * @return
     */
    @PostMapping( "/enableData")
    public R enable( CodeClstemplateDTO codeClstemplateDTO) {
    public R enable( CodeClassifyTemplateDTO codeClstemplateDTO) {
        return plCodeClstemplateService.updateLcStatus(codeClstemplateDTO.getOid(), CodeClassifyTemplateLC.RELEASED.getValue());
    }
@@ -224,7 +226,7 @@
     * @return
     */
    @PostMapping( "/disableData")
    public R disableData( CodeClstemplateDTO codeClassifyDTO) {
    public R disableData( CodeClassifyTemplateDTO codeClassifyDTO) {
        return plCodeClstemplateService.updateLcStatus(codeClassifyDTO.getOid(),CodeClassifyTemplateLC.DISABLED.getValue());
    }
@@ -234,7 +236,7 @@
     * @return
     */
    @PostMapping( "/editDate")
    public R editDate( CodeClstemplateDTO codeClassifyDTO) {
    public R editDate( CodeClassifyTemplateDTO codeClassifyDTO) {
        return plCodeClstemplateService.updateLcStatus(codeClassifyDTO.getOid(),CodeClassifyTemplateLC.EDITING.getValue());
    }
@@ -244,7 +246,7 @@
     * @return oid模板oid
     */
    @PostMapping( "/upgrade")
    public R Upgrade(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
    public R Upgrade(@RequestBody CodeClassifyTemplateDTO codeClassifyDTO) {
        return plCodeClstemplateService.Upgrade(codeClassifyDTO);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClsflowtempController.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeKeyAttrRepeatController.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeKeyattrrepeatController.java ÐÞ¸Ä
@@ -17,9 +17,8 @@
package com.vci.ubcs.code.controller;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.mapper.CodeButtonMapper;
import com.vci.ubcs.code.mapper.CodeKeyattrrepeatMapper;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import com.vci.ubcs.code.mapper.CodeKeyAttrRepeatMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -31,12 +30,11 @@
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.wrapper.PlCodeKeyattrrepeatWrapper;
import com.vci.ubcs.code.service.ICodeKeyattrrepeatService;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import com.vci.ubcs.code.wrapper.CodeKeyAttrRepeatWrapper;
import com.vci.ubcs.code.service.ICodeKeyAttrRepeatService;
import org.springblade.core.boot.ctrl.BladeController;
/**
@@ -49,12 +47,12 @@
@AllArgsConstructor
@RequestMapping("/plCodeKeyattrrepeat")
@Api(value = "关键属性查重规则", tags = "关键属性查重规则接口")
public class CodeKeyattrrepeatController extends BladeController {
public class CodeKeyAttrRepeatController extends BladeController {
    private final ICodeKeyattrrepeatService plCodeKeyattrrepeatService;
    private final ICodeKeyAttrRepeatService plCodeKeyattrrepeatService;
    CodeKeyattrrepeatMapper codeKeyattrrepeatMapper;
    CodeKeyAttrRepeatMapper codeKeyattrrepeatMapper;
    /**
     * å…³é”®å±žæ€§æŸ¥é‡è§„则 è¯¦æƒ…
@@ -62,9 +60,9 @@
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入plCodeKeyattrrepeat")
    public R<CodeKeyattrrepeatVO> detail(CodeKeyattrrepeatEntity plCodeKeyattrrepeat) {
        CodeKeyattrrepeatEntity detail = codeKeyattrrepeatMapper.selectOne(Condition.getQueryWrapper(plCodeKeyattrrepeat));
        return R.data(PlCodeKeyattrrepeatWrapper.build().entityVO(detail));
    public R<CodeKeyAttrRepeatVO> detail(CodeKeyAttrRepeat plCodeKeyattrrepeat) {
        CodeKeyAttrRepeat detail = codeKeyattrrepeatMapper.selectOne(Condition.getQueryWrapper(plCodeKeyattrrepeat));
        return R.data(CodeKeyAttrRepeatWrapper.build().entityVO(detail));
    }
    /**
     * å…³é”®å±žæ€§æŸ¥é‡è§„则 åˆ†é¡µ
@@ -72,9 +70,9 @@
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入plCodeKeyattrrepeat")
    public R<IPage<CodeKeyattrrepeatVO>> list(CodeKeyattrrepeatEntity plCodeKeyattrrepeat, Query query) {
        IPage<CodeKeyattrrepeatEntity> pages = codeKeyattrrepeatMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(plCodeKeyattrrepeat));
        return R.data(PlCodeKeyattrrepeatWrapper.build().pageVO(pages));
    public R<IPage<CodeKeyAttrRepeatVO>> list(CodeKeyAttrRepeat plCodeKeyattrrepeat, Query query) {
        IPage<CodeKeyAttrRepeat> pages = codeKeyattrrepeatMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(plCodeKeyattrrepeat));
        return R.data(CodeKeyAttrRepeatWrapper.build().pageVO(pages));
    }
    /**
@@ -83,8 +81,8 @@
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入plCodeKeyattrrepeat")
    public R<IPage<CodeKeyattrrepeatVO>> page(CodeKeyattrrepeatVO plCodeKeyattrrepeat, Query query) {
        IPage<CodeKeyattrrepeatVO> pages = plCodeKeyattrrepeatService.selectPlCodeKeyattrrepeatPage(Condition.getPage(query), plCodeKeyattrrepeat);
    public R<IPage<CodeKeyAttrRepeatVO>> page(CodeKeyAttrRepeatVO plCodeKeyattrrepeat, Query query) {
        IPage<CodeKeyAttrRepeatVO> pages = plCodeKeyattrrepeatService.selectPlCodeKeyattrrepeatPage(Condition.getPage(query), plCodeKeyattrrepeat);
        return R.data(pages);
    }
@@ -94,7 +92,7 @@
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "传入plCodeKeyattrrepeat")
    public R save(@Valid @RequestBody CodeKeyattrrepeatEntity plCodeKeyattrrepeat) {
    public R save(@Valid @RequestBody CodeKeyAttrRepeat plCodeKeyattrrepeat) {
        return R.status(SqlHelper.retBool(codeKeyattrrepeatMapper.insert(plCodeKeyattrrepeat)));
    }
@@ -104,7 +102,7 @@
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "传入plCodeKeyattrrepeat")
    public R update(@Valid @RequestBody CodeKeyattrrepeatEntity plCodeKeyattrrepeat) {
    public R update(@Valid @RequestBody CodeKeyAttrRepeat plCodeKeyattrrepeat) {
        return R.status(SqlHelper.retBool(codeKeyattrrepeatMapper.updateById(plCodeKeyattrrepeat)));
    }
@@ -114,7 +112,7 @@
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "传入plCodeKeyattrrepeat")
    public R submit(@Valid @RequestBody CodeKeyattrrepeatEntity plCodeKeyattrrepeat) {
    public R submit(@Valid @RequestBody CodeKeyAttrRepeat plCodeKeyattrrepeat) {
        if(plCodeKeyattrrepeat.getOid() != null){
            return R.status(SqlHelper.retBool(codeKeyattrrepeatMapper.updateById(plCodeKeyattrrepeat)));
        }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseAttrController.java
@@ -45,7 +45,7 @@
 */
@RestController
@AllArgsConstructor
@RequestMapping("/CodePhaseattr")
@RequestMapping("/codePhaseAttrController")
@Api(value = "编码库定义-模板阶段-属性", tags = "编码库定义-模板阶段-属性接口")
public class CodePhaseAttrController extends BladeController {
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -9,8 +9,10 @@
import com.vci.ubcs.code.service.MdmEngineService;
import com.vci.ubcs.code.service.MdmIOService;
import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO;
import com.vci.ubcs.code.vo.pagemodel.MdmUIInfoVO;
import com.vci.ubcs.starter.annotation.VciBusinessLog;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.util.ControllerUtil;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import io.swagger.annotations.Api;
@@ -27,121 +29,157 @@
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
@RestController
//@AllArgsConstructor
@RequestMapping("/mdmEngineController")
@Api(value = "编码数据管理", tags = "编码数据管理")
public class MdmEngineController {
//
////    /**
////     * æ—¥å¿—
////     */
//    private Logger logger = LoggerFactory.getLogger(getClass());
//    /**
//     * æ—¥å¿—
//     * ä¸»æ•°æ®å¼•擎服务
//     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * ä¸»æ•°æ®å¼•擎服务
     */
    @Autowired
    private MdmEngineService engineService;
    /**
     * ä¸»æ•°æ®å¯¼å…¥å¯¼å‡ºæœåŠ¡
     */
    @Autowired
    private MdmIOService mdmIOService;
//    @Autowired
//    private MdmEngineService engineService;
//    /**
//     * ä¸»æ•°æ®å¯¼å…¥å¯¼å‡ºæœåŠ¡
//     */
//    @Autowired
//    private MdmIOService mdmIOService;
//
//    /**
//     * ä¸‹è½½æ‰¹é‡ç”³è¯·çš„导入模板
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @param response å“åº”对象
//     * @throws IOException æŠ›å‡ºå¼‚常
//     */
//    @GetMapping("/downloadImportExcel")
//    @VciBusinessLog(operateName = "下载批量申请编码的导入模板")
//    public void downloadImportExcel(String codeClassifyOid, HttpServletResponse response) throws IOException{
//        String excelName = mdmIOService.createImportExcel(codeClassifyOid,false);
//        try {
//            ControllerUtil.writeFileToResponse(response,excelName);
//        } catch (Throwable e) {
//            //如果出错,把错误信息写到text
//            String msg = LangBaseUtil.getErrorMsg(e);
//            if(StringUtils.isBlank(msg)){
//                msg = "未知错误";
//            }
//            ControllerUtil.writeDataToResponse(response,msg.getBytes(StandardCharsets.UTF_8),null);
//        }
//    }
//
//
//    /**
//     * æ‰¹é‡ç”³è¯·ç¼–码的信息
//     * @param secDTOList ç”³è¯·ç¼–码的信息,必须包含码段和分类主键的信息
//     * @param file æ–‡ä»¶çš„内容
//     */
//    @VciBusinessLog(operateName = "批量申请编码的信息")
//    @PostMapping("/batchImportCode")
//    public R batchImportCode(String secDTOList, String codeClassifyOid, MultipartFile file, HttpServletResponse response) throws Throwable {
//        CodeOrderDTO orderDTO = new CodeOrderDTO();
//        orderDTO.setCodeClassifyOid(codeClassifyOid);
//        if(StringUtils.isNotBlank(secDTOList)){
//            List<CodeOrderSecDTO> secDTOS = JSONObject.parseArray(secDTOList, CodeOrderSecDTO.class);
//            orderDTO.setSecDTOList(secDTOS);
//        }
//        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
//        File file1 = new File(excelFileName);
//        try {
//            file.transferTo(new File(excelFileName));
//            CodeImProtRusultVO codeImProtRusultVO = mdmIOService.batchImportCode(orderDTO,file1);
//            if(StringUtils.isNotBlank(codeImProtRusultVO.getFilePath())||StringUtils.isNotBlank(codeImProtRusultVO.getRedisUuid())){
//                //放到map里
//                R result = R.fail("导入失败");
//                if(StringUtils.isNotBlank(codeImProtRusultVO.getFilePath())) {
//                    String filedUUid = ControllerUtil.putErrorFile(codeImProtRusultVO.getFilePath());
//                    codeImProtRusultVO.setFileOid(filedUUid);
//                }
//                result.setData(codeImProtRusultVO);
//                return result;
//            }else {
//                return R.success("操作成功!");
//            }
//        }catch (Throwable e) {
//            logger.error("导入错误",e);
//            String errorFile = LocalFileUtil.getDefaultTempFolder() + File.separator + "错误.txt";
//            LocalFileUtil.writeContentToFile( LangBaseUtil.getErrorMsg(e),errorFile);
//            String uuid=ControllerUtil.putErrorFile(errorFile);
//            CodeImProtRusultVO codeImProtRusultVO =new CodeImProtRusultVO();
//            codeImProtRusultVO.setRedisUuid("");
//            codeImProtRusultVO.setFileOid(uuid);
//            codeImProtRusultVO.setFilePath(errorFile);
//            R result = R.fail("导入失败");
//            result.setData(codeImProtRusultVO);
////            result.setObj(codeImProtRusultVO);
//            return result;
//        }finally {
//            file1.delete();
//        }
//    }
//
//
//    /**
//     * ä¿®æ”¹çŠ¶æ€
//     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
//     * @return æ‰§è¡Œç»“æžœ
//     */
//    @PostMapping("changeStatus")
//    public R changeStatus(BaseModelDTO baseModelDTO) {
//        engineService.changeStatus(baseModelDTO);
//        return R.success("操作成功!");
//    }
//
//
//    /**
//     * ç”³è¯·ç¼–码保存
//     * @param orderDTO ç¼–码申请相关的信息,需要有属性和码段相关的信息
//     * @return æ‰§è¡Œç»“æžœ
//     */
//    @PostMapping("/addSaveCode")
//    @VciBusinessLog(operateName = "申请单个编码")
//    public R addSaveCode(@RequestBody CodeOrderDTO orderDTO){
//        return R.success(engineService.addSaveCode(orderDTO));
//    }
//
//
//    /**
//     * ä½¿ç”¨æ¨¡æ¿çš„主键获取表单的定义
//     * @param templateOid æ¨¡æ¿çš„主键
//     * @param codeClassifyOid ä½¿ç”¨æ¨¡æ¿çš„分类主键
//     * @return UI相关的信息(仅包含表单)
//     */
//    @GetMapping("/getFormDefineByTemplateOid")
//    public MdmUIInfoVO getFormDefineByTemplateOid(String templateOid, String codeClassifyOid){
//        return engineService.getFormDefineByTemplateOid(templateOid,codeClassifyOid);
//    }
//
//    /**
//     * ç›¸ä¼¼é¡¹æŸ¥è¯¢
//     * @param orderDTO ç¼–码的相关信息
//     * @return æ•°æ®åˆ—表
//     */
//    @PostMapping("/resembleQuery")
//    public DataGrid<Map<String,String>> resembleQuery(@RequestBody CodeOrderDTO orderDTO){
//        return engineService.resembleQuery(orderDTO);
//    }
//
//    /**
//     * ä¿®æ”¹å•条主题库的数据
//     * @param orderDTO ç¼–码申请相关的信息,不需要码段的信息
//     * @return æ‰§è¡Œç»“æžœ
//     */
//    @PutMapping("/editSaveCode")
//    @VciBusinessLog(operateName = "修改编码数据")
//    public R editSaveCode(@RequestBody CodeOrderDTO orderDTO){
//        engineService.editSaveCode(orderDTO);
//        return  R.success("修改成功!");
//    }
    /**
     * ä¸‹è½½æ‰¹é‡ç”³è¯·çš„导入模板
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @param response å“åº”对象
     * @throws IOException æŠ›å‡ºå¼‚常
     */
    @GetMapping("/downloadImportExcel")
    @VciBusinessLog(operateName = "下载批量申请编码的导入模板")
    public void downloadImportExcel(String codeClassifyOid, HttpServletResponse response) throws IOException{
        String excelName = mdmIOService.createImportExcel(codeClassifyOid,false);
        try {
            ControllerUtil.writeFileToResponse(response,excelName);
        } catch (Throwable e) {
            //如果出错,把错误信息写到text
            String msg = LangBaseUtil.getErrorMsg(e);
            if(StringUtils.isBlank(msg)){
                msg = "未知错误";
            }
            ControllerUtil.writeDataToResponse(response,msg.getBytes(StandardCharsets.UTF_8),null);
        }
    }
    /**
     * æ‰¹é‡ç”³è¯·ç¼–码的信息
     * @param secDTOList ç”³è¯·ç¼–码的信息,必须包含码段和分类主键的信息
     * @param file æ–‡ä»¶çš„内容
     */
    @VciBusinessLog(operateName = "批量申请编码的信息")
    @PostMapping("/batchImportCode")
    public R batchImportCode(String secDTOList, String codeClassifyOid, MultipartFile file, HttpServletResponse response) throws Throwable {
        CodeOrderDTO orderDTO = new CodeOrderDTO();
        orderDTO.setCodeClassifyOid(codeClassifyOid);
        if(StringUtils.isNotBlank(secDTOList)){
            List<CodeOrderSecDTO> secDTOS = JSONObject.parseArray(secDTOList, CodeOrderSecDTO.class);
            orderDTO.setSecDTOList(secDTOS);
        }
        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
        File file1 = new File(excelFileName);
        try {
            file.transferTo(new File(excelFileName));
            CodeImProtRusultVO codeImProtRusultVO = mdmIOService.batchImportCode(orderDTO,file1);
            if(StringUtils.isNotBlank(codeImProtRusultVO.getFilePath())||StringUtils.isNotBlank(codeImProtRusultVO.getRedisUuid())){
                //放到map里
                R result = R.fail("导入失败");
                if(StringUtils.isNotBlank(codeImProtRusultVO.getFilePath())) {
                    String filedUUid = ControllerUtil.putErrorFile(codeImProtRusultVO.getFilePath());
                    codeImProtRusultVO.setFileOid(filedUUid);
                }
                result.setData(codeImProtRusultVO);
                return result;
            }else {
                return R.success("操作成功!");
            }
        }catch (Throwable e) {
            logger.error("导入错误",e);
            String errorFile = LocalFileUtil.getDefaultTempFolder() + File.separator + "错误.txt";
            LocalFileUtil.writeContentToFile( LangBaseUtil.getErrorMsg(e),errorFile);
            String uuid=ControllerUtil.putErrorFile(errorFile);
            CodeImProtRusultVO codeImProtRusultVO =new CodeImProtRusultVO();
            codeImProtRusultVO.setRedisUuid("");
            codeImProtRusultVO.setFileOid(uuid);
            codeImProtRusultVO.setFilePath(errorFile);
            R result = R.fail("导入失败");
            result.setData(codeImProtRusultVO);
//            result.setObj(codeImProtRusultVO);
            return result;
        }finally {
            file1.delete();
        }
    }
    /**
     * ä¿®æ”¹çŠ¶æ€
     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping("changeStatus")
    public R changeStatus(BaseModelDTO baseModelDTO) {
        engineService.changeStatus(baseModelDTO);
        return R.success("操作成功!");
    }
    /**
     * ç”³è¯·ç¼–码保存
     * @param orderDTO ç¼–码申请相关的信息,需要有属性和码段相关的信息
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping("/addSaveCode")
    @VciBusinessLog(operateName = "申请单个编码")
    public R addSaveCode(@RequestBody CodeOrderDTO orderDTO){
        return R.success(engineService.addSaveCode(orderDTO));
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeButtonClient.java
@@ -19,7 +19,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.code.entity.CodeButton;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.mapper.CodeButtonMapper;
import com.vci.ubcs.code.service.ICodeButtonService;
import lombok.AllArgsConstructor;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClassifyTemplateAttrClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClstempattrClient.java ÐÞ¸Ä
@@ -37,7 +37,7 @@
@ApiIgnore()
@RestController
@AllArgsConstructor
public class CodeClstempattrClient implements ICodeClstempattrClient {
public class CodeClassifyTemplateAttrClient implements ICodeClassifyTemplateAttrClient {
    private CodeClassifyTemplateAttrMapper codeClstempattrMapper;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClassifyTemplateClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClstemplateClient.java ÐÞ¸Ä
@@ -18,13 +18,12 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
import com.vci.ubcs.code.mapper.CodeClassifyTemplateMapper;
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 com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.service.ICodeClstemplateService;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
@@ -38,17 +37,17 @@
@ApiIgnore()
@RestController
@AllArgsConstructor
public class CodeClstemplateClient implements lCodeClstemplateClient {
public class CodeClassifyTemplateClient implements lCodeClassifyTemplateClient {
    private final CodeClstemplateMapper codeClstemplateMapper;
    private final CodeClassifyTemplateMapper codeClassifyTemplateMapper;
    @Override
    @GetMapping(TOP)
    public BladePage<CodeClstemplateEntity> top(Integer current, Integer size) {
    public BladePage<CodeClassifyTemplate> top(Integer current, Integer size) {
        Query query = new Query();
        query.setCurrent(current);
        query.setSize(size);
        IPage<CodeClstemplateEntity> page = codeClstemplateMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
        IPage<CodeClassifyTemplate> page = codeClassifyTemplateMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
        return BladePage.of(page);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClsflowtempClient.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeKeyAttrRepeatClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeKeyattrrepeatClient.java ÐÞ¸Ä
@@ -18,14 +18,13 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.entity.CodeSynonymEntity;
import com.vci.ubcs.code.mapper.CodeKeyattrrepeatMapper;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import com.vci.ubcs.code.mapper.CodeKeyAttrRepeatMapper;
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 com.vci.ubcs.code.service.ICodeKeyattrrepeatService;
import com.vci.ubcs.code.service.ICodeKeyAttrRepeatService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
@@ -39,19 +38,19 @@
@ApiIgnore()
@RestController
@AllArgsConstructor
public class CodeKeyattrrepeatClient implements lCodeKeyattrrepeatClient {
public class CodeKeyAttrRepeatClient implements lCodeKeyAttrRepeatClient {
    private final ICodeKeyattrrepeatService plCodeKeyattrrepeatService;
    private final ICodeKeyAttrRepeatService plCodeKeyattrrepeatService;
    CodeKeyattrrepeatMapper codeKeyattrrepeatMapper;
    CodeKeyAttrRepeatMapper codeKeyattrrepeatMapper;
    @Override
    @GetMapping(TOP)
    public BladePage<CodeKeyattrrepeatEntity> top(Integer current, Integer size) {
    public BladePage<CodeKeyAttrRepeat> top(Integer current, Integer size) {
        Query query = new Query();
        query.setCurrent(current);
        query.setSize(size);
        IPage<CodeKeyattrrepeatEntity> page = codeKeyattrrepeatMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
        IPage<CodeKeyAttrRepeat> page = codeKeyattrrepeatMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
        return BladePage.of(page);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseAttrClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseattrClient.java ÐÞ¸Ä
@@ -20,7 +20,6 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.code.entity.CodePhaseAttr;
import com.vci.ubcs.code.mapper.CodePhaseAttrMapper;
import com.vci.ubcs.code.mapper.CodePhaseAttrMapper;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.mp.support.Condition;
@@ -38,7 +37,7 @@
@ApiIgnore()
@RestController
@AllArgsConstructor
public class CodePhaseattrClient implements ICodePhaseattrClient {
public class CodePhaseAttrClient implements ICodePhaseAttrClient {
    private final CodePhaseAttrMapper codePhaseAttrMapper;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempButtonClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempbuttonClient.java ÐÞ¸Ä
@@ -24,7 +24,6 @@
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import com.vci.ubcs.code.service.ICodeTempbuttonService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
@@ -38,7 +37,7 @@
@ApiIgnore()
@RestController
@AllArgsConstructor
public class CodeTempbuttonClient implements ICodeTempbuttonClient {
public class CodeTempButtonClient implements ICodeTempButtonClient {
    private final CodeClassifyTemplateButtonMapper codeTempbuttonMapper;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeClassifyTemplateAttrClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeClstempattrClient.java ÐÞ¸Ä
@@ -31,7 +31,7 @@
@FeignClient(
    value = "ubcs-code"
)
public interface ICodeClstempattrClient {
public interface ICodeClassifyTemplateAttrClient {
    String API_PREFIX = "/clientTempAttr";
    String TOP = API_PREFIX + "/top";
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeClsflowtempClient.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseAttrClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseattrClient.java ÐÞ¸Ä
@@ -31,7 +31,7 @@
@FeignClient(
    value = "ubcs-code"
)
public interface ICodePhaseattrClient {
public interface ICodePhaseAttrClient {
    String API_PREFIX = "/clientPhaseattr";
    String TOP = API_PREFIX + "/top";
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempButtonClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempbuttonClient.java ÐÞ¸Ä
@@ -31,7 +31,7 @@
@FeignClient(
    value = "ubcs-code"
)
public interface ICodeTempbuttonClient {
public interface ICodeTempButtonClient {
    String API_PREFIX = "/clientTempButton";
    String TOP = API_PREFIX + "/top";
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/lCodeClassifyTemplateClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/lCodeClstemplateClient.java ÐÞ¸Ä
@@ -17,7 +17,7 @@
package com.vci.ubcs.code.feign;
import org.springblade.core.mp.support.BladePage;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@@ -31,7 +31,7 @@
@FeignClient(
    value = "ubcs-code"
)
public interface lCodeClstemplateClient {
public interface lCodeClassifyTemplateClient {
    String API_PREFIX = "/client";
    String TOP = API_PREFIX + "/getClstempPage";
@@ -44,6 +44,6 @@
     * @return BladePage
     */
    @GetMapping(TOP)
    BladePage<CodeClstemplateEntity> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
    BladePage<CodeClassifyTemplate> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/lCodeKeyAttrRepeatClient.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/lCodeKeyattrrepeatClient.java ÐÞ¸Ä
@@ -16,7 +16,7 @@
 */
package com.vci.ubcs.code.feign;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import org.springblade.core.mp.support.BladePage;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@@ -31,7 +31,7 @@
@FeignClient(
    value = "ubcs-code"
)
public interface lCodeKeyattrrepeatClient {
public interface lCodeKeyAttrRepeatClient {
    String API_PREFIX = "/codekey";
    String TOP = API_PREFIX + "/keylist";
@@ -44,6 +44,6 @@
     * @return BladePage
     */
    @GetMapping(TOP)
    BladePage<CodeKeyattrrepeatEntity> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
    BladePage<CodeKeyAttrRepeat> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyTemplateMapper.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java ÐÞ¸Ä
@@ -18,9 +18,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import org.apache.ibatis.annotations.MapKey;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -32,7 +31,7 @@
 * @author yuxc
 * @since 2023-04-10
 */
public interface CodeClstemplateMapper extends BaseMapper<CodeClstemplateEntity> {
public interface CodeClassifyTemplateMapper extends BaseMapper<CodeClassifyTemplate> {
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
@@ -41,7 +40,7 @@
     * @param plCodeClstemplate
     * @return
     */
    List<CodeClstemplateVO> selectPlCodeClstemplatePage(IPage page, CodeClstemplateVO plCodeClstemplate);
    List<CodeClassifyTemplateVO> selectPlCodeClstemplatePage(IPage page, CodeClassifyTemplateVO plCodeClstemplate);
    /**
     * èŽ·å–æ‰€æœ‰å±‚çº§ä¸‹çº§çš„ä¸»é”®
@@ -68,8 +67,8 @@
//    @MapKey("REVISIONSEQ")
    Map<String,Object> getNextRevision(@Param("nameoid") String nameoid);
    List<CodeClstemplateEntity> selectCodeClassifyTemplateDOByTree(@Param("codeclassifyoid") String codeclassifyoid,
                                                          @Param("lcstatus") String lcstatus);
    List<CodeClassifyTemplate> selectCodeClassifyTemplateDOByTree(@Param("codeclassifyoid") String codeclassifyoid,
                                                                  @Param("lcstatus") String lcstatus);
    List<Map<String,String>> selectChildHasReleaseTemplate(@Param("lcstatus") String lcstatus,
                                                              @Param("classifyoid") String classifyoid,
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClsflowtempMapper.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeKeyAttrRepeatMapper.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeKeyattrrepeatMapper.java ÐÞ¸Ä
@@ -18,8 +18,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import java.util.List;
@@ -29,7 +29,7 @@
 * @author yuxc
 * @since 2023-04-03
 */
public interface CodeKeyattrrepeatMapper extends BaseMapper<CodeKeyattrrepeatEntity> {
public interface CodeKeyAttrRepeatMapper extends BaseMapper<CodeKeyAttrRepeat> {
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
@@ -38,7 +38,7 @@
     * @param plCodeKeyattrrepeat
     * @return
     */
    List<CodeKeyattrrepeatVO> selectPlCodeKeyattrrepeatPage(IPage page, CodeKeyattrrepeatVO plCodeKeyattrrepeat);
    List<CodeKeyAttrRepeatVO> selectPlCodeKeyattrrepeatPage(IPage page, CodeKeyAttrRepeatVO plCodeKeyattrrepeat);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java
@@ -19,4 +19,6 @@
    List<String> selectById(@Param("inSql") String inSql);
    List<Map> selectBySql(@Param("inSql") String inSql);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyProcessTempService.java
@@ -115,5 +115,11 @@
     */
    List<CodeClassifyProcessTempVO> selectByWrapper(LambdaQueryWrapper<CodeClassifyProcessTemp> queryWrapper);
    /**
     * æ¨¡æ¿åˆ é™¤çš„æ—¶å€™è§¦å‘
     * @param classifyTemplateOid æ¨¡æ¿çš„主键
     * @return å—影响的内容
     */
    int codeTemplateDeleteTrigger(String classifyTemplateOid) ;
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java
@@ -1,14 +1,17 @@
package com.vci.ubcs.code.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.vci.ubcs.code.dto.CodeClassifyTemplateAttrDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.starter.exception.VciBaseException;
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;
@@ -31,13 +34,6 @@
     */
    IPage<CodeClassifyTemplateAttrVO> gridCodeClassifyTemplateAttr(MPJLambdaWrapper<CodeClassifyTemplateAttr> mpjLambdaWrapper , PageHelper pageHelper) throws VciBaseException;
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeClassifyTemplateAttrDOs æ•°æ®å¯¹è±¡åˆ—表
     * @return æ˜¾ç¤ºå¯¹è±¡
     * @throws VciBaseException å‚数为空或者不存在的时候会抛出异常
     */
    List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrDO2VOs(Collection<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOs) throws VciBaseException;
    /**
     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
@@ -47,14 +43,6 @@
     */
    CodeClassifyTemplateAttrVO codeClassifyTemplateAttrDO2VO(CodeClassifyTemplateAttr codeClassifyTemplateAttrDO) throws VciBaseException;
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    IPage<CodeClassifyTemplateAttrVO> refDataGridCodeClassifyTemplateAttr(Map<String, Object> conditionMap, PageHelper pageHelper) throws VciBaseException;
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
@@ -73,5 +61,91 @@
    List<CodeClassifyTemplateAttrVO> listCodeClassifyTemplateAttrByTemplateOids(Collection<String> templateOidCollection);
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeClassifyTemplateAttrDOs æ•°æ®å¯¹è±¡åˆ—表
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrDO2VOs(Collection<CodeClassifyTemplateAttr>  codeClassifyTemplateAttrDOs);
//    /**
//     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
//     * @param  codeClassifyTemplateAttrDO æ•°æ®å¯¹è±¡
//     * @return æ˜¾ç¤ºå¯¹è±¡
//     */
//    CodeClassifyTemplateAttrVO codeClassifyTemplateAttrDO2VO(CodeClassifyTemplateAttr codeClassifyTemplateAttrDO);
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„主题库分类的模板属性
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return æ‰§è¡Œç»“æžœ
     */
    DataGrid<CodeClassifyTemplateAttrVO> gridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper);
    /**
     * å¢žåŠ ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“æžœ
     */
    CodeClassifyTemplateAttrVO addSave(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO);
    List<CodeClassifyTemplateAttrVO> batchAddSave(List<CodeClassifyTemplateAttrDTO> list);
    /**
     * ä¿®æ”¹ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象
     * @return æ‰§è¡Œç»“æžœ
     */
    R<CodeClassifyTemplateAttrVO> editSave(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO);
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     */
    R deleteCodeClassifyTemplateAttr(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO);
    /**
     * ä¸»é”®èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oid ä¸»é”®
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    CodeClassifyTemplateAttrVO getObjectByOid(String oid);
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–ä¸»é¢˜åº“åˆ†ç±»çš„æ¨¡æ¿å±žæ€§
     * @param oidCollections ä¸»é”®é›†åˆï¼Œä½†æ˜¯å—性能影响,建议一次查询不超过10000个
     * @return ä¸»é¢˜åº“分类的模板属性显示对象
     */
    Collection<CodeClassifyTemplateAttrVO> listCodeClassifyTemplateAttrByOids(Collection<String> oidCollections);
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     */
    DataGrid<CodeClassifyTemplateAttrVO> 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(CodeClassifyTemplateAttrDTO codeClassifyAttrDTO);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClsflowtempService.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
@@ -18,13 +18,13 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.code.dto.CodeClstemplateDTO;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.dto.CodeClassifyTemplateDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
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;
import java.util.Collection;
@@ -37,7 +37,7 @@
 * @author yuxc
 * @since 2023-04-10
 */
public interface ICodeClstemplateService extends IService<CodeClstemplateEntity> {
public interface ICodeClstemplateService extends IService<CodeClassifyTemplate> {
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
@@ -46,7 +46,7 @@
     * @param plCodeClstemplate
     * @return
     */
    IPage<CodeClstemplateVO> selectPlCodeClstemplatePage(IPage<CodeClstemplateVO> page, CodeClstemplateVO plCodeClstemplate);
    IPage<CodeClassifyTemplateVO> selectPlCodeClstemplatePage(IPage<CodeClassifyTemplateVO> page, CodeClassifyTemplateVO plCodeClstemplate);
    /**
     * æŸ¥è¯¢åˆ†ç±»æ¨¡æ¿å¯¹è±¡ æ ‘
@@ -61,29 +61,29 @@
     * @param treeQueryObject æ ‘形查询对象
     * @return æŸ¥è¯¢ç»“æžœ,数据对象
     */
    List<CodeClstemplateEntity> selectCodeClassifyTemplateDOByTree(TreeQueryObject treeQueryObject);
    List<CodeClassifyTemplate> selectCodeClassifyTemplateDOByTree(TreeQueryObject treeQueryObject);
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeClstemplateEntitys æ•°æ®å¯¹è±¡åˆ—表
     * @param codeClassifyTemplates æ•°æ®å¯¹è±¡åˆ—表
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    List<CodeClstemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClstemplateEntity> codeClstemplateEntitys);
    List<CodeClassifyTemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClassifyTemplate> codeClassifyTemplates);
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeClstemplateEntitys æ•°æ®å¯¹è±¡åˆ—表
     * @param codeClassifyTemplates æ•°æ®å¯¹è±¡åˆ—表
     * @param hasAttr æ˜¯å¦åŒ…含属性
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    List<CodeClstemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClstemplateEntity> codeClstemplateEntitys, boolean hasAttr);
    List<CodeClassifyTemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClassifyTemplate> codeClassifyTemplates, boolean hasAttr);
    /**
     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param  codeClstemplateEntity æ•°æ®å¯¹è±¡
     * @param  codeClassifyTemplate æ•°æ®å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstemplateVO codeClassifyTemplateDO2VO(CodeClstemplateEntity codeClstemplateEntity);
    CodeClassifyTemplateVO codeClassifyTemplateDO2VO(CodeClassifyTemplate codeClassifyTemplate);
//    /**
//     * åˆ†ç±»æ¨¡æ¿åˆ—表
@@ -98,7 +98,7 @@
     * @param codeClstemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象,必须要有oid和ts属性
     * @return æ‰§è¡Œç»“æžœ success为true为可以删除,false表示有数据引用,obj为true表示有下级
     */
    R checkIsCanDelete(CodeClstemplateDTO codeClstemplateDTO);
    R checkIsCanDelete(CodeClassifyTemplateDTO codeClstemplateDTO);
    /**
     * æ£€æŸ¥æ˜¯å¦æœ‰ä¸‹çº§æ˜¯å¦å…³è”了数据
@@ -121,21 +121,21 @@
     * @param codeClstemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象,oid和ts需要传输
     * @return åˆ é™¤ç»“果反馈::success:成功,fail:失败
     */
    R deleteCodeClassifyTemplate(CodeClstemplateDTO codeClstemplateDTO);
    R deleteCodeClassifyTemplate(CodeClassifyTemplateDTO codeClstemplateDTO);
    /**
     * ä¸»é”®èŽ·å–åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param oid ä¸»é”®
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstemplateVO getObjectByOid(String oid) ;
    CodeClassifyTemplateVO getObjectByOid(String oid) ;
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param oidCollections ä¸»é”®é›†åˆï¼Œä½†æ˜¯å—性能影响,建议一次查询不超过10000个
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    Collection<CodeClstemplateVO> listCodeClassifyTemplateByOids(List<String> oidCollections);
    Collection<CodeClassifyTemplateVO> listCodeClassifyTemplateByOids(List<String> oidCollections);
    /**
@@ -156,40 +156,40 @@
    /**
     * å‡ç‰ˆ
     */
    R Upgrade(CodeClstemplateDTO codeClassifyDTO);
    R Upgrade(CodeClassifyTemplateDTO codeClassifyDTO);
    /**
     * æ¨¡æ¿å…‹éš†
     */
    R copyTemplate(CodeClstemplateDTO codeClassifyDTO);
    R copyTemplate(CodeClassifyTemplateDTO codeClassifyDTO);
    /**
     * åˆ†ç±»æ¨¡æ¿åˆ—表
     * @param plCodeClstemplate æŸ¥è¯¢æ¡ä»¶
     * @param query åˆ†é¡µå¯¹è±¡
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query);
    DataGrid<CodeClassifyTemplateVO> gridCodeClassifyTemplate(Map<String, String> conditionMap, PageHelper pageHelper);
    /**
     * å¢žåŠ åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param codeClassifyTemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象
     * @return æ‰§è¡Œç»“æžœ
     */
    R<CodeClstemplateVO> addSave(CodeClstemplateDTO codeClassifyTemplateDTO);
    R<CodeClassifyTemplateVO> addSave(CodeClassifyTemplateDTO codeClassifyTemplateDTO);
    /**
     * ä¿®æ”¹åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param codeClassifyTemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象
     * @return æ‰§è¡Œç»“æžœ
     */
    R<CodeClstemplateVO> editSave(CodeClstemplateDTO codeClassifyTemplateDTO);
    R<CodeClassifyTemplateVO> editSave(CodeClassifyTemplateDTO codeClassifyTemplateDTO);
    /**
     * èŽ·å–æ‰€æœ‰å­åˆ†ç±»æ¨¡æ¿
     * @param codeClassifyOid çˆ¶åˆ†ç±»çš„主键
     * @return true表示相同
     */
    List<CodeClstemplateVO> childTemplates(String codeClassifyOid);
    List<CodeClassifyTemplateVO> childTemplates(String codeClassifyOid);
    /**
     * ä½¿ç”¨ä¸»é¢˜åº“的分类主键,获取生效的模板
@@ -197,14 +197,14 @@
     * @param hasAttribute æ˜¯å¦åŒ…含属性
     * @return æ¨¡æ¿çš„信息
     */
    List<CodeClstemplateVO> listReleaseTemplateByClassifyOid(String codeClassifyOid,boolean hasAttribute);
    List<CodeClassifyTemplateVO> listReleaseTemplateByClassifyOid(String codeClassifyOid,boolean hasAttribute);
    /**
     * ç”¨æ¨¡æ¿çš„版本来排序
     * @param templateVOList æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     * @return æŽ’序后的列表
     */
    List<CodeClstemplateVO> sortTemplateByRevision(List<CodeClstemplateVO> templateVOList);
    List<CodeClassifyTemplateVO> sortTemplateByRevision(List<CodeClassifyTemplateVO> templateVOList);
    /**
@@ -212,7 +212,7 @@
     * @param templateOid ä¸»é”®
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstemplateVO getObjectHasAttrByOid(String templateOid);
    CodeClassifyTemplateVO getObjectHasAttrByOid(String templateOid);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyAttrRepeatService.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyattrrepeatService.java ÐÞ¸Ä
@@ -17,8 +17,8 @@
package com.vci.ubcs.code.service;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -31,7 +31,7 @@
 * @author yuxc
 * @since 2023-04-03
 */
public interface ICodeKeyattrrepeatService  {
public interface ICodeKeyAttrRepeatService {
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
@@ -40,7 +40,7 @@
     * @param plCodeKeyattrrepeat
     * @return
     */
    IPage<CodeKeyattrrepeatVO> selectPlCodeKeyattrrepeatPage(IPage<CodeKeyattrrepeatVO> page, CodeKeyattrrepeatVO plCodeKeyattrrepeat);
    IPage<CodeKeyAttrRepeatVO> selectPlCodeKeyattrrepeatPage(IPage<CodeKeyAttrRepeatVO> page, CodeKeyAttrRepeatVO plCodeKeyattrrepeat);
    /**
     * ä¸»é”®æ‰¹é‡èŽ·å–å…³é”®æ•°æ®æŸ¥é‡è§„åˆ™
@@ -52,24 +52,24 @@
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeKeyattrrepeatEntityS æ•°æ®å¯¹è±¡åˆ—表
     * @param codeKeyAttrRepeats æ•°æ®å¯¹è±¡åˆ—表
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    List<CodeKeyAttrRepeatRuleVO> codeKeyAttrRepeatRuleDO2VOs(Collection<CodeKeyattrrepeatEntity>  codeKeyattrrepeatEntityS);
    List<CodeKeyAttrRepeatRuleVO> codeKeyAttrRepeatRuleDO2VOs(Collection<CodeKeyAttrRepeat> codeKeyAttrRepeats);
    /**
     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param  codeKeyattrrepeatEntity æ•°æ®å¯¹è±¡
     * @param  codeKeyAttrRepeat æ•°æ®å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleDO2VO(CodeKeyattrrepeatEntity codeKeyattrrepeatEntity);
    CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleDO2VO(CodeKeyAttrRepeat codeKeyAttrRepeat);
    /**
     * ä½¿ç”¨åˆ†ç±»çš„全部信息来获取关键属性判断规则的内容
     * @param classifyFullInfo ä¸»é¢˜åº“分类的全部信息
     * @return è§„则的显示对象
     */
    CodeKeyattrrepeatVO getRuleByClassifyFullInfo(CodeClassifyFullInfoBO classifyFullInfo);
    CodeKeyAttrRepeatVO getRuleByClassifyFullInfo(CodeClassifyFullInfoBO classifyFullInfo);
    /**
     * ä¸»é”®èŽ·å–å…³é”®æ•°æ®æŸ¥é‡è§„åˆ™
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
@@ -2,15 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
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.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import java.util.List;
/**
 * ä¸»æ•°æ®å¼•擎服务
@@ -18,46 +10,117 @@
 * @date 2022-2-21
 */
public interface MdmEngineService extends IService<CodeAllCode> {
    /**
     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid);
    /**
     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @param hasAttr åŒ…含属性
     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     */
    CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid, boolean hasAttr);
    /**
     * èŽ·å–æžšä¸¾çš„ä¸‹æ‹‰é€‰é¡¹
     * @param attrVO æ¨¡æ¿å±žæ€§çš„对象
     * @return ä¸‹æ‹‰é€‰é¡¹
     */
    List<KeyValue> listComboboxItems(CodeClassifyTemplateAttrVO attrVO);
    /**
     * ä¿®æ”¹çŠ¶æ€
     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
     */
    void changeStatus(BaseModelDTO baseModelDTO);
    /**
     * ç”³è¯·å•一编码
     * @param orderDTO ç”³è¯·çš„信息,需要包含属性的内容和码段相关的内容
     * @return è¿”回编码的内容
     */
    String addSaveCode(CodeOrderDTO orderDTO);
    /**
     * åˆ¤æ–­ç¼–码的码段是否输入或者选择了码值
     * @param ruleVO è§„则的显示对象
     * @param orderDTO ç¼–码申请的内容
     */
    void checkSecValueOnOrder(CodeRuleVO ruleVO, CodeOrderDTO orderDTO);
//    /**
//     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     */
//    CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid);
//
//    /**
//     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @param hasAttr åŒ…含属性
//     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     */
//    CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid, boolean hasAttr);
//
//    /**
//     * èŽ·å–æžšä¸¾çš„ä¸‹æ‹‰é€‰é¡¹
//     * @param attrVO æ¨¡æ¿å±žæ€§çš„对象
//     * @return ä¸‹æ‹‰é€‰é¡¹
//     */
//    List<KeyValue> listComboboxItems(CodeClassifyTemplateAttrVO attrVO);
//
//    /**
//     * ä¿®æ”¹çŠ¶æ€
//     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
//     */
//    void changeStatus(BaseModelDTO baseModelDTO);
//
//    /**
//     * ç”³è¯·å•一编码
//     * @param orderDTO ç”³è¯·çš„信息,需要包含属性的内容和码段相关的内容
//     * @return è¿”回编码的内容
//     */
//    String addSaveCode(CodeOrderDTO orderDTO);
//
//    /**
//     * åˆ¤æ–­ç¼–码的码段是否输入或者选择了码值
//     * @param ruleVO è§„则的显示对象
//     * @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);
//
//    /**
//     * ä½¿ç”¨æ¨¡æ¿çš„主键获取表单的信息
//     * @param templateOid æ¨¡æ¿çš„主键
//     * @param codeClassifyOid ä½¿ç”¨æ¨¡æ¿çš„分类的主键
//     * @return ui相关的内容
//     */
//    MdmUIInfoVO getFormDefineByTemplateOid(String templateOid, String codeClassifyOid);
//
//    /**
//     * æ¨¡æ¿å±žæ€§è½¬æ¢ä¸ºè¡¨å•的字段
//     *
//     * @param attrVO  æ¨¡æ¿å±žæ€§
//     * @param btmType ä¸šåŠ¡ç±»åž‹
//     * @return è¡¨å•的字段
//     */
//    UIFormItemVO templateAttr2FormField(CodeClstempattrVO attrVO, String btmType) ;
//
//    /**
//     * æ¨¡æ¿å±žæ€§è½¬æ¢ä¸ºè¡¨æ ¼æ˜¾ç¤ºçš„配置
//     *
//     * @param attrVO æ¨¡æ¿å±žæ€§
//     * @param forEdit æ˜¯å¦æ˜¯ç¼–辑所需
//     * @return è¡¨æ ¼çš„字段
//     */
//    UITableFieldVO templateAttr2TableField(CodeClstempattrVO attrVO, boolean forEdit);
//
//    /**
//     * ç›¸ä¼¼é¡¹æŸ¥è¯¢
//     * @param orderDTO ç¼–码的相关信息
//     * @return æ•°æ®åˆ—表
//     */
//    DataGrid<Map<String, String>> resembleQuery(CodeOrderDTO orderDTO);
//
//    /**
//     * ä¿®æ”¹ä¸»é¢˜åº“数据
//     * @param orderDTO æ•°æ®çš„内容,不用包含码段的内容了
//     */
//    void editSaveCode(CodeOrderDTO orderDTO);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java
@@ -6,20 +6,20 @@
import java.io.File;
public interface MdmIOService {
    /**
     * ç”Ÿæˆå¯¼å…¥çš„æ–‡ä»¶
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @param isHistory æ˜¯å¦åŽ†å²æ•°æ®å¯¼å…¥
     * @return excel的文件地址
     */
    String createImportExcel(String codeClassifyOid,boolean isHistory);
    /**
     * æ‰¹é‡ç”³è¯·ç¼–码数据
     * @param orderDTO ç¼–码申请信息,必须包含分类主键和码段的信息
     * @param file excel文件的信息
     * @return æœ‰é”™è¯¯ä¿¡æ¯çš„excel
     */
    CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file);
//
//    /**
//     * ç”Ÿæˆå¯¼å…¥çš„æ–‡ä»¶
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @param isHistory æ˜¯å¦åŽ†å²æ•°æ®å¯¼å…¥
//     * @return excel的文件地址
//     */
//    String createImportExcel(String codeClassifyOid,boolean isHistory);
//
//    /**
//     * æ‰¹é‡ç”³è¯·ç¼–码数据
//     * @param orderDTO ç¼–码申请信息,必须包含分类主键和码段的信息
//     * @param file excel文件的信息
//     * @return æœ‰é”™è¯¯ä¿¡æ¯çš„excel
//     */
//    CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
@@ -3,7 +3,7 @@
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.entity.CodeWupinEntity;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import java.util.List;
@@ -17,7 +17,7 @@
     * @param secDTOList å„个码段的值
     * @param dataCBOList ä¸šåŠ¡æ•°æ®
     */
    List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClstemplateVO templateVO,
    List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO,
                                        CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<CodeWupinEntity> dataCBOList);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java
@@ -6,8 +6,6 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonParser;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.vci.ubcs.code.dto.CodeClassifyProcessTempDTO;
import com.vci.ubcs.code.entity.CodeClassifyProcessTemp;
@@ -15,7 +13,6 @@
import com.vci.ubcs.code.service.ICodeClassifyProcessTempService;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyProcessTempVO;
import com.vci.ubcs.code.wrapper.CodeClassifyProcessTempWrapper;
import com.vci.ubcs.common.utils.PageDO2PageVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
@@ -33,12 +30,10 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.sql.Wrapper;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.*;
import static com.vci.ubcs.code.constant.MdmBtmTypeConstant.CODE_CLASSIFY_PROCESS_TEMPLATE;
/**
 * åˆ†ç±»ä½¿ç”¨çš„æµç¨‹æ¨¡æ¿æœåŠ¡æŽ¥å£
@@ -362,4 +357,25 @@
        return count;
    }
    /**
     * æ¨¡æ¿åˆ é™¤çš„æ—¶å€™è§¦å‘
     *
     * @param classifyTemplateOid æ¨¡æ¿çš„主键
     * @return å—影响的内容
     */
    @Override
    public int codeTemplateDeleteTrigger(String classifyTemplateOid) {
        int updateCount = 0;
        if(com.alibaba.nacos.api.utils.StringUtils.isBlank(classifyTemplateOid)){
            Map<String,Object> conditionMap = new HashMap<>();
            conditionMap.put("classifyTemplateOid",classifyTemplateOid);
            List<CodeClassifyProcessTemp> codeClsflowtempEntities = baseMapper.selectByMap(conditionMap);
            if(!CollectionUtils.isEmpty(codeClsflowtempEntities)){
                updateCount += baseMapper.deleteBatchIds(codeClsflowtempEntities.stream()
                    .map(CodeClassifyProcessTemp::getOid).collect(Collectors.toList()));
            }
        }
        return updateCount;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -7,17 +7,17 @@
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.entity.CodeClassify;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import com.vci.ubcs.code.entity.CodeOsbtmtypeEntity;
import com.vci.ubcs.code.entity.CodeOsbtmtypeattributeEntity;
import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
import com.vci.ubcs.code.mapper.CodeClassifyMapper;
import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
import com.vci.ubcs.code.mapper.CodeClassifyTemplateMapper;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeMapper;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeattributeMapper;
import com.vci.ubcs.code.po.CodeClassifyPO;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.ICodeKeyattrrepeatService;
import com.vci.ubcs.code.service.ICodeKeyAttrRepeatService;
import com.vci.ubcs.code.service.ICodeRuleService;
import com.vci.ubcs.code.vo.CodeOsattributeVO;
import com.vci.ubcs.code.vo.CodeOsbtmtypeVO;
@@ -44,7 +44,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.log.exception.ServiceException;
import com.vci.ubcs.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
@@ -66,7 +66,7 @@
    private CodeClassifyMapper codeClassifyMapper;
    @Resource
    private CodeClstemplateMapper codeClstemplateMapper;
    private CodeClassifyTemplateMapper codeClassifyTemplateMapper;
    @Resource
    private ICodeRuleService codeRuleService;
@@ -89,7 +89,7 @@
    private RevisionModelUtil revisionModelUtil;
    @Resource
    private ICodeKeyattrrepeatService iCodeKeyattrrepeatService;
    private ICodeKeyAttrRepeatService iCodeKeyattrrepeatService;
    /**
     * ä¸Šçº§èŠ‚ç‚¹çš„å±žæ€§åç§°
     */
@@ -276,7 +276,7 @@
        //先简称是否有关联模板,有模板要先删除
        Map<String,Object> condition = new HashMap<>(2);
        condition.put("codeClassifyOid",codeClassify.getOid());
        List<CodeClstemplateEntity> codeClstemplateEntities = codeClstemplateMapper.selectByMap(condition);
        List<CodeClassifyTemplate> codeClstemplateEntities = codeClassifyTemplateMapper.selectByMap(condition);
//        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateDO.class);
//        queryWrapper.addQueryMap("codeClassifyOid",codeClassifyDTO.getOid());
//        List<CodeClassifyTemplateDO> codeClassifyTemplateDOListHaveTemplate =  codeClassifyTemplateMapper.selectByWrapper(queryWrapper);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
@@ -1,33 +1,51 @@
package com.vci.ubcs.code.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.vci.ubcs.code.dto.CodeClassifyTemplateAttrDTO;
import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
import com.vci.ubcs.code.mapper.CodeClassifyTemplateAttrMapper;
import com.vci.ubcs.code.mapper.CodeClassifyTemplateMapper;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeattributeMapper;
import com.vci.ubcs.code.service.ICodeClassifyTemplateAttrService;
import com.vci.ubcs.code.service.ICodeTempphaseService;
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.common.utils.PageDO2PageVO;
import com.vci.ubcs.code.wrapper.CodeClassifyTemplateAttrWrapper;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.util.Map2MPLLambdaUtil;
import com.vci.ubcs.starter.util.MybatisParameterUtil;
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.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
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.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;
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.*;
import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.DATA_OID_NOT_EXIST;
/**
 * ä¸»é¢˜åº“分类的模板属性服务
@@ -42,6 +60,25 @@
     */
    @Resource
    private CodeClassifyTemplateAttrMapper codeClassifyTemplateAttrMapper;
//    @Resource
//    CodeClstempattrMapper codeClstempattrMapper;
    //    @Resource
//    ICodeTempphaseService codeTempphaseService;
    @Resource
    IDictBizClient iDictBizClient;
    @Resource
    CodeClassifyTemplateMapper codeClassifyTemplateMapper;
    @Resource
    CodeOsbtmtypeattributeMapper codeOsbtmtypeattributeMapper;
    @Resource
    @Lazy
    ICodeTempphaseService codeTempphaseService;
    /**
     * å¯¹è±¡çš„æ“ä½œ
     */
    @Autowired(required = false)
    private RevisionModelUtil revisionModelUtil;
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„主题库分类的模板属性
@@ -70,25 +107,25 @@
        IPage<CodeClassifyTemplateAttr> doList = codeClassifyTemplateAttrMapper.selectPage(Condition.getPage(query), mpjLambdaWrapper);
        IPage<CodeClassifyTemplateAttrVO> voList = new Page<>();
        if (!CollectionUtils.isEmpty(doList.getRecords())) {
            voList = CodeClstempattrWrapper.build().pageVO(doList);
            voList = CodeClassifyTemplateAttrWrapper.build().pageVO(doList);
        }
        return voList;
    }
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public IPage<CodeClassifyTemplateAttrVO> refDataGridCodeClassifyTemplateAttr(Map<String, Object> conditionMap, PageHelper pageHelper) throws VciBaseException{
        if(conditionMap == null){
            conditionMap = new HashMap<String, Object>();
        }
        return gridCodeClassifyTemplateAttr(Map2MPLLambdaUtil.getMPJLambdaWrapper(conditionMap, CodeClassifyTemplateAttr.class),pageHelper);
    }
//    /**
//     * å‚照主题库分类的模板属性列表
//     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
//     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
//     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
//     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
//     */
//    @Override
//    public IPage<CodeClassifyTemplateAttrVO> refDataGridCodeClassifyTemplateAttr(Map<String, Object> conditionMap, PageHelper pageHelper) throws VciBaseException{
//        if(conditionMap == null){
//            conditionMap = new HashMap<String, Object>();
//        }
//        return gridCodeClassifyTemplateAttr(Map2MPLLambdaUtil.getMPJLambdaWrapper(conditionMap, CodeClassifyTemplateAttr.class),pageHelper);
//    }
    @Override
    public IPage<CodeClassifyTemplateAttrVO> selectCodeClstempattrPage(IPage<CodeClassifyTemplateAttrVO> page, CodeClassifyTemplateAttrVO CodeClstempattr) {
@@ -158,6 +195,714 @@
        return vo;
    }
//    @Override
//    public IPage<CodeClassifyTemplateAttrVO> selectCodeClstempattrPage(IPage<CodeClassifyTemplateAttrVO> page, CodeClassifyTemplateAttrVO CodeClstempattr) {
//        return page.setRecords(baseMapper.selectCodeClstempattrPage(page, CodeClstempattr));
//    }
//    /**
//     * ä½¿ç”¨æ¨¡æ¿çš„主键获取模板的属性--批量
//     *
//     * @param templateOidCollection æ¨¡æ¿çš„主键
//     * @return å±žæ€§çš„信息
//     */
//    @Override
//    public List<CodeClassifyTemplateAttrVO> listCodeClassifyTemplateAttrByTemplateOids(Collection<String> templateOidCollection) {
//        if(CollectionUtils.isEmpty(templateOidCollection)){
//            return new ArrayList<>();
//        }
//        List<CodeClassifyTemplateAttr> 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<CodeClassifyTemplateAttr> 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<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrDO2VOs(Collection<CodeClassifyTemplateAttr>  codeClassifyTemplateAttrDOs){
//        List<CodeClassifyTemplateAttrVO> voList = new ArrayList<CodeClassifyTemplateAttrVO>();
//        if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOs)){
//            for(CodeClassifyTemplateAttr s: codeClassifyTemplateAttrDOs){
//                CodeClassifyTemplateAttrVO vo =  codeClassifyTemplateAttrDO2VO(s);
//                if(vo != null){
//                    voList.add(vo);
//                }
//            }
//        }
//        return voList;
//    }
//    /**
//     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
//     * @param  codeClassifyTemplateAttrDO æ•°æ®å¯¹è±¡
//     * @return æ˜¾ç¤ºå¯¹è±¡
//     */
//    @Override
//    public  CodeClassifyTemplateAttrVO codeClassifyTemplateAttrDO2VO(CodeClassifyTemplateAttr codeClassifyTemplateAttrDO){
//        CodeClassifyTemplateAttrVO vo = new CodeClassifyTemplateAttrVO();
//        if(codeClassifyTemplateAttrDO != null){
//            BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDO,vo);
//            //如果有lcstatus的类的话
//            vo.setAttributeDataTypeText(VciFieldTypeEnum.getTextByValue(vo.getAttributeDataType()));
//        }
//        return vo;
//    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„主题库分类的模板属性
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    public DataGrid<CodeClassifyTemplateAttrVO> gridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper) {
        DataGrid<CodeClassifyTemplateAttrVO> dataGrid=new DataGrid<CodeClassifyTemplateAttrVO>();
        //没有传递参数,就不执行查询逻辑
        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)
        CodeClassifyTemplateAttr codeClstempattrVO = new CodeClassifyTemplateAttr();
//        BeanUtil.toBean(map,codeClstempattrVO);
//        BeanUtil
        BeanMap beanMap = BeanMap.create(codeClstempattrVO);
        beanMap.putAll(conditionMap);
//        Condition.getQueryWrapper(
        IPage<CodeClassifyTemplateAttr> 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 CodeClassifyTemplateAttrVO addSave(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO){
        VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"需要添加的数据对象");
        //将DTO转换为DO
        CodeClassifyTemplateAttr codeClassifyTemplateAttrDO = new CodeClassifyTemplateAttr();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
        baseMapper.insert(codeClassifyTemplateAttrDO);
        return codeClassifyTemplateAttrDO2VO(codeClassifyTemplateAttrDO);
    }
    /**
     * æ‰¹é‡æ·»åŠ 
     * @param codeClassifyTemplateAttrDTOs æ•°æ®ä¼ è¾“对象
     * @return ä¿å­˜åŽçš„æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    @Transactional
    public List<CodeClassifyTemplateAttrVO> batchAddSave(List<CodeClassifyTemplateAttrDTO> codeClassifyTemplateAttrDTOs) {
        if(CollectionUtils.isEmpty(codeClassifyTemplateAttrDTOs)){
            return new ArrayList<>();
        }
        //取所有属性的英文名称,第三个验证需要用到
        Map<String,CodeClassifyTemplateAttrDTO> 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<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOInsert = new ArrayList<CodeClassifyTemplateAttr>();
        List<String> prefix = new ArrayList<>();
        List<String> suffix = new ArrayList<>();
        List<String> dateFormates = new ArrayList<>();
        for (CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO:codeClassifyTemplateAttrDTOs){
            VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"需要添加的数据对象");
            //将DTO转换为DO
            CodeClassifyTemplateAttr codeClassifyTemplateAttrDO = new CodeClassifyTemplateAttr();
            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 CodeClassifyTemplateAttrDTO()).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<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDODelete = baseMapper.selectByMap(condition);
        //oids
        List<String> oids = new ArrayList<String>();
        for (CodeClassifyTemplateAttr 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)){
            codeTempphaseService.codeTemplateAttrModifyTrigger(codeClassifyTemplateAttrDOInsert);
        }
//        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(CodeClassifyTemplateAttrDTO 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
        CodeClassifyTemplateAttr codeClassifyTemplateAttrDOCopyFromDTO = new CodeClassifyTemplateAttr();
//        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());
        CodeClassifyTemplateAttr detail = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
        if(!detail.getTs().toString().equals(codeClassifyTemplateAttrDTO.getTs().toString())){//不是最新的不让改
            return R.fail("当前数据不是最新,请刷新后再修改!");
        }
        //将DTO转换为DO
        CodeClassifyTemplateAttr 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(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
        VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"主题库分类的模板属性数据对象",codeClassifyTemplateAttrDTO.getOid(),"主题库分类的模板属性的主键");
        CodeClassifyTemplateAttr 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(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO, CodeClassifyTemplateAttr codeClassifyTemplateAttrDO) {
//        boService.checkTs(codeClassifyTemplateAttrDO);
//        Map<String,Object> condition = new HashMap<>(2);
//        condition.put("oid",codeClassifyTemplateAttrDTO.getOid());
//        condition.put("ts",codeClassifyTemplateAttrDTO.getTs());
        CodeClassifyTemplateAttr 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  CodeClassifyTemplateAttrVO getObjectByOid(String oid) throws VciBaseException{
        return codeClassifyTemplateAttrDO2VO(selectByOid(oid));
    }
    /**
     * ä¸»é”®æŸ¥è¯¢æ•°æ®å¯¹è±¡
     * @param oid ä¸»é”®
     * @return  æ•°æ®å¯¹è±¡
     * @throws VciBaseException å‚数为空,并且数据不存在的时候会抛出异常
     */
    private CodeClassifyTemplateAttr selectByOid(String oid) throws VciBaseException{
        VciBaseUtil.alertNotNull(oid,"主键");
        CodeClassifyTemplateAttr 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<CodeClassifyTemplateAttrVO> listCodeClassifyTemplateAttrByOids(Collection<String> oidCollections) {
        VciBaseUtil.alertNotNull(oidCollections,"数据对象主键集合");
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = listCodeClassifyTemplateAttrDOByOidCollections(oidCollections);
        return codeClassifyTemplateAttrDO2VOs(codeClassifyTemplateAttrDOList);
    }
    /**
     * ä½¿ç”¨ä¸»é”®é›†åˆæŸ¥è¯¢æ•°æ®å¯¹è±¡
     * @param oidCollections ä¸»é”®çš„集合
     * @return æ•°æ®å¯¹è±¡åˆ—表
     */
    private List<CodeClassifyTemplateAttr> listCodeClassifyTemplateAttrDOByOidCollections(Collection<String> oidCollections){
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = new ArrayList<CodeClassifyTemplateAttr>();
        if(!CollectionUtils.isEmpty(oidCollections)){
            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
            for(Collection<String> oids: oidCollectionsList){
                List<CodeClassifyTemplateAttr> tempDOList = baseMapper.selectBatchIds(oids);
                if(!CollectionUtils.isEmpty(tempDOList)){
                    codeClassifyTemplateAttrDOList.addAll(tempDOList);
                }
            }
        }
        return  codeClassifyTemplateAttrDOList;
    }
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public DataGrid<CodeClassifyTemplateAttrVO> 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;
        }
        //查询模板对象
        CodeClassifyTemplate codeClassifyTemplateDO = codeClassifyTemplateMapper.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<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = baseMapper.selectByMap(condition);
        List<String> btmOids = new ArrayList<String>();
        for (CodeClassifyTemplateAttr 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;
        }
        //查询模板对象
        CodeClassifyTemplate codeClassifyTemplateDO = codeClassifyTemplateMapper.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<CodeClassifyTemplateAttr> wrapper=new QueryWrapper<>();
        wrapper.eq("CLASSIFYTEMPLATEOID",templateAttrOid);
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = baseMapper.selectList(wrapper);
        List<String> btmOids = new ArrayList<String>();
        for (CodeClassifyTemplateAttr 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(CodeClassifyTemplateAttrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
        String templateAttrOid = codeClassifyTemplateAttrDTO.getOid();
        //查询出来要复制的对象
        CodeClassifyTemplateAttr 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<CodeClassifyTemplateAttr> wrapper=new QueryWrapper<>();
        wrapper.eq("id",id);
        //所有id=id的模板属性
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList =baseMapper.selectList(wrapper);
        //要删除的模板属性的oids
        List<String> deleteOids = new ArrayList<String>();
        //要修改的模板属性对象
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOListInsert = new ArrayList<CodeClassifyTemplateAttr>();
        for (CodeClassifyTemplateAttr codeClassifyTemplateAttrDOi:codeClassifyTemplateAttrDOList){
            String oid = codeClassifyTemplateAttrDOi.getOid();
            String templateOldOid = codeClassifyTemplateAttrDOi.getClassifyTemplateOid();
            CodeClassifyTemplateAttr codeClassifyTemplateAttrDOInsert = new CodeClassifyTemplateAttr();
            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);
        baseMapper.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/CodeClsflowtempServiceImpl.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
@@ -21,21 +21,23 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
import com.vci.ubcs.code.dto.CodeClstemplateDTO;
import com.vci.ubcs.code.dto.CodeClassifyTemplateDTO;
import com.vci.ubcs.code.entity.*;
import com.vci.ubcs.code.enumpack.CodeClassifyTemplateLC;
import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
import com.vci.ubcs.code.mapper.*;
import com.vci.ubcs.code.service.ICodeClassifyProcessTempService;
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.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
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 +47,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;
@@ -64,7 +67,7 @@
 * @since 2023-04-10
 */
@Service
public class CodeClstemplateServiceImpl extends ServiceImpl<CodeClstemplateMapper, CodeClstemplateEntity> implements ICodeClstemplateService {
public class CodeClstemplateServiceImpl extends ServiceImpl<CodeClassifyTemplateMapper, CodeClassifyTemplate> implements ICodeClstemplateService {
    /**
     * æ¨¡æ¿å±žæ€§çš„æœåŠ¡
@@ -86,9 +89,9 @@
    @Autowired(required = false)
    private CodeTempbuttonServiceImpl codeTempbuttonServiceImpl;
    @Autowired(required = false)
    private CodeClsflowtempServiceImpl codeClsflowtempServiceImpl;
    @Autowired(required = false)
    private CodeClsflowtempMapper codeClsflowtempMapper;
    private ICodeClassifyProcessTempService codeClsflowtempServiceImpl;
//    @Autowired(required = false)
//    private CodeClsflowtempMapper codeClsflowtempMapper;
    @Autowired(required = false)
    private CodeTemplatePhaseMapper codeTempphaseMapper;
    @Autowired(required = false)
@@ -100,12 +103,12 @@
    @Autowired(required = false)
    private ICodeClassifyService codeClassifyService;
    @Autowired(required = false)
    private CodeClstemplateMapper codeClstemplateMapper;
    private CodeClassifyTemplateMapper codeClassifyTemplateMapper;
    @Autowired(required = false)
    private CodePhaseAttrServiceImpl codePhaseattrServiceImpl;
    @Override
    public IPage<CodeClstemplateVO> selectPlCodeClstemplatePage(IPage<CodeClstemplateVO> page, CodeClstemplateVO plCodeClstemplate) {
    public IPage<CodeClassifyTemplateVO> selectPlCodeClstemplatePage(IPage<CodeClassifyTemplateVO> page, CodeClassifyTemplateVO plCodeClstemplate) {
        return page.setRecords(baseMapper.selectPlCodeClstemplatePage(page, plCodeClstemplate));
    }
@@ -116,12 +119,12 @@
     */
    @Override
    public List<Tree> treeCodeClassifyTemplate(TreeQueryObject treeQueryObject) {
        List<CodeClstemplateEntity> doList =selectCodeClassifyTemplateDOByTree(treeQueryObject);
        List<CodeClassifyTemplate> doList =selectCodeClassifyTemplateDOByTree(treeQueryObject);
        List<CodeClstemplateVO> voList = codeClassifyTemplateDO2VOs(doList);
        List<CodeClassifyTemplateVO> voList = codeClassifyTemplateDO2VOs(doList);
        TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(PARENT_FIELD_NAME);
        treeWrapperOptions.copyFromTreeQuery(treeQueryObject);
        return revisionModelUtil.doList2Trees(voList,treeWrapperOptions,(CodeClstemplateVO s) ->{
        return revisionModelUtil.doList2Trees(voList,treeWrapperOptions,(CodeClassifyTemplateVO s) ->{
            //可以在这里处理树节点的显示
            return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
                .getLcStatus()) ? (" ã€åœç”¨ã€‘ ") : "");
@@ -135,7 +138,7 @@
     * @return æŸ¥è¯¢ç»“æžœ,数据对象
     */
    @Override
    public List<CodeClstemplateEntity> selectCodeClassifyTemplateDOByTree(TreeQueryObject treeQueryObject) {
    public List<CodeClassifyTemplate> selectCodeClassifyTemplateDOByTree(TreeQueryObject treeQueryObject) {
//        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,CodeClassifyTemplateDO.class);
//        VciParentQueryOption parentQueryOption = new VciParentQueryOption();
//        parentQueryOption.setParentFieldName(PARENT_FIELD_NAME);
@@ -155,7 +158,7 @@
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<CodeClstemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClstemplateEntity> codeClassifyTemplateDOs) {
    public List<CodeClassifyTemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClassifyTemplate> codeClassifyTemplateDOs) {
        return codeClassifyTemplateDO2VOs(codeClassifyTemplateDOs,false);
    }
@@ -166,11 +169,11 @@
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<CodeClstemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClstemplateEntity>  codeClassifyTemplateDOs,boolean hasAttr) {
        List<CodeClstemplateVO> voList = new ArrayList<CodeClstemplateVO>();
    public List<CodeClassifyTemplateVO> codeClassifyTemplateDO2VOs(Collection<CodeClassifyTemplate>  codeClassifyTemplateDOs, boolean hasAttr) {
        List<CodeClassifyTemplateVO> voList = new ArrayList<CodeClassifyTemplateVO>();
        if(!CollectionUtils.isEmpty(codeClassifyTemplateDOs)){
            for(CodeClstemplateEntity s: codeClassifyTemplateDOs){
                CodeClstemplateVO vo =  codeClassifyTemplateDO2VO(s);
            for(CodeClassifyTemplate s: codeClassifyTemplateDOs){
                CodeClassifyTemplateVO vo =  codeClassifyTemplateDO2VO(s);
                if(vo != null){
                    voList.add(vo);
                }
@@ -178,7 +181,7 @@
        }
        if(hasAttr){
            //一个分类里面总不能超过1000个生效的版本吧!!!
            VciBaseUtil.switchCollectionForOracleIn(voList.stream().map(CodeClstemplateVO::getOid).collect(Collectors.toList())).forEach(tempOids->{
            VciBaseUtil.switchCollectionForOracleIn(voList.stream().map(CodeClassifyTemplateVO::getOid).collect(Collectors.toList())).forEach(tempOids->{
                List<CodeClassifyTemplateAttrVO> attrVOList = codeClstempattrService.listCodeClassifyTemplateAttrByTemplateOids(tempOids);
                if(!CollectionUtils.isEmpty(attrVOList)){
@@ -186,7 +189,11 @@
                    voList.stream().forEach(templateVO->{
                        if(attrVOMap.containsKey(templateVO.getOid())){
                            templateVO.setAttributes(attrVOMap.get(templateVO.getOid()));
                            List<CodeClassifyTemplateAttrVO> codeClstempattrVO = new ArrayList<>();
                            for (CodeClassifyTemplateAttrVO codeClassifyTemplateAttrVO : attrVOMap.get(templateVO.getOid())) {
                                codeClstempattrVO.add(codeClassifyTemplateAttrVO);
                            }
                            templateVO.setAttributes(codeClstempattrVO);
                        }
                    });
                }
@@ -201,8 +208,8 @@
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public  CodeClstemplateVO codeClassifyTemplateDO2VO(CodeClstemplateEntity codeClassifyTemplateDO) {
        CodeClstemplateVO vo = new CodeClstemplateVO();
    public  CodeClassifyTemplateVO codeClassifyTemplateDO2VO(CodeClassifyTemplate codeClassifyTemplateDO) {
        CodeClassifyTemplateVO vo = new CodeClassifyTemplateVO();
        if(codeClassifyTemplateDO != null){
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDO,vo);
            //如果有lcstatus的类的话
@@ -218,37 +225,37 @@
     * @return æ‰§è¡Œç»“æžœ success为true为可以删除,false表示有数据引用,obj为true表示有下级
     */
    @Override
    public R checkIsCanDelete(CodeClstemplateDTO codeClstemplateDTO) {
    public R checkIsCanDelete(CodeClassifyTemplateDTO codeClstemplateDTO) {
        VciBaseUtil.alertNotNull(codeClstemplateDTO,"数据传输对象",codeClstemplateDTO.getOid(),"主键");
        CodeClstemplateEntity codeClstemplateEntity = baseMapper.selectById(codeClstemplateDTO.getOid());
        return checkIsCanDeleteForDO(codeClstemplateDTO,codeClstemplateEntity);
        CodeClassifyTemplate codeClassifyTemplate = baseMapper.selectById(codeClstemplateDTO.getOid());
        return checkIsCanDeleteForDO(codeClstemplateDTO, codeClassifyTemplate);
    }
    /**
     * æ ¡éªŒæ˜¯å¦å¯ä»¥åˆ é™¤ï¼Œå¦‚果存在下级,并且下级有数据引用则不能删除
     * @param codeClstemplateDTO æ•°æ®ä¼ è¾“对象
     * @param codeClstemplateEntity æ•°æ®åº“中的数据对象
     * @param codeClassifyTemplate æ•°æ®åº“中的数据对象
     * @return success为true为可以删除,false表示有数据引用,obj为true表示有下级
     */
    private R checkIsCanDeleteForDO(CodeClstemplateDTO codeClstemplateDTO, CodeClstemplateEntity codeClstemplateEntity) {
        CodeClstemplateEntity codeClassifyTemplateDOCopyFromDTO = new CodeClstemplateEntity();
    private R checkIsCanDeleteForDO(CodeClassifyTemplateDTO codeClstemplateDTO, CodeClassifyTemplate codeClassifyTemplate) {
        CodeClassifyTemplate codeClassifyTemplateDOCopyFromDTO = new CodeClassifyTemplate();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClstemplateDTO,codeClassifyTemplateDOCopyFromDTO);
        //检查ts
//        Map<String,Object> condition = new HashMap<>(2);
//        condition.put("oid",codeClstemplateDTO.getOid());
//        condition.put("ts",codeClstemplateDTO.getTs());
        CodeClstemplateEntity detail = baseMapper
        CodeClassifyTemplate detail = baseMapper
            .selectById(codeClstemplateDTO.getOid());
        if(!detail.getTs().toString().equals(codeClstemplateDTO.getTs().toString())){//不是最新的不让改
            return R.fail("当前数据不是最新,请刷新后再修改!");
        }
        //校验下级是否有引用
        if(checkChildIsLinked(codeClstemplateEntity.getOid())){
        if(checkChildIsLinked(codeClassifyTemplate.getOid())){
            return R.fail(DATA_CASCADE_LINKED_NOT_DELETE);
        }
        return R.success(String.valueOf(checkHasChild(codeClstemplateEntity.getOid())));
        return R.success(String.valueOf(checkHasChild(codeClassifyTemplate.getOid())));
    }
    /**
@@ -301,11 +308,11 @@
     */
    @Transactional
    @Override
    public R deleteCodeClassifyTemplate(CodeClstemplateDTO codeClstemplateDTO) {
    public R deleteCodeClassifyTemplate(CodeClassifyTemplateDTO codeClstemplateDTO) {
        checkIsCanDelete(codeClstemplateDTO);
        VciBaseUtil.alertNotNull(codeClstemplateDTO,"分类模板对象数据对象",codeClstemplateDTO.getOid(),"分类模板对象的主键");
        CodeClstemplateEntity codeClassifyTemplateDO = baseMapper.selectById(codeClstemplateDTO.getOid());
        CodeClassifyTemplate codeClassifyTemplateDO = baseMapper.selectById(codeClstemplateDTO.getOid());
        //只有编辑中才能删
        if(!CodeClassifyTemplateLC.EDITING.getValue().equals(codeClassifyTemplateDO.getLcStatus())){
@@ -374,14 +381,14 @@
     * @return åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public  CodeClstemplateVO getObjectByOid(String oid) {
    public  CodeClassifyTemplateVO getObjectByOid(String oid) {
        return codeClassifyTemplateDO2VO(selectByOid(oid));
    }
    @Override
    public Collection<CodeClstemplateVO> listCodeClassifyTemplateByOids(List<String> oidCollections) {
    public Collection<CodeClassifyTemplateVO> listCodeClassifyTemplateByOids(List<String> oidCollections) {
        VciBaseUtil.alertNotNull(oidCollections,"数据对象主键集合");
        List<CodeClstemplateEntity> codeClassifyTemplateDOList = listCodeClassifyTemplateDOByOidCollections(oidCollections);
        List<CodeClassifyTemplate> codeClassifyTemplateDOList = listCodeClassifyTemplateDOByOidCollections(oidCollections);
        return codeClassifyTemplateDO2VOs(codeClassifyTemplateDOList);
    }
@@ -411,12 +418,12 @@
     * @param oidCollections ä¸»é”®çš„集合
     * @return æ•°æ®å¯¹è±¡åˆ—表
     */
    private List<CodeClstemplateEntity> listCodeClassifyTemplateDOByOidCollections(Collection<String> oidCollections){
        List<CodeClstemplateEntity> codeClassifyTemplateDOList = new ArrayList<CodeClstemplateEntity>();
    private List<CodeClassifyTemplate> listCodeClassifyTemplateDOByOidCollections(Collection<String> oidCollections){
        List<CodeClassifyTemplate> codeClassifyTemplateDOList = new ArrayList<CodeClassifyTemplate>();
        if(!CollectionUtils.isEmpty(oidCollections)){
            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
            for(Collection<String> oids: oidCollectionsList){
                List<CodeClstemplateEntity> tempDOList =  baseMapper.selectBatchIds(oids); //codeClassifyTemplateMapper.selectByPrimaryKeyCollection(oids);
                List<CodeClassifyTemplate> tempDOList =  baseMapper.selectBatchIds(oids); //codeClassifyTemplateMapper.selectByPrimaryKeyCollection(oids);
                if(!CollectionUtils.isEmpty(tempDOList)){
                    codeClassifyTemplateDOList.addAll(tempDOList);
                }
@@ -430,13 +437,13 @@
     * @param oid ä¸»é”®
     * @return  æ•°æ®å¯¹è±¡
     */
    private CodeClstemplateEntity  selectByOid(String oid) {
    private CodeClassifyTemplate selectByOid(String oid) {
        VciBaseUtil.alertNotNull(oid,"主键");
        CodeClstemplateEntity codeClstemplateEntity = baseMapper.selectById(oid.trim());
        if(codeClstemplateEntity == null || StringUtils.isBlank(codeClstemplateEntity.getOid())){
        CodeClassifyTemplate codeClassifyTemplate = baseMapper.selectById(oid.trim());
        if(codeClassifyTemplate == null || StringUtils.isBlank(codeClassifyTemplate.getOid())){
            throw new VciBaseException(DATA_OID_NOT_EXIST);
        }
        return codeClstemplateEntity;
        return codeClassifyTemplate;
    }
    /**
@@ -448,7 +455,7 @@
    @Transactional
    @Override
    public R updateLcStatus( String oid, String lcStatus){
        CodeClstemplateEntity codeClassifyTemplateDO = baseMapper.selectById(oid);
        CodeClassifyTemplate codeClassifyTemplateDO = baseMapper.selectById(oid);
        //停用的时候,验证模板是否为已发布
        if(CodeClassifyTemplateLC.DISABLED.getValue().equals(lcStatus)){
//            CodeClstemplateEntity codeClassifyTemplateDO = baseMapper.selectById(oid);
@@ -470,20 +477,20 @@
     */
    @Transactional
    @Override
    public R Upgrade(CodeClstemplateDTO codeClassifyDTO) {
    public R Upgrade(CodeClassifyTemplateDTO codeClassifyDTO) {
        //旧的模板oid
        String templateOldOid = codeClassifyDTO.getOid();
        //只有已发布的才能升版
        CodeClstemplateEntity codeClassifyTemplateDOOld =  baseMapper.selectById(templateOldOid);
        CodeClassifyTemplate codeClassifyTemplateDOOld =  baseMapper.selectById(templateOldOid);
        if(!FRAMEWORK_RELEASE_RELEASED.equals(codeClassifyTemplateDOOld.getLcStatus())){
            return R.fail("该模板未发布,不能升版!");
        }
        //需要新增的升级模板
//        ClientBusinessObject clientBusinessObject_template = boService.selectCBOByOid(codeClassifyDTO.getOid(), "codeclstemplate");
        CodeClstemplateEntity codeCls_template = baseMapper.selectById(templateOldOid);
        CodeClstemplateEntity codeCls_template_insert = new CodeClstemplateEntity();
        CodeClassifyTemplate codeCls_template = baseMapper.selectById(templateOldOid);
        CodeClassifyTemplate codeCls_template_insert = new CodeClassifyTemplate();
//            ClientBusinessObject clientBusinessObject_template_insert = null;
//        try {
//            clientBusinessObject_template_insert = clientBusinessObjectOperation.reviseBusinessObject(clientBusinessObject_template, "");
@@ -547,7 +554,7 @@
        }
        //复制模板流程
        List<CodeClsflowtempEntity>  codeClassifyProcessTempDOList = copyTemplateProcess(templateOldOid,templateNewOid);
        List<CodeClassifyProcessTemp>  codeClassifyProcessTempDOList = copyTemplateProcess(templateOldOid,templateNewOid);
        //复制模板阶段,阶段属性
        Map phase_attrMap = copyTemplatePhase_attr(templateOldOid,templateNewOid);
@@ -610,16 +617,16 @@
    @Override
    @Transactional
    public R copyTemplate(CodeClstemplateDTO codeClassifyDTO) {
    public R copyTemplate(CodeClassifyTemplateDTO codeClassifyDTO) {
        //旧的模板oid
        String oldOid = codeClassifyDTO.getOid();
        //新的模板oid
        String newOid = VciBaseUtil.getPk();
        //分类oid,复制过来的新的分类oid
        String codeClassifyOid = codeClassifyDTO.getCodeClassifyOid();
        String codeClassifyOid = codeClassifyDTO.getCodeclassifyoid();
        //复制模板
        CodeClstemplateEntity codeClassifyTemplateDO_old = baseMapper.selectById(oldOid);//旧模板
        CodeClassifyTemplate codeClassifyTemplateDO_old = baseMapper.selectById(oldOid);//旧模板
        //验证,业务类型是不是一致
        CodeClassify codeClassifyDO_old = codeClassifyService.selectBtmOrParentBtm(codeClassifyTemplateDO_old.getCodeClassifyOid());
@@ -642,14 +649,14 @@
        codeClassifyTemplateDO_old.setDescription(codeClassifyDTO.getDescription());//描述
        codeClassifyTemplateDO_old.setCodeClassifyOid(codeClassifyOid);//分类oid
        codeClassifyTemplateDO_old.setOid(newOid);
        List<CodeClstemplateEntity> codeClassifyTemplateDOList = new ArrayList<CodeClstemplateEntity>();
        List<CodeClassifyTemplate> codeClassifyTemplateDOList = new ArrayList<CodeClassifyTemplate>();
        codeClassifyTemplateDOList.add(codeClassifyTemplateDO_old);
        //复制模板属性
        List<CodeClassifyTemplateAttr> codeClassifyTemplateAttrDOList = copyTemplateAttr(oldOid,newOid);
        //复制模板流程
        List<CodeClsflowtempEntity> codeClassifyProcessTempDOList = copyTemplateProcess(oldOid,newOid);
        List<CodeClassifyProcessTemp> codeClassifyProcessTempDOList = copyTemplateProcess(oldOid,newOid);
        //复制模板阶段,阶段属性
        Map  phase_attrMap = copyTemplatePhase_attr(oldOid,newOid);
@@ -726,18 +733,21 @@
    /**
     * å¤åˆ¶æ¨¡æ¿æµç¨‹
     */
    public List<CodeClsflowtempEntity> copyTemplateProcess(String templateOldOid,String templateNewOid){
    public List<CodeClassifyProcessTemp> copyTemplateProcess(String templateOldOid,String templateNewOid){
//        VciQueryWrapperForDO processWrapper = new VciQueryWrapperForDO(CodeClassifyProcessTempDO.class);
//        processWrapper.addQueryMap("classifyTemplateOid",templateOldOid);
        Map<String,Object> condition = new HashMap<>(1);
        condition.put("classifyTemplateOid",templateOldOid);
        List<CodeClsflowtempEntity> codeClsflowtempEntities = codeClsflowtempMapper.selectByMap(condition);
//        Map<String,Object> condition = new HashMap<>(1);
//        condition.put("classifyTemplateOid",templateOldOid);
        QueryWrapper<CodeClassifyProcessTemp> wrapper = new QueryWrapper<>();
        wrapper.eq("classifyTemplateOid",templateOldOid);
        List<CodeClassifyProcessTemp> codeClsflowtempEntities = codeClsflowtempServiceImpl.list(wrapper);
//        List<CodeClassifyProcessTempDO>  codeClassifyProcessTempDOList = codeClassifyProcessTempDaoI.selectByWrapper(processWrapper);//要保存的新的模板流程
        for (CodeClsflowtempEntity codeClassifyProcessTempDO:codeClsflowtempEntities){
        for (CodeClassifyProcessTemp codeClassifyProcessTempDO:codeClsflowtempEntities){
//            String newOid = VciBaseUtil.getPk();
            codeClassifyProcessTempDO.setOid(null);
            //codeClassifyProcessTempDO.setCodeClassifyOid(templateNewOid);
            codeClassifyProcessTempDO.setClassifytemplateoid(templateNewOid);
            codeClassifyProcessTempDO.setClassifyTemplateOid(templateNewOid);
//            codeClsflowtempMapper.insert(codeClassifyProcessTempDO);
            //modify by lihang - @20220406 è®¾ç½®æ¨¡æ¿ä¸»é”®ä½ç½®å‡ºé”™ï¼Œå¯¼è‡´å‡ç‰ˆçš„æ¨¡æ¿ä¸­çš„æµç¨‹æ˜¯ç©ºçš„。
        }
@@ -841,14 +851,13 @@
    /**
     * åˆ†ç±»æ¨¡æ¿åˆ—表
     *
     * @param plCodeClstemplate æŸ¥è¯¢æ¡ä»¶
     * @param query   åˆ†é¡µå¯¹è±¡
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper   åˆ†é¡µå¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query) throws VciBaseException {
        DataGrid<CodeClstemplateVO> dataGrid=new DataGrid<CodeClstemplateVO>();
    public DataGrid<CodeClassifyTemplateVO> gridCodeClassifyTemplate(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
        DataGrid<CodeClassifyTemplateVO> dataGrid=new DataGrid<CodeClassifyTemplateVO>();
        //没有传分类id,不执行查询逻辑,直接返回
//        if(conditionMap.size()==0){
//            dataGrid.setData(new ArrayList<>());
@@ -860,14 +869,38 @@
//        }
//        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)))));
//        CodeClassifyTemplateVO codeClstemplateVO = new CodeClassifyTemplateVO();
        CodeClassifyTemplate codeClstemplateQuery = new CodeClassifyTemplate();
//        BeanUtil.toBean(map,codeClstempattrVO);
//        BeanUtil
        BeanMap beanMap = BeanMap.create(codeClstemplateQuery);
        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<CodeClassifyTemplate> doList = baseMapper.
            selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeClstemplateQuery));
        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(codeClassifyTemplateMapper.selectCount(Condition.getQueryWrapper(codeClstemplateQuery)))));
        }
        return dataGrid;
    }
@@ -880,14 +913,14 @@
     * @throws VciBaseException å‚数为空,唯一项,必输项不通过时会抛出异常
     */
    @Override
    public R<CodeClstemplateVO> addSave(CodeClstemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
    public R<CodeClassifyTemplateVO> addSave(CodeClassifyTemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
        VciBaseUtil.alertNotNull(codeClassifyTemplateDTO,"需要添加的数据对象");
        //将DTO转换为DO
        CodeClstemplateEntity codeClassifyTemplateDO = new CodeClstemplateEntity();
        CodeClassifyTemplate codeClassifyTemplateDO = new CodeClassifyTemplate();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDO);
        //查询分类以及上级分类的业务类型btmtypeid、btmtypename
        List<CodeClassify> codeClassifyDOList = codeClassifyService.selectAllLevelParents(codeClassifyTemplateDTO.getCodeClassifyOid());
        List<CodeClassify> codeClassifyDOList = codeClassifyService.selectAllLevelParents(codeClassifyTemplateDTO.getCodeclassifyoid());
        //所有分类都没有业务类型,返回提示
        if(codeClassifyDOList.size()==0){
@@ -991,12 +1024,12 @@
     * @throws VciBaseException å‚数为空,唯一项,必输项不通过时会抛出异常
     */
    @Override
    public R editSave(CodeClstemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
    public R editSave(CodeClassifyTemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
        VciBaseUtil.alertNotNull(codeClassifyTemplateDTO,"数据对象",codeClassifyTemplateDTO.getOid(),"分类模板对象主键");
        //检查ts
        CodeClstemplateEntity codeClassifyTemplateDOCopyFromDTO = new CodeClstemplateEntity();
        CodeClassifyTemplate codeClassifyTemplateDOCopyFromDTO = new CodeClassifyTemplate();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDOCopyFromDTO);
        CodeClstemplateEntity codeClassifyTemplateDO = null;
        CodeClassifyTemplate codeClassifyTemplateDO = null;
        if(codeClassifyTemplateDOCopyFromDTO.getOid() == null){
            baseMapper.insert(codeClassifyTemplateDOCopyFromDTO);
            return R.data(codeClassifyTemplateDOCopyFromDTO);
@@ -1004,7 +1037,7 @@
//            Map<String,Object> condition = new HashMap<>(2);
//            condition.put("oid",codeClassifyTemplateDOCopyFromDTO.getOid());
//            condition.put("ts",codeClassifyTemplateDOCopyFromDTO.getTs());
            CodeClstemplateEntity detail = baseMapper
            CodeClassifyTemplate detail = baseMapper
                .selectById(codeClassifyTemplateDOCopyFromDTO.getOid());
    //        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
            if(detail.getTs().compareTo(codeClassifyTemplateDOCopyFromDTO.getTs()) != 0){//不是最新的不让改
@@ -1038,8 +1071,8 @@
     * @return
     */
    @Override
    public List<CodeClstemplateVO> childTemplates(String codeClassifyOid){
        List<CodeClstemplateVO> codeClassifyTemplateVOList=new ArrayList<>();
    public List<CodeClassifyTemplateVO> childTemplates(String codeClassifyOid){
        List<CodeClassifyTemplateVO> codeClassifyTemplateVOList=new ArrayList<>();
//        Map<String/**模板的主键**/,String/**分类的主键**/> childHasTemplateMap =baseMapper
//            .selectChildHasReleaseTemplate(FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED,
//                codeClassifyOid,CodeClassifyTemplateLC.RELEASED.getValue());
@@ -1054,13 +1087,13 @@
        }
        Set<String> templateOid = childHasTemplateMap.keySet();
        List<CodeClstemplateEntity>  classifyTemplateDOS=new ArrayList<>();
        List<CodeClassifyTemplate>  classifyTemplateDOS=new ArrayList<>();
        if(!CollectionUtils.isEmpty(templateOid)) {
            classifyTemplateDOS= this.listCodeClassifyTemplateDOByOidCollections(templateOid);
        }else{
            classifyTemplateDOS=selectOnlyTemplateByClassifyOid(codeClassifyOid);
        }
        List<CodeClstemplateVO> templateVOList = codeClassifyTemplateDO2VOs(classifyTemplateDOS, true);
        List<CodeClassifyTemplateVO> templateVOList = codeClassifyTemplateDO2VOs(classifyTemplateDOS, true);
        if(!CollectionUtils.isEmpty(templateVOList)){
            codeClassifyTemplateVOList.addAll(templateVOList);
        }
@@ -1073,7 +1106,7 @@
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @return æ¨¡æ¿çš„æ•°æ®å¯¹è±¡
     */
    private List<CodeClstemplateEntity> selectOnlyTemplateByClassifyOid(String codeClassifyOid){
    private List<CodeClassifyTemplate> selectOnlyTemplateByClassifyOid(String codeClassifyOid){
        //1.直接查询,看看这个分类下面有没有发布状态的模板
        //2.如果没有,则往上找分类的内容,这个分类层级不会太多,所以直接递归即可
        //3.如果分类下面添加了模板,但是没有发布,则说明模板可能还在编辑的状态,依然使用上级分类
@@ -1081,11 +1114,11 @@
//        Map<String,String> conditionMap = new HashMap<>();
//        conditionMap.put("codeClassifyOid",codeClassifyOid);
//        conditionMap.put("lcstatus",CodeClassifyTemplateLC.RELEASED.getValue());
        QueryWrapper<CodeClstemplateEntity> wrapper=new QueryWrapper<>();
        QueryWrapper<CodeClassifyTemplate> wrapper=new QueryWrapper<>();
        wrapper.eq("codeClassifyOid",codeClassifyOid)
            .eq("lcstatus",CodeClassifyTemplateLC.RELEASED.getValue());
        List<CodeClstemplateEntity> templateDOS = baseMapper.selectList(wrapper);
        List<CodeClassifyTemplate> templateDOS = baseMapper.selectList(wrapper);
        if(CollectionUtils.isEmpty(templateDOS)){
            //递归找上级的模板
            CodeClassify classifyDO = codeClassifyMapper.selectById(codeClassifyOid);
@@ -1108,13 +1141,13 @@
     * @return æ¨¡æ¿çš„信息
     */
    @Override
    public List<CodeClstemplateVO> listReleaseTemplateByClassifyOid(String codeClassifyOid, boolean hasAttribute) {
    public List<CodeClassifyTemplateVO> listReleaseTemplateByClassifyOid(String codeClassifyOid, boolean hasAttribute) {
        VciBaseUtil.alertNotNull(codeClassifyOid,"主题库分类主键");
        List<CodeClstemplateEntity> templateDOS = selectOnlyTemplateByClassifyOid(codeClassifyOid);
        List<CodeClassifyTemplate> templateDOS = selectOnlyTemplateByClassifyOid(codeClassifyOid);
        if(CollectionUtils.isEmpty(templateDOS)){
            throw new VciBaseException("当前分类,以及其上级分类都没有设置模板");
        }
        List<CodeClstemplateVO> templateVOList = codeClassifyTemplateDO2VOs(templateDOS, true);
        List<CodeClassifyTemplateVO> templateVOList = codeClassifyTemplateDO2VOs(templateDOS, true);
        return sortTemplateByRevision(templateVOList);
    }
@@ -1124,7 +1157,7 @@
     * @return æŽ’序后的列表
     */
    @Override
    public List<CodeClstemplateVO> sortTemplateByRevision(List<CodeClstemplateVO> templateVOList){
    public List<CodeClassifyTemplateVO> sortTemplateByRevision(List<CodeClassifyTemplateVO> templateVOList){
        if(!CollectionUtils.isEmpty(templateVOList) && templateVOList.size() >1){
            //获取版本号最大的那个
            templateVOList = templateVOList.stream().sorted((o1,o2)->
@@ -1142,10 +1175,10 @@
     * @throws VciBaseException å‚数为空,数据不存在时会抛出异常
     */
    @Override
    public CodeClstemplateVO getObjectHasAttrByOid(String oid) throws VciBaseException {
        List<CodeClstemplateEntity> doList = new ArrayList<>();
    public CodeClassifyTemplateVO getObjectHasAttrByOid(String oid) throws VciBaseException {
        List<CodeClassifyTemplate> doList = new ArrayList<>();
        doList.add(selectByOid(oid));
        List<CodeClstemplateVO> templateVOS = codeClassifyTemplateDO2VOs(doList, true);
        List<CodeClassifyTemplateVO> templateVOS = codeClassifyTemplateDO2VOs(doList, true);
        return CollectionUtils.isEmpty(templateVOS)?null:templateVOS.get(0);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyAttrRepeatServiceImpl.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyattrrepeatServiceImpl.java ÐÞ¸Ä
@@ -18,11 +18,11 @@
import com.alibaba.nacos.common.utils.StringUtils;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.mapper.CodeKeyattrrepeatMapper;
import com.vci.ubcs.code.service.ICodeKeyattrrepeatService;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import com.vci.ubcs.code.mapper.CodeKeyAttrRepeatMapper;
import com.vci.ubcs.code.service.ICodeKeyAttrRepeatService;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
@@ -48,13 +48,13 @@
 * @since 2023-04-03
 */
@Service
public class CodeKeyattrrepeatServiceImpl implements ICodeKeyattrrepeatService {
public class CodeKeyAttrRepeatServiceImpl implements ICodeKeyAttrRepeatService {
    @Autowired
    CodeKeyattrrepeatMapper codeKeyattrrepeatMapper;
    CodeKeyAttrRepeatMapper codeKeyattrrepeatMapper;
    @Override
    public IPage<CodeKeyattrrepeatVO> selectPlCodeKeyattrrepeatPage(IPage<CodeKeyattrrepeatVO> page, CodeKeyattrrepeatVO plCodeKeyattrrepeat) {
    public IPage<CodeKeyAttrRepeatVO> selectPlCodeKeyattrrepeatPage(IPage<CodeKeyAttrRepeatVO> page, CodeKeyAttrRepeatVO plCodeKeyattrrepeat) {
        return page.setRecords(codeKeyattrrepeatMapper.selectPlCodeKeyattrrepeatPage(page, plCodeKeyattrrepeat));
    }
@@ -67,20 +67,20 @@
    @Override
    public List<CodeKeyAttrRepeatRuleVO> listCodeKeyAttrRepeatRuleByOids(Collection<String> oidCollections) {
        VciBaseUtil.alertNotNull(oidCollections,"数据对象主键集合");
        List<CodeKeyattrrepeatEntity> codeKeyAttrRepeatRuleDOList = listCodeKeyAttrRepeatRuleDOByOidCollections(oidCollections);
        List<CodeKeyAttrRepeat> codeKeyAttrRepeatRuleDOList = listCodeKeyAttrRepeatRuleDOByOidCollections(oidCollections);
        return codeKeyAttrRepeatRuleDO2VOs(codeKeyAttrRepeatRuleDOList);
    }
    /**
     * æ‰¹é‡æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param codeKeyattrrepeatEntityS æ•°æ®å¯¹è±¡åˆ—表
     * @param codeKeyAttrRepeats æ•°æ®å¯¹è±¡åˆ—表
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<CodeKeyAttrRepeatRuleVO> codeKeyAttrRepeatRuleDO2VOs(Collection<CodeKeyattrrepeatEntity>  codeKeyattrrepeatEntityS){
    public List<CodeKeyAttrRepeatRuleVO> codeKeyAttrRepeatRuleDO2VOs(Collection<CodeKeyAttrRepeat> codeKeyAttrRepeats){
        List<CodeKeyAttrRepeatRuleVO> voList = new ArrayList<CodeKeyAttrRepeatRuleVO>();
        if(!CollectionUtils.isEmpty(codeKeyattrrepeatEntityS)){
            for(CodeKeyattrrepeatEntity s: codeKeyattrrepeatEntityS){
        if(!CollectionUtils.isEmpty(codeKeyAttrRepeats)){
            for(CodeKeyAttrRepeat s: codeKeyAttrRepeats){
                CodeKeyAttrRepeatRuleVO vo =  codeKeyAttrRepeatRuleDO2VO(s);
                if(vo != null){
                    voList.add(vo);
@@ -95,12 +95,12 @@
     * @param oidCollections ä¸»é”®çš„集合
     * @return æ•°æ®å¯¹è±¡åˆ—表
     */
    private List<CodeKeyattrrepeatEntity> listCodeKeyAttrRepeatRuleDOByOidCollections(Collection<String> oidCollections){
        List<CodeKeyattrrepeatEntity> codeKeyAttrRepeatRuleDOList = new ArrayList<CodeKeyattrrepeatEntity>();
    private List<CodeKeyAttrRepeat> listCodeKeyAttrRepeatRuleDOByOidCollections(Collection<String> oidCollections){
        List<CodeKeyAttrRepeat> codeKeyAttrRepeatRuleDOList = new ArrayList<CodeKeyAttrRepeat>();
        if(!CollectionUtils.isEmpty(oidCollections)){
            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
            for(Collection<String> oids: oidCollectionsList){
                List<CodeKeyattrrepeatEntity> tempDOList =  codeKeyattrrepeatMapper.selectBatchIds(oids);
                List<CodeKeyAttrRepeat> tempDOList =  codeKeyattrrepeatMapper.selectBatchIds(oids);
                if(!CollectionUtils.isEmpty(tempDOList)){
                    codeKeyAttrRepeatRuleDOList.addAll(tempDOList);
                }
@@ -112,14 +112,14 @@
    /**
     * æ•°æ®å¯¹è±¡è½¬æ¢ä¸ºæ˜¾ç¤ºå¯¹è±¡
     * @param  codeKeyattrrepeatEntity æ•°æ®å¯¹è±¡
     * @param  codeKeyAttrRepeat æ•°æ®å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public  CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleDO2VO(CodeKeyattrrepeatEntity codeKeyattrrepeatEntity) {
    public  CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleDO2VO(CodeKeyAttrRepeat codeKeyAttrRepeat) {
        CodeKeyAttrRepeatRuleVO vo = new CodeKeyAttrRepeatRuleVO();
        if(codeKeyattrrepeatEntity != null) {
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeKeyattrrepeatEntity, vo);
        if(codeKeyAttrRepeat != null) {
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeKeyAttrRepeat, vo);
            //如果有lcstatus的类的话
            vo.setLcStatusText(FrameworkDataLCStatus.getTextByValue(vo.getLcStatus()));
        }
@@ -133,7 +133,7 @@
     * @return è§„则的显示对象
     */
    @Override
    public CodeKeyattrrepeatVO getRuleByClassifyFullInfo(CodeClassifyFullInfoBO classifyFullInfo) {
    public CodeKeyAttrRepeatVO getRuleByClassifyFullInfo(CodeClassifyFullInfoBO classifyFullInfo) {
        VciBaseUtil.alertNotNull(classifyFullInfo,"主题库分类的信息");
        String keyAttrRuleOid = classifyFullInfo.getCurrentClassifyVO().getCodekeyattrrepeatoid();
        if(StringUtils.isBlank(keyAttrRuleOid)){
@@ -153,7 +153,7 @@
        }
        if(StringUtils.isNotBlank(keyAttrRuleOid)){
            CodeKeyAttrRepeatRuleVO objectByOid = getObjectByOid(keyAttrRuleOid);
            CodeKeyattrrepeatVO codeKeyattrrepeatVO = new CodeKeyattrrepeatVO();
            CodeKeyAttrRepeatVO codeKeyattrrepeatVO = new CodeKeyAttrRepeatVO();
            BeanUtils.copyProperties(objectByOid,codeKeyattrrepeatVO);
            return codeKeyattrrepeatVO;
        }
@@ -169,7 +169,7 @@
    @Override
    public  CodeKeyAttrRepeatRuleVO getObjectByOid(String oid){
        CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleVO = codeKeyAttrRepeatRuleDO2VO(selectByOid(oid));
        CodeKeyattrrepeatVO codeKeyattrrepeatVO = new CodeKeyattrrepeatVO();
        CodeKeyAttrRepeatVO codeKeyattrrepeatVO = new CodeKeyAttrRepeatVO();
        BeanUtils.copyProperties(codeKeyAttrRepeatRuleVO,codeKeyattrrepeatVO);
        return codeKeyAttrRepeatRuleVO;
    }
@@ -179,10 +179,10 @@
     * @return  æ•°æ®å¯¹è±¡
     * @throws VciBaseException å‚数为空,并且数据不存在的时候会抛出异常
     */
    private CodeKeyattrrepeatEntity selectByOid(String oid) {
    private CodeKeyAttrRepeat selectByOid(String oid) {
        VciBaseUtil.alertNotNull(oid,"主键");
        CodeKeyattrrepeatEntity codeKeyAttrRepeatRuleDO = codeKeyattrrepeatMapper.selectById(oid.trim());
        CodeKeyAttrRepeat codeKeyAttrRepeatRuleDO = codeKeyattrrepeatMapper.selectById(oid.trim());
//            .selectByPrimaryKey(oid.trim());
        if(codeKeyAttrRepeatRuleDO == null || StringUtils.isBlank(codeKeyAttrRepeatRuleDO.getOid())){
            throw new VciBaseException(DATA_OID_NOT_EXIST);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
@@ -35,7 +35,6 @@
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseVO;
import com.vci.ubcs.code.wrapper.CodeTemplatePhaseWapper;
import com.vci.ubcs.common.utils.PageDO2PageVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
@@ -379,8 +378,8 @@
        String codePhaseOid = conditionMap.getOrDefault("codePhaseOid", null);
        MPJLambdaWrapper<CodeClassifyTemplateAttr> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(CodeClassifyTemplateAttr.class)
            .selectAs(CodeClstemplateEntity::getName,CodeClassifyTemplateAttr::getClassifyTemplateOidName)
            .leftJoin(CodeClstemplateEntity.class, CodeClstemplateEntity::getOid, CodeClassifyTemplateAttr::getClassifyTemplateOid)
            .selectAs(CodeClassifyTemplate::getName,CodeClassifyTemplateAttr::getClassifyTemplateOidName)
            .leftJoin(CodeClassifyTemplate.class, CodeClassifyTemplate::getOid, CodeClassifyTemplateAttr::getClassifyTemplateOid)
            .eq(CodeClassifyTemplateAttr::getClassifyTemplateOid,conditionMap.getOrDefault("classifyTemplateOid",null));
        if(StringUtils.isNotBlank(codePhaseOid)){
            //排除阶段上使用的
@@ -418,8 +417,8 @@
        //这儿是个连表查询语句
        MPJLambdaWrapper<CodeClassifyTemplateAttr> mpjLambdaWrapper = new MPJLambdaWrapper<>();
        mpjLambdaWrapper.selectAll(CodeClassifyTemplateAttr.class)
            .selectAs(CodeClstemplateEntity::getName,CodeClassifyTemplateAttr::getClassifyTemplateOidName)
            .leftJoin(CodeClstemplateEntity.class,CodeClstemplateEntity::getOid, CodeClassifyTemplateAttr::getClassifyTemplateOid)
            .selectAs(CodeClassifyTemplate::getName,CodeClassifyTemplateAttr::getClassifyTemplateOidName)
            .leftJoin(CodeClassifyTemplate.class, CodeClassifyTemplate::getOid, CodeClassifyTemplateAttr::getClassifyTemplateOid)
            .eq(CodeClassifyTemplateAttr::getClassifyTemplateOid,phaseDO.getCodeClassifyTemplateOid());
        if(ids.size()<1000){
            mpjLambdaWrapper = mpjLambdaWrapper.in(CodeClassifyTemplateAttr::getId, ids);
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
@@ -1,57 +1,10 @@
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.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.service.*;
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;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import com.vci.ubcs.starter.web.util.VciQueryWrapperForDO;
import com.vci.ubcs.starter.web.util.WebUtil;
import com.vci.ubcs.system.entity.DictBiz;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
 * ä¸»æ•°æ®å¼•擎服务
@@ -62,395 +15,455 @@
@Service
public class MdmEngineServiceImpl extends ServiceImpl<CodeAllCodeMapper, CodeAllCode> implements MdmEngineService {
    /**
     * æ¨¡æ¿çš„æœåŠ¡
     */
    @Resource
    private CodeClstemplateServiceImpl templateService;
    /**
     * æ¨¡æ¿çš„æœåŠ¡
     */
    @Resource
    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
    /**
     * ç”Ÿæˆç¼–码的服务
     */
    @Resource
    private MdmProductCodeService productCodeService;
    /**
     * å­—典的服务
     */
    @Resource
    IDictBizClient iDictBizClient;
    /**
     * ç¼–码规则的服务
     */
    @Autowired
    private ICodeRuleService ruleService;
    /**
     * åˆ†ç±»çš„æœåŠ¡
     */
    @Resource
    private ICodeClassifyService classifyService;
    /**
     * å…³é”®å±žæ€§çš„配置
     */
    @Autowired
    private ICodeKeyattrrepeatService keyRuleService;
    /**
     * æ—¥å¿—
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    //    @Autowired
    //    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
    /**
     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
     *
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid) {
        return getUsedTemplateByClassifyOid(codeClassifyOid, true);
    }
    /**
     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
     *
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @param hasAttr         åŒ…含属性
     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid, boolean hasAttr) {
        List<CodeClstemplateVO> templateVOs = templateService.listReleaseTemplateByClassifyOid(codeClassifyOid, hasAttr);
        return templateVOs.get(templateVOs.size() - 1);
    }
    /**
     * èŽ·å–æžšä¸¾çš„ä¸‹æ‹‰é€‰é¡¹
     *
     * @param attrVO æ¨¡æ¿å±žæ€§çš„对象
     * @return ä¸‹æ‹‰é€‰é¡¹
     */
    @Override
    public List<KeyValue> listComboboxItems(CodeClassifyTemplateAttrVO attrVO) {
        List<KeyValue> comboboxKVs = null;
        if (StringUtils.isNotBlank(attrVO.getEnumString())) {
            comboboxKVs = JSONObject.parseArray(attrVO.getEnumString(), KeyValue.class);
        } else {
//            comboboxKVs = enumService.getEnum(attrVO.getEnumid());
//             Dict dict = new Dict();
//            dict.setParentId(Long.valueOf(attrVO.getEnumid()));
            R<List<DictBiz>> list = iDictBizClient.getList(attrVO.getEnumId());
            if(list.isSuccess()){
                for (DictBiz datum : list.getData()) {
                    KeyValue keyValue = new KeyValue();
                    keyValue.setKey(datum.getDictKey());
                    keyValue.setValue(datum.getDictValue());
                    comboboxKVs.add(keyValue);
                }
            }
        }
        return comboboxKVs;
    }
    /**
     * ä¿®æ”¹çŠ¶æ€
     *
     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
     */
    @Override
    public void changeStatus(BaseModelDTO baseModelDTO) {
        VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
        List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
//        List<ClientBusinessObject> cboList = boService.selectCBOByOidCollection(oids, baseModelDTO.getBtmname());
        //插个点 ä¸šåŠ¡ç±»åž‹å®ŒæˆåŽéœ€è¦ä¿®æ”¹
        QueryWrapper<CodeOsbtmtypeEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
        wrapper.in("OID",oids);
        List<CodeOsbtmtypeEntity> cboList = codeOsbtmtypeMapper.selectList(wrapper);
        //还需要修改allCode的生命周期
//        Map<String, String> conditionMap = new HashMap<>();
        QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
        allCodeWrapper.eq("createcodebtm",baseModelDTO.getBtmname());
        allCodeWrapper.in("createcodeoid",oids);
//        conditionMap.put("createcodeoid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")");
//        conditionMap.put("createcodebtm", baseModelDTO.getBtmname());
        List<CodeAllCode> codeCbos = baseMapper.selectList(allCodeWrapper);
//        List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
        // å›žæ”¶éœ€è¦ä¸šåŠ¡æ•°æ®åˆ é™¤
//    /**
//     * æ¨¡æ¿çš„æœåŠ¡
//     */
//    @Resource
//    private CodeClstemplateServiceImpl templateService;
//    /**
//     * æ¨¡æ¿çš„æœåŠ¡
//     */
//    @Resource
//    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
//    /**
//     * ç”Ÿæˆç¼–码的服务
//     */
//    @Resource
//    private MdmProductCodeService productCodeService;
//    /**
//     * å­—典的服务
//     */
//    @Resource
//    IDictBizClient iDictBizClient;
//    /**
//     * å…¬å¼çš„æœåŠ¡
//     */
//    @Autowired
//    private FormulaServiceImpl formulaService;
//
//    /**
//     * é€šç”¨æŸ¥è¯¢
//     */
//    @Resource
//    CommonsMapper commonsMapper;
//    /**
//     * ç¼–码规则的服务
//     */
//    @Autowired
//    private ICodeRuleService ruleService;
//
//    /**
//     * åˆ†ç±»çš„æœåŠ¡
//     */
//    @Resource
//    private ICodeClassifyService classifyService;
//
//    /**
//     * å…³é”®å±žæ€§çš„配置
//     */
//    @Autowired
//    private ICodeKeyattrrepeatService keyRuleService;
//    /**
//     * æ—¥å¿—
//     */
//    private Logger logger = LoggerFactory.getLogger(getClass());
//
//    /**
//     * ç©ºæ ¼
//     */
//    public static final String SPACE = " ";
//
//    /**
//     * å¯†çº§çš„字段
//     */
//    public static final String SECRET_FILED = "secretgrade";
//    /**
//     * ç”¨æˆ·æ–°å¢žæ•°æ®çš„æ—¶å€™å¯ä»¥æŸ¥çœ‹çš„密级
//     */
//    public static final String MY_DATA_SECRET = "myDataSecret";
//    /**
//     * æ‹·è´çš„版本
//     */
//    public static final String COPY_FROM_VERSION = "copyfromversion";
//    /**
//     * åªæ˜¯sql
//     */
//    public static final String ONLY = "${vcionly}";
//
//    /**
//     * é»˜è®¤çš„æ—¶é—´æ ¼å¼
//     */
//    private static final String DATETIME_FORMAT = "yyyy-mm-dd hh24:mi:ss";
//
//    /**
//     * æ—¥æœŸæ ¼å¼
//     */
//    private static final String DATE_FORMAT = "yyyy-mm-dd";
//
//    /**
//     * å¿…输
//     */
//    public static final String REQUIRED_CHAR = "*";
//    /**
//     * æ›¿æ¢å­—符
//     */
//    public static final String SPECIAL_CHAR  = "VCI";
////    @Autowired
////    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
//
//
//
//    /**
//     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
//     *
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     */
//    @Override
//    public CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid) {
//        return getUsedTemplateByClassifyOid(codeClassifyOid, true);
//    }
//
//    /**
//     * ä½¿ç”¨åˆ†ç±»çš„主键获取可以使用的模板对象
//     *
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @param hasAttr         åŒ…含属性
//     * @return æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     */
//    @Override
//    public CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid, boolean hasAttr) {
//        List<CodeClstemplateVO> templateVOs = templateService.listReleaseTemplateByClassifyOid(codeClassifyOid, hasAttr);
//        return templateVOs.get(templateVOs.size() - 1);
//    }
//
//    /**
//     * èŽ·å–æžšä¸¾çš„ä¸‹æ‹‰é€‰é¡¹
//     *
//     * @param attrVO æ¨¡æ¿å±žæ€§çš„对象
//     * @return ä¸‹æ‹‰é€‰é¡¹
//     */
//    @Override
//    public List<KeyValue> listComboboxItems(CodeClassifyTemplateAttrVO attrVO) {
//        List<KeyValue> comboboxKVs = null;
//        if (StringUtils.isNotBlank(attrVO.getEnumString())) {
//            comboboxKVs = JSONObject.parseArray(attrVO.getEnumString(), KeyValue.class);
//        } else {
////            comboboxKVs = enumService.getEnum(attrVO.getEnumid());
////             Dict dict = new Dict();
////            dict.setParentId(Long.valueOf(attrVO.getEnumid()));
//            R<List<DictBiz>> list = iDictBizClient.getList(attrVO.getEnumId());
//            if(list.isSuccess()){
//                for (DictBiz datum : list.getData()) {
//                    KeyValue keyValue = new KeyValue();
//                    keyValue.setKey(datum.getDictKey());
//                    keyValue.setValue(datum.getDictValue());
//                    comboboxKVs.add(keyValue);
//                }
//            }
//        }
//        return comboboxKVs;
//    }
//    /**
//     * ä¿®æ”¹çŠ¶æ€
//     *
//     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
//     */
//    @Override
//    public void changeStatus(BaseModelDTO baseModelDTO) {
//        VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
//        List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
////        List<ClientBusinessObject> cboList = boService.selectCBOByOidCollection(oids, baseModelDTO.getBtmname());
//        //插个点 ä¸šåŠ¡ç±»åž‹å®ŒæˆåŽéœ€è¦ä¿®æ”¹
//        QueryWrapper<CodeOsbtmtypeEntity> wrapper = new QueryWrapper<>();
//        wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
//        wrapper.in("OID",oids);
//        List<CodeOsbtmtypeEntity> cboList = codeOsbtmtypeMapper.selectList(wrapper);
//        //还需要修改allCode的生命周期
////        Map<String, String> conditionMap = new HashMap<>();
//        QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
//        allCodeWrapper.eq("createcodebtm",baseModelDTO.getBtmname());
//        allCodeWrapper.in("createcodeoid",oids);
////        conditionMap.put("createcodeoid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")");
////        conditionMap.put("createcodebtm", baseModelDTO.getBtmname());
//        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 {
//            lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
////            lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
//        }
//        lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
    }
    /**
     * ç”³è¯·å•一编码
     *
     * @param orderDTO ç”³è¯·çš„信息,需要包含属性的内容和码段相关的内容
     * @return è¿”回编码的内容
     */
    @Override
    public String addSaveCode(CodeOrderDTO orderDTO) {
        VciBaseUtil.alertNotNull(orderDTO, "编码申请相关的属性和码段的内容都为空", orderDTO.getCodeClassifyOid(), "主题库分类的主键",
            orderDTO.getTemplateOid(), "模板的主键", orderDTO.getCodeRuleOid(), "编码规则的主键");
        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
        CodeClstemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
        CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(orderDTO.getCodeRuleOid());
        //1.判断规则中除了流水码段,是否有其他码段
        checkSecValueOnOrder(ruleVO, orderDTO);
        //2.判断必输项
        checkRequiredAttrOnOrder(templateVO, orderDTO);
        //3.先注入,再组合,最后校验
        switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
        //4.处理组合规则。组合规则不能使用编码的属性,因为编码的生成可能是需要属性的
        switchComponentAttrOnOrder(templateVO, orderDTO);
        //5.校验规则
        checkVerifyOnOrder(templateVO, orderDTO);
        //6.关键属性
        checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
        //7.枚举转换
        checkEnumOnOrder(templateVO, orderDTO);
        //8.处理时间格式,在数据库里面不论是字符串还是日期格式,都使用相同的格式存储
        switchDateAttrOnOrder(templateVO, orderDTO);
        //9.生成编码的信息
//        ClientBusinessObject cbo = boService.createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
////        lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
//    }
//
//
//    /**
//     * ç”³è¯·å•一编码
//     *
//     * @param orderDTO ç”³è¯·çš„信息,需要包含属性的内容和码段相关的内容
//     * @return è¿”回编码的内容
//     */
//    @Override
//    public String addSaveCode(CodeOrderDTO orderDTO) {
//        VciBaseUtil.alertNotNull(orderDTO, "编码申请相关的属性和码段的内容都为空", orderDTO.getCodeClassifyOid(), "主题库分类的主键",
//            orderDTO.getTemplateOid(), "模板的主键", orderDTO.getCodeRuleOid(), "编码规则的主键");
//        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
//        CodeClstemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
//        CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(orderDTO.getCodeRuleOid());
//        //1.判断规则中除了流水码段,是否有其他码段
//        checkSecValueOnOrder(ruleVO, orderDTO);
//        //2.判断必输项
//        checkRequiredAttrOnOrder(templateVO, orderDTO);
//        //3.先注入,再组合,最后校验
//        switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
//        //4.处理组合规则。组合规则不能使用编码的属性,因为编码的生成可能是需要属性的
//        switchComponentAttrOnOrder(templateVO, orderDTO);
//        //5.校验规则
//        checkVerifyOnOrder(templateVO, orderDTO);
//        //6.关键属性
//        checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
//        //7.枚举转换
//        checkEnumOnOrder(templateVO, orderDTO);
//        //8.处理时间格式,在数据库里面不论是字符串还是日期格式,都使用相同的格式存储
//        switchDateAttrOnOrder(templateVO, orderDTO);
//        //9.生成编码的信息
////        ClientBusinessObject cbo = boService.createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
//        CodeWupinEntity cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
//        //默认的属性都不用从前端拷贝
//        //设置编码需要的默认属性的内容
////        //默认的属性都不用从前端拷贝
////        //设置编码需要的默认属性的内容
//        copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
//        //TODO:因为默认的属性都不拷贝,目前集团码叫name,并没有从DTO拷贝到cbo里。增加一个单独处理,以后再看要不要调整
////        //TODO:因为默认的属性都不拷贝,目前集团码叫name,并没有从DTO拷贝到cbo里。增加一个单独处理,以后再看要不要调整
//        cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
//        //end -- modify by lihang @20220407
////        //end -- modify by lihang @20220407
//        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);
//
//
//        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;
    }
    /**
     * å¤„理分类注入的信息
     *
     * @param templateVO         æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œå¿…须要后模板的属性
     * @param classifyFullInfoBO åˆ†ç±»çš„全路径
     * @param orderDTO           ç¼–码申请的信息
     */
    private void switchClassifyLevelOnOrder(CodeClstemplateVO templateVO, CodeClassifyFullInfoBO classifyFullInfoBO, CodeOrderDTO orderDTO) {
        Map<String,CodeClassifyTemplateAttrVO> classifyAttrVOMap = templateVO.getAttributes().stream().filter(
            s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr()) && StringUtils.isNotBlank(s.getClassifyInvokeLevel())
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (classifyFullInfoBO.getTopClassifyVO() == null) {
            //需要重新查询一下,因为这个是指定的分类进来的
        }
        if (!CollectionUtils.isEmpty(classifyAttrVOMap)) {
            classifyAttrVOMap.forEach((attrId, attrVO) -> {
                //分类注入的编号或者名称,
                //层级包含指定层和最小层
                CodeClassifyVO classifyVO = null;
                if (!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyInvokeLevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyInvokeLevel())) {
                    //指定了层级的
                    //注意,因为查询上级分类出来的层级是倒序的,即顶层节点是最大的值
                    List<CodeClassifyVO> classifyVOS = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
                    int level = VciBaseUtil.getInt(attrVO.getClassifyInvokeLevel());
                    if (classifyVOS.size() >= level && level > 0) {
                        classifyVO = classifyVOS.get(level - 1);
                    }
                } else {
                    //当前的分类
                    classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
                }
                if (classifyVO == null) {
                    //说明层级有误
                    orderDTO.getData().put(attrId, "分类树上没有层级[" + attrVO.getClassifyInvokeLevel() + "]");
                    // classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
                } else {
                    Map<String, String> classifyDataMap = VciBaseUtil.objectToMapString(classifyVO);
                    String value = classifyDataMap.getOrDefault(attrVO.getClassifyInvokeAttr(), "");
                    orderDTO.getData().put(attrId, value);
                }
            });
        }
    }
    /**
     * åˆ¤æ–­ç¼–码的码段是否输入或者选择了码值
     *
     * @param ruleVO   è§„则的显示对象
     * @param orderDTO ç¼–码申请的内容
     */
    @Override
    public void checkSecValueOnOrder(CodeRuleVO ruleVO, CodeOrderDTO orderDTO) {
        List<String> unSerialSecOidList = ruleVO.getSecVOList().stream().filter(
            s -> !(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(s.getSecType())
                || CodeSecTypeEnum.CODE_ATTR_SEC.getValue().equalsIgnoreCase(s.getSecType())
                || CodeSecTypeEnum.CODE_DATE_SEC.getValue().equalsIgnoreCase(s.getSecType())
                || CodeSecTypeEnum.CODE_LEVEL_SEC.getValue().equalsIgnoreCase(s.getSecType())
                || VciBaseUtil.getBoolean(s.getNullableFlag()))
        ).map(CodeBasicSecVO::getOid).collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(unSerialSecOidList)) {
            if (CollectionUtils.isEmpty(orderDTO.getSecDTOList())) {
                throw new VciBaseException("非流水码段(或者必输码段)必须要输入(或选择)码值");
            }
            if (orderDTO.getSecDTOList().stream().anyMatch(s -> !unSerialSecOidList.contains(s.getSecOid())
                && StringUtils.isBlank(s.getSecValue()))) {
                throw new VciBaseException("非流水码段(或者必输码段)必须要输入(或选择)码值");
            }
        }
    }
    /**
     * æ ¡éªŒå±žæ€§æ˜¯å¦ä¸ºå¿…输
     *
     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含模板属性
     * @param orderDTO   ç¼–码申请的信息
     */
    private void checkRequiredAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
        Map<String, CodeClassifyTemplateAttrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(
                s -> VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule())
                    && StringUtils.isBlank(s.getClassifyInvokeAttr()))
            .collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(requiredAttrMap)) {
            requiredAttrMap.forEach((attrId, attrVO) -> {
                //只有企业编码,状态,备注,模板主键,分类主键这几个是固定的,其余都是自行配置的
                if (StringUtils.isBlank(getValueFromOrderDTO(orderDTO, attrId))) {
                    throw new VciBaseException("属性【{0}】必须要输入(选择)内容", new String[]{attrVO.getName()});
                }
            });
        }
    }
    /**
     * ä»Žç¼–码申请信息对象上获取某个属性的值
     *
     * @param orderDTO ç¼–码申请对象
     * @param attrId   å±žæ€§çš„编号
     * @return å€¼
     */
    private String getValueFromOrderDTO(CodeOrderDTO orderDTO, String attrId) {
        attrId = attrId.toLowerCase(Locale.ROOT);
        String value = null;
        if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
            value = WebUtil.getStringValueFromObject(WebUtil.getValueFromField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO));
        } else {
            //说明是自行配置的
            //前端必须要传递小写的属性
            value = orderDTO.getData().getOrDefault(attrId, "");
        }
        return value;
    }
    /**
     * è½¬æ¢ç»„合规则的值
     *
     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含模板属性
     * @param orderDTO   ç¼–码申请的信息
     */
    private void switchComponentAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
        Map<String, CodeClassifyTemplateAttrVO> compAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getComponentRule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(compAttrVOMap)) {
            Map<String, String> dataMap = WebUtil.objectToMapString(orderDTO);
            Map<String, String> dataLowMap = new HashMap<>();
            if (!CollectionUtils.isEmpty(dataMap)) {
                dataMap.forEach((key, value) -> {
                    dataLowMap.put(key.toLowerCase(Locale.ROOT), value);
                });
            }
            dataLowMap.putAll(orderDTO.getData());
            compAttrVOMap.forEach((attrId, attrVO) -> {
////        return null;
//    }
//
//    /**
//     * å¤„理分类注入的信息
//     *
//     * @param templateVO         æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œå¿…须要后模板的属性
//     * @param classifyFullInfoBO åˆ†ç±»çš„全路径
//     * @param orderDTO           ç¼–码申请的信息
//     */
//    private void switchClassifyLevelOnOrder(CodeClstemplateVO templateVO, CodeClassifyFullInfoBO classifyFullInfoBO, CodeOrderDTO orderDTO) {
//        Map<String,CodeClstempattrVO> classifyAttrVOMap = templateVO.getAttributes().stream().filter(
//            s -> StringUtils.isNotBlank(s.getClassifyinvokeattr()) && StringUtils.isNotBlank(s.getClassifyinvokelevel())
//        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        if (classifyFullInfoBO.getTopClassifyVO() == null) {
//            //需要重新查询一下,因为这个是指定的分类进来的
//
//        }
//        if (!CollectionUtils.isEmpty(classifyAttrVOMap)) {
//            classifyAttrVOMap.forEach((attrId, attrVO) -> {
//                //分类注入的编号或者名称,
//                //层级包含指定层和最小层
//                CodeClassifyVO classifyVO = null;
//                if (!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyinvokelevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyinvokelevel())) {
//                    //指定了层级的
//                    //注意,因为查询上级分类出来的层级是倒序的,即顶层节点是最大的值
//                    List<CodeClassifyVO> classifyVOS = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
//                    int level = VciBaseUtil.getInt(attrVO.getClassifyinvokelevel());
//                    if (classifyVOS.size() >= level && level > 0) {
//                        classifyVO = classifyVOS.get(level - 1);
//                    }
//                } else {
//                    //当前的分类
//                    classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
//                }
//                if (classifyVO == null) {
//                    //说明层级有误
//                    orderDTO.getData().put(attrId, "分类树上没有层级[" + attrVO.getClassifyinvokelevel() + "]");
//                    // classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
//                } else {
//                    Map<String, String> classifyDataMap = VciBaseUtil.objectToMapString(classifyVO);
//                    String value = classifyDataMap.getOrDefault(attrVO.getClassifyinvokeattr(), "");
//                    orderDTO.getData().put(attrId, value);
//                }
//            });
//        }
//    }
//
//
//    /**
//     * åˆ¤æ–­ç¼–码的码段是否输入或者选择了码值
//     *
//     * @param ruleVO   è§„则的显示对象
//     * @param orderDTO ç¼–码申请的内容
//     */
//    @Override
//    public void checkSecValueOnOrder(CodeRuleVO ruleVO, CodeOrderDTO orderDTO) {
//        List<String> unSerialSecOidList = ruleVO.getSecVOList().stream().filter(
//            s -> !(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(s.getSecType())
//                || CodeSecTypeEnum.CODE_ATTR_SEC.getValue().equalsIgnoreCase(s.getSecType())
//                || CodeSecTypeEnum.CODE_DATE_SEC.getValue().equalsIgnoreCase(s.getSecType())
//                || CodeSecTypeEnum.CODE_LEVEL_SEC.getValue().equalsIgnoreCase(s.getSecType())
//                || VciBaseUtil.getBoolean(s.getNullableFlag()))
//        ).map(CodeBasicSecVO::getOid).collect(Collectors.toList());
//        if (!CollectionUtils.isEmpty(unSerialSecOidList)) {
//            if (CollectionUtils.isEmpty(orderDTO.getSecDTOList())) {
//                throw new VciBaseException("非流水码段(或者必输码段)必须要输入(或选择)码值");
//            }
//            if (orderDTO.getSecDTOList().stream().anyMatch(s -> !unSerialSecOidList.contains(s.getSecOid())
//                && StringUtils.isBlank(s.getSecValue()))) {
//                throw new VciBaseException("非流水码段(或者必输码段)必须要输入(或选择)码值");
//            }
//        }
//    }
//
//    /**
//     * æ ¡éªŒå±žæ€§æ˜¯å¦ä¸ºå¿…输
//     *
//     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含模板属性
//     * @param orderDTO   ç¼–码申请的信息
//     */
//    private void checkRequiredAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
//        Map<String, CodeClstempattrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(
//                s -> VciBaseUtil.getBoolean(s.getRequireflag()) && StringUtils.isBlank(s.getComponentrule())
//                    && StringUtils.isBlank(s.getClassifyinvokeattr()))
//            .collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        if (!CollectionUtils.isEmpty(requiredAttrMap)) {
//            requiredAttrMap.forEach((attrId, attrVO) -> {
//                //只有企业编码,状态,备注,模板主键,分类主键这几个是固定的,其余都是自行配置的
//                if (StringUtils.isBlank(getValueFromOrderDTO(orderDTO, attrId))) {
//                    throw new VciBaseException("属性【{0}】必须要输入(选择)内容", new String[]{attrVO.getName()});
//                }
//            });
//        }
//    }
//
//    /**
//     * ä»Žç¼–码申请信息对象上获取某个属性的值
//     *
//     * @param orderDTO ç¼–码申请对象
//     * @param attrId   å±žæ€§çš„编号
//     * @return å€¼
//     */
//    private String getValueFromOrderDTO(CodeOrderDTO orderDTO, String attrId) {
//        attrId = attrId.toLowerCase(Locale.ROOT);
//        String value = null;
//        if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
//            value = WebUtil.getStringValueFromObject(WebUtil.getValueFromField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO));
//        } else {
//            //说明是自行配置的
//            //前端必须要传递小写的属性
//            value = orderDTO.getData().getOrDefault(attrId, "");
//        }
//        return value;
//    }
//
//    /**
//     * è½¬æ¢ç»„合规则的值
//     *
//     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含模板属性
//     * @param orderDTO   ç¼–码申请的信息
//     */
//    private void switchComponentAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
//        Map<String, CodeClstempattrVO> compAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getComponentrule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        if (!CollectionUtils.isEmpty(compAttrVOMap)) {
//            Map<String, String> dataMap = WebUtil.objectToMapString(orderDTO);
//
//            Map<String, String> dataLowMap = new HashMap<>();
//            if (!CollectionUtils.isEmpty(dataMap)) {
//                dataMap.forEach((key, value) -> {
//                    dataLowMap.put(key.toLowerCase(Locale.ROOT), value);
//                });
//            }
//            dataLowMap.putAll(orderDTO.getData());
//            compAttrVOMap.forEach((attrId, attrVO) -> {
//                dataLowMap.put(attrId, formulaService.getValueByFormula(dataLowMap, attrVO.getComponentrule()));
            });
            dataLowMap.forEach((key, value) -> {
                setValueToOrderDTO(orderDTO, key, value);
            });
        }
    }
    /**
     * è®¾ç½®æ–°çš„值到申请对象上
     *
     * @param orderDTO ç¼–码申请对象
     * @param attrId   å±žæ€§çš„编号
     * @param value    å€¼
     */
    private void setValueToOrderDTO(CodeOrderDTO orderDTO, String attrId, String value) {
        attrId = attrId.toLowerCase(Locale.ROOT);
        if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
            WebUtil.setValueToField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO, value);
        } else {
            orderDTO.getData().put(attrId, value);
        }
    }
    /**
     * æ ¡éªŒæ­£åˆ™è¡¨è¾¾å¼æ˜¯å¦æ­£ç¡®
     *
     * @param templateVO æ¨¡æ¿çš„信息,必须包含属性的内容
     * @param orderDTO   ç¼–码申请的相关的信息
     */
    private void checkVerifyOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
        Map<String, CodeClassifyTemplateAttrVO> verifyAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getVerifyRule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(verifyAttrVOMap)) {
            verifyAttrVOMap.forEach((attrId, attrVO) -> {
                String value = getValueFromOrderDTO(orderDTO, attrId);
                if (StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyRule())) {
                    //校验正则表达式
                    throw new VciBaseException("属性[{0}]的值不符合校验规则的要求", new String[]{attrVO.getName()});
                }
            });
        }
    }
    /**
     * æ ¡éªŒå…³é”®å±žæ€§
     *
     * @param classifyFullInfo åˆ†ç±»çš„全部信息
     * @param templateVO       æ¨¡æ¿çš„内容,必须包含模板属性
     * @param orderDTO         ç¼–码申请的相关的信息
     */
    private void checkKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
        //先获取关键属性的规则,也利用继承的方式
        CodeKeyattrrepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
        //注意的是keyRuleVO可能为空,表示不使用规则控制
        //获取所有的关键属性
        Map<String, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        Map<String, String> conditionMap = new HashMap<>();
        boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
        //全部去空的优先级大于去空
        boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
        boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
        boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
        ketAttrMap.forEach((attrId, attrVO) -> {
            String value = getValueFromOrderDTO(orderDTO, attrId);
            if (value == null) {
                value = "";
            }
//            });
//            dataLowMap.forEach((key, value) -> {
//                setValueToOrderDTO(orderDTO, key, value);
//            });
//        }
//    }
//
//
//    /**
//     * è®¾ç½®æ–°çš„值到申请对象上
//     *
//     * @param orderDTO ç¼–码申请对象
//     * @param attrId   å±žæ€§çš„编号
//     * @param value    å€¼
//     */
//    private void setValueToOrderDTO(CodeOrderDTO orderDTO, String attrId, String value) {
//        attrId = attrId.toLowerCase(Locale.ROOT);
//        if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
//            WebUtil.setValueToField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO, value);
//        } else {
//            orderDTO.getData().put(attrId, value);
//        }
//    }
//
//    /**
//     * æ ¡éªŒæ­£åˆ™è¡¨è¾¾å¼æ˜¯å¦æ­£ç¡®
//     *
//     * @param templateVO æ¨¡æ¿çš„信息,必须包含属性的内容
//     * @param orderDTO   ç¼–码申请的相关的信息
//     */
//    private void checkVerifyOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
//        Map<String, CodeClstempattrVO> verifyAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getVerifyrule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        if (!CollectionUtils.isEmpty(verifyAttrVOMap)) {
//            verifyAttrVOMap.forEach((attrId, attrVO) -> {
//                String value = getValueFromOrderDTO(orderDTO, attrId);
//                if (StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyrule())) {
//                    //校验正则表达式
//                    throw new VciBaseException("属性[{0}]的值不符合校验规则的要求", new String[]{attrVO.getName()});
//                }
//            });
//        }
//    }
//
//    /**
//     * æ ¡éªŒå…³é”®å±žæ€§
//     *
//     * @param classifyFullInfo åˆ†ç±»çš„全部信息
//     * @param templateVO       æ¨¡æ¿çš„内容,必须包含模板属性
//     * @param orderDTO         ç¼–码申请的相关的信息
//     */
//    private void checkKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
//        //先获取关键属性的规则,也利用继承的方式
//        CodeKeyattrrepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
//        //注意的是keyRuleVO可能为空,表示不使用规则控制
//        //获取所有的关键属性
//        Map<String, CodeClstempattrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyattrflag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        Map<String, String> conditionMap = new HashMap<>();
//        boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
//        //全部去空的优先级大于去空
//        boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
//        boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
//        boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
//        ketAttrMap.forEach((attrId, attrVO) -> {
//            String value = getValueFromOrderDTO(orderDTO, attrId);
//            if (value == null) {
//                value = "";
//            }
//            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) -> {
@@ -463,26 +476,27 @@
//                sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
//            }
//            sql[0] += " and islastR = '1' and islastV = '1' ";
//            if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
////            if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
//            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);
//            }
//        }
    }
    /**
     * å°è£…关键属性的查询语句
     *
     * @param value        å½“前的值
     * @param keyRuleVO    å…³é”®å±žæ€§çš„æŽ§åˆ¶è§„则,可以为空
     * @param attrId       å±žæ€§çš„编号
     * @param trim         æ˜¯å¦åŽ»é™¤ç©ºæ ¼
     * @param ignoreCase   æ˜¯å¦ä¸åŒºåˆ†å¤§å°å†™
     * @param ignoreWidth  æ˜¯å¦å¿½ç•¥å…¨åŠè§’
     * @param trimAll      æ˜¯å¦å¿½ç•¥å…¨éƒ¨ç©ºæ ¼
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     */
//    }
//
//    /**
//     * å°è£…关键属性的查询语句
//     *
//     * @param value        å½“前的值
//     * @param keyRuleVO    å…³é”®å±žæ€§çš„æŽ§åˆ¶è§„则,可以为空
//     * @param attrId       å±žæ€§çš„编号
//     * @param trim         æ˜¯å¦åŽ»é™¤ç©ºæ ¼
//     * @param ignoreCase   æ˜¯å¦ä¸åŒºåˆ†å¤§å°å†™
//     * @param ignoreWidth  æ˜¯å¦å¿½ç•¥å…¨åŠè§’
//     * @param trimAll      æ˜¯å¦å¿½ç•¥å…¨éƒ¨ç©ºæ ¼
//     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
//     */
//    @Override
//    public void wrapperKeyAttrConditionMap(String value, CodeKeyattrrepeatVO keyRuleVO, String attrId,
//                                           boolean trim, boolean ignoreCase, boolean ignoreWidth,
@@ -531,132 +545,134 @@
//            }
//        }
//    }
    /**
     * æ ¡éªŒæžšä¸¾çš„内容
     *
     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含属性
     * @param orderDTO   ç¼–码申请的信息
     */
    private void checkEnumOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
        //如果枚举可以修改,则不需要校验是否符合枚举的选项
        Map<String, CodeClassifyTemplateAttrVO> enumAttrVOMap = templateVO.getAttributes().stream().filter(s -> (StringUtils.isNotBlank(s.getEnumString()) || StringUtils.isNotBlank(s.getEnumId())) && !VciBaseUtil.getBoolean(s.getEnumEditFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(enumAttrVOMap)) {
            enumAttrVOMap.forEach((attrId, attrVO) -> {
                String value = getValueFromOrderDTO(orderDTO, attrId);
                if (StringUtils.isNotBlank(value)) {
                    //有值才能校验
                    List<KeyValue> comboboxKVs = listComboboxItems(attrVO);
                    if (!comboboxKVs.stream().anyMatch(s -> value.equalsIgnoreCase(s.getKey()))) {
                        throw new VciBaseException("属性【{0}】的值不符合枚举的要求", new String[]{attrVO.getName()});
                    }
                }
            });
        }
    }
    /**
     * è½¬æ¢æ—¶é—´çš„æ ¼å¼
     *
     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含属性
     * @param orderDTO   ç¼–码申请的信息
     */
    private void switchDateAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
        Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getCodeDateFormat())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
            dateAttrVOMap.forEach((attrId, attrVO) -> {
                String value = getValueFromOrderDTO(orderDTO, attrId);
                if (StringUtils.isNotBlank(value)) {
                    DateConverter dateConverter = new DateConverter();
                    dateConverter.setAsText(value);
                    value = VciDateUtil.date2Str(dateConverter.getValue(), VciDateUtil.DateTimeMillFormat);
                    setValueToOrderDTO(orderDTO, attrId, value);
                }
            });
        }
    }
    /**
     * æ‹·è´æ•°æ®åˆ°cbo对象上
     *
     * @param classifyFullInfo åˆ†ç±»çš„全部信息
     * @param cbo              ä¸šåŠ¡æ•°æ®
     * @param orderDTO         ç¼–码申请的信息
     * @param templateVO       æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     * @param edit             æ˜¯å¦ä¸ºä¿®æ”¹
     */
    private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, CodeWupinEntity cbo,
                                CodeOrderDTO orderDTO, CodeClstemplateVO templateVO,
                                boolean edit) {
        String fullPath = "";
        if (!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())) {
            fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel())))
                .map(CodeClassifyVO::getOid).collect(Collectors.joining("##"));
        } else {
            fullPath = classifyFullInfo.getCurrentClassifyVO().getOid();
        }
//        BeanUtils.
        BeanUtils.copyProperties(orderDTO.getData(),cbo);
        cbo.setMaterialtype(Short.valueOf("1001"));
//        orderDTO.getData().forEach((key, value) -> {
//            if (!edit || (!checkUnAttrUnEdit(key) &&
//                !VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(key))) {
//                try {
//                    cbo.setAttributeValue(key, value);
//                } catch (Exception e) {
//                    logger.error("设置属性的值错误", e);
//                }
//            }
//        });
        try {
            cbo.setCodeclsfid(classifyFullInfo.getCurrentClassifyVO().getOid());
            cbo.setCodetemplateoid(templateVO.getOid());
            cbo.setCodeclsfpath(fullPath);
//            cbo.setMaterialclassify("model_type");
//            cbo.setMaterialname(orderDTO.getData().get("materialname"));
//            cbo.setShifoupihaoguanli("true");
//            cbo.setKucunwl("true");
//            cbo.setXiaoshouwl("false");
            if (!edit && StringUtils.isBlank(orderDTO.getLcStatus())) {
                //找生命周期的起始状态,插个点,看生命周期是否需要创建
                if (StringUtils.isNotBlank(cbo.getLctid())) {
//                    OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(cbo.getLctid());
//                    if (lifeCycleVO != null) {
//                        cbo.setLcStatus("Editing");
////                        cbo.setLcStatus(lifeCycleVO.getStartStatus());
//                    } else {
                        cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
//
//    /**
//     * æ ¡éªŒæžšä¸¾çš„内容
//     *
//     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含属性
//     * @param orderDTO   ç¼–码申请的信息
//     */
//    private void checkEnumOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
//        //如果枚举可以修改,则不需要校验是否符合枚举的选项
//
//        Map<String, CodeClstempattrVO> enumAttrVOMap = templateVO.getAttributes().stream().filter(s -> (StringUtils.isNotBlank(s.getEnumstring()) || StringUtils.isNotBlank(s.getEnumid())) && !VciBaseUtil.getBoolean(s.getEnumeditflag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        if (!CollectionUtils.isEmpty(enumAttrVOMap)) {
//            enumAttrVOMap.forEach((attrId, attrVO) -> {
//                String value = getValueFromOrderDTO(orderDTO, attrId);
//                if (StringUtils.isNotBlank(value)) {
//                    CodeClassifyTemplateAttrVO codeClassifyTemplateAttrVO = new CodeClassifyTemplateAttrVO();
//                    BeanUtils.copyProperties(attrVO,codeClassifyTemplateAttrVO);
//                    //有值才能校验
//                    List<KeyValue> comboboxKVs = listComboboxItems(codeClassifyTemplateAttrVO);
//                    if (!comboboxKVs.stream().anyMatch(s -> value.equalsIgnoreCase(s.getKey()))) {
//                        throw new VciBaseException("属性【{0}】的值不符合枚举的要求", new String[]{attrVO.getName()});
//                    }
                } else {
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                }
            }
            int secret = VciBaseUtil.getInt(cbo.getSecretGrade().toString());
            //插个点,后续看密级服务是否可用
//            if (secret == 0 || !secretService.checkDataSecret(secret)) {
            if (secret == 0 ) {
                Integer userSecret = VciBaseUtil.getCurrentUserSecret();
//                cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
                cbo.setSecretGrade(userSecret == null || userSecret == 0 ? UserSecretEnum.NONE.getValue() : userSecret);
            }
        } catch (Throwable e) {
            logger.error("设置默认的属性的值错误", e);
        }
    }
    /**
     * åˆå§‹åŒ–业务类型
     * --创建人默认为当前用户,如果需要修改,可以在获取后自行处理
     * @param btmName ä¸šåŠ¡ç±»åž‹çš„åç§°ï¼Œä¼šè‡ªåŠ¨å˜æˆå°å†™
     * @return CodeWupinEntity
     * @throws VciBaseException åˆå§‹åŒ–出错的是会抛出异常
     */
//                }
//            });
//        }
//    }
//
//    /**
//     * è½¬æ¢æ—¶é—´çš„æ ¼å¼
//     *
//     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡ï¼Œéœ€è¦åŒ…含属性
//     * @param orderDTO   ç¼–码申请的信息
//     */
//    private void switchDateAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
//        Map<String, CodeClstempattrVO> dateAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getCodedateformat())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
//            dateAttrVOMap.forEach((attrId, attrVO) -> {
//                String value = getValueFromOrderDTO(orderDTO, attrId);
//                if (StringUtils.isNotBlank(value)) {
//                    DateConverter dateConverter = new DateConverter();
//                    dateConverter.setAsText(value);
//                    value = VciDateUtil.date2Str(dateConverter.getValue(), VciDateUtil.DateTimeMillFormat);
//                    setValueToOrderDTO(orderDTO, attrId, value);
//                }
//            });
//        }
//    }
//
//    /**
//     * æ‹·è´æ•°æ®åˆ°cbo对象上
//     *
//     * @param classifyFullInfo åˆ†ç±»çš„全部信息
//     * @param cbo              ä¸šåŠ¡æ•°æ®
//     * @param orderDTO         ç¼–码申请的信息
//     * @param templateVO       æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     * @param edit             æ˜¯å¦ä¸ºä¿®æ”¹
//     */
//    private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, CodeWupinEntity cbo,
//                                CodeOrderDTO orderDTO, CodeClstemplateVO templateVO,
//                                boolean edit) {
//        String fullPath = "";
//        if (!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())) {
//            fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel())))
//                .map(CodeClassifyVO::getOid).collect(Collectors.joining("##"));
//        } else {
//            fullPath = classifyFullInfo.getCurrentClassifyVO().getOid();
//        }
//
////        BeanUtils.
//        BeanUtils.copyProperties(orderDTO.getData(),cbo);
//        cbo.setMaterialtype(Short.valueOf("1001"));
////        orderDTO.getData().forEach((key, value) -> {
////            if (!edit || (!checkUnAttrUnEdit(key) &&
////                !VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(key))) {
////                try {
////                    cbo.setAttributeValue(key, value);
////                } catch (Exception e) {
////                    logger.error("设置属性的值错误", e);
////                }
////            }
////        });
//        try {
//
//            cbo.setCodeclsfid(classifyFullInfo.getCurrentClassifyVO().getOid());
//            cbo.setCodetemplateoid(templateVO.getOid());
//            cbo.setCodeclsfpath(fullPath);
////            cbo.setMaterialclassify("model_type");
////            cbo.setMaterialname(orderDTO.getData().get("materialname"));
////            cbo.setShifoupihaoguanli("true");
////            cbo.setKucunwl("true");
////            cbo.setXiaoshouwl("false");
//            if (!edit && StringUtils.isBlank(orderDTO.getLcStatus())) {
//                //找生命周期的起始状态,插个点,看生命周期是否需要创建
//                if (StringUtils.isNotBlank(cbo.getLctid())) {
////                    OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(cbo.getLctid());
////                    if (lifeCycleVO != null) {
////                        cbo.setLcStatus("Editing");
//////                        cbo.setLcStatus(lifeCycleVO.getStartStatus());
////                    } else {
//                        cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
////                    }
//                } else {
//                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
//                }
//
//            }
//
//            int secret = VciBaseUtil.getInt(cbo.getSecretGrade().toString());
//            //插个点,后续看密级服务是否可用
////            if (secret == 0 || !secretService.checkDataSecret(secret)) {
//            if (secret == 0 ) {
//                Integer userSecret = VciBaseUtil.getCurrentUserSecret();
////                cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
//                cbo.setSecretGrade(userSecret == null || userSecret == 0 ? UserSecretEnum.NONE.getValue() : userSecret);
//            }
//        } catch (Throwable e) {
//            logger.error("设置默认的属性的值错误", e);
//        }
//    }
//
//
//    /**
//     * åˆå§‹åŒ–业务类型
//     * --创建人默认为当前用户,如果需要修改,可以在获取后自行处理
//     * @param btmName ä¸šåŠ¡ç±»åž‹çš„åç§°ï¼Œä¼šè‡ªåŠ¨å˜æˆå°å†™
//     * @return CodeWupinEntity
//     * @throws VciBaseException åˆå§‹åŒ–出错的是会抛出异常
//     */
//    @Override
//    public CodeWupinEntity createCBOByBtmName(String btmName)
//        throws VciBaseException {
@@ -728,49 +744,1087 @@
//
////        return cbo;
//    }
    /**
     * æ˜¯å¦ä¸ºä¿®æ”¹å¿½ç•¥çš„属性
     * @param attrName å±žæ€§çš„名字
     * @return true è¡¨ç¤ºåº”该忽略
     */
    boolean checkUnAttrUnEdit(String attrName){
        return  (VciQueryWrapperForDO.OID_FIELD.equalsIgnoreCase(attrName)
            ||"ts".equalsIgnoreCase(attrName)
            || "lastmodifier".equalsIgnoreCase(attrName)
            || "lastmodifytime".equalsIgnoreCase(attrName)
            || "createtime".equalsIgnoreCase(attrName)
            || "checkintime".equalsIgnoreCase(attrName)
            ||"checkouttime".equalsIgnoreCase(attrName));
    }
    /**
     * ä¿å­˜å¯è¾“可选的信息
     *
     * @param templateVO æ¨¡æ¿çš„对象
     * @param cboList    æ•°æ®çš„内容
     */
//
//    /**
//     * æ˜¯å¦ä¸ºä¿®æ”¹å¿½ç•¥çš„属性
//     * @param attrName å±žæ€§çš„名字
//     * @return true è¡¨ç¤ºåº”该忽略
//     */
//    boolean checkUnAttrUnEdit(String attrName){
//        return  (VciQueryWrapperForDO.OID_FIELD.equalsIgnoreCase(attrName)
//            ||"ts".equalsIgnoreCase(attrName)
//            || "lastmodifier".equalsIgnoreCase(attrName)
//            || "lastmodifytime".equalsIgnoreCase(attrName)
//            || "createtime".equalsIgnoreCase(attrName)
//            || "checkintime".equalsIgnoreCase(attrName)
//            ||"checkouttime".equalsIgnoreCase(attrName));
//    }
//
//    /**
//     * ä¿å­˜å¯è¾“可选的信息
//     *
//     * @param templateVO æ¨¡æ¿çš„对象
//     * @param cboList    æ•°æ®çš„内容
//     */
//    @Override
//    public void batchSaveSelectChar(CodeClstemplateVO templateVO, List<ClientBusinessObject> cboList) {
//    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());
//            List<CodeClstempattrVO> 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<>();
//                    cboList.parallelStream().forEach(cbo -> {
//                        String value = cbo.getAttributeValue(attrVO.getId());
//                        if (StringUtils.isNotBlank(value)) {
//                            valuesList.add(value);
//                        }
//                    });
//                    List<String> valuesList = cboList;
////                    cboList.parallelStream().forEach(cbo -> {
////                        String value = cbo.get.getAttributeValue(attrVO.getId());
////                        if (StringUtils.isNotBlank(value)) {
////                            valuesList.add(value);
////                        }
////                    });
//                    if (!CollectionUtils.isEmpty(valuesList)) {
//                        charService.saveBySameNamespaceAndFlag(templateVO.getBtmTypeId(), attrVO.getLibraryIdentification(), valuesList, sessionInfo);
//                        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);
//                    }
//                });
//            }
//        }
//    }
//
//    @Override
//    public MdmUIInfoVO getFormDefineByTemplateOid(String templateOid, String codeClassifyOid) {
//        CodeClstemplateVO templateVO = templateService.getObjectHasAttrByOid(templateOid);
//        MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
//        uiInfoVO.setTemplateVO(templateVO);
//        uiInfoVO.setFormDefineVO(wrapperFormDefineByTemplate(templateVO, codeClassifyOid));
//        wrapperResemble(templateVO, uiInfoVO);
//        return uiInfoVO;
//    }
//
//
//    /**
//     * æ¨¡æ¿å±žæ€§è½¬æ¢ä¸ºè¡¨å•定义的信息
//     *
//     * @param templateVO      æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     * @param codeClassifyOid åˆ†ç±»çš„主键,为空的时候,获取模板所属的分类主键.用于产生分类注入
//     * @return è¡¨æ ¼çš„信息
//     */
//    private UIFormDefineVO wrapperFormDefineByTemplate(CodeClstemplateVO templateVO, String codeClassifyOid) {
//        UIFormDefineVO formDefineVO = new UIFormDefineVO();
//        formDefineVO.setOid(templateVO.getOid());
//        formDefineVO.setBtmType(templateVO.getBtmTypeId());
//        if (StringUtils.isBlank(codeClassifyOid)) {
//            codeClassifyOid = templateVO.getCodeClassifyOid();
//        }
//        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
//
//        List<UIFormItemVO> itemVOS = new ArrayList<>();
//        Map<String, List<CodeClstempattrVO>> attrGroupMap = templateVO.getAttributes().stream().
//            filter(s -> StringUtils.isNotBlank(s.getAttributegroup())).collect(Collectors.groupingBy(s -> s.getAttributegroup()));
//
//        templateVO.getAttributes().forEach(attrVO -> {
//            UIFormItemVO formItemVO = templateAttr2FormField(attrVO, templateVO.getBtmTypeId());
//            itemVOS.add(formItemVO);
//        });
//        //处理属性分组
//        if (!CollectionUtils.isEmpty(attrGroupMap)) {
//            //按照分组的属性排列,找到每一个分组的第一个属性
//            for (String key : attrGroupMap.keySet()) {
//                List<CodeClstempattrVO> value = attrGroupMap.get(key);
//                //找到这个分组的属性的第一个
//                CodeClstempattrVO attrVO = value.stream().sorted(((o1, o2) -> o1.getOrdernum().compareTo(o2.getOrdernum()))).findFirst().get();
//                //我们找到这个属性在最终的itemVOs里的位置
//                UIFormItemVO lineVO = new UIFormItemVO();
//                lineVO.setField(attrVO.getId() + "_line");
//                lineVO.setType("line");
//                lineVO.setText(key);
//                //找位置
//                for (int i = 0; i < itemVOS.size(); i++) {
//                    UIFormItemVO record = itemVOS.get(i);
//                    if (record.getField().equalsIgnoreCase(attrVO.getId())) {
//                        itemVOS.add(i, lineVO);
//                        break;
//                    }
//                }
//            }
//        }
//
//        CodeOrderDTO orderDTO = new CodeOrderDTO();
//        switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
//        if (!CollectionUtils.isEmpty(orderDTO.getData())) {
//            orderDTO.getData().forEach((key, value) -> {
//                for (int i = 0; i < itemVOS.size(); i++) {
//                    UIFormItemVO itemVO = itemVOS.get(i);
//                    if (itemVO.getField().equalsIgnoreCase(key)) {
//                        itemVO.setDefaultValue(value);
//                        break;
//                    }
//                }
//            });
//        }
//        formDefineVO.setItems(itemVOS);
//        //查询是否有分类注入的
//        return formDefineVO;
//    }
//    /**
//     * å±žæ€§ç±»åž‹ä¸Žjs中的字段类型的映射
//     */
//    private static Map<String, String> vciFieldTypeMap = new HashMap<String, String>() {{
//        put(VciFieldTypeEnum.VTString.name(), "text");
//        put(VciFieldTypeEnum.VTInteger.name(), "text");
//        put(VciFieldTypeEnum.VTLong.name(), "text");
//        put(VciFieldTypeEnum.VTDouble.name(), "text");
//        put(VciFieldTypeEnum.VTClob.name(), "text");
//        put(VciFieldTypeEnum.VTBoolean.name(), "truefalse");
//        put(VciFieldTypeEnum.VTDateTime.name(), "datetime");
//        put(VciFieldTypeEnum.VTDate.name(), "datetime");
//        put(VciFieldTypeEnum.VTTime.name(), "datetime");
//        put(VciFieldTypeEnum.VTFilePath.name(), "file");
//    }};
//
//    /**
//     * æ¨¡æ¿å±žæ€§è½¬æ¢ä¸ºè¡¨å•的字段
//     *
//     * @param attrVO  æ¨¡æ¿å±žæ€§
//     * @param btmType ä¸šåŠ¡ç±»åž‹
//     * @return è¡¨å•的字段
//     */
//    @Override
//    public UIFormItemVO templateAttr2FormField(CodeClstempattrVO attrVO, String btmType) {
//
//        UIFormItemVO itemVO = new UIFormItemVO();
//        if (SECRET_FILED.equalsIgnoreCase(attrVO.getId())) {
////            attrVO.setEnumid(OsEnumServiceImpl.MY_DATA_SECRET);
//            attrVO.setEnumid(MY_DATA_SECRET);
//        }
//        itemVO.setField(attrVO.getId());
//        itemVO.setText(attrVO.getName());
//        itemVO.setType(vciFieldTypeMap.getOrDefault(attrVO.getAttributedatatype(), "text"));
//        if (VciBaseUtil.getBoolean(attrVO.getTextareaflag())) {
//            itemVO.setType("textarea");
//        }
//        if (VciFieldTypeEnum.VTLong.name().equalsIgnoreCase(attrVO.getAttributedatatype())
//            || VciFieldTypeEnum.VTInteger.name().equalsIgnoreCase(attrVO.getAttributedatatype())
//            || VciFieldTypeEnum.VTDouble.name().equalsIgnoreCase(attrVO.getAttributedatatype())) {
//            itemVO.setVerify("number");
//        }
//        itemVO.setReadOnly(VciBaseUtil.getBoolean(attrVO.getReadonlyflag()));
//        itemVO.setKeyAttr(VciBaseUtil.getBoolean(attrVO.getKeyattrflag()));
//        itemVO.setRequired(VciBaseUtil.getBoolean(attrVO.getRequireflag()));
//        itemVO.setDefaultValue(attrVO.getDefaultvalue());
//        itemVO.setDateFormate(attrVO.getCodedateformat());
//        itemVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getFormdisplayflag()));
//        itemVO.setVerify(attrVO.getVerifyrule());
//        itemVO.setPrefix(attrVO.getPrefixvalue());
//        itemVO.setSuffix(attrVO.getSuffixvalue());
//        itemVO.setTooltips(attrVO.getExplain());
//        itemVO.setSelectLibFlag(attrVO.getLibraryidentification());
//        //看看是否有枚举
//        if ((StringUtils.isNotBlank(attrVO.getEnumstring())
//            && !"[]".equalsIgnoreCase(attrVO.getEnumstring())) ||
//            StringUtils.isNotBlank(attrVO.getEnumid())) {
//            itemVO.setType("combox");
//            itemVO.setComboxKey(attrVO.getEnumid());
//            if (StringUtils.isNotBlank(attrVO.getEnumstring())) {
//                //指定的下拉框内容
//                itemVO.setData(JSONObject.parseArray(attrVO.getEnumstring(), KeyValue.class));
//                if (StringUtils.isBlank(attrVO.getEnumid())) {
//                    itemVO.setComboxKey(itemVO.getField() + "_data");
//                }
//            }
//        }
//        //看是否有参照
//        if (StringUtils.isNotBlank(attrVO.getReferbtmid()) || StringUtils.isNotBlank(attrVO.getReferconfig())) {
//            itemVO.setType("refer");
//            itemVO.setShowField(itemVO.getField() + "name");
//            if (StringUtils.isNotBlank(attrVO.getReferconfig())) {
//                //配置的内容
//                itemVO.setReferConfig(JSONObject.parseObject(attrVO.getReferconfig(), UIFormReferVO.class));
//            } else {
//                UIFormReferVO formReferVO = new UIFormReferVO();
//                formReferVO.setType("default");
//                formReferVO.setReferType(attrVO.getReferbtmid());
//                itemVO.setReferConfig(formReferVO);
//            }
//        }
//
//        //如果是组合规则,分类注入的,显示为只读
//        if (StringUtils.isNotBlank(attrVO.getComponentrule())) {
//            itemVO.setReadOnly(true);
//            itemVO.setTooltips("本属性为组合规则");
//            itemVO.setRequired(false);
//        }
//        if (StringUtils.isNotBlank(attrVO.getClassifyinvokeattr())) {
//            itemVO.setReadOnly(!VciBaseUtil.getBoolean(attrVO.getClassifyinvokeeditflag()));
//            itemVO.setTooltips("本属性是分类注入");
//            itemVO.setRequired(false);
//        }
//
//        if (VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(itemVO.getField())) {
//            //是生命周期状态
//            itemVO.setType("combox");
//            itemVO.setComboxKey(btmType + LC_STATUS_SUBFIX);
//        }
//        return itemVO;
//    }
//
//
//    /**
//     * å°è£…相似项查询的列表
//     *
//     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
//     * @param uiInfoVO   é¡µé¢çš„信息
//     */
//    private void wrapperResemble(CodeClstemplateVO templateVO, MdmUIInfoVO uiInfoVO) {
//        List<CodeClstempattrVO> resembleAttrList = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getSamerepeatattrflag())
//            || VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).collect(Collectors.toList());
//        if (!CollectionUtils.isEmpty(resembleAttrList) && resembleAttrList.size() > 1) {
//            UITableDefineVO resembleTable = new UITableDefineVO();
//            resembleTable.setOid(templateVO.getOid());
//            resembleTable.setBtmType(templateVO.getBtmTypeId());
//            resembleTable.setDisplayQueryArea(false);
//            resembleTable.setPageVO(new UITablePageVO());
//            //处理所有的列,这个模板没有合并的表头的情况
//            List<UITableFieldVO> fieldVOList = new ArrayList<>();
//            resembleAttrList.forEach(attrVO -> {
//                UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO,false);
//                tableFieldVO.setHidden(false);
//                fieldVOList.add(tableFieldVO);
//            });
//            List<List<UITableFieldVO>> cols = new ArrayList<>();
//            cols.add(fieldVOList);
//            resembleTable.setCols(cols);
//            uiInfoVO.setResembleTableVO(resembleTable);
//        }
//    }
//
//
//    /**
//     * æ¨¡æ¿å±žæ€§è½¬æ¢ä¸ºè¡¨æ ¼æ˜¾ç¤ºçš„配置
//     *
//     * @param attrVO æ¨¡æ¿å±žæ€§
//     * @param forEdit æ˜¯å¦æ˜¯ç¼–辑所需
//     * @return è¡¨æ ¼çš„字段
//     */
//    @Override
//    public UITableFieldVO templateAttr2TableField(CodeClstempattrVO attrVO,boolean forEdit) {
//        UITableFieldVO fieldVO = new UITableFieldVO();
//        if (SECRET_FILED.equalsIgnoreCase(attrVO.getId())) {
//            attrVO.setEnumid(MY_DATA_SECRET);
//        }
//        fieldVO.setField(attrVO.getId());
//        fieldVO.setTitle(attrVO.getName());
//        fieldVO.setFieldType(vciFieldTypeMap.getOrDefault(attrVO.getAttributedatatype(), "text"));
//        fieldVO.setSort(true);
//        fieldVO.setSortField(fieldVO.getField());
//        fieldVO.setQueryField(fieldVO.getField());
//        if (forEdit){
//            fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getFormdisplayflag()));
//        }else {
//            fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getTabledisplayflag()));
//        }
//        if (attrVO.getAttrtablewidth() != null && attrVO.getAttrtablewidth() > 0) {
//            fieldVO.setMinWidth(Integer.valueOf(attrVO.getAttrtablewidth()));
//            fieldVO.setWidth(Integer.valueOf(attrVO.getAttrtablewidth()));
//        }
//        //看看是否有枚举
//        if ((StringUtils.isNotBlank(attrVO.getEnumstring())
//            && !"[]".equalsIgnoreCase(attrVO.getEnumstring())) ||
//            StringUtils.isNotBlank(attrVO.getEnumid())) {
//            fieldVO.setFieldType("combox");
//            fieldVO.setField(fieldVO.getField() + "Text");
//            fieldVO.setComboxKey(attrVO.getEnumid());
//            if (StringUtils.isNotBlank(attrVO.getEnumstring())) {
//                //指定的下拉框内容
//                fieldVO.setData(JSONObject.parseArray(attrVO.getEnumstring(), KeyValue.class));
//                if (StringUtils.isBlank(attrVO.getEnumid())) {
//                    fieldVO.setComboxKey(fieldVO.getField() + "_data");
//                }
//            }else {
//                List<KeyValue> osEnumItemVOList= enumService.getEnum(attrVO.getEnumid());
//                fieldVO.setData(osEnumItemVOList);
//            }
//        }
//        //看是否有参照
//        if (StringUtils.isNotBlank(attrVO.getReferbtmid()) || StringUtils.isNotBlank(attrVO.getReferconfig())) {
//            fieldVO.setFieldType("refer");
//            fieldVO.setQueryField(fieldVO.getField());
//            fieldVO.setField(fieldVO.getField() + "name");
//            fieldVO.setShowField(fieldVO.getField());
//            if (StringUtils.isNotBlank(attrVO.getReferconfig())) {
//                //配置的内容
//                fieldVO.setReferConfig(JSONObject.parseObject(attrVO.getReferconfig(), UIFormReferVO.class));
//            } else {
//                UIFormReferVO formReferVO = new UIFormReferVO();
//                formReferVO.setType("default");
//                formReferVO.setReferType(attrVO.getReferbtmid());
//                fieldVO.setReferConfig(formReferVO);
//            }
//        }
//        if (VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(fieldVO.getSortField())) {
//            fieldVO.setField("lcstatus_text");
//        }
//        Map<String, String> eventJsMap = new HashMap<>();
//        //超链接与模板是互斥
//        if (StringUtils.isNotBlank(attrVO.getTablehref())) {
//            String event = fieldVO.getSortField() + "_href";
//            eventJsMap.put(event, attrVO.getTablehref());
//            fieldVO.setTemplet("function(d){ return '<a class=\"layui-btn layui-btn-intable \" lay-event=\"" + event + "\">d." + fieldVO.getField() + "</a>';}");
//        }
//        if (StringUtils.isNotBlank(attrVO.getTabledisplayjs())) {
//            //直接写function(d){ return xxxxx;}
//            fieldVO.setTemplet(attrVO.getTabledisplayjs());
//        }
//        if (StringUtils.isBlank(fieldVO.getTemplet()) && VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributedatatype())) {
//            fieldVO.setTemplet("function(d){return $webUtil.formateBoolean(d." + fieldVO.getField() + ");}");
//        }
//        fieldVO.setOptionJsMap(eventJsMap);
//        fieldVO.setStyle(attrVO.getTabledisplaystyle());
//        //列表里不允许直接编辑
//        fieldVO.setDateFormate(attrVO.getCodedateformat());
//        return fieldVO;
//    }
//
//
//    /**
//     * ç›¸ä¼¼é¡¹æŸ¥è¯¢
//     *
//     * @param orderDTO ç¼–码的相关信息
//     * @return æ•°æ®åˆ—表
//     */
//    @Override
//    public DataGrid<Map<String, String>> resembleQuery(CodeOrderDTO orderDTO) {
//        VciBaseUtil.alertNotNull(orderDTO, "申请的信息", orderDTO.getCodeClassifyOid(), "分类主键", orderDTO.getTemplateOid(), "模板主键");
//        CodeClassifyFullInfoBO fullInfoBO = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
//        CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
//        switchClassifyLevelOnOrder(templateVO, fullInfoBO, orderDTO);
//        switchDateAttrOnOrder(templateVO, orderDTO);
//        switchComponentAttrOnOrder(templateVO, orderDTO);
//        //需要获取是否有相似查询属性
//        Map<String, CodeClassifyTemplateAttrVO> attrVOs = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getSamerepeatattrflag())).collect(Collectors.toMap(s -> s.getId(), t -> t));
//        if (CollectionUtils.isEmpty(attrVOs)) {
//            //都没有属性,肯定不能查询了
//            return new DataGrid<>();
//        }
//        Map<String, String> conditionMap = new HashMap<>();
//        //我们首先获取有没有查询规则
//        CodeResembleRuleVO resembleRuleVO = Optional.ofNullable(getUseResembleRule(fullInfoBO, fullInfoBO.getCurrentClassifyVO())).orElseGet(() -> new CodeResembleRuleVO());
//        attrVOs.forEach((attrId, attrVO) -> {
//            String value = getValueFromOrderDTO(orderDTO, attrId);
//            if (value == null) {
//                value = "";
//            }
//            wrapperResembleConditionMap(value, resembleRuleVO, attrId, conditionMap);
//        });
//
//        //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
//        if (!CollectionUtils.isEmpty(conditionMap)) {
//            Map<String, String> andConditionMap = new HashMap<>();
//            andConditionMap.put("islastr", "1");
//            andConditionMap.put("islastv", "1");
//            if (StringUtils.isNotBlank(orderDTO.getOid())) {
//                andConditionMap.put("oid", QueryOptionConstant.NOTEQUAL + orderDTO.getOid());
//            }
//            conditionMap.putAll(andConditionMap);
//            PageHelper pageHelper = new PageHelper(-1);
//            pageHelper.addDefaultDesc("id");
//            return queryGrid(fullInfoBO.getTopClassifyVO().getBtmtypeid(), templateVO, conditionMap, pageHelper);
//        }
//        return new DataGrid<>();
//    }
//
//    /**
//     * èŽ·å–ä½¿ç”¨çš„ç›¸ä¼¼æŸ¥è¯¢è§„åˆ™
//     *
//     * @param fullInfoBO        ç±»å…¨éƒ¨ä¿¡æ¯
//     * @param currentClassifyVO å½“前的分类
//     * @return è§„则,如果不存在会返回Null
//     */
//    @Override
//    public CodeResembleRuleVO getUseResembleRule(CodeClassifyFullInfoBO fullInfoBO, CodeClassifyVO currentClassifyVO) {
//        if (currentClassifyVO == null) {
//            return null;
//        }
//        if (currentClassifyVO != null && StringUtils.isNotBlank(currentClassifyVO.getCodeResembleRuleOid())) {
//            //说明已经存在
//            return resembleRuleService.getObjectByOid(currentClassifyVO.getCodeResembleRuleOid());
//        }
//        if (StringUtils.isBlank(currentClassifyVO.getParentcodeclassifyoid())) {
//            return null;
//        }
//        Map<String, CodeClassifyVO> classifyVOMap = fullInfoBO.getParentClassifyVOs().stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
//        return getUseResembleRule(fullInfoBO, classifyVOMap.getOrDefault(currentClassifyVO.getParentcodeclassifyoid(), null));
//    }
//
//    /**
//     * å°è£…相似项查询的查询条件的映射
//     *
//     * @param value          å€¼
//     * @param resembleRuleVO ç›¸ä¼¼é¡¹è§„则
//     * @param attrId         å±žæ€§çš„编号
//     * @param conditionMap   æŸ¥è¯¢æ¡ä»¶
//     */
//    @Override
//    public void wrapperResembleConditionMap(String value, CodeResembleRuleVO resembleRuleVO, String attrId, Map<String, String> conditionMap) {
//        boolean ignoreSpace = VciBaseUtil.getBoolean(resembleRuleVO.getIgnorespaceflag()) || VciBaseUtil.getBoolean(resembleRuleVO.getIgnoreallspaceflag());
//        if (StringUtils.isBlank(value)) {
//            //为空的时候就不查询它就是
//        } else {
//            String queryKey = "";
//            String queryValue = "";
//            boolean ignoreCase = VciBaseUtil.getBoolean(resembleRuleVO.getIgnorecaseflag());
//            boolean ignoreWidth = VciBaseUtil.getBoolean(resembleRuleVO.getIgnorewidthflag());
//            boolean trimAll = VciBaseUtil.getBoolean(resembleRuleVO.getIgnoreallspaceflag());
//            boolean trim = VciBaseUtil.getBoolean(resembleRuleVO.getIgnoreallspaceflag());
//            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";
//            }
//            if (StringUtils.isNotBlank(resembleRuleVO.getLinkCharacter())) {
//                List<String> chars = VciBaseUtil.str2List(resembleRuleVO.getLinkCharacter());
//                for (int i = 0; i < chars.size(); i++) {
//                    String s = chars.get(i);
//                    temp = "replace(" + temp + ",'" + s + "','')";
//                }
//            }
//            queryValue = String.format(temp, (trim ? value.trim() : value));
//            temp = temp.replace("to_single_byte('%s')","to_single_byte(%s)");
//            queryKey = String.format(temp, "t."+attrId);
//            conditionMap.put(queryKey, QueryOptionConstant.OR + queryValue);
//        }
//    }
//
//
//    /**
//     * æŸ¥è¯¢ç¼–码数据的列表
//     *
//     * @param btmType      ä¸šåŠ¡ç±»åž‹
//     * @param templateVO   æ¨¡æ¿çš„对象,需要包含模板的属性
//     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
//     * @param pageHelper   åˆ†é¡µå¯¹è±¡
//     * @return æ•°æ®åˆ—表
//     */
//    @Override
//    public DataGrid<Map<String, String>> queryGrid(String btmType, CodeClassifyTemplateVO templateVO, Map<String, String> conditionMap, PageHelper pageHelper) {
//        CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmType, templateVO, conditionMap, pageHelper);
////        List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
//        List<Map> maps = commonsMapper.selectBySql(sqlBO.getSqlHasPage());
//        DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
//        List<Map<String, String>> dataList = new ArrayList<>();
//        if (!CollectionUtils.isEmpty(maps)) {
//            maps.stream().forEach(map -> {
//                Map<String, String> data = new HashMap<>();
//                map.forEach((key, value) -> {
//                    data.put(((String) key).toLowerCase(Locale.ROOT), (String) value);
//                });
//                dataList.add(data);
//            });
//        }
//        dataGrid.setData(dataList);
//        if (!CollectionUtils.isEmpty(dataList)) {
//            wrapperData(dataGrid.getData(), templateVO, sqlBO.getSelectFieldList(), false);
//            dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()););
//        }
//        return dataGrid;
//    }
//
//
//    /**
//     * å°è£…查询出来的数据
//     *
//     * @param dataMap              æ•°æ®çš„æ˜ å°„
//     * @param templateVO           æ¨¡æ¿çš„属性
//     * @param onlySelectAttrIdList ä»…仅查询的属性字段
//     * @param form è¡¨å•里使用
//     */
//    @Override
//    public void wrapperData(List<Map<String, String>> dataMap, CodeClassifyTemplateVO templateVO,
//                            Collection<String> onlySelectAttrIdList, boolean form) {
//        if (onlySelectAttrIdList == null) {
//            onlySelectAttrIdList = new ArrayList<>();
//        }
//        //先转换一下时间格式
//        List<String> finalOnlySelectAttrIdList = onlySelectAttrIdList.stream().collect(Collectors.toList());
//        List<CodeClassifyTemplateAttrVO> dateFormatAttrVOs = templateVO.getAttributes().stream().filter(
//            s -> StringUtils.isNotBlank(s.getCodeDateFormat()) &&
//                (finalOnlySelectAttrIdList.size() == 0 || finalOnlySelectAttrIdList.contains(s.getId().toLowerCase(Locale.ROOT)))
//        ).collect(Collectors.toList());
//        //枚举的内容
//        List<CodeClassifyTemplateAttrVO> enumAttrVOs = templateVO.getAttributes().stream().filter(
//            s -> (StringUtils.isNotBlank(s.getEnumId()) || StringUtils.isNotBlank(s.getEnumString()))
//                &&
//                (finalOnlySelectAttrIdList.size() == 0 || finalOnlySelectAttrIdList.contains(s.getId().toLowerCase(Locale.ROOT)))
//        ).collect(Collectors.toList());
//
//        List<String> userIds = new ArrayList<>();
//        dataMap.stream().forEach(data -> {
//            //处理时间
//            if (!form) {
//                //表单的时候只能用统一的时间格式
//                wrapperDateFormat(dateFormatAttrVOs, data);
//            }
//            //处理枚举
//            wrapperEnum(enumAttrVOs, data);
//            String lcstatus = data.get(VciQueryWrapperForDO.LC_STATUS_FIELD);
//            String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION,"");
//            if ((CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus) || CodeDefaultLC.AUDITING.getValue().equalsIgnoreCase(lcstatus))
//                && StringUtils.isBlank(copyFromVersion)
//            ) {
//                data.put(VciQueryWrapperForDO.ID_FIELD, "******");
//            }
//            data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), CodeDefaultLC.getTextByValue(lcstatus));
//            if(CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
//                && StringUtils.isNotBlank(copyFromVersion)){
//                data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), "修改中");
//            }
//            if (data.containsKey("creator")) {
//                userIds.add(data.get("creator"));
//            }
//            if (data.containsKey("lastmodifier")) {
//                userIds.add(data.get("lastmodifier"));
//            }
//        });
//        if (!CollectionUtils.isEmpty(userIds)) {
//            Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//            dataMap.stream().forEach(data -> {
//                String creator = data.getOrDefault("creator", null);
//                if (StringUtils.isNotBlank(creator) && userVOMap.containsKey(creator.toLowerCase(Locale.ROOT))) {
//                    data.put("creator", creator + "(" + userVOMap.get(creator.toLowerCase(Locale.ROOT)).getName() + ")");
//                }
//                String lastmodifier = data.getOrDefault("lastmodifier", null);
//                if (StringUtils.isNotBlank(lastmodifier) && userVOMap.containsKey(lastmodifier.toLowerCase(Locale.ROOT))) {
//                    data.put("lastmodifier", lastmodifier + "(" + userVOMap.get(lastmodifier.toLowerCase(Locale.ROOT)).getName() + ")");
//                }
//            });
//        }
//    }
//
//
//    /**
//     * å¤„理时间格式
//     *
//     * @param dateFormatAttrVOs æ—¶é—´æ ¼å¼çš„属性
//     * @param data              å½“前行数据
//     */
//    private void wrapperDateFormat(Collection<CodeClassifyTemplateAttrVO> dateFormatAttrVOs, Map<String, String> data) {
//        if (!CollectionUtils.isEmpty(dateFormatAttrVOs)) {
//            dateFormatAttrVOs.stream().forEach(dateFormatAttrVO -> {
//                String attrId = dateFormatAttrVO.getId().toLowerCase(Locale.ROOT);
//                String oldValue = data.getOrDefault(attrId, null);
//                if (StringUtils.isNotBlank(oldValue)) {
//                    DateConverter dateConverter = new DateConverter();
//                    try {
//                        dateConverter.setAsText(oldValue);
//                        Date value = dateConverter.getValue();
//                        if (value != null) {
//                            data.put(attrId, VciDateUtil.date2Str(value, dateFormatAttrVO.getCodeDateFormat()));
//                        }
//                    } catch (Throwable e) {
//                        //转换可能有问题,这就使用原本存储的值
//                    }
//                }
//            });
//        }
//    }
//
//
//    /**
//     * å¤„理枚举的内容,如果不在枚举中,会返回原本的值
//     *
//     * @param enumAttrVOs æžšä¸¾å±žæ€§
//     * @param data        å½“前行数据
//     */
//    private void wrapperEnum(Collection<CodeClassifyTemplateAttrVO> enumAttrVOs, Map<String, String> data) {
//        //处理枚举的内容,为了兼容以前的数据,如果数据不能使用枚举转换的话,那还是显示以前的值
//        if (!CollectionUtils.isEmpty(enumAttrVOs)) {
//            enumAttrVOs.stream().forEach(enumAttrVO -> {
//                String attrId = enumAttrVO.getId().toLowerCase(Locale.ROOT);
//                String oldValue = data.getOrDefault(attrId, null);
//                if (StringUtils.isNotBlank(oldValue)) {
//                    List<KeyValue> comboxKVs = listComboboxItems(enumAttrVO);
//                    String newValue = oldValue;
//                    KeyValue keyValue = Optional.ofNullable(comboxKVs).orElseGet(() -> new ArrayList<>()).stream().filter(s -> s.getKey().equalsIgnoreCase(oldValue)).findFirst().orElseGet(() -> null);
//                    if (keyValue != null) {
//                        newValue = keyValue.getValue();
//                    }
//                    data.put(attrId + "Text", newValue);
//                }
//            });
//        }
//    }
//
//
//    /**
//     * æ ¹æ®æ¨¡æ¿å±žæ€§ç”Ÿæˆç›¸åº”çš„sql信息
//     *
//     * @param btmType      ä¸šåŠ¡ç±»åž‹
//     * @param templateVO   æ¨¡æ¿æ˜¾ç¤ºå¯¹è±¡ï¼Œå¿…须包含属性
//     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
//     * @param pageHelper   åˆ†é¡µå’ŒæŽ’序对象
//     * @return sql的相关信息
//     */
//    @Override
//    public CodeTemplateAttrSqlBO getSqlByTemplateVO(String btmType, CodeClassifyTemplateVO templateVO, Map<String, String> conditionMap, PageHelper pageHelper) {
//        //因为参照不一定是在平台的属性池里面设置,所以我们得需要自行处理
//        //参考VciQueryWrapper来处理
//        //1. æ‰¾åˆ°æ‰€æœ‰çš„字段,
//        Map<String, CodeClassifyTemplateAttrVO> attrVOMap = templateVO.getAttributes().stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//        List<String> selectFieldList = attrVOMap.keySet().stream().collect(Collectors.toList());
//
//        //所有的参照的字段
//        Map<String/**属性字段**/, String> joinTableList = new ConcurrentHashMap<>();
//        List<CodeClassifyTemplateAttrVO> referAttrVOs = templateVO.getAttributes().stream().filter(
//            s -> StringUtils.isNotBlank(s.getReferBtmId()) || StringUtils.isNotBlank(s.getReferConfig())
//        ).collect(Collectors.toList());
//        Map<String/**参照的属性**/, String/**实际的字段**/> referFieldMap = new HashMap<>();
//        if (!CollectionUtils.isEmpty(referAttrVOs)) {
//            referAttrVOs.parallelStream().forEach(attrVO -> {
//                UIFormReferVO referVO = null;
//                if (StringUtils.isNotBlank(attrVO.getReferConfig())) {
//                    referVO = JSONObject.parseObject(attrVO.getReferConfig(), UIFormReferVO.class);
//                } else {
//                    referVO = new UIFormReferVO();
//                    referVO.setReferType(attrVO.getReferBtmId());
//                    referVO.setValueField(VciQueryWrapperForDO.OID_FIELD);
//                    referVO.setTextField("name");
//                }
//
//                String referTable = VciBaseUtil.getTableName(referVO.getReferType());
//                String referTableNick = attrVO.getId() + "0";
//                String left = " left join " + referTable + " " + referTableNick + " on " + referTableNick + "." + referVO.getValueField() + " =  t." + attrVO.getId();
//                joinTableList.put(attrVO.getId(), left);
//                String referShowField = attrVO.getId() + "Name";
//                List<String> textFields = VciBaseUtil.str2List(referVO.getTextField());
//                String showFieldInSource = "";
//                if (textFields.contains("name")) {
//                    showFieldInSource = "name";
//                } else {
//                    showFieldInSource = textFields.get(0);
//                }
//                referFieldMap.put(attrVO.getId(), referTableNick + "." + showFieldInSource);
//                selectFieldList.add(referTableNick + "." + showFieldInSource + " as " + referShowField);
//            });
//        }
//        Optional.ofNullable(attributeService.getDefaultAttributeVOMap()).orElseGet(() -> new HashMap<>()).keySet().stream().forEach(attrId -> {
//            if (!selectFieldList.contains(attrId) && !"secretgrade".equalsIgnoreCase(attrId)) {
//                selectFieldList.add(attrId);
//            }
//        });
//        if (!selectFieldList.contains(CODE_FIELD)) {
//            selectFieldList.add(CODE_FIELD);
//        }
//        if (!selectFieldList.contains(CODE_CLASSIFY_OID_FIELD)) {
//            selectFieldList.add(CODE_CLASSIFY_OID_FIELD);
//        }
//        if (!selectFieldList.contains(CODE_TEMPLATE_OID_FIELD)) {
//            selectFieldList.add(CODE_TEMPLATE_OID_FIELD);
//        }
//        if (!selectFieldList.contains(CODE_FULL_PATH_FILED)) {
//            selectFieldList.add(CODE_FULL_PATH_FILED);
//        }
//
//        //处理查询条件
//        //TODO éªŒè¯sql注入
//        List<String> andSql = new ArrayList<>();
//        List<String> orSql = new ArrayList<>();
//        if (!CollectionUtils.isEmpty(conditionMap)) {
//            Map<String, String> orConditionMap = new HashMap<>();
//            Map<String, String> andCondtionMap = new HashMap<>();
//            //先分离or的查询条件,另外当查询条件是空的时候也不查询
//            conditionMap.forEach((k, v) -> {
//                if (StringUtils.isNotBlank(v)) {
//                    if (v.startsWith(QueryOptionConstant.OR)) {
//                        orConditionMap.put(k, v.substring(QueryOptionConstant.OR.length()));
//                    } else {
//                        andCondtionMap.put(k, v);
//                    }
//                }
//            });
//
//            andCondtionMap.forEach((k, v) -> {
//                andSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap));
//            });
//            orConditionMap.forEach((k, v) -> {
//                orSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap));
//            });
//        }
//        //组合起来
//        StringBuilder andSb = new StringBuilder();
//        andSql.stream().forEach(s -> {
//            andSb.append(s).append(SPACE).append(QueryOptionConstant.AND).append(SPACE);
//        });
//
//        String andString = andSb.toString().trim();
//        String endWithSql = QueryOptionConstant.AND;
//        if (andString.endsWith(endWithSql)) {
//            andString = andString.substring(0, andString.length() - endWithSql.length());
//        }
//
//        String orString = orSql.stream().collect(Collectors.joining(" or "));
//        String whereSql = "";
//        if (StringUtils.isNotBlank(orString)) {
//            if (StringUtils.isBlank(andString)) {
//                andString = " 1 = 1 ";
//            }
//            whereSql = SPACE + "(" + SPACE + andString + SPACE + ") and (" + SPACE + orString + SPACE + ")" + SPACE;
//        } else {
//            whereSql = andString + SPACE;
//        }
//        if (attrVOMap.keySet().contains("secretgrade")) {
//            Integer userSecret = VciBaseUtil.getCurrentUserSecret();
//            if (userSecret == null || userSecret == 0) {
//                userSecret = secretService.getMinUserSecret();
//            }
//            whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
//        }
//        String tableName = VciBaseUtil.getTableName(btmType);
//        String sql = "select " + selectFieldList.stream().map(s -> (s.contains(".") ? s : ("t." + s))).collect(Collectors.joining(","))
//            + " from " + tableName + SPACE + "t" + SPACE
//            + joinTableList.values().stream().collect(Collectors.joining(SPACE))
//            + (StringUtils.isBlank(whereSql) ? "" : " where ") + whereSql;
//        if (pageHelper == null) {
//            pageHelper = new PageHelper(-1);
//        }
//        //看看排序
//        String orderSql = pageHelper.getOrderSql("t");
//        sql += (orderSql == null ? "" : orderSql);
//        String whereSubfixForPage = " ) A where rownum < " + (pageHelper.getLimit() * pageHelper.getPage() + 1) + ") where RN >= "
//            + (pageHelper.getLimit() * (pageHelper.getPage() - 1) + 1);
//        String sqlHasPage = pageHelper.getLimit() > 0 ? ("select * from (select A.*,rownum RN from (" + sql + whereSubfixForPage) : sql;
//        String sqlCount = "select count(1) from " + tableName + SPACE + "t" + SPACE + joinTableList.values().stream().collect(Collectors.joining(SPACE))
//            + (StringUtils.isBlank(whereSql) ? "" : " where ") + whereSql;
//        CodeTemplateAttrSqlBO sqlBO = new CodeTemplateAttrSqlBO();
//        sqlBO.setTableName(tableName);
//        sqlBO.setJoinTable(joinTableList);
//        sqlBO.setNickName("t");
////        sqlBO.setPageHelper(pageHelper);
//        sqlBO.setSqlHasPage(sqlHasPage);
//        sqlBO.setSqlCount(sqlCount);
//        sqlBO.setSqlUnPage(sql);
//        return sqlBO;
//    }
//
//
//    /**
//     * ç»„合查询条件的sql
//     *
//     * @param key           å­—段
//     * @param value         åå­—
//     * @param referFieldMap å‚照的字段
//     * @param attrVOMap     å±žæ€§çš„æ˜ å°„
//     * @return Sql语句
//     */
//    private String getConditionSql(String key, String value, Map<String/**参照的属性**/, String/**实际的属性**/> referFieldMap, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
//        if (key.endsWith("_begin")) {
//            //说明是>=的。我们需要先获取一下
//            String field = (key.substring(0, key.length() - 6).toLowerCase().trim());
//            if (referFieldMap.containsKey(field)) {
//                //说明还是参照里面的,我们默认这种情况下都是字符串吧,因为参照的属性不一定用的平台的属性池里的,所以大部分情况下,显示的属性都是字符串吧
//                return referFieldMap.get(field) + SPACE + " >= '" + value + "'" + SPACE;
//            } else {
//                return (field.contains(".") ? "" : "t.") + field + SPACE + " >= " + getStringValueInWhere(value, field, attrVOMap);
//            }
//        } else if (key.endsWith("_end")) {
//            //说明是<=的。我们需要先获取一下
//            String field = (key.substring(0, key.length() - 6).toLowerCase().trim());
//            if (referFieldMap.containsKey(field)) {
//                //说明还是参照里面的,我们默认这种情况下都是字符串吧,因为参照的属性不一定用的平台的属性池里的,所以大部分情况下,显示的属性都是字符串吧
//                return referFieldMap.get(field) + SPACE + " <= '" + value + "'" + SPACE;
//            } else {
//                return (field.contains(".") ? "" : "t.") + field + SPACE + " <= " + getStringValueInWhere(field, value, attrVOMap);
//            }
//        } else {
//            if (referFieldMap.containsKey(key)) {
//                //说明是参照的,我们参照的查询都认为是字符串,如果是时间格式的查询肯定有问题,
//                String selectKey = referFieldMap.get(key);
//                return getSqlByValue(selectKey, value, null);
//            } else {
//                return getSqlByValue(key, value, attrVOMap);
//            }
//        }
//
//    }
//
//    /**
//     * èŽ·å–æŸ¥è¯¢æ¡ä»¶ä¸­çš„å€¼çš„ï¼Œå¤„ç†ä¸åŒçš„ç±»åž‹
//     *
//     * @param value å€¼
//     * @param field å­—段名称
//     * @return æ—¥æœŸæˆ–者时间格式会包括to_date,字符串会加'
//     */
//    private String getStringValueInWhere(String field, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
//        if ((field.contains(".") && !field.toLowerCase(Locale.ROOT).startsWith("t.")) || attrVOMap == null
//            || !field.replace("t.", "").matches(RegExpConstant.LETTER) || value.startsWith(ONLY)) {
//            //说明可能是指定的某个条件,直接返回
//            if (value.startsWith(ONLY)) {
//                value = value.replace(ONLY, "");
//            }
//            if ((value.startsWith("(") && value.endsWith(")")) || (value.startsWith("'") && value.endsWith("'"))) {
//                return value;
//            }
//            if (field.contains(".") && attrVOMap != null && attrVOMap.containsKey(field.split("\\.")[0].toLowerCase(Locale.ROOT))) {
//                //是参照
//                return "'" + value + "'";
//            } else {
//                return value;
//            }
//        } else {
//            //看看是不是这个对象里的属性
//            if (attrVOMap.containsKey(field)) {
//                VciFieldTypeEnum fieldTypeEnum = VciFieldTypeEnum.valueOf(attrVOMap.get(field).getAttributeDataType());
//                if ("ts".equalsIgnoreCase(field)) {
//                    return "to_timestamp('" + value + "', '" + DATETIME_FORMAT + ".ff')";
//                }
//                DateConverter dateConverter = new DateConverter();
//                if (VciFieldTypeEnum.VTDateTime.equals(fieldTypeEnum)) {
//                    //实际上,数据库都是timestamp的类型.
//                    dateConverter.setAsText(value);
//                    return "to_date('" + dateConverter.getAsText(VciDateUtil.DateTimeFormat) + "','" + DATETIME_FORMAT + "')";
//                } else if (VciFieldTypeEnum.VTDate.equals(fieldTypeEnum)) {
//                    dateConverter.setAsText(value);
//                    return "to_date('" + dateConverter.getAsText(VciDateUtil.DateFormat) + "','" + DATE_FORMAT + "')";
//                } else if (VciFieldTypeEnum.VTDouble.equals(fieldTypeEnum)
//                    || VciFieldTypeEnum.VTLong.equals(fieldTypeEnum)
//                    || VciFieldTypeEnum.VTInteger.equals(fieldTypeEnum)) {
//                    return value;
//                } else {
//                    return "'" + value + "'";
//                }
//            } else {
//                if ((value.startsWith("(") && value.endsWith(")")) || (value.startsWith("'") && value.endsWith("'"))) {
//                    return value;
//                }
//                return "'" + value + "'";
//            }
//        }
//
//    }
//
//    /**
//     * å°è£…最终的sql语句中的值部分
//     *
//     * @param selectKey æŸ¥è¯¢çš„字段
//     * @param value     å€¼
//     * @param attrVOMap å±žæ€§çš„æ˜¾ç¤ºå¯¹è±¡æ˜ å°„
//     * @return sql里的值
//     */
//    private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
//        StringBuilder sql = new StringBuilder();
//        if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
//            sql.append("t.");
//        }
//        if (value.startsWith(QueryOptionConstant.IN)) {
//            sql.append(selectKey)
//                .append(SPACE)
//                .append("in")
//                .append(SPACE)
//                .append("(")
//                .append(value.replace(QueryOptionConstant.IN, ""))
//                .append(")");
//        } else if (value.startsWith(QueryOptionConstant.NOTIN)) {
//            sql.append(selectKey)
//                .append(SPACE)
//                .append("not in")
//                .append(SPACE)
//                .append("(")
//                .append(value.replace(QueryOptionConstant.NOTIN, ""))
//                .append(")");
//        } else if (value.startsWith(QueryOptionConstant.NOTEQUAL)) {
//            value = value.replace(QueryOptionConstant.NOTEQUAL, "");
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(QueryOptionConstant.NOTEQUAL)
//                .append(SPACE)
//                .append(value);
//        } else if (value.startsWith(QueryOptionConstant.MORETHAN)) {
//            value = value.replace(QueryOptionConstant.MORETHAN, "");
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(QueryOptionConstant.MORETHAN)
//                .append(SPACE)
//                .append(value);
//        } else if (value.startsWith(QueryOptionConstant.MORE)) {
//            value = value.replace(QueryOptionConstant.MORE, "");
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(QueryOptionConstant.MORE)
//                .append(SPACE)
//                .append(value);
//        } else if (value.startsWith(QueryOptionConstant.LESSTHAN)) {
//            value = value.replace(QueryOptionConstant.LESSTHAN, "");
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(QueryOptionConstant.LESSTHAN)
//                .append(SPACE)
//                .append(value);
//        } else if (value.startsWith(QueryOptionConstant.LESS)) {
//            value = value.replace(QueryOptionConstant.LESS, "");
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(QueryOptionConstant.LESS)
//                .append(SPACE)
//                .append(value);
//        } else if (value.startsWith(QueryOptionConstant.ISNOTNULL)) {
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(" is not null");
//        } else if (value.startsWith(QueryOptionConstant.ISNULL)) {
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(" is null");
//        } else if (value.contains("*")) {
//            //说明是like,或者lefe like ,right like
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//            sql.append(selectKey)
//                .append(SPACE)
//                .append("like")
//                .append(SPACE)
//                //   .append("'")
//                .append(value.replace("*", "%"))
//                //  .append("'")
//                .append(SPACE);
//        } else {
//            value= value.replace(SPECIAL_CHAR,REQUIRED_CHAR);
//            value = getStringValueInWhere(selectKey, value, attrVOMap);
//
//            sql.append(selectKey)
//                .append(SPACE)
//                .append(QueryOptionConstant.EQUAL)
//                .append(SPACE)
//                .append(value);
//        }
//        sql.append(SPACE);
//        return sql.toString();
//    }
//
//    /**
//     * ä¿®æ”¹ä¸»é¢˜åº“数据
//     *
//     * @param orderDTO æ•°æ®çš„内容,不用包含码段的内容了
//     */
//    @Override
//    public void editSaveCode(CodeOrderDTO orderDTO) {
//        VciBaseUtil.alertNotNull(orderDTO, "编码申请相关的属性的内容都为空", orderDTO.getOid(), "数据主键",
//            orderDTO.getCodeClassifyOid(), "主题库分类的主键");
////        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
//        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
//        //找业务类型,然后使用主键去获取数据库里的数据
////        List<ClientBusinessObject> cbos = boService.queryCBO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), WebUtil.getOidQuery(orderDTO.getOid()));
//
//        QueryWrapper<CodeOsbtmtypeEntity> btmWrapper = new QueryWrapper<>();
//        btmWrapper.eq("OID",orderDTO.getOid());
//        CodeWupinEntity cbo = codeOsbtmtypeMapper.selectOne(btmWrapper);
//
////        CodeClstemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
////        CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(orderDTO.getCodeRuleOid());
//
//        if (cbo != null) {
//            throw new VciBaseException(DATA_OID_NOT_EXIST);
//        }
////        ClientBusinessObject cbo = cbos.get(0);
//        if (!cbo.getTs().toString().contains(VciDateUtil.date2Str(orderDTO.getTs(), VciDateUtil.DateTimeFormat))) {
//            throw new VciBaseException("数据不是最新的,可能他人已经修改,请刷新后再试");
//        }
//        if (!CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(cbo.getLcStatus()) && !orderDTO.isEditInProcess()) {
//            throw new VciBaseException("数据不是{0}的状态,不允许修改", new String[]{CodeDefaultLC.EDITING.getText()});
//        }
//
//        //注意模板不能使用数据存储的时候的模板,因为可能会变化
//
//        //1. åˆ¤æ–­å¿…输项
//        CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
//        checkRequiredAttrOnOrder(templateVO, orderDTO);
//        //2.先注入,再组合,最后校验
//        switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
//        //3.处理组合规则。组合规则不能使用编码的属性,因为编码的生成可能是需要属性的
//        switchComponentAttrOnOrder(templateVO, orderDTO);
//        //4.校验规则
//        checkVerifyOnOrder(templateVO, orderDTO);
//        //5.判断关键属性
//        checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
//        //6.校验枚举的内容是否正确
//        checkEnumOnOrder(templateVO, orderDTO);
//        //7.处理时间格式,在数据库里面不论是字符串还是日期格式,都使用相同的格式存储
//        switchDateAttrOnOrder(templateVO, orderDTO);
//        //默认的内容不能变,所以只需要拷贝自定义的相关属性即可
//        copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true);
//        //企业码和集团码的不修改
//        cbo.setDescription(orderDTO.getDescription());
//        cbo.setName(orderDTO.getName());
//        try {
//            cbo.setDescription(orderDTO.getDescription());
//            cbo.setName(orderDTO.getName());
//////            cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
////            cbo.setAttributeValue("name", orderDTO.getName());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//
//        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);
//
//
//        List<String> charList = new ArrayList<>();
//        for (CodeWupinEntity wupinEntity : cboList) {
//            charList.add(wupinEntity.getId());
//        }
//        batchSaveSelectChar(templateVO, charList);
//        return codeList.size() > 0 ? codeList.get(0) : "";
//
//
//
//
//        //修改的时候,编码是不变的
////        BatchCBO batchCBO = new BatchCBO();
////        batchCBO.getUpdateCbos().add(cbo);
////        List<ClientBusinessObject> cboList = new ArrayList<>();
////        cboList.add(cbo);
////        boService.persistenceBatch(batchCBO);
//        batchSaveSelectChar(templateVO, cboList);
//    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -1,419 +1,381 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.nacos.common.utils.StringUtils;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.MdmEngineService;
import com.vci.ubcs.code.service.MdmIOService;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO;
import com.vci.ubcs.starter.bo.WriteExcelData;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.poi.bo.ReadExcelOption;
import com.vci.ubcs.starter.poi.bo.SheetDataSet;
import com.vci.ubcs.starter.poi.bo.SheetRowData;
import com.vci.ubcs.starter.poi.bo.WriteExcelOption;
import com.vci.ubcs.starter.poi.util.ExcelUtil;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
import static com.vci.ubcs.code.constant.MdmEngineConstant.CODE_FIELD;
import static com.vci.ubcs.code.constant.MdmEngineConstant.DEFAULT_ATTR_LIST;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.KEY_ATTR_CHAR;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.REQUIRED_CHAR;
@Service
public class MdmIOServiceImpl implements MdmIOService {
    /**
     * ä¸»é¢˜åº“分类的服务
     */
    @Resource
    private ICodeClassifyService classifyService;
    /**
     * æ¨¡æ¿çš„æœåŠ¡
     */
    @Resource
    private CodeClstemplateServiceImpl templateService;
    /**
     * ä¸»æ•°æ®å¼•擎的服务
     */
    @Resource
    private MdmEngineService engineService;
    /**
     * ç”Ÿæˆå¯¼å…¥çš„æ–‡ä»¶
     *
     * @param codeClassifyOid åˆ†ç±»çš„主键
     * @param isHistory æ˜¯å¦åŽ†å²æ•°æ®å¯¼å…¥
     * @return excel的文件地址
     */
    @Override
    public String createImportExcel(String codeClassifyOid, boolean isHistory) {
        List<CodeClstemplateVO> templateVOList=new ArrayList<>();
        VciBaseUtil.alertNotNull("导出模板","导出的配置",codeClassifyOid,"主题库分类的主键");
        CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
        if(isHistory){
            templateVOList= templateService.childTemplates(codeClassifyOid);
        }else{
            //找模板
            CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
            templateVOList.add(templateVO);
        }
        WriteExcelOption eo = new WriteExcelOption();
        eo.setAppend(true);
        //增加模板的信息导入
        LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
        tempEDList.add(new WriteExcelData(0,0,"模板主键"));
        tempEDList.add(new WriteExcelData(0,1,"模板代号"));
        tempEDList.add(new WriteExcelData(0,2,"模板名称"));
        for(int j=0;j<templateVOList.size();j++){
            CodeClstemplateVO  templateVO=templateVOList.get(j);
            //组合格式的不导入,
            // æžšä¸¾çš„æä¾›åºåˆ—的选择
            //时间全部统一为yyyy-MM-dd HH:mm:ss
            //参照的自行输入名称
            //分类注入的不用,都是导入后自动处理的
            //编码,状态等字段不导入
            List<CodeClassifyTemplateAttrVO> templateAttrVOS = templateVO.getAttributes().stream().filter(s ->
                !DEFAULT_ATTR_LIST.contains(s.getId())
                    && StringUtils.isBlank(s.getComponentRule())
                    && StringUtils.isBlank(s.getClassifyInvokeAttr())
                    && (isHistory || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
            ).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(templateAttrVOS)){
                throw new VciBaseException("模板没有配置任何【表单显示】为【是】的属性");
            }
            List<CodeClassifyTemplateAttrVO> idAttrVOList = templateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
            LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
            Workbook workbook = new HSSFWorkbook();
            if(isHistory){
                excelDataList.add(new WriteExcelData(0,0,"分类路径"));
                excelDataList.add(new WriteExcelData(0,1,"码段宽度"));
                excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"企业编码"));
            }
            for (int i = 0; i < templateAttrVOS.size(); i++) {
                CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
                Object text = attrVO.getName();
                text = exportKeyAndRequired(workbook,attrVO,text);
                int colIndex = (isHistory?3:0) + i;
                WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
                if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())
                    || VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())
                    || VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributeDataType())
                    ||VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
                    excelData.setDateFormat(VciDateUtil.DateTimeFormat);
                }
                if(text instanceof RichTextString){
                    excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
                }
                excelDataList.add(excelData);
                if(StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())){
                    //添加数据有效性
                    List<String> enumValueList = new ArrayList<>();
                    enumValueList.add("");
                    List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
                    if(!CollectionUtils.isEmpty(valueList)){
                        valueList.stream().forEach(kv->{
                            enumValueList.add(kv.getValue());
                        });
                    }
                    //默认加1万条
                    WriteExcelData ed = new WriteExcelData(1,colIndex,"");
                    ed.setRowTo(100);
                    ed.setColTo(colIndex);
                    ed.setValidation(true);
                    ed.setValidationDataList(enumValueList);
                    ed.setValidationErrorMsg("请在序列中选择正确的值");
                    excelDataList.add(ed);
                }
                if(VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
                    List<String> booleanList = new ArrayList<>();
                    booleanList.add("是");
                    booleanList.add("否");
                    //默认加1万条
                    WriteExcelData ed = new WriteExcelData(1,colIndex,"");
                    ed.setRowTo(100);
                    ed.setColTo(colIndex);
                    ed.setValidation(true);
                    ed.setValidationDataList(booleanList);
                    ed.setValidationErrorMsg("请在序列中选择正确的值");
                    excelDataList.add(ed);
                }
            }
            eo.addSheetDataList(j+templateVO.getName(),excelDataList);
            tempEDList.add(new WriteExcelData(j+1,0,templateVO.getOid()));
            tempEDList.add(new WriteExcelData(j+1,1,templateVO.getId()));
            tempEDList.add(new WriteExcelData(j+1,2,templateVO.getName()));
        }
        String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + (isHistory?"_历史数据导入模板.xls": "_导入模板.xls");
        eo.addSheetDataList(templateVOList.size()+"模板信息【请勿删除或移动】",tempEDList);
        ExcelUtil.writeDataToFile(excelName,eo);
        return excelName;
    }
    /**
     * å¯¼å‡ºçš„æ—¶å€™å°è£…必输和关键属性
     * @param attrVO å±žæ€§çš„æ˜¾ç¤ºå¯¹è±¡
     * @param text å•元格的值
     */
    private Object exportKeyAndRequired(Workbook workbook,CodeClassifyTemplateAttrVO attrVO,Object text){
        //必输加*,关键属性为蓝色
        if (VciBaseUtil.getBoolean(attrVO.getRequireFlag()) || VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())) {
            String value = text.toString();
            if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())) {
                value += REQUIRED_CHAR;
            }
            if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
                value += KEY_ATTR_CHAR;
            }
            RichTextString ts = new HSSFRichTextString(value);
            if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())){
                Font font =  workbook.createFont();
                font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
                ts.applyFont(font);
            }
            if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
                Font font =  workbook.createFont();
                font.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex());
                ts.applyFont(font);
            }
            return ts;
        }
        return text;
    }
    /**
     * æ‰¹é‡ç”³è¯·ç¼–码数据
     *
     * @param orderDTO ç¼–码申请信息,必须包含分类主键和码段的信息
     * @param file     excel文件的信息
     * @return  æœ‰é”™è¯¯ä¿¡æ¯çš„excel的文件
     */
    @Override
    public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
        VciBaseUtil.alertNotNull(orderDTO,"编码申请相关的数据",orderDTO.getCodeClassifyOid(),"主题库分类主键");
        ReadExcelOption reo = new ReadExcelOption();
        reo.setReadAllSheet(true);
        List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
        if(CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
            ||sheetDataSetList.get(0).getRowData().size()<1){
            throw new VciBaseException("没有读取到任何的数据");
        }
        if(sheetDataSetList.size()>LIMIT+1){
            throw new VciBaseException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
        }
        //先找到每一行的标题,然后根据标题来获取对应的属性
        SheetDataSet dataSet = sheetDataSetList.get(0);
        //找第一行,为了找标题
        CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
        //校验模板是不是最新的
        checkTemplateSync(sheetDataSetList,templateVO,0);
        //先不用管属性是否都存在,先转换一下数据
        Map<String,String> errorMap = new HashMap<>();
        String redisUUid=batchImportCodes(orderDTO,templateVO,dataSet,errorMap,true);
        CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
        List<String> needRowIndexList = new ArrayList<>();
//        String filePath = returnErrorToExcel(dataSet.getRowData(), errorMap, needRowIndexList, dataSet.getColName());
//        if(StringUtils.isNotBlank(filePath)) {
//            codeImProtRusultVO.setFilePath(filePath);
//        }
//        if(StringUtils.isNotBlank(redisUUid)){
//            codeImProtRusultVO.setRedisUuid(redisUUid);
//        }
        return null;
//        return codeImProtRusultVO;
    }
    /**
     * æ ¡éªŒæ¨¡æ¿æ˜¯å¦ä¸ºåŒæ­¥çš„
     * @param sheetDataSetList excel里的内容
     * @param templateVO æ¨¡æ¿çš„信息
     */
    private void checkTemplateSync(List<SheetDataSet> sheetDataSetList,CodeClstemplateVO templateVO,int i){
        String templateOidInExcel = "";
        String templateName="";
        if(!CollectionUtils.isEmpty(sheetDataSetList)
            && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
            templateName=rowData.get(i).getData().get(2);
            templateOidInExcel=rowData.get(i).getData().get(0);
            //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
        }
       /* if(!CollectionUtils.isEmpty(sheetDataSetList)
                && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
            templateOidInExcel=rowData.get(i).getData().get(0);
           //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
        }*/
        if(StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(templateVO.getOid())){
            throw new VciBaseException("模板【"+templateName+"】中的数据获取的模版信息与当前模板不匹配,请确保excel文件里有【模板信息-请勿移动或删除】的工作表,且确保每次导入都是先下载的导入模板后添加的数据");
        }
    }
    /***
     * æ‰¹é‡å¤„理申请数据
     * @param orderDTO
     * @param templateVO
     * @param dataSet
     * @return
     */
    private String batchImportCodes(CodeOrderDTO orderDTO,CodeClstemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
        List<String> codeList=new ArrayList<>();
//        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
        //规则的主键需要去获取
//        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
//        //1.判断规则中除了流水码段,是否有其他码段
//        engineService.checkSecValueOnOrder(ruleVO,orderDTO);
//        List<SheetRowData> rowDataList = dataSet.getRowData();
//
//        //除去默认的属性.还有只有表单显示的字段才导入
//        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
//            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormdisplayflag())
//        ).collect(Collectors.toList());
//        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
//        List<String> titleRowData = dataSet.getColName();
//        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
//        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
//    /**
//     * ä¸»é¢˜åº“分类的服务
//     */
//    @Resource
//    private ICodeClassifyService classifyService;
//
//        //需要判断是否所有的属性都在模板上了
//        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
//            && StringUtils.isBlank(s.getComponentrule()) && StringUtils.isBlank(s.getClassifyinvokeattr())//组合规则和分类注入确实没给用户导出去
//        ).collect(Collectors.toList());
//        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
//            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
//        }
//        List<ClientBusinessObject> cboList = new ArrayList<>();
//        String fullPath = getFullPath(classifyFullInfo);
//        excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
//    /**
//     * æ¨¡æ¿çš„æœåŠ¡
//     */
//    @Resource
//    private CodeClstemplateServiceImpl templateService;
//
//        //都转换完了。需要批量检查
//        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
//        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
//        batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
//        //3.判断关键属性
//        CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
//        Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
//        Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
//        if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
//            selfRepeatRowIndexList.stream().forEach(rowIndex->{
//                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
//            });
//        }
//        if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
//            keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
//                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";关键属性与系统中的重复" );
//            });
//        }
//        //分类注入
//        batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
//        //boolean
//        reSwitchBooleanAttrOnOrder(attrVOS,cboList);
//        //4.校验规则
//        batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
//        if(isEnumType) {//是否需要校验枚举/参照
//            //5.校验枚举是否正确
//            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
//            //7.处理参照的情况
//            batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
//        }
//        //6.时间格式的验证
//        //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
//        batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
//        //最后弄组合规则
//        batchSwitchComponentAttrOnOrder(attrVOS,cboList);
//        String uuid=redisService.getUUIDEveryDay();
//        Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
//    /**
//     * ä¸»æ•°æ®å¼•擎的服务
//     */
//    @Resource
//    private MdmEngineService engineService;
//
//        if(errorMap.size()>0) {
//            createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
//    /**
//     * ç”Ÿæˆå¯¼å…¥çš„æ–‡ä»¶
//     *
//     * @param codeClassifyOid åˆ†ç±»çš„主键
//     * @param isHistory æ˜¯å¦åŽ†å²æ•°æ®å¯¼å…¥
//     * @return excel的文件地址
//     */
//    @Override
//    public String createImportExcel(String codeClassifyOid, boolean isHistory) {
//        List<CodeClstemplateVO> templateVOList=new ArrayList<>();
//
//        VciBaseUtil.alertNotNull("导出模板","导出的配置",codeClassifyOid,"主题库分类的主键");
//
//        CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
//
//        if(isHistory){
//            templateVOList= templateService.childTemplates(codeClassifyOid);
//        }else{
//            //找模板
//            CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
//            templateVOList.add(templateVO);
//        }
//        boolean isCreateUUid=false;
//        List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
//            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
//            return !errorMap.containsKey(rowIndex);
//        }).collect(Collectors.toList());
//        //相似校验
//        Map<String,String>resembleMap=new HashMap<>();
//        List<DataResembleVO> dataResembleVOS=new ArrayList<>();
//        String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
//        bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
//        if(resembleMap.size()>0) {
//            isCreateUUid=true;
//            if(!CollectionUtils.isEmpty(dataResembleVOS)) {
//                redisService.setCacheList(uuid + "-resemble-data", dataResembleVOS);
//                createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
//
//        WriteExcelOption eo = new WriteExcelOption();
//        eo.setAppend(true);
//        //增加模板的信息导入
//        LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
//        tempEDList.add(new WriteExcelData(0,0,"模板主键"));
//        tempEDList.add(new WriteExcelData(0,1,"模板代号"));
//        tempEDList.add(new WriteExcelData(0,2,"模板名称"));
//        for(int j=0;j<templateVOList.size();j++){
//            CodeClstemplateVO  templateVO=templateVOList.get(j);
//            CodeClassifyTemplateVO codeClassifyTemplateVO = new CodeClassifyTemplateVO();
//            BeanUtils.copyProperties(templateVO,codeClassifyTemplateVO);
//            //组合格式的不导入,
//            // æžšä¸¾çš„æä¾›åºåˆ—的选择
//            //时间全部统一为yyyy-MM-dd HH:mm:ss
//            //参照的自行输入名称
//            //分类注入的不用,都是导入后自动处理的
//            //编码,状态等字段不导入
//            List<CodeClassifyTemplateAttrVO> templateAttrVOS = codeClassifyTemplateVO.getAttributes().stream().filter(s ->
//                !DEFAULT_ATTR_LIST.contains(s.getId())
//                    && StringUtils.isBlank(s.getComponentRule())
//                    && StringUtils.isBlank(s.getClassifyInvokeAttr())
//                    && (isHistory || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
//            ).collect(Collectors.toList());
//
//            if(CollectionUtils.isEmpty(templateAttrVOS)){
//                throw new VciBaseException("模板没有配置任何【表单显示】为【是】的属性");
//            }
//        }
//        //排除错误的,剩下正确的
//        Map<String,String> newErrorMap=new HashMap<>();
//        newErrorMap.putAll(resembleMap);
//        newErrorMap.putAll(errorMap);
//        needSaveCboList = cboList.stream().filter(cbo -> {
//            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
//            return !newErrorMap.containsKey(rowIndex);
//        }).collect(Collectors.toList());
//        if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
//            isCreateUUid=true;
//        }
//        createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
//        if(newErrorMap.size()>0) {
//            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
//        }else {
//            uuid="";
//            //要把以上的错误的都抛出后,再继续处理时间和组合规则
//            needSaveCboList = cboList.stream().filter(cbo -> {
//                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
//                return !newErrorMap.containsKey(rowIndex);
//            }).collect(Collectors.toList());
//            if (!CollectionUtils.isEmpty(needSaveCboList)) {
//                //9.我们处理业务数据
//                //生成编码的内容
//                codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), needSaveCboList);
//                //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
//                engineService.batchSaveSelectChar(templateVO, needSaveCboList);
//            List<CodeClassifyTemplateAttrVO> idAttrVOList = codeClassifyTemplateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
//            LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
//            Workbook workbook = new HSSFWorkbook();
//            if(isHistory){
//                excelDataList.add(new WriteExcelData(0,0,"分类路径"));
//                excelDataList.add(new WriteExcelData(0,1,"码段宽度"));
//                excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"企业编码"));
//            }
//            for (int i = 0; i < templateAttrVOS.size(); i++) {
//                CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
//
//                Object text = attrVO.getName();
//                text = exportKeyAndRequired(workbook,attrVO,text);
//                int colIndex = (isHistory?3:0) + i;
//                WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
//                if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())
//                    || VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())
//                    || VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributeDataType())
//                    ||VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
//                    excelData.setDateFormat(VciDateUtil.DateTimeFormat);
//                }
//                if(text instanceof RichTextString){
//                    excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
//                }
//                excelDataList.add(excelData);
//                if(StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())){
//                    //添加数据有效性
//                    List<String> enumValueList = new ArrayList<>();
//                    enumValueList.add("");
//                    List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
//                    if(!CollectionUtils.isEmpty(valueList)){
//                        valueList.stream().forEach(kv->{
//                            enumValueList.add(kv.getValue());
//                        });
//                    }
//                    //默认加1万条
//                    WriteExcelData ed = new WriteExcelData(1,colIndex,"");
//                    ed.setRowTo(100);
//                    ed.setColTo(colIndex);
//                    ed.setValidation(true);
//                    ed.setValidationDataList(enumValueList);
//                    ed.setValidationErrorMsg("请在序列中选择正确的值");
//                    excelDataList.add(ed);
//                }
//                if(VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
//                    List<String> booleanList = new ArrayList<>();
//
//                    booleanList.add("是");
//                    booleanList.add("否");
//                    //默认加1万条
//                    WriteExcelData ed = new WriteExcelData(1,colIndex,"");
//                    ed.setRowTo(100);
//                    ed.setColTo(colIndex);
//                    ed.setValidation(true);
//                    ed.setValidationDataList(booleanList);
//                    ed.setValidationErrorMsg("请在序列中选择正确的值");
//                    excelDataList.add(ed);
//                }
//            }
//            eo.addSheetDataList(j+templateVO.getName(),excelDataList);
//            tempEDList.add(new WriteExcelData(j+1,0,templateVO.getOid()));
//            tempEDList.add(new WriteExcelData(j+1,1,templateVO.getId()));
//            tempEDList.add(new WriteExcelData(j+1,2,templateVO.getName()));
//        }
//        if(!isCreateUUid){
//            return uuid="";
//        String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + (isHistory?"_历史数据导入模板.xls": "_导入模板.xls");
//        eo.addSheetDataList(templateVOList.size()+"模板信息【请勿删除或移动】",tempEDList);
//        ExcelUtil.writeDataToFile(excelName,eo);
//        return excelName;
//    }
//
//    /**
//     * å¯¼å‡ºçš„æ—¶å€™å°è£…必输和关键属性
//     * @param attrVO å±žæ€§çš„æ˜¾ç¤ºå¯¹è±¡
//     * @param text å•元格的值
//     */
//    private Object exportKeyAndRequired(Workbook workbook,CodeClassifyTemplateAttrVO attrVO,Object text){
//        //必输加*,关键属性为蓝色
//        if (VciBaseUtil.getBoolean(attrVO.getRequireFlag()) || VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())) {
//            String value = text.toString();
//            if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())) {
//                value += REQUIRED_CHAR;
//            }
//            if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
//                value += KEY_ATTR_CHAR;
//            }
//            RichTextString ts = new HSSFRichTextString(value);
//            if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())){
//                Font font =  workbook.createFont();
//                font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
//                ts.applyFont(font);
//            }
//
//            if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
//                Font font =  workbook.createFont();
//                font.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex());
//                ts.applyFont(font);
//            }
//            return ts;
//        }
//        return uuid;
        return null;
    }
//        return text;
//    }
//
//
//    /**
//     * æ‰¹é‡ç”³è¯·ç¼–码数据
//     *
//     * @param orderDTO ç¼–码申请信息,必须包含分类主键和码段的信息
//     * @param file     excel文件的信息
//     * @return  æœ‰é”™è¯¯ä¿¡æ¯çš„excel的文件
//     */
//    @Override
//    public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
//        VciBaseUtil.alertNotNull(orderDTO,"编码申请相关的数据",orderDTO.getCodeClassifyOid(),"主题库分类主键");
//        ReadExcelOption reo = new ReadExcelOption();
//        reo.setReadAllSheet(true);
//        List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
//        if(CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
//            ||sheetDataSetList.get(0).getRowData().size()<1){
//            throw new VciBaseException("没有读取到任何的数据");
//        }
//        if(sheetDataSetList.size()>LIMIT+1){
//            throw new VciBaseException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
//        }
//        //先找到每一行的标题,然后根据标题来获取对应的属性
//        SheetDataSet dataSet = sheetDataSetList.get(0);
//        //找第一行,为了找标题
//        CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
//
//        //校验模板是不是最新的
//        checkTemplateSync(sheetDataSetList,templateVO,0);
//        //先不用管属性是否都存在,先转换一下数据
//        Map<String,String> errorMap = new HashMap<>();
//        String redisUUid=batchImportCodes(orderDTO,templateVO,dataSet,errorMap,true);
//        CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
//        List<String> needRowIndexList = new ArrayList<>();
////        String filePath = returnErrorToExcel(dataSet.getRowData(), errorMap, needRowIndexList, dataSet.getColName());
////        if(StringUtils.isNotBlank(filePath)) {
////            codeImProtRusultVO.setFilePath(filePath);
////        }
////        if(StringUtils.isNotBlank(redisUUid)){
////            codeImProtRusultVO.setRedisUuid(redisUUid);
////        }
//        return null;
////        return codeImProtRusultVO;
//    }
//
//    /**
//     * æ ¡éªŒæ¨¡æ¿æ˜¯å¦ä¸ºåŒæ­¥çš„
//     * @param sheetDataSetList excel里的内容
//     * @param templateVO æ¨¡æ¿çš„信息
//     */
//    private void checkTemplateSync(List<SheetDataSet> sheetDataSetList,CodeClstemplateVO templateVO,int i){
//        String templateOidInExcel = "";
//        String templateName="";
//        if(!CollectionUtils.isEmpty(sheetDataSetList)
//            && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
//            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
//            templateName=rowData.get(i).getData().get(2);
//            templateOidInExcel=rowData.get(i).getData().get(0);
//            //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
//        }
//       /* if(!CollectionUtils.isEmpty(sheetDataSetList)
//                && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
//            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
//            templateOidInExcel=rowData.get(i).getData().get(0);
//           //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
//        }*/
//        if(StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(templateVO.getOid())){
//            throw new VciBaseException("模板【"+templateName+"】中的数据获取的模版信息与当前模板不匹配,请确保excel文件里有【模板信息-请勿移动或删除】的工作表,且确保每次导入都是先下载的导入模板后添加的数据");
//        }
//
//    }
//
//
//    /***
//     * æ‰¹é‡å¤„理申请数据
//     * @param orderDTO
//     * @param templateVO
//     * @param dataSet
//     * @return
//     */
//    private String batchImportCodes(CodeOrderDTO orderDTO,CodeClstemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
//        List<String> codeList=new ArrayList<>();
////        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
//        //规则的主键需要去获取
////        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
////        //1.判断规则中除了流水码段,是否有其他码段
////        engineService.checkSecValueOnOrder(ruleVO,orderDTO);
////        List<SheetRowData> rowDataList = dataSet.getRowData();
////
////        //除去默认的属性.还有只有表单显示的字段才导入
////        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
////            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormdisplayflag())
////        ).collect(Collectors.toList());
////        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
////        List<String> titleRowData = dataSet.getColName();
////        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
////        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
////
////        //需要判断是否所有的属性都在模板上了
////        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
////            && StringUtils.isBlank(s.getComponentrule()) && StringUtils.isBlank(s.getClassifyinvokeattr())//组合规则和分类注入确实没给用户导出去
////        ).collect(Collectors.toList());
////        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
////            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
////        }
////        List<ClientBusinessObject> cboList = new ArrayList<>();
////        String fullPath = getFullPath(classifyFullInfo);
////        excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
////
////        //都转换完了。需要批量检查
////        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
////        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
////        batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
////        //3.判断关键属性
////        CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
////        Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
////        Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
////        if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
////            selfRepeatRowIndexList.stream().forEach(rowIndex->{
////                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
////            });
////        }
////        if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
////            keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
////                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";关键属性与系统中的重复" );
////            });
////        }
////        //分类注入
////        batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
////        //boolean
////        reSwitchBooleanAttrOnOrder(attrVOS,cboList);
////        //4.校验规则
////        batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
////        if(isEnumType) {//是否需要校验枚举/参照
////            //5.校验枚举是否正确
////            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
////            //7.处理参照的情况
////            batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
////        }
////        //6.时间格式的验证
////        //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
////        batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
////        //最后弄组合规则
////        batchSwitchComponentAttrOnOrder(attrVOS,cboList);
////        String uuid=redisService.getUUIDEveryDay();
////        Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
////
////        if(errorMap.size()>0) {
////            createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
////        }
////        boolean isCreateUUid=false;
////        List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
////            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
////            return !errorMap.containsKey(rowIndex);
////        }).collect(Collectors.toList());
////        //相似校验
////        Map<String,String>resembleMap=new HashMap<>();
////        List<DataResembleVO> dataResembleVOS=new ArrayList<>();
////        String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
////        bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
////        if(resembleMap.size()>0) {
////            isCreateUUid=true;
////            if(!CollectionUtils.isEmpty(dataResembleVOS)) {
////                redisService.setCacheList(uuid + "-resemble-data", dataResembleVOS);
////                createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
////            }
////        }
////        //排除错误的,剩下正确的
////        Map<String,String> newErrorMap=new HashMap<>();
////        newErrorMap.putAll(resembleMap);
////        newErrorMap.putAll(errorMap);
////        needSaveCboList = cboList.stream().filter(cbo -> {
////            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
////            return !newErrorMap.containsKey(rowIndex);
////        }).collect(Collectors.toList());
////        if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
////            isCreateUUid=true;
////        }
////        createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
////        if(newErrorMap.size()>0) {
////            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
////        }else {
////            uuid="";
////            //要把以上的错误的都抛出后,再继续处理时间和组合规则
////            needSaveCboList = cboList.stream().filter(cbo -> {
////                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
////                return !newErrorMap.containsKey(rowIndex);
////            }).collect(Collectors.toList());
////            if (!CollectionUtils.isEmpty(needSaveCboList)) {
////                //9.我们处理业务数据
////                //生成编码的内容
////                codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), needSaveCboList);
////                //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
////                engineService.batchSaveSelectChar(templateVO, needSaveCboList);
////            }
////        }
////        if(!isCreateUUid){
////            return uuid="";
////        }
////        return uuid;
//        return null;
//    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -11,22 +11,19 @@
import com.vci.ubcs.code.enumpack.CodeGetValueTypeEnum;
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.CodeSerialValueMapper;
import com.vci.ubcs.code.service.ICodeWupinService;
import com.vci.ubcs.code.service.MdmProductCodeService;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
import com.vci.ubcs.starter.web.constant.RegExpConstant;
import com.vci.ubcs.starter.web.enumpck.OsCodeFillTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -57,7 +54,7 @@
    private ICodeWupinService iCodeWupinService;
    @Override
    public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClstemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<CodeWupinEntity> dataCBOList) {
    public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<CodeWupinEntity> dataCBOList) {
//        BatchCBO batchCBO = new BatchCBO();
//        WebUtil.setPersistence(false);
//        dataCBOList = dataCBOList.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList());
@@ -588,7 +585,7 @@
     * @param allCodeDOList æ‰€æœ‰çš„码值的对象列表
     */
    private void wrapperAllCode(CodeClassifyFullInfoBO classifyFullInfoBO,CodeRuleVO ruleVO,
                                CodeWupinEntity cbo,CodeClstemplateVO templateVO,
                                CodeWupinEntity cbo,CodeClassifyTemplateVO templateVO,
                                List<CodeAllCode> allCodeDOList,String serialUnitString,String serialValueString){
        CodeAllCode allCodeDO = new CodeAllCode();
        allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyProcessTempWrapper.java
@@ -1,11 +1,8 @@
package com.vci.ubcs.code.wrapper;
import com.vci.ubcs.code.entity.CodeClassifyProcessTemp;
import com.vci.ubcs.code.entity.CodeClassifyValue;
import com.vci.ubcs.code.enumpack.CodeClassifyProcessUseEnum;
import com.vci.ubcs.code.vo.CodeClsflowtempVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyProcessTempVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyValueVO;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyTemplateAttrWrapper.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClstempattrWrapper.java ÐÞ¸Ä
@@ -29,10 +29,10 @@
 * @author yuxc
 * @since 2023-04-19
 */
public class CodeClstempattrWrapper extends BaseEntityWrapper<CodeClassifyTemplateAttr, CodeClassifyTemplateAttrVO>  {
public class CodeClassifyTemplateAttrWrapper extends BaseEntityWrapper<CodeClassifyTemplateAttr, CodeClassifyTemplateAttrVO>  {
    public static CodeClstempattrWrapper build() {
        return new CodeClstempattrWrapper();
    public static CodeClassifyTemplateAttrWrapper build() {
        return new CodeClassifyTemplateAttrWrapper();
     }
    @Override
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyTemplateWrapper.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/PlCodeClstemplateWrapper.java ÐÞ¸Ä
@@ -16,10 +16,11 @@
 */
package com.vci.ubcs.code.wrapper;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
import com.vci.ubcs.code.vo.CodeClstemplateVO;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import java.util.Objects;
/**
@@ -28,15 +29,15 @@
 * @author yuxc
 * @since 2023-04-10
 */
public class PlCodeClstemplateWrapper extends BaseEntityWrapper<CodeClstemplateEntity, CodeClstemplateVO>  {
public class CodeClassifyTemplateWrapper extends BaseEntityWrapper<CodeClassifyTemplate, CodeClassifyTemplateVO>  {
    public static PlCodeClstemplateWrapper build() {
        return new PlCodeClstemplateWrapper();
    public static CodeClassifyTemplateWrapper build() {
        return new CodeClassifyTemplateWrapper();
     }
    @Override
    public CodeClstemplateVO entityVO(CodeClstemplateEntity plCodeClstemplate) {
        CodeClstemplateVO plCodeClstemplateVO = Objects.requireNonNull(BeanUtil.copy(plCodeClstemplate, CodeClstemplateVO.class));
    public CodeClassifyTemplateVO entityVO(CodeClassifyTemplate plCodeClstemplate) {
        CodeClassifyTemplateVO plCodeClstemplateVO = Objects.requireNonNull(BeanUtil.copy(plCodeClstemplate, CodeClassifyTemplateVO.class));
        //User createUser = UserCache.getUser(plCodeClstemplate.getCreateUser());
        //User updateUser = UserCache.getUser(plCodeClstemplate.getUpdateUser());
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClsflowtempWrapper.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeKeyAttrRepeatWrapper.java
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/PlCodeKeyattrrepeatWrapper.java ÐÞ¸Ä
@@ -16,10 +16,10 @@
 */
package com.vci.ubcs.code.wrapper;
import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
import com.vci.ubcs.code.entity.CodeKeyAttrRepeat;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import java.util.Objects;
/**
@@ -28,15 +28,15 @@
 * @author yuxc
 * @since 2023-04-03
 */
public class PlCodeKeyattrrepeatWrapper extends BaseEntityWrapper<CodeKeyattrrepeatEntity, CodeKeyattrrepeatVO>  {
public class CodeKeyAttrRepeatWrapper extends BaseEntityWrapper<CodeKeyAttrRepeat, CodeKeyAttrRepeatVO>  {
    public static PlCodeKeyattrrepeatWrapper build() {
        return new PlCodeKeyattrrepeatWrapper();
    public static CodeKeyAttrRepeatWrapper build() {
        return new CodeKeyAttrRepeatWrapper();
     }
    @Override
    public CodeKeyattrrepeatVO entityVO(CodeKeyattrrepeatEntity plCodeKeyattrrepeat) {
        CodeKeyattrrepeatVO codeKeyattrrepeatVO = Objects.requireNonNull(BeanUtil.copy(plCodeKeyattrrepeat, CodeKeyattrrepeatVO.class));
    public CodeKeyAttrRepeatVO entityVO(CodeKeyAttrRepeat plCodeKeyattrrepeat) {
        CodeKeyAttrRepeatVO codeKeyattrrepeatVO = Objects.requireNonNull(BeanUtil.copy(plCodeKeyattrrepeat, CodeKeyAttrRepeatVO.class));
        //User createUser = UserCache.getUser(plCodeKeyattrrepeat.getCreateUser());
        //User updateUser = UserCache.getUser(plCodeKeyattrrepeat.getUpdateUser());
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClassifyTemplateMapper.xml
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml ÐÞ¸Ä
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vci.ubcs.code.mapper.CodeClstemplateMapper">
<mapper namespace="com.vci.ubcs.code.mapper.CodeClassifyTemplateMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="plCodeClstemplateResultMap" type="com.vci.ubcs.code.entity.CodeClstemplateEntity">
    <resultMap id="plCodeClstemplateResultMap" type="com.vci.ubcs.code.entity.CodeClassifyTemplate">
        <result column="OID" property="oid"/>
        <result column="REVISIONOID" property="revisionOid"/>
        <result column="NAMEOID" property="nameOid"/>
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeKeyAttrRepeatMapper.xml
ÎļþÃû´Ó Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeKeyattrrepeatMapper.xml ÐÞ¸Ä
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vci.ubcs.code.mapper.CodeKeyattrrepeatMapper">
<mapper namespace="com.vci.ubcs.code.mapper.CodeKeyAttrRepeatMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="plCodeKeyattrrepeatResultMap" type="com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity">
    <resultMap id="plCodeKeyattrrepeatResultMap" type="com.vci.ubcs.code.entity.CodeKeyAttrRepeat">
        <result column="OID" property="oid"/>
        <result column="REVISIONOID" property="revisionoid"/>
        <result column="NAMEOID" property="nameoid"/>
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
@@ -18,5 +18,9 @@
        ${inSql}
    </select>
    <select id="selectBySql" resultType="java.util.Map">
        ${inSql}
    </select>
</mapper>