package com.vci.ubcs.code.service.impl; import com.alibaba.cloud.commons.lang.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.pagemodel.CodeClassifyTemplateAttrVO; 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.code.vo.webserviceModel.attrmap.DataObjectVO; import com.vci.ubcs.code.vo.webserviceModel.attrmap.RowDatas; import com.vci.ubcs.code.vo.webserviceModel.result.xml.XMLResultDataObjectDetailDO; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.VciBaseUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; import static com.vci.ubcs.code.constant.MdmEngineConstant.*; import static com.vci.ubcs.starter.poi.util.ExcelUtil.KEY_ATTR_CHAR; import static com.vci.ubcs.starter.poi.util.ExcelUtil.REQUIRED_CHAR; @Service @Slf4j public class MdmIOServiceImpl implements MdmIOService { /** * 分类服务层 */ @Resource @Lazy private ICodeClassifyService classifyService; /** * 分类服务层 */ @Resource @Lazy private MdmEngineService engineService; /** * 集成批量申请数据 * @param orderDTO 分类的主键 * @param dataObjectVO 数据信息 * @param resultDataObjectDetailDOs 错误信息 * @return 有错误信息的excel */ @Override public void batchSyncApplyCode(CodeOrderDTO orderDTO, DataObjectVO dataObjectVO, LinkedList resultDataObjectDetailDOs) { Map errorMap=new HashMap<>(); VciBaseUtil.alertNotNull(orderDTO,"编码申请相关的数据",orderDTO.getCodeClassifyOid(),"主题库分类主键"); CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid()); //规则的主键需要去获取 CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo); //1.判断规则中除了流水码段,是否有其他码段 //engineService.checkSecValueOnOrder(ruleVO,orderDTO); //查询分类和模板 //先找到每一行的标题,然后根据标题来获取对应的属性 List rowDataList = dataObjectVO.getRowData(); MaprowDataMap=new LinkedHashMap<>(); rowDataList.stream().forEach(rowData->{ rowDataMap.put(rowData.getRowIndex(),rowData); }); //找第一行,为了找标题 CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid()); //校验模板是不是最新的 //checkTemplateSync(sheetDataSetList,templateVO); //除去默认的属性.还有只有表单显示的字段才导入 List attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag()) ).collect(Collectors.toList()); Map fieldIndexMap = new HashMap<>(); List titleRowData = dataObjectVO.getColName(); Map attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2)); getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap); //需要判断是否所有的属性都在模板上了 List 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) + "】这些属性在excel中没有找到"); } String fullPath = getFullPath(classifyFullInfo); // List codeClassifyProcessTempVOS=codeClassifyProcessTempService.listProcessTemplate(templateVO.getOid(),"code_cls_flow_use_order"); boolean isProcess=false; //注释掉此处下面所有都按照不判断流程存储状态了 /** if(!CollectionUtils.isEmpty(codeClassifyProcessTempVOS)){ isProcess=true; }***/ //List cboList = new ArrayList<>(); //Map codeOidToSystemOidMap=new HashMap<>();//存储编码数据和集成系统数据oid对照映射 //excelToCbo(classifyFullInfo,titleRowData,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,isProcess,"create",errorMap,codeOidToSystemOidMap); //都转换完了。需要批量检查 //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中 //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则 } @Override public void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList resultDataObjectDetailDOs) { } /** * 获取分类的全路径 * @param classifyFullInfo 分类的全部信息 * @return 全路径 */ private String getFullPath(CodeClassifyFullInfoBO classifyFullInfo){ String fullPath = ""; if(!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())){ fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))) .map(CodeClassifyVO::getOid).collect(Collectors.joining("##")); }else{ fullPath = classifyFullInfo.getCurrentClassifyVO().getOid(); } return fullPath; } /** * excel的标题上获取字段所在的位置 * @param titleRowData 标题的内容 * @param attrNameIdMap 模板中属性名称和英文的映射 * @param fieldIndexMap 位置和英文字段的映射 */ private void getFieldIndexMap(List titleRowData,Map attrNameIdMap,Map fieldIndexMap){ for (int i = 0; i < titleRowData.size(); i++) { String title = titleRowData.get(i); String id = attrNameIdMap.getOrDefault(title.replace(KEY_ATTR_CHAR,"").replace(REQUIRED_CHAR ,""),""); if(StringUtils.isBlank(id) && "分类路径".equalsIgnoreCase(title)){ id = CODE_CLASSIFY_OID_FIELD; } if(StringUtils.isBlank(id) && "码段宽度".equalsIgnoreCase(title)){ id = CODE_SEC_LENGTH_FIELD; } if(StringUtils.isBlank(id) && "企业编码".equalsIgnoreCase(title)){ id = CODE_FIELD; } if(StringUtils.isNotBlank(id)){ fieldIndexMap.put(i,id); } } } }