ludc
2023-09-11 53d628adb1082d7df51dc1a2151505f17b1de9a2
bug修改,规则克隆接口修改
已修改19个文件
626 ■■■■■ 文件已修改
Source/UBCS-WEB/src/const/code/cloneCodeRuleDialogOption.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/code.vue 321 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyValue.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeFixedValue.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeFixedValueVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeBasicSecController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyValueService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeFixedValueService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyValueServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeFixedValueServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/cloneCodeRuleDialogOption.js
@@ -11,15 +11,23 @@
    border: true,
    index: true,
    viewBtn: false,
    selection: true,
    selection: false,
    menu: false,
    refreshBtn: false,
    columnBtn: false,
    dialogClickModal: false,
    highlightCurrentRow: true, //行选中时高亮
    rowKey: "oid", //行数据的 Key,用来优化 Table 的渲染
    align: 'center',
    menuAlign: 'center',
    column: [
      {
        label: '',
        prop: 'radio',
        width: 60,
        hide: false
      },
      {
        label: "编号",
        prop: "id",
        search: true,
Source/UBCS-WEB/src/main.js
@@ -41,6 +41,8 @@
import referConfigDialog from "@/components/code-dialog-page/referConfigDialog"
import referBtmTypeCrudDialog from "@/components/code-dialog-page/referBtmTypeCrudDialog"
import referSelectBtmAttrDialog from "@/components/code-dialog-page/referSelectBtmAttrDialog"
import cloneRuleDialog from "@/components/code-dialog-page/cloneRuleDialog"
import cloneOtherBasicSecDialog from "@/components/code-dialog-page/cloneOtherBasicSecDialog"
import advancedQuery from "@/components/advanced-query/advancedQuery"
import businessAdd from "@/views/modeling/BusinessAdd"
import VciMasterCrud from "@/components/MasterCrud/VciMasterCrud"
@@ -98,6 +100,8 @@
Vue.component('originalAdd',originalAdd)
Vue.component('referBtmTypeCrudDialog',referBtmTypeCrudDialog)
Vue.component('referSelectBtmAttrDialog',referSelectBtmAttrDialog)
Vue.component('cloneOtherBasicSecDialog',cloneOtherBasicSecDialog)
Vue.component('cloneRuleDialog',cloneRuleDialog)
Vue.component('FormTemplateDialog',FormTemplateDialog)
Vue.component('LinkTypeAdd',linkTypeAdd)
Vue.component('MasterTree',MasterTree)
Source/UBCS-WEB/src/views/code/code.vue
@@ -156,7 +156,7 @@
    >
    </advanced-query>
    <!-- 编码规则相关对话框 -->
    <!-- 以下是编码规则相关对话框 -->
    <el-dialog
      :visible.sync="codeRangeSettingBox"
      append-to-body
@@ -177,150 +177,18 @@
    </el-dialog>
    <!-- 编码规则,克隆对话框 -->
    <el-dialog
    <clone-rule-dialog
      :visible.sync="cloneSettingBox"
      append-to-body
      class="avue-dialog avue-dialog--top"
      style="height: 100vh"
      title="克隆编码规则"
      top="-3%"
      width="800px"
    >
      <div>
        <el-row>
          <el-form ref="form" :inline="true" :model="form" label-width="80px">
            <el-form-item label="编号" required>
              <el-input v-model="cloneCodeRuleForm.id"></el-input>
            </el-form-item>
            <el-form-item label="名称" required>
              <el-input v-model="cloneCodeRuleForm.name"></el-input>
            </el-form-item>
            <el-form-item class="clone-input-textarea" label="描述">
              <el-input
                v-model="cloneCodeRuleForm.description"
                :autosize="{ minRows: 3, maxRows: 5 }"
                type="textarea"
              ></el-input>
            </el-form-item>
          </el-form>
        </el-row>
        <el-row>
          <p
            style="
              margin: 0 0px 16px 50%;
              font-weight: 500;
              font-size: 20px;
              color: #000;
            "
          >
            码段管理
          </p>
          <avue-crud
            :data="cloneData"
            :option="cloneOption"
            :table-loading="cloneTableLoading"
            class="clone-avue-crud"
            @on-load="cloneDataOnLoad"
          >
            <template slot="menu" slot-scope="scope">
              <el-button
                v-show="scope.row.orderNum > 1"
                icon="el-icon-arrow-up"
                plain
                size="small"
                type="text"
                @click="upOrderNum(scope.row)"
                >上移
              </el-button>
              <el-button
                icon="el-icon-arrow-down"
                plain
                size="small"
                type="text"
                @click="downOrderNum(scope.row)"
                >下移
              </el-button>
            </template>
          </avue-crud>
        </el-row>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="saveCloneCodeRule">保 存</el-button>
        <el-button @click="cloneSettingBox = false">取 消</el-button>
      </div>
    </el-dialog>
      :ruleData="selectionList[0]"
      @refreshRuleTable="onLoad">
    </clone-rule-dialog>
    <!-- 编码规则,从其他规则克隆对话框 -->
    <el-dialog
    <clone-other-basic-sec-dialog
      :visible.sync="cloneOtherCodeRuleSettingBox"
      append-to-body
      class="avue-dialog avue-dialog--top"
      destroy-on-close
      style="height: 100vh"
      title="克隆编码规则的基础信息"
      top="-3%"
      width="800px"
    >
      <div>
        <el-row>
          <p
            style="
              margin-top: -20px;
              margin-bottom: 4px;
              font-weight: 570;
              font-size: 19px;
              color: #0e2d5f;
            "
          >
            编码规则
          </p>
          <avue-crud
            ref="crudCloneCodeRuleOther"
            :data="data"
            :option="cloneCodeRuleOption"
            :page.sync="page"
            :table-loading="loading"
            class="other-clone-coderule-crud"
            @row-click="codeOtherCloneRuleRowClick"
            @size-change="sizeChange"
            @selection-change="selectionOtherCloneCodeRuleChange"
            @search-change="searchOtherCloneChange"
            @search-reset="searchOtherCloneReset"
            @on-load="onLoad"
          >
          </avue-crud>
        </el-row>
        <el-row style="margin-top: 10px; border-top: 1px solid #ebeef5">
          <p
            style="
              margin-top: 10px;
              margin-bottom: 4px;
              font-weight: 570;
              font-size: 19px;
              color: #0e2d5f;
            "
          >
            码段信息
          </p>
          <avue-crud
            ref="crudCloneCodeBasicOther"
            :data="basicData"
            :option="cloneBasicOption"
            :table-loading="loadingBasic"
            class="other-clone-codebasic-crud"
            @row-click="codeOtherCloneBasicRowClick"
            @selection-change="selectionOtherCloneCodeBasicChange"
          >
          </avue-crud>
        </el-row>
      </div>
      <div slot="footer" class="dialog-footer" style="height: 50px">
        <el-button type="primary" @click="saveOtherCodeBasic">保 存</el-button>
        <el-button @click="cloneOtherCodeRuleSettingBox = false"
          >取 消</el-button
        >
      </div>
    </el-dialog>
      :quiltCloneCodeRule="selectionList[0]"
      @refreshRuleTable="onLoad">
    </clone-other-basic-sec-dialog>
    <!-- 编码规则,转移所有者对话框 -->
    <el-dialog
@@ -1414,7 +1282,6 @@
  remove,
  listUseRange,
  updateStatus,
  clone,
  clearAllCode,
  checkLikeCodeRule,
} from "@/api/code/mdmrule";
@@ -1424,7 +1291,6 @@
  upOrderNum,
  deleteData,
  editSave,
  cloneCodeBasic,
  addSave,
  refDataGridClassifySec,
} from "@/api/code/codebasic";
@@ -1445,9 +1311,6 @@
} from "@/api/code/codeClassifyValue";
import { getDictionary } from "@/api/omd/enum";
import optionBasic from "@/const/code/codebasic";
import cloneOption from "@/const/code/cloneOption";
import cloneBasicOption from "@/const/code/cloneBasicDialogOption";
import cloneCodeRuleOption from "@/const/code/cloneCodeRuleDialogOption";
import optionRule from "@/const/code/mdmrule";
import attrOption from "@/const/code/selectAttrOptionDialog";
import treeOption from "@/const/code/classifyTreeOptionDialog";
@@ -1476,24 +1339,11 @@
      data: [],
      currentRuleLcStatus: "",
      /*克隆对话框控制变量*/
      /*克隆编码规则对话框控制变量*/
      cloneSettingBox: false,
      cloneTableLoading: false,
      cloneOption: cloneOption,
      cloneData: [],
      cloneCodeRuleForm: {
        id: "",
        name: "",
        description: "",
      },
      
      /*从其他规则克隆码段*/
      cloneOtherCodeRuleSettingBox: false,
      cloneBasicOption: cloneBasicOption,
      cloneCodeRuleOption: cloneCodeRuleOption,
      selectionOtherCloneCodeBasicList: [], // 此界面内当前选中的基础码段
      selectionOtherCloneCodeRuleList: [], // 此界面内当前选中的编码规则
      otherCloneQuery: {}, // 查询条件对象
      /** 转移所有者对话框 */
      escapeOwnerVisible: false,
