ludc
2024-04-30 46de46ed851dc909f0ff355e9c6e3422efb5b4ad
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java
@@ -15,9 +15,9 @@
import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
import com.vci.ubcs.starter.util.SaveLogUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.CaseInsensitiveMap;
import org.jetbrains.annotations.NotNull;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
@@ -29,6 +29,7 @@
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
@@ -43,7 +44,10 @@
public class MdmInterJtClient implements IMdmInterJtClient {
   @Value("${docking.apply.partCode:10}")
   public String partCode;
   private String partCode;
   @Value("#{'${docking.apply.jDataBtmNames:wupin}'.split(',')}")
   private List<String> JDATABTMNAMES;
   /**
    * 集团申请单服务
@@ -195,6 +199,10 @@
            dockingPreApplyFormList.add(dockingPreApplyForm);
            String jdataid = dockingPreApplyForm.getDataOid();
            String jdatabtmname = dockingPreApplyForm.getDataBtmName();
            // 跳过不需要处理集团返码的分类
            if(!JDATABTMNAMES.contains(jdatabtmname)){
               continue;
            }
            if (res) {
               //此处需要查询业务数据,去更改
               R<List<BaseModel>> R = mdmEngineClient.selectByTypeAndOid(jdatabtmname,jdataid);
@@ -219,8 +227,9 @@
                        // 3.1、通过该条数据的分类id,拿到集团属性映射配置,用来将集团的属性映射到我们系统的属性
                        List<DockingPreAttrMapping> dockingPreAttrMappings = dockingPreAttrMappingService.selectByWrapper(Wrappers.<DockingPreAttrMapping>query().lambda().eq(DockingPreAttrMapping::getTargetClassifyId, codeclsfid).eq(DockingPreAttrMapping::getViewName,"编码视图"));
                        if(Func.isNotEmpty(dockingPreAttrMappings)){
                           log.info("开始调用sourceAttrKey2TargetKey方法。");
                           //根据集团属性映射将集团转到我们系统,并修改不一致的到我们系统中对应的该条记录的值
                           sourceAttrKey2TargetKey(dockingPreAttrMappings, viewValueList.get(0), oldDatalist, baseModel);
                           sourceAttrKey2TargetKey(dockingPreAttrMappings, viewValueList.get(0), baseModel);
                        }
                     }
                     log.info("申请单:"+applyId+",集团码:"+customCoding+"编码:"+baseModel.getId());
@@ -246,6 +255,7 @@
         return R.fail("集团码集成赋值失败,原因:"+e.getMessage());
      }
      log.info("获取集团集团码,赋值到主数据 end");
      return R.success("集团码赋值成功");
   }
@@ -253,33 +263,70 @@
    * 根据集团属性映射将集团转到我们系统
    * @param dockingPreAttrMappings
    * @param viewValueMap
    * @param oldDatalist
    * @param baseModel
    */
   private void sourceAttrKey2TargetKey(List<DockingPreAttrMapping> dockingPreAttrMappings,Map<String, Object> viewValueMap, List<BaseModel> oldDatalist,BaseModel baseModel){
      Map<String, Object> targetKeyMap = new HashMap<>();
   private void sourceAttrKey2TargetKey(List<DockingPreAttrMapping> dockingPreAttrMappings,Map<String, Object> viewValueMap,BaseModel baseModel) throws ServiceException {
      log.info("开始根据集团属性映射,将集团属性转成编码系统属性,并进行是否修改的比对!");
      //深拷贝记录下原对象,如果有更改用来放在旧业务数据字段(oldbusinessdata)上
      BaseModel oldBaseModel = null;
      try {
         oldBaseModel = deepCopy(baseModel);
      } catch (Exception e) {
         log.error("记录旧的业务数据时,baseModel对象深拷贝出现错误,原因:"+e.getMessage());
         e.printStackTrace();
         throw new ServiceException("记录旧的业务数据时,baseModel对象深拷贝出现错误,原因:"+e.getMessage());
      }
      Map<String, Object> targetKeyMap = new CaseInsensitiveMap<>();
      // 将集团属性转成我们系统属性的map
      dockingPreAttrMappings.stream().forEach(item->{
         targetKeyMap.put(item.getTargetAttrKey(),viewValueMap.get(item.getSourceAttrKey()));
      });
      // 比对baseModel的data中的属性是否和targetKeyMap不一致,不一致的话就需要将baseModel的data中的对应key的value值转成集团的
      boolean isEdit = false;
      // 忽略大小写
      Map caseInsensitiveMap = new CaseInsensitiveMap(baseModel.getData());
      for (Map.Entry<String, Object> entry : targetKeyMap.entrySet()) {
         String key = entry.getKey();
         Object targetValue = entry.getValue();
         String dataValue = baseModel.getData().get(key);
         String dataValue = String.valueOf(caseInsensitiveMap.get(key));
         if (targetValue != null && !targetValue.equals(dataValue)) {
            baseModel.getData().put(key, targetValue.toString());
            caseInsensitiveMap.put(key, targetValue.toString());
            isEdit = true;
         }
      }
      // 集团对我们系统属性做了调整,我们需要对老的业务数据做记录
      if (isEdit) {
         baseModel.getData().put("oldbusinessdata", JSON.toJSONString(oldDatalist));
         log.info("集团返回的数据存在差异,开始执行对编码系统basemodel对象修改操作!");
         // 清空原先的map,使用新的不区分key大小写的map
         baseModel.getData().clear();
         baseModel.getData().putAll(caseInsensitiveMap);
         // 移除历史的oldbusinessdata字段,否则会超长
         oldBaseModel.getData().remove("oldbusinessdata");
         baseModel.getData().put("oldbusinessdata", JSON.toJSONString(oldBaseModel));
      }
   }
   /**
    * 深拷贝
    * @param baseModel
    * @return
    * @throws ClassNotFoundException
    * @throws IOException
    */
   public static BaseModel deepCopy(BaseModel baseModel) throws ClassNotFoundException, IOException {
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(bos);
      oos.writeObject(baseModel);
      oos.close();
      ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
      ObjectInputStream ois = new ObjectInputStream(bis);
      BaseModel copy = (BaseModel) ois.readObject();
      ois.close();
      return copy;
   }
   /***
    * 接受集团分类主模型数据
    * @param dockingClassifyModelAttrVO