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); } /**