@@ -1549,7 +1399,7 @@
      loadingBasic: false,
      selectionBasicList: [],
      addBasicCodeSettingBox: false,
      showbtn: false, //基础码段新增是否显示基础码段
      showbtn: false, //基础码段新增按钮是否禁用
      isLoadingSecCodeAddBtn: false,
      basicSecDialogTitle: "", //基础码段第一层对话框标题
      basicSecOnlyRead: false, //新增基础码段表单是否只读
@@ -2575,46 +2425,6 @@
        return;
      }
      this.cloneSettingBox = true;
      this.cloneCodeRuleForm.id = this.selectionList[0].id;
      this.cloneCodeRuleForm.name = this.selectionList[0].name;
      this.cloneCodeRuleForm.description = this.selectionList[0].description;
      this.loadBasic({ oid: this.selectionList[0].oid });
    },
    /** 克隆编码规则保存功能*/
    saveCloneCodeRule() {
      let form = this.cloneCodeRuleForm;
      if (form.id.trim() == "") {
        this.$message.warning("编号不能为空!");
        return;
      }
      if (form.name.trim() == "") {
        this.$message.warning("码值不能为空!");
        return;
      }
      this.selectionList[0].oid = "";
      this.selectionList[0].id = form.id;
      this.selectionList[0].name = form.name;
      this.selectionList[0].description = form.description;
      this.selectionList[0].createTime = new Date().getTime();
      this.selectionList[0].ts = new Date(this.selectionList[0].ts).getTime();
      this.selectionList[0].lcStatus = "Editing";
      let data = Object.assign({}, this.selectionList[0], {
        elements: this.cloneData,
      });
      clone(data).then(
        () => {
          this.cloneSettingBox = false;
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
          });
        },
        (error) => {
          window.console.log(error);
        }
      );
      //console.log(data);
    },
    /** 打开从其他编码规则中克隆码段对话框*/
