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<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs) {
|
Map<String,String> 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<RowDatas> rowDataList = dataObjectVO.getRowData();
|
Map<String , RowDatas>rowDataMap=new LinkedHashMap<>();
|
rowDataList.stream().forEach(rowData->{
|
rowDataMap.put(rowData.getRowIndex(),rowData);
|
});
|
//找第一行,为了找标题
|
CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
|
|
//校验模板是不是最新的
|
//checkTemplateSync(sheetDataSetList,templateVO);
|
//除去默认的属性.还有只有表单显示的字段才导入
|
List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
|
).collect(Collectors.toList());
|
Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
|
List<String> titleRowData = dataObjectVO.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) + "】这些属性在excel中没有找到");
|
}
|
|
String fullPath = getFullPath(classifyFullInfo);
|
|
// List<CodeClassifyProcessTempVO> codeClassifyProcessTempVOS=codeClassifyProcessTempService.listProcessTemplate(templateVO.getOid(),"code_cls_flow_use_order");
|
boolean isProcess=false;
|
//注释掉此处下面所有都按照不判断流程存储状态了
|
/** if(!CollectionUtils.isEmpty(codeClassifyProcessTempVOS)){
|
isProcess=true;
|
}***/
|
//List<ClientBusinessObject> cboList = new ArrayList<>();
|
//Map<String,String> 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<XMLResultDataObjectDetailDO> 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<String> titleRowData,Map<String/**名称**/,String/**字段名**/> attrNameIdMap,Map<Integer/**位置**/,String/**英文名字**/> 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);
|
}
|
}
|
}
|
|
|
}
|