xiejun
2023-12-06 e9a590e862148092027510b15d33cdd32691a6f5
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -6,13 +6,11 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.protobuf.ServiceException;
import com.vci.ubcs.code.applyjtcodeservice.entity.DockingPreAttrMapping;
import com.vci.ubcs.code.applyjtcodeservice.feign.IMdmInterJtClient;
import com.vci.ubcs.code.applyjtcodeservice.vo.DockingPreAttrMappingVO;
import com.vci.ubcs.code.bo.AttributeValue;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
import com.vci.ubcs.code.constant.MdmEngineConstant;
import com.vci.ubcs.code.dto.*;
import com.vci.ubcs.code.entity.CodeAllCode;
import com.vci.ubcs.code.enumpack.CodeDefaultLC;
@@ -62,6 +60,7 @@
import org.apache.poi.ss.usermodel.Workbook;
import org.aspectj.apache.bcel.classfile.Code;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
@@ -73,6 +72,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
@@ -90,7 +90,6 @@
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
@@ -201,9 +200,9 @@
   private SaveLogUtil saveLogUtil;
   /**
    * 导出的十万条
    * 客户现场excel为老版本,导出的总数限制为65535
    */
   public static final int EXPORT_LIMIT = 100000;
   public static final int EXPORT_LIMIT = 65535;
   /**
    * 批量申请:选取选中分类下的所有模板关键属性,相似属性,必填属性,写入execl中
@@ -614,6 +613,7 @@
      ExcelUtil.writeDataToFile(excelName,eo);
      return excelName;
   }
   /**
    * 获取码段宽度
    * @param codeClassifyOid
@@ -1209,6 +1209,7 @@
               //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
               List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
               CodeClassifyTemplateVO finalTemplateVO = templateVO;
               final BladeUser user = AuthUtil.getUser();
               ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
                  //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
                  List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
@@ -1225,7 +1226,7 @@
                  if (!CollectionUtils.isEmpty(thisCbos)) {
                     try {
                        // TODO 多线程流问题
                        productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
                        productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList,user);
                        importCount.add(dataCBOList.size());
                     } catch (Throwable e) {
                        log.error("批量产生编码的时候出错了", e);
@@ -1276,6 +1277,7 @@
         throw e;
      }
   }
   /**
    * 导入批量编辑数据
    *
@@ -1284,14 +1286,18 @@
    * @param file            excel文件的信息
    * @return 有错误信息的excel
    */
   @Transactional
   @Override
   public CodeImProtRusultVO batchImportEdit(String codeClassifyOid, String classifyAttr,File file) throws  Throwable{
      VciBaseUtil.alertNotNull(codeClassifyOid,"分类的主键");
      ReadExcelOption reo = new ReadExcelOption();
      reo.setReadAllSheet(true);
      List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
      if (sheetDataSetList.size() > LIMIT + 1) {
         throw new VciBaseException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
      if (sheetDataSetList.get(0).getRowData().size() > LIMIT + 1) {
         throw new ServiceException("为了保证系统的稳定性,请一次不要导入超过1万条的数据");
      }
      if (sheetDataSetList.get(0).getRowData().size() == 0) {
         throw new ServiceException("未读取到excle相关数据,请确认!!!");
      }
      boolean isExport=false;
      Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
@@ -1327,7 +1333,7 @@
            titleRowData.remove(titleRowData.size()-1);
            templateVO= templateVOList.get(0);
         }catch (Throwable e){
            throw  new VciBaseException(e.getMessage());
            throw new ServiceException(e.getMessage());
         }
         CodeClassifyTemplateVO finalTemplateVO = templateVO;
@@ -1354,32 +1360,18 @@
            //我们使用和业务类型的来查询
            List<Map> cbosB = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
            if(cbosB.size() == 0){
               throw  new ServiceException("编码:"+ sheetRowData.getData().get(0) + ",未能查询到相关数据。");
               throw new ServiceException("编码:"+ sheetRowData.getData().get(0) + ",未能查询到相关数据。");
            }
            excelToCboEdit(fieldIndexMap, sheetRowData, orderDTO, cbosB.get(0));
            orderDTO.setCopyFromVersion(orderDTO.getOid());
            orderDTO.setOid(null);
            try {
               mdmEngineService.upSaveCode(orderDTO);
               List<Map> newCbos = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
               //对码值表进行处理替换创建数据的oid
               QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
               wrapper.eq("CREATECODEOID",orderDTO.getCopyFromVersion());
               List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
               codeAllCodes.get(0).setCreateCodeOid(newCbos.get(0).get("OID").toString());
               codeAllCodes.get(0).setLastModifyTime(new Date());
               codeAllCodes.get(0).setTs(new Date());
               codeAllCodes.get(0).setLastModifier(AuthUtil.getUser().getUserName());
               codeAllCodeService.updateBatchById(codeAllCodes);
            } catch (Throwable e) {
               log.error("批量产生编码的时候出错了", e);
//            thisCbos.stream().forEach(cbo -> {
//               String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
               errorMap.put(sheetRowData.getRowIndex(), ";系统错误,存储数据的时候出错了:"+e.getMessage());
//            });
            }
         }
         if (errorMap.size() > 0) {
            isExport = true;
         }