@@ -2627,99 +2437,6 @@
        return;
      }
      this.cloneOtherCodeRuleSettingBox = true;
    },
    /** 从其他编码规则中克隆码段对话框-单击编码规则实现行选择*/
    codeOtherCloneRuleRowClick(row) {
      this.$refs.crudCloneCodeRuleOther.toggleSelection();
      this.selectionOtherCloneCodeRuleList = row;
      this.$refs.crudCloneCodeRuleOther.setCurrentRow(row);
      this.$refs.crudCloneCodeRuleOther.toggleRowSelection(row); //选中当前行
      this.loadBasic(row);
    },
    /** 从其他编码规则中克隆码段对话框-单击基础码段实现行选择*/
    codeOtherCloneBasicRowClick(row) {
      this.$refs.crudCloneCodeBasicOther.toggleSelection();
      this.selectionOtherCloneCodeBasicList = row;
      this.$refs.crudCloneCodeBasicOther.setCurrentRow(row);
      this.$refs.crudCloneCodeBasicOther.toggleRowSelection(row); //选中当前行
    },
    /** 从其他规则克隆码段界面中编码规则当前选中行变化的时候触发*/
    selectionOtherCloneCodeRuleChange(list) {
      //console.log(list);
      this.selectionOtherCloneCodeRuleList = list;
      this.$refs.crudBasic.setCurrentRow(
        this.selectionBasicList[list.length - 1]
      );
      if (list == "") {
        this.basicData = [];
      }
      if (this.selectionOtherCloneCodeRuleList.length > 0) {
        this.loadBasic(this.selectionOtherCloneCodeRuleList[list.length - 1]);
      }
    },
    selectionOtherCloneCodeBasicChange(list) {
      this.selectionOtherCloneCodeBasicList = list;
      this.$refs.crudCloneCodeBasicOther.setCurrentRow(
        this.selectionOtherCloneCodeBasicList[list.length - 1]
      );
    },
    /** 从其他规则克隆码段界面重置搜索功能 */
    searchOtherCloneReset() {
      this.otherCloneQuery = {};
      this.onLoad(this.page);
    },
    /** 从其他规则克隆码段界面搜索功能*/
    searchOtherCloneChange(params, done) {
      this.page.currentPage = 1;
      // 多个conditionMap这样传参,快速查询默认采用模糊查询
      let requestData = {};
      if (params) {
        Object.keys(params).forEach((key) => {
          requestData["conditionMap" + "[" + key + "_like]"] =
            params[key].trim();
        });
      }
      this.otherCloneQuery = requestData;
      this.onLoad(this.page,requestData);
      done();
    },
    /** 保存从其他编码规则中克隆码段信息*/
    saveOtherCodeBasic() {
      let oid = this.selectionList[0].oid;
      let fromDialogPkCodebasic = this.selectionOtherCloneCodeBasicList;
      if (fromDialogPkCodebasic.length <= 0) {
        this.$message.warning("请选择码段数据!");
        return;
      }
      let res = fromDialogPkCodebasic.filter((item) => {
        return item.pkCodeRule == oid;
      });
      if (res != "") {
        this.$message.warning("需要克隆的编码规则与被克隆的编码规则相同!");
        return;
      }
      let oidArr = [];
      fromDialogPkCodebasic.forEach((ele) => {
        oidArr.push(ele.oid);
      });
      let data = {
        pkCodeRule: oid,
        oidArr: oidArr.join(","),
      };
      //console.log(data);
      cloneCodeBasic(data).then(
        () => {
          this.cloneOtherCodeRuleSettingBox = false;
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!",
          });
        },
        (error) => {
          window.console.log(error);
        }
      );
    },
    /** 清空码值*/
