package com.vci.ubcs.code.service.impl; import com.alibaba.cloud.commons.io.FileUtils; import com.vci.ubcs.code.constant.MdmDuckingConstant; import com.vci.ubcs.code.constant.MdmEngineConstant; import com.vci.ubcs.code.dao.DockingPreApplyDataDaoI; import com.vci.ubcs.code.dao.DockingPreApplyDataInfoDaoI; import com.vci.ubcs.code.lifecycle.CodeDefaultLC; import com.vci.ubcs.code.model.DockingPreApplyDataDO; import com.vci.ubcs.code.model.DockingPreApplyDataInfoDO; import com.vci.code.service.*; import com.vci.ubcs.code.utils.AttributeMapConfig; import com.vci.ubcs.code.utils.EnumVO; import com.vci.starter.poi.bo.SheetDataSet; import com.vci.starter.poi.bo.SheetRowData; import com.vci.starter.poi.bo.WriteExcelData; import com.vci.starter.poi.bo.WriteExcelOption; import com.vci.starter.poi.util.ExcelUtil; import com.vci.starter.revision.service.RevisionModelUtil; import com.vci.starter.web.constant.QueryOptionConstant; import com.vci.starter.web.enumpck.ResultCodeEnum; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseResult; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.PageHelper; import com.vci.starter.web.util.*; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.ubcs.code.service.*; import com.vci.ubcs.code.vo.pagemodel.*; import com.vci.web.pageModel.BatchCBO; import com.vci.web.pageModel.KeyValue; import com.vci.web.pageModel.UITableFieldVO; import com.vci.web.redis.RedisService; import com.vci.web.service.WebBoServiceI; import com.vci.web.util.WebUtil; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang.StringUtils; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.vci.ubcs.code.dto.CodeOrderDTO; import com.vci.ubcs.code.dto.DockingPreApplyDataDTO; import com.vci.ubcs.code.dto.DockingPreApplyDataInfoDTO; import com.vci.ubcs.code.dto.PreApplyCodeOrderDTO; import org.springblade.code.service.*; import org.springblade.code.vo.pagemodel.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import plm.bs.bom.clientobject.ClientBusinessObject; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.*; /** * 记录工艺推送过来的数据信息服务 * @author weidy * @date 2022-04-05 */ @Service public class DockingPreApplyDataServiceImpl implements DockingPreApplyDataServiceI { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 数据操作层 */ @Resource private DockingPreApplyDataDaoI dockingPreApplyDataMapper; /** * 数据操作层 */ @Resource private DockingPreApplyDataInfoDaoI dockingPreApplyDataInfoMapper; /** * 业务类型操作的服务 */ @Autowired @Lazy private WebBoServiceI boService; /** * 对象的操作 */ @Autowired private DockingPreApplyDataInfoServiceI dockingPreApplyDataInfoServiceI; /** * 模板的服务 */ @Autowired private CodeClassifyTemplateServiceI templateService; /** * 分类操作服务 */ @Autowired private CodeClassifyServiceImpl codeClassifyService; /** * 对象的操作 */ @Autowired private RevisionModelUtil revisionModelUtil; /** * 对象的操作 */ @Autowired private CodeClassifyServiceI codeClassifyServiceI; /** * 预申请数据,属性映射模板存放路径 */ @Value("${docking.templateDir:D:\\desktop}") public String preApplyTemplate; @Value("${docking.tuhao:tuhao}") public String tuhao; /** * 主数据引擎服务 */ @Autowired(required = false) @Lazy private MdmEngineServiceI engineService; /** * 主数据引擎服务 */ @Autowired(required = false) @Lazy private MdmIOServiceI mdmIOService; @Autowired private RedisService redisService; @Autowired private DockingPreAttrMappingSeviceI dockingPreAttrMappingSeviceI; /*** * 获取MAP枚举值 */ @Autowired private AttributeMapConfig attributeMapConfig; /** * 批量数据对象转换为显示对象 * @param dockingPreApplyDataDOs 数据对象列表 * @return 显示对象 * @throws VciBaseException 参数为空或者不存在的时候会抛出异常 */ public List dockingPreApplyDataDO2VOs(Collection dockingPreApplyDataDOs, boolean iscontainAttr) throws VciBaseException { List voList = new ArrayList(); if(!CollectionUtils.isEmpty(dockingPreApplyDataDOs)){ for(DockingPreApplyDataDO s: dockingPreApplyDataDOs){ DockingPreApplyDataVO vo = dockingPreApplyDataDO2VO(s,iscontainAttr); if(vo != null){ voList.add(vo); } } } return voList; } private DockingPreApplyDataVO dockingPreApplyDataDO2VO(DockingPreApplyDataDO dockingPreApplyDataDO,boolean iscontainAttr) throws VciBaseException{ DockingPreApplyDataVO vo = new DockingPreApplyDataVO(); if(dockingPreApplyDataDO != null){ BeanUtilForVCI.copyPropertiesIgnoreCase(dockingPreApplyDataDO,vo); //如果有lcstatus的类的话 if(iscontainAttr) { List dockingPreApplyDataInfoDOS = redisService.getCacheList(vo.getOid() + "_attr"); if (CollectionUtils.isEmpty(dockingPreApplyDataInfoDOS)) { //查询数据的属性对应值信息 VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(DockingPreApplyDataInfoDO.class); queryWrapperForDO.addQueryMap("dataoid",dockingPreApplyDataDO.getOid()); dockingPreApplyDataInfoDOS= boService.selectByQueryWrapper(queryWrapperForDO,DockingPreApplyDataInfoDO.class); } List dockingPreApplyDataInfoVOS = dockingPreApplyDataInfoServiceI.dockingPreApplyDataInfoDO2VOs(dockingPreApplyDataInfoDOS); vo.setDockingPreApplyDataInfoVOs(dockingPreApplyDataInfoVOS); } } return vo; } @Override public List batchSetDataClassId(DockingPreApplyDataDTO dockingPreApplyDataDTO) throws VciBaseException { VciBaseUtil.alertNotNull(dockingPreApplyDataDTO,"数据对象",dockingPreApplyDataDTO.getOid(),"记录工艺推送过来的数据信息主键"); List oidList= VciBaseUtil.str2List(dockingPreApplyDataDTO.getOid()); String classOid=dockingPreApplyDataDTO.getClassifyoid(); List dockingPreApplyDataDOS=dockingPreApplyDataMapper.selectByPrimaryKeyCollection(oidList); dockingPreApplyDataDOS.stream().forEach(dockingPreApplyDataDO -> { dockingPreApplyDataDO.setClassifyoid(classOid); }); dockingPreApplyDataMapper.batchUpdate(dockingPreApplyDataDOS); List dockingPreApplyDataVOS= dockingPreApplyDataDO2VOs(dockingPreApplyDataDOS); return dockingPreApplyDataVOS; } /*** * 返回信息 * @param codeClassifyOid * @param templateOid * @param btmType * @param dataOids * @return * @throws VciBaseException */ @Override public DataGrid> gridApplyData(String codeClassifyOid, String templateOid, String btmType, String dataOids) throws VciBaseException { VciBaseUtil.alertNotNull(codeClassifyOid,"数据对象",codeClassifyOid,"分类主键"); VciBaseUtil.alertNotNull(templateOid,"数据对象",templateOid,"分类模板"); VciBaseUtil.alertNotNull(dataOids,"数据对象",dataOids,"数据主键"); CodeClassifyVO topClassifyVO = codeClassifyService.getTopClassifyVO(codeClassifyOid); String btmTypeId = topClassifyVO.getBtmtypeid(); if (StringUtils.isBlank(btmTypeId)) { return new DataGrid<>("这个分类所属顶层分类没有添加业务类型"); } boolean iccheckHasChild=codeClassifyService.checkHasChild(codeClassifyOid); if(iccheckHasChild){ throw new VciBaseException("请选择叶子分类节点申请数据!"); } CodeClassifyTemplateVO templateVO= engineService.getUsedTemplateByClassifyOid(codeClassifyOid); Map classifyDevlevMap= engineService.previewClassify(codeClassifyOid,templateOid); List templateAttrVOS=templateVO.getAttributes(); Map attrTemplateAttrMap=templateAttrVOS.stream().collect(Collectors.toMap(s -> s.getId(), t -> t, (o1, o2) -> o2)); Map condtionMappingMap=new HashMap<>(); condtionMappingMap.put("jviewModeId", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(VciBaseUtil.str2List(templateOid).toArray(new String[]{})) + ")"); //condtionMappingMap.put("jSourceClsfId",codeClassifyOid); //获取属性映射关系 List dockingPreAttrMappingVOList=dockingPreAttrMappingSeviceI.selectAttrMappings(condtionMappingMap); if(CollectionUtils.isEmpty(dockingPreAttrMappingVOList)){ return new DataGrid<>("未获取到相关属性映射配置"); } List dockingPreApplyDataDOS=this.dockingPreApplyDataMapper.selectByPrimaryKeyCollection(VciBaseUtil.str2List(dataOids)); List dockingPreApplyDataVOS= dockingPreApplyDataDO2VOs(dockingPreApplyDataDOS,true); List maps=new ArrayList<>(); dockingPreApplyDataVOS.stream().forEach(dockingPreApplyDataVO -> { List dockingPreApplyDataInfoVOS= dockingPreApplyDataVO.getDockingPreApplyDataInfoVOs(); Map attrMappingMap=new HashMap<>(); if(!CollectionUtils.isEmpty(dockingPreApplyDataInfoVOS)) { attrMappingMap = dockingPreApplyDataInfoVOS.stream().collect(Collectors.toMap(s -> s.getKey(), t -> t, (o1, o2) -> o2)); } Map attributMap=new HashMap<>(); Map finalAttrMappingMap = attrMappingMap; dockingPreAttrMappingVOList.stream().forEach(dockingPreAttrMappingVO -> { String innerName=dockingPreAttrMappingVO.getJsourceAttrKey(); String jtargetAttrKey=dockingPreAttrMappingVO.getJtargetAttrKey().toLowerCase(Locale.ROOT); final String[] defaulValue = {dockingPreAttrMappingVO.getJdefaultValue()}; CodeClassifyTemplateAttrVO templateAttr= attrTemplateAttrMap.get(innerName); if(innerName.equalsIgnoreCase(tuhao.toLowerCase(Locale.ROOT))){//属性映射中是图号的应当单独加 attributMap.put(tuhao,dockingPreApplyDataVO.getUniquecode()); }else{ if (StringUtils.isNotBlank(jtargetAttrKey) && finalAttrMappingMap.containsKey(jtargetAttrKey)) { DockingPreApplyDataInfoVO dataInfoVO = finalAttrMappingMap.get(jtargetAttrKey); String value = dataInfoVO.getValue(); List dockingPreAttrRangeVOList = dockingPreAttrMappingVO.getDockingPreAttrRangeVOS(); //Map attrNameIdMap=new HashMap<>(); if (StringUtils.isNotBlank(value)) { defaulValue[0] = value; } if (!CollectionUtils.isEmpty(dockingPreAttrRangeVOList)) { // attrNameIdMap = dockingPreAttrRangeVOList.stream().collect(Collectors.toMap(s -> s.getJtargeNumTextValue(), t -> t.getJnumTextValue().toLowerCase(Locale.ROOT),(o1, o2)->o2)); dockingPreAttrRangeVOList.stream().forEach(dockingPreAttrRangeVO -> { String jtargeNumTextValue = dockingPreAttrRangeVO.getJtargeNumTextValue(); List valueList = VciBaseUtil.str2List(jtargeNumTextValue); if (valueList.contains(value)) { defaulValue[0] = dockingPreAttrRangeVO.getJnumTextValue(); } }); } } //判断模板属性设置规则默认值 if (StringUtils.isBlank(defaulValue[0]) && templateAttr != null && StringUtils.isNotBlank(templateAttr.getClassifyinvokelevel())) { defaulValue[0] = classifyDevlevMap.get(innerName); } //判断模板属性默认值 if (StringUtils.isBlank(defaulValue[0]) && templateAttr != null && StringUtils.isNotBlank(templateAttr.getDefaultvalue())) { defaulValue[0] = templateAttr.getDefaultvalue(); } if (((StringUtils.isNotBlank(templateAttr.getEnumString()) && !"[]".equalsIgnoreCase(templateAttr.getEnumString())) || StringUtils.isNotBlank(templateAttr.getEnumid()))) { UITableFieldVO fieldVO = engineService.templateAttr2TableField(templateAttr, false); List keyValueList = fieldVO.getData(); String text = ""; if (!CollectionUtils.isEmpty(keyValueList)) { Map enumMap = keyValueList.stream().collect(Collectors.toMap(s -> s.getKey(), t -> t.getValue().toLowerCase(Locale.ROOT), (o1, o2) -> o2)); if (enumMap.containsKey(defaulValue[0])) { text = enumMap.get(defaulValue[0]); } } attributMap.put(fieldVO.getField(), text); } attributMap.put(innerName, defaulValue[0]); } }); maps.add(attributMap); }); DataGrid> dataGrid = new DataGrid<>(); List> dataList = new ArrayList<>(); if (!CollectionUtils.isEmpty(maps)) { maps.stream().forEach(map -> { Map data = new HashMap<>(); map.forEach((key, value) -> { data.put((String) key, (String) value); }); dataList.add(data); }); } dataGrid.setData(dataList); return dataGrid; } /** * 批量数据对象转换为显示对象 * @param dockingPreApplyDataDOs 数据对象列表 * @return 显示对象 * @throws VciBaseException 参数为空或者不存在的时候会抛出异常 */ @Override public List dockingPreApplyDataDO2VOs(Collection dockingPreApplyDataDOs) throws VciBaseException{ List voList = new ArrayList(); if(!CollectionUtils.isEmpty(dockingPreApplyDataDOs)){ for(DockingPreApplyDataDO s: dockingPreApplyDataDOs){ DockingPreApplyDataVO vo = dockingPreApplyDataDO2VO(s); if(vo != null){ voList.add(vo); } } } return voList; } /** * 数据对象转换为显示对象 * @param dockingPreApplyDataDO 数据对象 * @return 显示对象 * @throws VciBaseException 拷贝属性出错的时候会抛出异常 */ @Override public DockingPreApplyDataVO dockingPreApplyDataDO2VO(DockingPreApplyDataDO dockingPreApplyDataDO) throws VciBaseException{ DockingPreApplyDataVO vo = new DockingPreApplyDataVO(); if(dockingPreApplyDataDO != null){ BeanUtilForVCI.copyPropertiesIgnoreCase(dockingPreApplyDataDO,vo); //如果有lcstatus的类的话 } return vo; } /** * 增加记录工艺推送过来的数据信息 * @param dockingPreApplyDataDTO 记录工艺推送过来的数据信息数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override public DockingPreApplyDataVO addSave(DockingPreApplyDataDTO dockingPreApplyDataDTO) throws VciBaseException{ VciBaseUtil.alertNotNull(dockingPreApplyDataDTO,"需要添加的数据对象"); //将DTO转换为DO DockingPreApplyDataDO dockingPreApplyDataDO = new DockingPreApplyDataDO(); BeanUtilForVCI.copyPropertiesIgnoreCase(dockingPreApplyDataDTO,dockingPreApplyDataDO); dockingPreApplyDataMapper.insert(dockingPreApplyDataDO); return dockingPreApplyDataDO2VO(dockingPreApplyDataDO); } /** * 校验是否可以删除,如果存在下级,并且下级有数据引用则不能删除 * @param dockingPreApplyDataDTO 数据传输对象 * @param dockingPreApplyDataDO 数据库中的数据对象 * @return success为true为可以删除,false表示有数据引用,obj为true表示有下级 */ private BaseResult checkIsCanDeleteForDO(DockingPreApplyDataDTO dockingPreApplyDataDTO, DockingPreApplyDataDO dockingPreApplyDataDO) { DockingPreApplyDataDO tsDO = new DockingPreApplyDataDO(); BeanUtilForVCI.copyPropertiesIgnoreCase(dockingPreApplyDataDTO,tsDO); boService.checkTs(tsDO); if(!checkIsLinked(dockingPreApplyDataDO.getOid())) { return BaseResult.success(); }else{ return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""}); } } /** * 校验是否被引用 * @param oid 主键 * @throws VciBaseException 被引用的时候会抛出异常 */ private boolean checkIsLinked(String oid) throws VciBaseException{ //TODO 添加需要校验引用的地方 return false; } /** * 删除记录工艺推送过来的数据信息 * @param dockingPreApplyDataDTO 记录工艺推送过来的数据信息数据传输对象,oid和ts需要传输 * @return 删除结果反馈::success:成功,fail:失败 * @throws VciBaseException 参数为空,被引用时抛出异常 */ @Override public BaseResult deleteDockingPreApplyData(DockingPreApplyDataDTO dockingPreApplyDataDTO) throws VciBaseException{ VciBaseUtil.alertNotNull(dockingPreApplyDataDTO,"记录工艺推送过来的数据信息数据对象",dockingPreApplyDataDTO.getOid(),"记录工艺推送过来的数据信息的主键"); DockingPreApplyDataDO dockingPreApplyDataDO = selectByOid(dockingPreApplyDataDTO.getOid()); BaseResult baseResult = checkIsCanDeleteForDO(dockingPreApplyDataDTO,dockingPreApplyDataDO); if(baseResult.isSuccess()) { }else{ return baseResult; } //执行删除操作 BatchCBO batchCBO = dockingPreApplyDataMapper.deleteByPrimaryKey(dockingPreApplyDataDO.getOid()); return (batchCBO!=null && batchCBO.getDeleteCbos() !=null &&batchCBO.getDeleteCbos().size() > 0)?BaseResult.successMsg(DELETE_SUCCESS):BaseResult.fail(DELETE_FAIL); } /** * 主键获取记录工艺推送过来的数据信息 * @param oid 主键 * @return 记录工艺推送过来的数据信息显示对象 * @throws VciBaseException 参数为空,数据不存在时会抛出异常 */ @Override public DockingPreApplyDataVO getObjectByOid(String oid) throws VciBaseException{ return dockingPreApplyDataDO2VO(selectByOid(oid)); } /** * 主键查询数据对象 * @param oid 主键 * @return 数据对象 * @throws VciBaseException 参数为空,并且数据不存在的时候会抛出异常 */ private DockingPreApplyDataDO selectByOid(String oid) throws VciBaseException{ VciBaseUtil.alertNotNull(oid,"主键"); DockingPreApplyDataDO dockingPreApplyDataDO = dockingPreApplyDataMapper.selectByPrimaryKey(oid.trim()); if(dockingPreApplyDataDO == null || StringUtils.isBlank(dockingPreApplyDataDO.getOid())){ throw new VciBaseException(DATA_OID_NOT_EXIST); } return dockingPreApplyDataDO; } /** * 主键批量获取记录工艺推送过来的数据信息 * @param oidCollections 主键集合,但是受性能影响,建议一次查询不超过10000个 * @return 记录工艺推送过来的数据信息显示对象 * @throws VciBaseException 查询出现异常时会抛出 */ @Override public Collection listDockingPreApplyDataByOids(Collection oidCollections) throws VciBaseException{ VciBaseUtil.alertNotNull(oidCollections,"数据对象主键集合"); List dockingPreApplyDataDOList = listDockingPreApplyDataDOByOidCollections(oidCollections); return dockingPreApplyDataDO2VOs(dockingPreApplyDataDOList); } /** * 使用主键集合查询数据对象 * @param oidCollections 主键的集合 * @return 数据对象列表 */ private List listDockingPreApplyDataDOByOidCollections(Collection oidCollections){ List dockingPreApplyDataDOList = new ArrayList(); if(!CollectionUtils.isEmpty(oidCollections)){ Collection> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections); for(Collection oids: oidCollectionsList){ List tempDOList = dockingPreApplyDataMapper.selectByPrimaryKeyCollection(oids); if(!CollectionUtils.isEmpty(tempDOList)){ dockingPreApplyDataDOList.addAll(tempDOList); } } } return dockingPreApplyDataDOList; } /** * 参照记录工艺推送过来的数据信息列表 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 记录工艺推送过来的数据信息显示对象列表,生效的内容 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public DataGrid refDataGridDockingPreApplyData(Map conditionMap, PageHelper pageHelper) throws VciBaseException{ if(conditionMap == null){ conditionMap = new HashMap(); } return gridDockingPreApplyData(conditionMap,pageHelper); } //================== /** * 查询所有的记录工艺推送过来的数据信息 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 执行结果 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public DataGrid gridDockingPreApplyData(Map conditionMap, PageHelper pageHelper) throws VciBaseException{ if (pageHelper == null) { pageHelper = new PageHelper(-1); } pageHelper.addDefaultDesc("createTime"); //只查询启用的data,这样就不用去找最大版本号了再查询 conditionMap.put("useddflag","true"); List doList = dockingPreApplyDataMapper.selectByCondition(conditionMap,pageHelper); Map> mpmEnumMap= this.attributeMapConfig.getMpmEnumMap(); Map> typeCodemap =new HashedMap(); doList.stream().forEach(dockingPreApplyDataDO -> { String enumValue= dockingPreApplyDataDO.getParttype(); String type=dockingPreApplyDataDO.getType(); String code=dockingPreApplyDataDO.getNum(); if(!CollectionUtils.isEmpty(mpmEnumMap)){ if(mpmEnumMap.containsKey("partType")){ List partTypeEnumMapList= mpmEnumMap.get("partType"); Map enumFieldValueMap = partTypeEnumMapList.stream().collect(Collectors.toMap(EnumVO::getEnumValue, EnumVO::getEnumText, (key1, key2) -> key2)); if(enumFieldValueMap.containsKey(enumValue)){ String enumText= enumFieldValueMap.get(enumValue); dockingPreApplyDataDO.setParttype(enumText); } } } if(StringUtils.isNotBlank(code)) { List codeList = new ArrayList<>(); codeList.add(code); if (typeCodemap.containsKey(type)) { List oldCodeList = typeCodemap.get(type); codeList.addAll(oldCodeList); } typeCodemap.put(type, codeList); } }); List cbos=new ArrayList<>(); if(!CollectionUtils.isEmpty(typeCodemap)) { typeCodemap.forEach((type,codes)->{ Map contionMap=new HashedMap(); contionMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(codes.toArray(new String[]{})) + ")"); List newcbos=boService.queryCBO(type,contionMap); cbos.addAll(newcbos); }); } Map codeCbosMap = cbos.stream().filter(systeDataObject -> systeDataObject != null && StringUtils.isNotBlank(systeDataObject.getId())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getId(), t -> t)); doList.stream().forEach(s->{ String code =s.getNum(); if(codeCbosMap.containsKey(code)){ ClientBusinessObject cbo= codeCbosMap.get(code); if(!cbo.getLcStatus().equals(CodeDefaultLC.RELEASED.getValue())){//如果不是发布状态则隐藏编码 s.setNum("******"); s.setId("******"); s.setPreapplyoid("******"); } }else{ } }); DataGrid dataGrid=new DataGrid(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(dockingPreApplyDataDO2VOs(doList,false)); dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(dockingPreApplyDataMapper.countByCondition(conditionMap)))); } return dataGrid; } /** * 插入data和datainfo,会自动把data里的oid,unique赋值到datainfo里边去 * @param dockingPreApplyDataDTO 记录工艺推送过来的数据信息数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override public void addSaveDataAndInfo(DockingPreApplyDataDTO dockingPreApplyDataDTO, List dockingPreApplyDataInfoDTOList) throws VciBaseException{ String unique = ""; //将DTO转换为DO DockingPreApplyDataDO dockingPreApplyDataDO = new DockingPreApplyDataDO(); BeanUtilForVCI.copyPropertiesIgnoreCase(dockingPreApplyDataDTO,dockingPreApplyDataDO); String dataoid = dockingPreApplyDataDO.getOid(); if(StringUtils.isEmpty(dockingPreApplyDataDO.getOid())) { dataoid = redisService.getUUIDEveryDay(); dockingPreApplyDataDO.setOid(dataoid); } //查询以前的数据,准备修改usedflasg VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(DockingPreApplyDataDO.class); queryWrapperForDO.addQueryMap("uniquecode",dockingPreApplyDataDO.getUniquecode()); List dockingPreApplyDataDOList = boService.selectByQueryWrapper(queryWrapperForDO,DockingPreApplyDataDO.class); //执行数据保存操作 WebUtil.setPersistence(false);//不执行保存 BatchCBO batchUpdateData = new BatchCBO(); //修改以前的数据useddflag=false if (dockingPreApplyDataDOList.size() != 0) { for (DockingPreApplyDataDO dockingPreApplyDataDOi : dockingPreApplyDataDOList) { dockingPreApplyDataDOi.setUseddflag(MdmDuckingConstant.PRE_APPLY_DATA_USER_FALSE); } batchUpdateData = dockingPreApplyDataMapper.batchUpdate(dockingPreApplyDataDOList); } //新增现在的data dockingPreApplyDataDO.setUseddflag(MdmDuckingConstant.PRE_APPLY_DATA_USER_TRUE);//是最新的 BatchCBO batchInsertData = dockingPreApplyDataMapper.insert(dockingPreApplyDataDO); batchUpdateData.copyFromOther(batchInsertData); //新增dataInfo List dockingPreApplyDataInfoDOList = new ArrayList(); for (DockingPreApplyDataInfoDTO dockingPreApplyDataInfoDTO : dockingPreApplyDataInfoDTOList) { DockingPreApplyDataInfoDO dockingPreApplyDataInfoDO = new DockingPreApplyDataInfoDO(); BeanUtilForVCI.copyPropertiesIgnoreCase(dockingPreApplyDataInfoDTO, dockingPreApplyDataInfoDO); dockingPreApplyDataInfoDO.setDataoid(dataoid); if (StringUtils.isNotEmpty(dockingPreApplyDataDO.getUniquecode())) { dockingPreApplyDataInfoDO.setUniquecode(dockingPreApplyDataDO.getUniquecode()); } if (StringUtils.isEmpty(dockingPreApplyDataInfoDO.getOid())) { String datainfooid = redisService.getUUIDEveryDay(); dockingPreApplyDataInfoDO.setOid(datainfooid); } dockingPreApplyDataInfoDOList.add(dockingPreApplyDataInfoDO); } if(dockingPreApplyDataInfoDOList.size()!=0) { BatchCBO batchInsertDataInfo = dockingPreApplyDataInfoMapper.batchInsert(dockingPreApplyDataInfoDOList); batchUpdateData.copyFromOther(batchInsertDataInfo); redisService.setCacheList(dockingPreApplyDataDO.getOid(),dockingPreApplyDataInfoDOList); } WebUtil.setPersistence(true);//执行保存 boService.persistenceBatch(batchUpdateData);//一起执行保存 } /** * 修改记录工艺推送过来的数据信息 * @param dockingPreApplyDataDTO 记录工艺推送过来的数据信息数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override public BaseResult editSave(DockingPreApplyDataDTO dockingPreApplyDataDTO) throws VciBaseException{ VciBaseUtil.alertNotNull(dockingPreApplyDataDTO,"数据对象",dockingPreApplyDataDTO.getOid(),"记录工艺推送过来的数据信息主键"); //将DTO转换为DO DockingPreApplyDataDO dockingPreApplyDataDO = selectByOid(dockingPreApplyDataDTO.getOid()); revisionModelUtil.copyFromDTOIgnore(dockingPreApplyDataDTO,dockingPreApplyDataDO); dockingPreApplyDataMapper.updateByPrimaryKey(dockingPreApplyDataDO); return BaseResult.success(dockingPreApplyDataDO2VO(dockingPreApplyDataDO)); } /** * 根据data的oid查询data信息和datainfo信息,并且拼接datainfo为map * @param dockingPreApplyDataDTO * @return * @throws VciBaseException */ @Override public BaseResult> getDataInfoMap(DockingPreApplyDataDTO dockingPreApplyDataDTO) throws VciBaseException{ String dataoid = dockingPreApplyDataDTO.getOid(); //查询data的type DockingPreApplyDataDO dockingPreApplyDataDO = dockingPreApplyDataMapper.selectByPrimaryKey(dataoid); if(dockingPreApplyDataDO == null){ String msg = "预申请编码,通过oid查询DockingPreApplyDataDO未找到数据!"; logger.error(msg); return BaseResult.fail(msg,null); } String type = dockingPreApplyDataDO.getType(); //查询datainfo为map VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(DockingPreApplyDataInfoDO.class); queryWrapper.addQueryMap("dataoid",dataoid); List dockingPreApplyDataInfoDOList = dockingPreApplyDataInfoMapper.selectByWrapper(queryWrapper); Map dataInfoMap = new HashMap();//所有的值 for (DockingPreApplyDataInfoDO dockingPreApplyDataInfoDO :dockingPreApplyDataInfoDOList){ dataInfoMap.put(dockingPreApplyDataInfoDO.getKey(),dockingPreApplyDataInfoDO.getValue()); } //把datainfomap根据配置的模板xml转化为最终存入的数据map // String systemid = dockingPreApplyDataDO.getSystemid();//系统编号 // // PreApplyDataTrans preApplyDataTrans = getPreApplyDataTransBySystemIdAndType(systemid,type); // if(preApplyDataTrans == null){ // String msg = "读取预申请数据配置模板成功,但是没有匹配的模板属性,systemid: "+systemid+",type: "+type; // logger.error(msg); // preApplyDataTrans = new PreApplyDataTrans(systemid,type,new HashMap()); // } // // Map attrMap = preApplyDataTrans.getAttrMap(); // // Map outMap = getShowMap(attrMap,dataInfoMap); return BaseResult.success(dataInfoMap,"查询成功"); } /** * 根据systemid查询配置的属性模板 * @param systemid 系统id * @param type 分类 * @return */ public PreApplyDataTrans getPreApplyDataTransBySystemIdAndType(String systemid,String type){ String templateXml = null; String fileUrl = ""; try { String templatename = systemid; fileUrl = preApplyTemplate+ File.separator+templatename+".xml"; templateXml = FileUtils.readFileToString(new File(fileUrl),"utf-8"); }catch (Exception e){ e.printStackTrace(); logger.error("读取预申请属性映射模板失败,fileUrl: "+fileUrl); return null; } /** * 通过配置的模板文件,转换为前端读懂和mdmEngineController/getDataByOid接口类似的数据 */ List preApplyDataTransList = null; try { preApplyDataTransList = readAttrTransfTemplate(templateXml); }catch (Exception e){ logger.error("读取预申请数据配置模板失败,"); return null; } PreApplyDataTrans preApplyDataTrans = null; for(PreApplyDataTrans preApplyDataTransi:preApplyDataTransList){ String preApplyDataTrans_type = preApplyDataTransi.getType(); if(type.equals(preApplyDataTrans_type)){ preApplyDataTrans = preApplyDataTransi; break; } } return preApplyDataTrans; } /** * 把预申请的属性根据模板xml转化为最终的属性map * @param attrMap * @param dataInfoMap * @return */ public Map getShowMap(Map attrMap,Map dataInfoMap){ Map outMap = new HashMap();//转换的key后的map for (String systemkey:attrMap.keySet()){ String mdmKey = attrMap.getOrDefault(systemkey,""); String value = dataInfoMap.getOrDefault(mdmKey,""); if(StringUtils.isNotEmpty(value)){ outMap.put(systemkey,value); } } return outMap; } /** * 批量处理预申请编码 * 必须要有分类oid和data */ @Override public BaseResult applyData(List preApplyCodeOrderDTOList) { List retMapList = new ArrayList();//保存返回的错误oid和信息 for (PreApplyCodeOrderDTO preApplyCodeOrderDTO : preApplyCodeOrderDTOList) { CodeOrderDTO codeOrderDTO = new CodeOrderDTO(); try { //根据分类oid查询模板oid,编码规则oid String codeClassfyOid = preApplyCodeOrderDTO.getCodeClassifyOid(); //查询data的type String dataoid = preApplyCodeOrderDTO.getDataoid(); DockingPreApplyDataDO dockingPreApplyDataDO = dockingPreApplyDataMapper.selectByPrimaryKey(dataoid); //查询编码规则oid String ruleOid = null; try { CodeRuleVO codeRuleVO = engineService.getCodeRuleByClassifyOid(codeClassfyOid); ruleOid = codeRuleVO.getOid(); }catch (Exception e){ Map retMap = new HashMap(); retMap.put("oid",codeOrderDTO.getOid()); retMap.put("msg","选择的分类以及上级分类没有配置编码规则"); retMapList.add(retMap); logger.error("批量处理预申请数据失败,数据: "+preApplyCodeOrderDTO.toString()+",msg: 根据分类oid查询编码规则失败,分类oid: "+codeClassfyOid); continue; } //查询使用的模板oid String templateOid = null; try { CodeClassifyTemplateVO codeClassifyTemplateVO = engineService.getUsedTemplateByClassifyOid(codeClassfyOid); templateOid = codeClassifyTemplateVO.getOid(); }catch (Exception e){ Map retMap = new HashMap(); retMap.put("oid",codeOrderDTO.getOid()); retMap.put("msg","选择的分类以及上级分类没有配置配置模板"); retMapList.add(retMap); logger.error("批量处理预申请数据失败,数据: "+preApplyCodeOrderDTO.toString()+",msg: 根据分类oid查询使用的模板失败,分类oid: "+codeClassfyOid); continue; } //根据dataoid查询dataInfoMap Map dataInfoMap = null; DockingPreApplyDataDTO dockingPreApplyDataDTO = new DockingPreApplyDataDTO(); dockingPreApplyDataDTO.setOid(preApplyCodeOrderDTO.getDataoid()); BaseResult baseResult_dataMap = getDataInfoMap(dockingPreApplyDataDTO); if(ResultCodeEnum.SUCCESS.code==baseResult_dataMap.getCode()){ Object datao = baseResult_dataMap.getObj(); if(datao!=null){ dataInfoMap = (Map)datao; } } if(dataInfoMap==null){ Map retMap = new HashMap(); retMap.put("oid",codeOrderDTO.getOid()); retMap.put("msg","查询到接收的预申请数据为空"); retMapList.add(retMap); logger.error("批量处理预申请数据失败,数据: "+preApplyCodeOrderDTO.toString()+",msg: 根据DockingPreApplyData_oid查询数据接收的预申请数据失败,DockingPreApplyData_oid: "+preApplyCodeOrderDTO.getDataoid()); continue; } //把datainfomap根据配置的模板xml转化为最终存入的数据map String systemid = dockingPreApplyDataDO.getSystemid();//系统编号 String type = dockingPreApplyDataDO.getType();//type PreApplyDataTrans preApplyDataTrans = getPreApplyDataTransBySystemIdAndType(systemid,type); if(preApplyDataTrans == null){ String msg = "读取预申请数据配置模板成功,但是没有匹配的模板属性,systemid: "+systemid+",type: "+type; logger.error(msg); preApplyDataTrans = new PreApplyDataTrans(systemid,type,new HashMap()); } Map attrMap = preApplyDataTrans.getAttrMap(); Map data = getShowMap(attrMap,dataInfoMap); if(data.size()==0){ Map retMap = new HashMap(); retMap.put("oid",codeOrderDTO.getOid()); retMap.put("msg","接收的预申请数据根据配置的模板xml转化属性失败"); retMapList.add(retMap); logger.error("批量处理预申请数据失败,数据: "+preApplyCodeOrderDTO.toString()+",msg: 接收的预申请数据根据配置的模板xml转化属性失败!"); continue; } String name = data.getOrDefault("name",""); //执行数据保存 codeOrderDTO.setCodeClassifyOid(codeClassfyOid); codeOrderDTO.setTemplateOid(templateOid); codeOrderDTO.setCodeRuleOid(ruleOid); codeOrderDTO.setSecDTOList(preApplyCodeOrderDTO.getSecDTOList());//码段 codeOrderDTO.setEditInProcess(preApplyCodeOrderDTO.isEditInProcess()); codeOrderDTO.setUpVersion(preApplyCodeOrderDTO.isUpVersion()); codeOrderDTO.setName(name); codeOrderDTO.setData(data); engineService.addSaveCode(codeOrderDTO); //再修改data里边的classifyoid和classifuname String classifyoid = preApplyCodeOrderDTO.getCodeClassifyOid(); //查询分类 CodeClassifyVO codeClassifyVO = codeClassifyServiceI.getObjectByOid(classifyoid); //设置分类oid,name,flag dockingPreApplyDataDO.setClassifyoid(codeClassifyVO.getOid()); dockingPreApplyDataDO.setClassifyname(codeClassifyVO.getName()); dockingPreApplyDataMapper.updateByPrimaryKey(dockingPreApplyDataDO); } catch (Exception e) { Map retMap = new HashMap(); retMap.put("oid",preApplyCodeOrderDTO.getDataoid()); retMap.put("msg","处理失败!"); retMapList.add(retMap); logger.error("批量处理预申请数据失败,数据: "+preApplyCodeOrderDTO.toString()+",msg: "+e.getMessage()); } } BaseResult result = BaseResult.success(retMapList); return result; } @Override public BaseResult batchApplyDatas(List codeOrderDTOs) { if(!CollectionUtils.isEmpty(codeOrderDTOs)){ CodeOrderDTO orderDTO=codeOrderDTOs.get(0); Map rowsOidMap=new HashMap<>(); SheetDataSet dataSet=new SheetDataSet(); List sheetRowDatas=new ArrayList<>(); CodeClassifyTemplateVO codeClassifyTemplateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid()); List colName=new ArrayList<>(); List templateAttrVOS=codeClassifyTemplateVO.getAttributes(); List attrVOS = templateAttrVOS.stream().filter(s -> !MdmEngineConstant.DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormdisplayflag()) ).collect(Collectors.toList()); Map attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t.getName(),(o1, o2)->o2)); for (int i=0;i dataMap= codeOrderDTO.getData(); sheetRowData.setRowIndex(i+""); Map indexValueMap=new HashMap<>(); int index=0; colName=new ArrayList<>(); for (String field: attrNameIdMap.keySet()) { String outAttrName=attrNameIdMap.get(field); colName.add(outAttrName); String value=""; if(dataMap.containsKey(field)){ value=StringUtils.isBlank(dataMap.get(field))?"":dataMap.get(field); }else{ value=""; } indexValueMap.put(index++,value); } sheetRowData.setData(indexValueMap); sheetRowDatas.add(sheetRowData); } dataSet.setRowData(sheetRowDatas); dataSet.setColName(colName); Map errorMap=new HashMap<>(); List codeList=mdmIOService.batchImportCode(orderDTO,codeClassifyTemplateVO,dataSet,errorMap,false); List needSaveCboList = dataSet.getRowData().stream().filter(cbo -> { String rowIndex =cbo.getRowIndex(); return !errorMap.containsKey(rowIndex); }).collect(Collectors.toList()); LinkedList needOIdList=new LinkedList<>(); Map codeIdMap=new HashMap<>(); for(int i=0;i dockingPreApplyDataDOS = dockingPreApplyDataMapper.selectByPrimaryKeys(VciBaseUtil.array2String(needOIdList.toArray(new String[]{}))); dockingPreApplyDataDOS.stream().forEach(dockingPreApplyDataDO -> { //设置分类oid,name,flag String dataOid=dockingPreApplyDataDO.getOid(); dockingPreApplyDataDO.setClassifyoid(codeClassifyVO.getOid()); dockingPreApplyDataDO.setClassifyname(codeClassifyVO.getName()); if(codeIdMap.containsKey(dataOid)) {//存入数据编码 String code= codeIdMap.get(dataOid); dockingPreApplyDataDO.setId(code); dockingPreApplyDataDO.setPreapplyoid(code); dockingPreApplyDataDO.setNum(code); } dockingPreApplyDataDO.setDatamsg("赋码成功"); dockingPreApplyDataDO.setUseddflag("true"); }); dockingPreApplyDataMapper.batchUpdate(dockingPreApplyDataDOS); } //如果有错误则导出execl if(errorMap.size()>0){ List needRowIndexList = new ArrayList<>(); String errorFile=returnErrorToExcel(dataSet.getRowData(),errorMap, needRowIndexList,dataSet.getColName()); if(StringUtils.isNotBlank(errorFile)){ //放到map里 BaseResult result = BaseResult.fail("有部分数据申请失败,请核对"); result.setObj(ControllerUtil.putErrorFile(errorFile)); return result; }else { return BaseResult.success("申请成功!"); } } } return BaseResult.success("申请成功!"); } /** * 错误信息返回excel * @param rowDataList 所有的导入数据 * @param errorMap 错误的信息 * @param needRowIndexList 需要写入的数据的行号 * @param titleRowData 标题行 * * @return 错误的excel文件,没有错误会返回空 */ private String returnErrorToExcel(Collection rowDataList, Map errorMap, List needRowIndexList,List titleRowData){ if(CollectionUtils.isEmpty(errorMap)){ return ""; } Map rowIndexDataMap = rowDataList.stream().filter(s -> !needRowIndexList.contains(s.getRowIndex())).collect(Collectors.toMap(s -> s.getRowIndex(), t -> t)); LinkedList errorDataList = new LinkedList<>(); errorDataList.add(new WriteExcelData(0,0,"错误信息")); for (int i = 0; i < titleRowData.size(); i++) { //错误信息在最后 errorDataList.add(new WriteExcelData(0,i+1,titleRowData.get(i))); } Integer[] newRowIndex = new Integer[]{1}; errorMap.forEach((index,error)->{ //错误信息全部组合到一起 SheetRowData rowData = rowIndexDataMap.getOrDefault(index, null); if(rowData!=null){ errorDataList.add(new WriteExcelData(newRowIndex[0],0,error)); rowData.getData().forEach((colIndex,value)->{ errorDataList.add(new WriteExcelData(newRowIndex[0],colIndex+1,value)); }); newRowIndex[0]++; } }); String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "错误信息.xls"; WriteExcelOption eo = new WriteExcelOption(errorDataList); try { new File(excelFileName).createNewFile(); } catch (IOException e) { throw new VciBaseException(LangBaseUtil.getErrorMsg(e)); } ExcelUtil.writeDataToFile(excelFileName,eo); return excelFileName; } /** * 解析预申请数据和分类的属性转换模板ss */ public List readAttrTransfTemplate(String templateXml) throws Exception{ templateXml = StringUtils.isEmpty(templateXml)?"\n" + "\n" + "\t\n" + "\t\t\n" + "\t\t\n" + "\t\n" + "":templateXml; List preApplyDataTransList = new ArrayList(); Document document = DocumentHelper.parseText(templateXml); Element datas_element = document.getRootElement(); List data_elements = datas_element.elements(MdmDuckingConstant.XML_DATA); for (Element data_element:data_elements){ Attribute systemid_attr = data_element.attribute(MdmDuckingConstant.XML_SYSTEMID); String systemid = systemid_attr==null?"":systemid_attr.getValue();//systemid Attribute type_attr = data_element.attribute(MdmDuckingConstant.XML_TYPE); String type = type_attr==null?"":type_attr.getValue();//type List attr_elements = data_element.elements(MdmDuckingConstant.XML_ATTR); Map attrMap = new HashMap(); for (Element attr_element:attr_elements){ Map dataMap = new HashMap(); Attribute systemkey_attr = attr_element.attribute(MdmDuckingConstant.XML_SYSTEMKEY); String systemkey = systemkey_attr==null?"":systemkey_attr.getValue();//systemkey Attribute mdmkey_attr = attr_element.attribute(MdmDuckingConstant.XML_MDMKEY); String mdmkey = mdmkey_attr==null?"":mdmkey_attr.getValue();//mdmkey attrMap.put(systemkey,mdmkey); PreApplyDataTrans p = new PreApplyDataTrans(systemid,type,attrMap); preApplyDataTransList.add(p); } } return preApplyDataTransList; } class PreApplyDataTrans{ private String systemid; private String type; private Map attrMap; public PreApplyDataTrans(String systemid, String type, Map attrMap) { this.systemid = systemid; this.type = type; this.attrMap = attrMap; } public String getSystemid() { return systemid; } public void setSystemid(String systemid) { this.systemid = systemid; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Map getAttrMap() { return attrMap; } public void setAttrMap(Map attrMap) { this.attrMap = attrMap; } } }