@@ -1686,7 +1678,7 @@
            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
         }else {
            uuid="";
            final BladeUser user = AuthUtil.getUser();
            //要把以上的错误的都抛出后,再继续处理时间和组合规则
            needSaveCboList = cboList.stream().filter(cbo -> {
               String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
@@ -1706,7 +1698,7 @@
                  dataCBOIdList.add(baseModel.getOid());
               });
               try {
                  codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
                  codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList,user);
                  //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
                  engineService.batchSaveSelectChar(templateVO, dataCBOList);
               } catch (Exception e) {
@@ -1839,10 +1831,10 @@
         tableName = VciBaseUtil.getTableName(btmTypeId);
      }
      String countSql = "select count(*) from " + tableName +" where 1=1" +
      String countSql = "select count(*) from (select * FROM " + tableName +" where 1=1" +
         " and lastr = '1'" +
         " and lastv='1'" +
         " and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%'";
         " and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%' {}";
      //先查询总数
      int total = 0;
@@ -1856,8 +1848,7 @@
            thisPage.setSort(exportAttrDTO.getSort());
            thisPage.setOrder(exportAttrDTO.getOrder());
            thisPage.addDefaultDesc("createTime");
            total += commonsMapper.queryCountBySql(countSql);
            total += commonsMapper.queryCountBySql(StringUtil.format(countSql," limit " + exportAttrDTO.getLimit() +" offset "+ i +")subquery;"));
         }
      }else{
         total = commonsMapper.queryCountBySql(countSql);
@@ -2122,7 +2113,9 @@
            }).collect(Collectors.toList());
            List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
            Map<String, CodeRuleVO> finalRuleVOMap = ruleVOMap;
            ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
            // TODO: 多线程流套多线程流,有坑,我把这儿改成单线程了
            final BladeUser user = AuthUtil.getUser();
            ruleRowIndexMap.keySet().stream().forEach(ruleOid -> {
               List <BaseModel>dataCBOList=new CopyOnWriteArrayList<>();
               List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
               List<ClientBusinessObject> thisCbos = needSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
@@ -2133,7 +2126,7 @@
                     dataCBOList.add(baseModel);
                  });
                  try {
                     productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, finalRuleVOMap.get(ruleOid), null, dataCBOList);
                     productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, finalRuleVOMap.get(ruleOid), null, dataCBOList, user);
                  } catch (Throwable e) {
                     //success=false;
                     log.error("批量产生编码的时候出错了", e);
@@ -2146,6 +2139,7 @@
               engineService.batchSaveSelectChar(codeClassifyTemplateVO, dataCBOList);
            });
         }else {
            final BladeUser user = AuthUtil.getUser();
            List<BaseModel> dataCBOList=new ArrayList<>();
            List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
               String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
@@ -2159,7 +2153,7 @@
                  dataCBOList.add(baseModel);
               });
               try {
                  productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
                  productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList,user);
               } catch (Exception e) {
                  log.error("批量产生编码的时候出错了", e);
                  needSaveCboList.stream().forEach(cbo -> {
@@ -2467,6 +2461,7 @@
         List<String>allNeedSaveCboList=new ArrayList<>();
         List<BaseModel> dataCBOList=new ArrayList<>();
         final BladeUser user = AuthUtil.getUser();
         needSaveCboList.stream().forEach(clientBusinessObject -> {
            BaseModel baseModel=new BaseModel();
            BeanUtil.convert(clientBusinessObject,baseModel);
@@ -2476,7 +2471,7 @@
         });
         try {
            List<String>applyGroupCodeIdList=new ArrayList<>();
            productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
            productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList,user);
            //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
            engineService.batchSaveSelectChar(templateVO, dataCBOList);
            // if(!isProcess){
@@ -2504,7 +2499,6 @@
                  resultDataObjectDetailDO.setErrorid("0");
               }
               resultDataObjectDetailDO.setId(sourceOid);
               resultDataObjectDetailDO.setMsg(msg);
               resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
               //处理传送的数据中关键属性重复的,直接拿到已经申请到编码的数据编码直接将赋给关键属性重复的数据
@@ -3567,7 +3561,7 @@
            if (StringUtils.isBlank(field)) {
               throw new VciBaseException("第" + (index + 1) + "列的标题在系统中不存在");
            }
            map.put(field,value);
            map.put(field.toUpperCase(),value);
         });
      try {
@@ -4273,6 +4267,7 @@
      Map<String,List<BaseModel>> indexTODataMap=new ConcurrentHashMap<>();
      // 查询不需要参与关键属性校验的除自己以外的所有分类oid
      final String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
      final BladeUser user = AuthUtil.getUser();
      List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
         //每行都得查询.如果其中出现了错误,我们就直接抛出异常,其余的显示
         //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
@@ -4304,7 +4299,7 @@
               List<BaseModel> newCboList = new ArrayList<>();
               newDataList.stream().forEach(stringStringMap -> {
                  BaseModel baseModel=new BaseModel();
                  DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,true);
                  DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,true,user);
                  baseModel.setData(stringStringMap);
                  newCboList.add(baseModel);
               });