@@ -3235,11 +2952,7 @@
    },
    /** 点击触发加载基础码段信息*/
    loadBasic(row) {
      if (this.cloneSettingBox) {
        this.cloneTableLoading = true;
      } else {
        this.loadingBasic = true;
      }
      this.loadingBasic = true;
      // console.log(row.oid);
      if (row != "" || row != null) {
        //存储当前关联的编码规则相关信息
@@ -3272,14 +2985,8 @@
      gridCodeBasicSec(1, -1, isAdancedQuery ? condition : conditionMaps).then(
        (res) => {
          const data = res.data.data;
          if (this.cloneSettingBox) {
            this.cloneData = data.records;
            this.cloneTableLoading = false;
          } else {
            this.basicData = data.records;
            // console.log(this.basicData);
            this.loadingBasic = false;
          }
          this.basicData = data.records;
          this.loadingBasic = false;
        }
      );
    },
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java
@@ -82,7 +82,6 @@
     */
    private String codeSecLength;
    /**
     * 层级类型
     */
@@ -148,7 +147,6 @@
     */
    private String filterSql ;
    /**
     * 流水号起始值
     */
@@ -158,7 +156,6 @@
     * 流水的步长
     */
    private Integer serialStep;
    /**
     * 编码补位方式
@@ -210,7 +207,6 @@
     */
    private String parentClassifySecText;
    /**
     * 是否可以为空
     */
@@ -240,6 +236,7 @@
     * 选择码段信息的主键集合
     */
    private String oidArr;
    /**
     * 获取 码段类型
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyValue.java
@@ -19,11 +19,11 @@
@EqualsAndHashCode(callSuper = true)
public class CodeClassifyValue extends BaseModel {
    /**
     * 序列化
     */
    private static final long serialVersionUID = 5238387322464830032L;
    /**
     * 分类码段主键
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeFixedValue.java
@@ -23,6 +23,7 @@
     * 序列化
     */
    private static final long serialVersionUID = 3392365440606832597L;
    /**
     * 固定码段主键
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeFixedValueVO.java
@@ -30,8 +30,6 @@
    */
    private Integer orderNum;
    /**
     * 获取 固定码段主键
     */
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java
@@ -21,7 +21,7 @@
        using = ToStringSerializer.class
    )
    @ApiModelProperty("主键id")
    @TableId(value = "OID",type = IdType.ASSIGN_UUID)
    @TableId(value = "OID",type = IdType.ASSIGN_ID)
    private String oid;
    @TableField(value = "id")
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java
@@ -36,7 +36,7 @@
    public static <T extends BaseModel> T addDefaultAttrAssimt(T object,String btmName) throws VciBaseException {
        BaseModel baseModel = object;
        try {
            baseModel.setOid(VciBaseUtil.getPk().toUpperCase());
            baseModel.setOid(VciBaseUtil.getPk());
            baseModel.setCreateTime(new Date());
            baseModel.setNameOid(VciBaseUtil.getPk());
            baseModel.setLastModifyTime(new Date());
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeBasicSecController.java
@@ -23,6 +23,7 @@
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.rmi.ServerException;
import java.util.Collection;
import java.util.List;
@@ -162,7 +163,7 @@
    @PostMapping("/clone")
    @ApiOperationSupport(order = 10)
    @ApiOperation(value = "克隆码段信息", notes = "codeBasicSecDTO")
    public R cloneCodeBasicSec(@RequestBody CodeBasicSecDTO codeBasicSecDTO){
    public R cloneCodeBasicSec(@RequestBody CodeBasicSecDTO codeBasicSecDTO) throws ServerException {
        VciBaseUtil.alertNotNull(codeBasicSecDTO.getOidArr(),"选择码段主键");
        List<String> oidArr = VciBaseUtil.str2List(codeBasicSecDTO.getOidArr());
        if (CollectionUtils.isEmpty(oidArr)){
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleController.java
@@ -48,6 +48,7 @@
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.rmi.ServerException;
import java.util.Collection;
import java.util.Map;
@@ -200,7 +201,7 @@
    @PostMapping("/clone")
    @ApiOperationSupport(order = 13)
    @ApiOperation(value = "克隆编码规则", notes = "传入codeRuleDTO")
    public R cloneCodeRule(@RequestBody CodeRuleDTO codeRuleDTO){
    public R cloneCodeRule(@RequestBody CodeRuleDTO codeRuleDTO) throws ServerException {
        return codeRuleService.cloneCodeRule(codeRuleDTO);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java
@@ -17,6 +17,7 @@
import org.springblade.core.tool.utils.BeanUtil;
import org.springframework.util.CollectionUtils;
import java.rmi.ServerException;
import java.util.*;
/**
@@ -41,7 +42,7 @@
     * @param codeRuleOid 编码规则主键
     * @return 执行结果
     */
    boolean batchDeleteSecByCodeRuleOid(String codeRuleOid);
    boolean batchDeleteSecByCodeRuleOid(String codeRuleOid)throws VciBaseException;
    /**
     * 根据码段分类的类型判断属性是否是空的
@@ -122,7 +123,15 @@
     * @param pkCodeRule 目标编码规则
     * @return 克隆结果反馈::success:成功,fail:失败
     */
    R cloneCodeBasicSec(List<String> oidList, String pkCodeRule);
    R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServerException;
    /**
     * 改变码段中父分类码段和子分类码段之间的关联oid为新的oid,并且不破坏分类码值的关联关系
     * @param basicSecs
     * @return
     * @throws ServerException
     */
    boolean changeParentOidAssnOid(List<CodeBasicSec> basicSecs) throws ServerException;
    /**
     * 查询目标分类码段所在的树结构
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyValueService.java
@@ -25,6 +25,13 @@
public interface ICodeClassifyValueService extends IService<CodeClassifyValue> {
    /**
     * 克隆分类码值
     * @param codeClassifyValues
     * @return
     */
    boolean cloneCodeClassifyVaue(List<CodeClassifyValue> codeClassifyValues);
    /**
     * 查询分类码段的码值 树
     * @param treeQueryObject 树查询对象
     * @return 分类码段的码值 显示树
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeFixedValueService.java
@@ -7,8 +7,6 @@
import com.vci.ubcs.code.vo.pagemodel.CodeFixedValueVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import org.springblade.core.tool.api.R;
import org.springframework.data.domain.Page;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -102,4 +100,11 @@
     */
    boolean batchDeleteBySecOid(String codefixedsecoid);
    /**
     * 根据codeFixedSecOid查询码值
     * @param codeFixedSecOids
     * @return
     */
    List<CodeFixedValue> listFixedValueByCodeFixedSecOid(List<String> codeFixedSecOids);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java
@@ -27,6 +27,7 @@
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import java.rmi.ServerException;
import java.util.Collection;
import java.util.Map;
@@ -144,7 +145,7 @@
     * @param codeRuleDTO 主数据编码规则数据传输对象,oid和ts需要传输
     * @return 主数据编码规则显示对象
     */
    R cloneCodeRule(CodeRuleDTO codeRuleDTO) throws VciBaseException;
    R cloneCodeRule(CodeRuleDTO codeRuleDTO) throws VciBaseException, ServerException;
    /**
     * 编码规则清空所有已生成的编码
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
@@ -52,6 +52,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.rmi.ServerException;
import java.util.*;
import java.util.stream.Collectors;
@@ -114,7 +115,7 @@
    /**
     * 上层分类码段的属性名称
     */
    private static  final String PARENT_FIELD_NAME = "parentclassifysecoid";
    private static  final String PARENT_FIELD_NAME = "parentClassifySecOid";
    /**
     * 上级分类码值的属性名称
@@ -170,10 +171,10 @@
            // 将要作为删除条件的值放在一个集合里面
            Set<String> fixedSecOidSet = fixedSecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toSet());
            // 通过外键进行查询
            List<CodeFixedValue> fixedValueS = fixedValueMapper.selectList(Wrappers.<CodeFixedValue>query().lambda().in(CodeFixedValue::getCodeFixedSecOid,fixedSecOidSet));
            if(!fixedValueS.isEmpty()){
            List<CodeFixedValue> fixedValues = fixedValueMapper.selectList(Wrappers.<CodeFixedValue>query().lambda().in(CodeFixedValue::getCodeFixedSecOid,fixedSecOidSet));
            if(!fixedValues.isEmpty()){
                // 根据查询出来的id执行固定码段执行删除
                deletFlag = fixedValueMapper.deleteBatchIds(fixedValueS.stream().map(CodeFixedValue::getOid).collect(Collectors.toSet()))>0;
                deletFlag = fixedValueMapper.deleteBatchIds(fixedValues.stream().map(CodeFixedValue::getOid).collect(Collectors.toSet()))>0;
            }
        }
        // 4、再删除分类码段
@@ -184,10 +185,10 @@
            // 将要作为删除条件的值放在一个集合里面
            Set<String> classifySecOidSet = classifySecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toSet());
            // 通过外键进行查询
            List<CodeClassifyValue> fixedValueS = codeClassifyValueMapper.selectList(Wrappers.<CodeClassifyValue>query().lambda().in(CodeClassifyValue::getCodeClassifySecOid,classifySecOidSet));
            if(!fixedValueS.isEmpty()){
            List<CodeClassifyValue> codeClassifyValues = codeClassifyValueMapper.selectList(Wrappers.<CodeClassifyValue>query().lambda().in(CodeClassifyValue::getCodeClassifySecOid,classifySecOidSet));
            if(!codeClassifyValues.isEmpty()){
                // 根据查询出来的主键id执行固定码段执行删除
                deletFlag = fixedValueMapper.deleteBatchIds(fixedValueS.stream().map(CodeClassifyValue::getOid).collect(Collectors.toSet()))>0;
                deletFlag = codeClassifyValueMapper.deleteBatchIds(codeClassifyValues.stream().map(CodeClassifyValue::getOid).collect(Collectors.toSet()))>0;
            }
        }
        return deletFlag;
@@ -574,7 +575,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServiceException {
    public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServiceException, ServerException {
        boolean isLinked = checkIsLinked(pkCodeRule,null);
        if (isLinked) {
            return R.fail("编码规则已被引用,不允许编辑或删除");
@@ -584,20 +585,96 @@
        if(basicSecDOS.isEmpty()){
            return R.fail("克隆的码段信息不存在!");
        }
        basicSecDOS.forEach(sec -> {
        List<CodeBasicSec> codeClassifySec = new ArrayList<>();
        Map<String,List<CodeFixedValue>> codeFixedValueMaps = new HashMap<>();
        for (CodeBasicSec sec : basicSecDOS) {
            CodeBasicSec newSecDO = new CodeBasicSec();
            BeanUtilForVCI.copyPropertiesIgnoreCase(sec,newSecDO);
            newSecDO.setOid(VciBaseUtil.getPk());
            newSecDO.setNameOid(VciBaseUtil.getPk());
            newSecDO.setRevisionOid(VciBaseUtil.getPk());
            newSecDO.setId(newSecDO.getId() + "_copy");
            newSecDO.setName(newSecDO.getName() + "_copy");
            String oldBasicOid = newSecDO.getOid();
            newSecDO.setId(newSecDO.getId());
            newSecDO.setName(newSecDO.getName());
            newSecDO.setPkCodeRule(pkCodeRule);
            // 判断是否是分类码段,业务逻辑稍微复杂一点所以需要先提出来单独处理
            if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue())){
                // 存储旧的码段oid和新的码段的oid的关联关系
                codeClassifySec.add(newSecDO);
                continue;
            }
            // 更改创建时间,修改时间等默认值
            DefaultAttrAssimtUtil.addDefaultAttrAssimt(newSecDO,MdmBtmTypeConstant.CODE_BASIC_SEC);
            //固定码段
            if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_FIXED_SEC.getValue())){
                // 固定码段存储好oid和码值的关联关系
                codeFixedValueMaps.put(newSecDO.getOid(),fixedValueService.list(Wrappers.<CodeFixedValue>query()
                    .lambda().eq(CodeFixedValue::getCodeFixedSecOid, oldBasicOid)
                ));
            }
            createList.add(newSecDO);
        });
        }
        // 处理分类码段的oid,因为oid关联parentClassifyOid,与码值codeClassifyOid,码值又需要通过旧的码段oid来查询,所以不能直接改变oid
        boolean resChangeAssn = changeParentOidAssnOid(codeClassifySec);
        // 将处理过的分类码段也添加进要做新增处理的码段集合中
        createList.addAll(codeClassifySec);
        boolean resBoolean = saveBatch(createList);
        //codeBasicSecMapper.insertBatch(createList);
        return resBoolean ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
        // 最终要存入码值表中的,码值对象
        List<CodeFixedValue> codeFixedDOValues = new ArrayList<>();
        // 构造码值对象,与码段主键关联关系,以及改变固定码值的oid
        codeFixedValueMaps.forEach((key, value) -> {
            value.stream().forEach(item -> {
                item.setOid("");
                item.setCodeFixedSecOid(key);
                DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
                codeFixedDOValues.add(item);
            });
        });
        // 克隆固定码值
        boolean resFixed = fixedValueService.saveBatch(codeFixedDOValues);
        return (resBoolean&&resFixed&&resChangeAssn) ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
    }
    /**
     * 改变码段中父分类码段和子分类码段之间的关联oid为新的oid,并且不破坏分类码值的关联关系
     * @param basicSecs
     * @return
     * @throws ServerException
     */
    @Override
    public boolean changeParentOidAssnOid(List<CodeBasicSec> basicSecs) throws ServerException {
        Map<String, List<CodeClassifyValue>> codeClassValues = new HashMap<>();
        List<CodeClassifyValue> codeClassifyDOValues = new ArrayList<>();
        HashMap<String, String> oidMap = new HashMap<>();
        boolean resClone = false;
        try {
            // 遍历对象数组,为每个对象生成新的oid,并将原始oid和新oid的映射关系存储到Map中
            for (CodeBasicSec obj : basicSecs) {
                String originalOid = obj.getOid();
                String newOid = VciBaseUtil.getPk();
                oidMap.put(originalOid, newOid);
            }
            // 遍历对象数组,更新每个对象的oid和codeClassifySecOid属性值
            for (CodeBasicSec obj : basicSecs) {
                String originalOid = obj.getOid();
                String newOid = oidMap.get(originalOid);
                // 新的oid关联要克隆码值
                codeClassValues.put(newOid,codeClassifyValueService.list(Wrappers.<CodeClassifyValue>query()
                    .lambda().eq(CodeClassifyValue::getCodeClassifySecOid, originalOid)));
                obj.setOid(newOid);
                String originalParentClassifyValueOid = obj.getParentClassifySecOid();
                String newParentClassifyValueOid = oidMap.get(originalParentClassifyValueOid);
                obj.setParentClassifySecOid(newParentClassifyValueOid);
            }
            codeClassValues.forEach((key, value) -> {
                value.stream().forEach(item -> {
                    DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
                    item.setCodeClassifySecOid(key);
                    codeClassifyDOValues.add(item);
                });
            });
            resClone = codeClassifyValueService.cloneCodeClassifyVaue(codeClassifyDOValues);
        }catch (Exception e){
            throw new ServerException("父分类码段和子分类码段clone转换oid时出错:"+e.getCause());
        }
        return resClone;
    }
    /**
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyValueServiceImpl.java
@@ -61,6 +61,33 @@
    private static final String PARENT_FIELD_NAME = "parentClassifyValueOid";
    /**
     * 克隆分类码值
     * @param codeClassifyValues
     * @return
     */
    @Override
    public boolean cloneCodeClassifyVaue(List<CodeClassifyValue> codeClassifyValues) {
        // 创建Map对象,用于存储原始oid和新oid的映射关系
        Map<String, String> oidMap = new HashMap<>();
        // 遍历对象数组,为每个对象生成新的oid,并将原始oid和新oid的映射关系存储到Map中
        for (CodeClassifyValue obj : codeClassifyValues) {
            String originalOid = obj.getOid();
            String newOid = VciBaseUtil.getPk();
            oidMap.put(originalOid, newOid);
        }
        // 遍历对象数组,更新每个对象的oid和codeClassifySecOid属性值
        for (CodeClassifyValue obj : codeClassifyValues) {
            String originalOid = obj.getOid();
            String newOid = oidMap.get(originalOid);
            obj.setOid(newOid);
            String originalParentClassifyValueOid = obj.getParentClassifyValueOid();
            String newParentClassifyValueOid = oidMap.get(originalParentClassifyValueOid);
            obj.setParentClassifyValueOid(newParentClassifyValueOid);
        }
        return this.saveBatch(codeClassifyValues);
    }
    /**
     * 查询分类码段的码值 树
     * @param treeQueryObject 树查询对象
     * @return 分类码段的码值 显示树
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeFixedValueServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.vci.ubcs.code.dto.CodeFixedValueDTO;
@@ -24,7 +25,6 @@
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -74,6 +74,24 @@
    }
    /**
     * 根据codeFixedSecOid查询码值
     * @param codeFixedSecOids
     * @return
     */
    @Override
    public List<CodeFixedValue> listFixedValueByCodeFixedSecOid(List<String> codeFixedSecOids){
        if(codeFixedSecOids.isEmpty()){
            return new ArrayList<CodeFixedValue>();
        }
        /*List<CodeFixedValue> codeFixedValues = codeFixedValueMapper.selectList(
            Wrappers.<CodeFixedValue>query().lambda()
                .in(CodeFixedValue::getCodeFixedSecOid, codeFixedSecOids)
        );*/
        List<CodeFixedValue> codeFixedValues = codeFixedValueMapper.selectByPageByCodeFixedSecOid(codeFixedSecOids, new Page<>(1, -1));
        return codeFixedValues;
    }
    /**
     * 增加固定码段的码值
     * @param codeFixedValueDTO 固定码段的码值数据传输对象
     * @return 执行结果
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
@@ -17,6 +17,7 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -48,6 +49,7 @@
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.WebUtil;
import com.vci.ubcs.system.cache.NacosConfigCache;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
@@ -64,6 +66,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.rmi.ServerException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -110,10 +113,14 @@
    @Resource
    private RevisionModelUtil revisionModelUtil;
    @Value("${user-info.tenant-id}")
    private String tenantId;
    @Value("${user-info.id}")
    private String userId;
    @Resource
    private NacosConfigCache nacosConfigCache;
    @Resource
    private ICodeFixedValueService codeFixedValueService;
    @Resource
    private ICodeClassifyValueService codeClassifyValueService;
    /**
     * 分页查询
@@ -124,7 +131,9 @@
    @Override
    public IPage<CodeRuleVO> gridCodeRule(Query query, Map<String,Object> conidtionMap) {
        //如果等于自己配置的管理组租户id和管理组超管账号,就不需要按照规则所有者来进行查询
        if(!(AuthUtil.getTenantId().equals(this.tenantId) && AuthUtil.getUserId().toString().equals(this.userId))){
        if(!(AuthUtil.getTenantId().equals(nacosConfigCache.getAdminUserInfo().getTenantId())
            && AuthUtil.getUserId().toString().equals(nacosConfigCache.getAdminUserInfo().getUserId().toString()))
        ){
            // 按照规则所有者来查询
            conidtionMap.put("owner",AuthUtil.getUserId());
        }
@@ -162,14 +171,17 @@
     */
    @Override
    public boolean checkCodeRuleRepeat(CodeRuleDTO codeRuleDTO){
        LambdaQueryWrapper<CodeRule> wrapper = Wrappers.<CodeRule>query()
            .lambda().eq(CodeRule::getId, codeRuleDTO.getId());
        if(AuthUtil.getTenantId().equals(nacosConfigCache.getAdminUserInfo().getTenantId())){
            wrapper.eq(CodeRule::getTenantId,codeRuleDTO.getTenantId());
        }
        // 根据规则id查询编号
        List<CodeRule> codeRulesList = this.codeRuleMapper.selectList(Wrappers.<CodeRule>query()
            .lambda().eq(CodeRule::getId, codeRuleDTO.getId())
            .eq(CodeRule::getTenantId,AuthUtil.getTenantId().equals(this.tenantId) ? "":codeRuleDTO.getTenantId()));
        List<CodeRule> codeRulesList = this.codeRuleMapper.selectList(wrapper);
        if(!codeRulesList.isEmpty()){
            return codeRulesList.parallelStream().anyMatch(codeRule -> {
                if(StringUtils.isNotBlank(codeRuleDTO.getOid())){
                    // 代表是修改,不是将编号修改相同的编号
                    // 代表是修改规则,不是将编号修改为已存在的的编号
                    return !codeRule.getOid().equals(codeRuleDTO.getOid());
                }else {
                    return true;
@@ -465,14 +477,21 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R cloneCodeRule(CodeRuleDTO codeRuleDTO) {
    public R cloneCodeRule(CodeRuleDTO codeRuleDTO) throws ServerException {
        if(checkCodeRuleRepeat(codeRuleDTO)){
            return R.fail("规则编号已存在!");
        }
        VciBaseUtil.alertNotNull(codeRuleDTO, "需要添加的数据对象");
        CodeRule codeRuleDO = new CodeRule();
        DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeRuleDO,MdmBtmTypeConstant.CODE_RULE);
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeRuleDTO, codeRuleDO);
        boolean exFlag = codeRuleMapper.insert(codeRuleDO)>0;
        List<CodeBasicSecDTO> secList = codeRuleDTO.getElements();
        List<CodeBasicSec> codeBasicSecs = new ArrayList<>();
        secList.forEach(codeBasicSecDTO -> {
        List<CodeBasicSec> codeClassifySec = new ArrayList<>();
        // 固定码值映射关系
        Map<String,List<CodeFixedValue>> codeFixedValueMaps = new HashMap<>();
        for (CodeBasicSecDTO codeBasicSecDTO : secList) {
            codeBasicSecDTO.setPkCodeRule(codeRuleDO.getOid());
            KeyValue attrKv = codeBasicSecService.checkAttrNullableBySecType(codeBasicSecDTO);
            if (!"success".equals(attrKv.getKey())) {
@@ -480,13 +499,43 @@
            }
            CodeBasicSec codeBasicSecDO = new CodeBasicSec();
            BeanUtilForVCI.copyPropertiesIgnoreCase(codeBasicSecDTO, codeBasicSecDO);
            codeBasicSecDO.setOid("");
            codeBasicSecDO.setRevisionOid("");
            codeBasicSecDO.setNameOid("");
            String oldBasicOid = codeBasicSecDO.getOid(); //被克隆的码段的oid
            // 判断是否是分类码段
            if(codeBasicSecDO.getSecType().equals(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue())){
                // 存储旧的码段oid和新的码段的oid的关联关系
                codeClassifySec.add(codeBasicSecDO);
                continue;
            }
            // 更改创建时间,修改时间等默认值
            DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeBasicSecDO,MdmBtmTypeConstant.CODE_BASIC_SEC);
            // 固定码段
            if(codeBasicSecDO.getSecType().equals(CodeSecTypeEnum.CODE_FIXED_SEC.getValue())){
                // 固定码段存储好oid和码值的关联关系
                codeFixedValueMaps.put(codeBasicSecDO.getOid(),codeFixedValueService.list(Wrappers.<CodeFixedValue>query()
                    .lambda().eq(CodeFixedValue::getCodeFixedSecOid, oldBasicOid)
                ));
            }
            codeBasicSecs.add(codeBasicSecDO);
        });
        }
        // 处理分类码段的oid,因为oid关联parentClassifyOid,与码值codeClassifyOid,码值又需要通过旧的码段oid来查询,所以不能直接改变oid
        boolean resChangeAssn = codeBasicSecService.changeParentOidAssnOid(codeClassifySec);
        // 将处理过的分类码段也添加进要做新增处理的码段集合中
        codeBasicSecs.addAll(codeClassifySec);
        // 新增码段
        boolean exFlag1 = this.codeBasicSecService.saveBatch(codeBasicSecs);
        return R.data(exFlag&&exFlag1);
        // 最终要存入码值表中的,码值对象
        List<CodeFixedValue> codeFixedDOValues = new ArrayList<>();
        // 构造码值对象,与码段主键关联关系,以及改变码值的oid
        codeFixedValueMaps.forEach((key, value) -> {
            value.stream().forEach(item -> {
                item.setOid("");
                item.setCodeFixedSecOid(key);
                DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
                codeFixedDOValues.add(item);
            });
        });
        boolean exFlag2 = codeFixedValueService.saveBatch(codeFixedDOValues) && resChangeAssn;
        return R.data(exFlag&&exFlag1&&exFlag2);
    }
    /**