@@ -4530,7 +4525,7 @@
      List<ClientBusinessObject> clientBusinessObjectList=new ArrayList<>();
      oldDataMap.stream().forEach(dataMap->{
         ClientBusinessObject clientBusinessObject=new ClientBusinessObject();
         DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject,true);
         DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject);
         for (String key:dataMap.keySet()){
            Object value= dataMap.getOrDefault(key,"");
            clientBusinessObject.setAttributeValue(key.toLowerCase(Locale.ROOT),value==null?"":value.toString());
@@ -4993,8 +4988,8 @@
      ExecGroupCodePortDataDTO execGroupCodePortDataDTO=new ExecGroupCodePortDataDTO();
      createExportGroupCodeMapConfig(templateVO,execGroupCodePortDataDTO);//组织数据
      if(CollectionUtils.isEmpty(execGroupCodePortDataDTO.getCodeAttrMapGroupAttrDTOS())){
         throw new VciBaseException("集团属性映射未配置");
      if(!CollectionUtils.isEmpty(execGroupCodePortDataDTO.getCodeAttrMapGroupAttrDTOS())){
         throw new ServiceException("集团属性映射未配置");
      }
      fieldList=execGroupCodePortDataDTO.getFieldList();
      List<Map<String,String>>dataList=new ArrayList<>();