田源
2024-04-18 f9ca72d2c14bc64fce54aa2e8742d7b7f6ff3a35
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeDuckingSyncServiceImpl.java
@@ -2,7 +2,9 @@
import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.shaded.com.google.protobuf.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.thoughtworks.xstream.XStream;
@@ -59,10 +61,11 @@
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionStatus;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@@ -71,15 +74,13 @@
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_TAKEBACK;
import static com.vci.ubcs.code.constant.MdmDuckingConstant.*;
import static com.vci.ubcs.code.constant.MdmEngineConstant.DEFAULT_SYNC_ATTR_LIST;
import static com.vci.ubcs.code.enumpack.CodeSecTypeEnum.CODE_CLASSIFY_SEC;
@@ -94,6 +95,7 @@
@Service
@Slf4j
public class CodeDuckingSyncServiceImpl implements ICodeDuckingSyncService {
   @Value("${dataSyncPush.dataParamName:xmlData}")
   public String DATA_PARAM_NAME;
   @Value("${dataSyncPush.dataId:itemid}")
@@ -112,61 +114,84 @@
   @Value("${erp.item.btmName:XHDH}")
   public String btmName;
   @Value("${erp.item.bearer:bearer: Bearer 7fc32939-0a59-da71-a6e6-6b0d37b53e8a}")
   private String ERPXHDHAUTH;
   @Value("${erp.item.url:http://127.0.0.1/api/pp/pp/ext/extend/v1.0}")
   private String ERPXHDHURL;
   @Value("${erp.item.tenant:10000}")
   private String ERPXHDHTENANT;
   /**
    * 业务类型的服务
    */
   @Autowired
   private IBtmTypeClient btmTypeClient;
   /**
    * 通用查询
    */
   @Resource
   private CommonsMapper commonsMapper;
   @Resource
   private  MdmEngineService  mdmEngineServiceI;
   /**
    * 批量处理的服务
    */
   @Resource
   private MdmIOService mdmIOService;
   @Resource
   private IPasswordFreeLoginService passwordFreeLoginService;
   @Resource
   private IDockingLogeService dockingLogeService;
   @Resource
   private IDockingDataService dockingDataService;
   @Resource
   private IDockingTaskService dockingTaskService;
   @Resource
   private IDockingSystemConfigService dockingSystemConfigService;
   @Resource
   private ICodeClassifyService codeClassifyService;
   @Autowired
   private ICodeClassifyValueService codeClassifyValueService;
   @Autowired(required = false)
   private AttributeMapConfig attributeMapConfig;
   /***
    * resdis缓存服务
    */
   @Resource
   private BladeRedis bladeRedis;
   @Resource
   private IDockingSysIntParamService dockingSysIntParamService;
   @Resource
   private IDockingSysIntHeaderService dockingSysIntHeaderService;
   @Autowired(required = false)
   private MdmSearchItemCodeProvider mdmSearchItemCodeProvider;
   @Autowired
   HttpServletRequest request;
   @Resource
   private ICodeAllCodeService codeAllCodeService;
   @Override
   public void DockingDataSyncScheduing() {
      // insertCache2();
      initPushDataTaks(1);
      sendpushDataForService();
   }
   /***
@@ -221,6 +246,7 @@
      });
      return  R.success("手动推送完成,请核对是否推送成功");
   }
   private SearchItemDataVO initData(String status,String itemCode,String mmCode){
      SearchItemDataVO searchItemDataVO=new SearchItemDataVO();
      searchItemDataVO.setLastchangedon(new Date());
@@ -254,14 +280,14 @@
         }
         org.springblade.core.tool.utils.WebUtil.setRequest(new ServletRequestAttributes(request));
      }
      return request;
   }
   /***
    * 同步型号代号
    */
   @Override
   public void saveItemDataSyncScheduing(String endDate) {
   public void saveItemDataSyncScheduing(String endDate) throws ServiceException {
      String paramString="";
      String backString="成功";
      String msg="成功";
@@ -275,28 +301,30 @@
         calendar.set(Calendar.HOUR_OF_DAY, 0);
         calendar.set(Calendar.MINUTE, 0);
         calendar.set(Calendar.SECOND, 0);
         log.info("查询时间------->"+calendar.getTime());
         log.info("查询时间------->"+dft.format(new Date()));
         lastchangedon= dft.format(calendar.getTime());
      }else{
         lastchangedon=endDate;
      }
      searchItemParam.setLastchangedon(lastchangedon);
      searchItemParam.setStatus(itemStatus);//
      Map<String,String>searchDataMap=  VciBaseUtil.objectToMapString(searchItemParam);
      searchItemParam.setIsenabled("");
      searchItemParam.setStatus(itemStatus);
      //Map<String,String> searchDataMap = VciBaseUtil.objectToMapString(searchItemParam);
      try {
         paramString=JSONObject.toJSON(searchItemParam).toString();
         String res= mdmSearchItemCodeProvider.getppModelByElem(searchItemParam);
         SearchItemVO searchItemVO  = JSONObject.toJavaObject(JSONObject.parseObject(res), SearchItemVO.class);
         /**SearchItemVO searchItemVO=new SearchItemVO();
         List<SearchItemDataVO> data=new ArrayList<>();
         SearchItemDataVO searchItemDataVO1=initData("1","","pro-00001");
         SearchItemDataVO searchItemDataVO2=initData("0","item-00001","");
         data.add(searchItemDataVO1);
         data.add(searchItemDataVO2);
         //searchItemVO.setData(data);
         searchItemVO.setCode("200");**/
         //searchItemVO.setMsg("");
         String sendParamString=JSONObject.toJSON(searchItemParam).toString();
         // TODO: 改为使用HttpUtils方式进行申请,因为现在申请用之前的方式会报错
         LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
         headers.add("Authorization",ERPXHDHAUTH);
         headers.add("X-ECC-Current-Tenant",ERPXHDHTENANT);
         headers.add("Accept-Language","zh-CHS");
         headers.add("Content-Type",MediaType.APPLICATION_JSON.toString());
         String res = HttpUtils.request(ERPXHDHURL+"/getppModelByElemNew",sendParamString,headers, HttpMethod.POST,MediaType.APPLICATION_JSON);
         // String res= mdmSearchItemCodeProvider.getppModelByElem(searchItemParam);
         SearchItemVO searchItemVO = JSONObject.toJavaObject(JSONObject.parseObject(res), SearchItemVO.class);
         if (searchItemVO != null) {
            if(!"200".equals(searchItemVO.getStatus())){
               throw new ServiceException(String.format("接口返回状态码为:%s,原因:%s",searchItemVO.getStatus(),searchItemVO.getMessage()));
            }
            BladeUser finalUser;
            paramString = JSONObject.toJSON(searchItemVO).toString();
            log.info("型号代号数据值-------》"+paramString);
@@ -330,7 +358,7 @@
               List<String> itemCodeList = new ArrayList<>();
               ApplyDatasVO allDatasVO = new ApplyDatasVO();
               List<ApplyDataVO> allObjectList = new ArrayList<>();
               if (!CollectionUtils.isEmpty(dataList)) {
               if (Func.isNotEmpty(dataList)) {
                  dataList.stream().forEach(searchItemDataVO -> {
                     String itemCode = StringUtils.isNotBlank(searchItemDataVO.getPROJECTITEM()) ? searchItemDataVO.getPROJECTITEM() : searchItemDataVO.getMMODELCODE();//项目代号
                     dataVOMap.put(itemCode, searchItemDataVO);
@@ -436,12 +464,9 @@
                  paramString = Func.isEmpty(paramObject) ? "" : paramObject.toString();
                  Object backObject = JSONObject.toJSON(allResultDataObjectDetailDOS);
                  backString = Func.isEmpty(backObject) ? "" : backObject.toString();
               }else{
                  throw new Throwable("接口未返回信息");
               }
            } catch (Throwable e) {
               e.printStackTrace();
               ;
               log.error("查询失败--->" + e);
               success = false;
               backString = "查询失败--->" + e;
@@ -458,7 +483,7 @@
               }
            }
         }else{
            throw  new Throwable("接口未返回信息");
            throw new Throwable("接口未返回信息");
         }
      }catch (Throwable e1){
         e1.printStackTrace();
@@ -473,8 +498,9 @@
         } catch (Throwable e) {
            e.printStackTrace();
            log.error(e.getMessage());
            throw new VciBaseException(e.getMessage());
            throw new ServiceException(e.getMessage());
         }
         throw new ServiceException(e1.getMessage());
      }
   }
@@ -509,7 +535,7 @@
         dockingLoge.setInterfaceStatus("false");//接口集成状态
      }
      dockingLogeService.save(dockingLoge);
      log.info("集成推送数据成功,systemId:"+systemId+",systemname:"+systemName+",operation:"+operation+",param:"+parmaData);
      log.info("集成推送数据,systemId:"+systemId+",systemname:"+systemName+",operation:"+operation+",param:"+parmaData);
   }
   /***
@@ -573,6 +599,7 @@
      }
      return codeOrderSecDTOList;
   }
   /***
    * 读取属性映射配置信息
    * @param systemId
@@ -697,7 +724,8 @@
         throw new   Throwable("组织数据映射值失败");
      }
   }
 private void changeObjectToMap(SearchItemUpperCaseDataVO searchItemDataVO, String code, BladeUser user,String operation,List<ApplyDataVO> object){
   private void changeObjectToMap(SearchItemUpperCaseDataVO searchItemDataVO, String code, BladeUser user,String operation,List<ApplyDataVO> object){
    ApplyDataVO applyDataVO=new ApplyDataVO();
    List<ProppertyVO> propList=new ArrayList<>();
    //String status= searchItemDataVO.getStatus();//数据状态 字符型,枚举值;制单:0;审批中:1;通过:2;驳回:3;
@@ -730,13 +758,15 @@
    applyDataVO.setProp(propList);
    object.add(applyDataVO);
 }
  private void initProperty(String key,String text,String value,List<ProppertyVO> propList){
    private void initProperty(String key,String text,String value,List<ProppertyVO> propList){
   ProppertyVO vo=new ProppertyVO();
     vo.setKey(key);
     vo.setText(StringUtils.isBlank(text)?"":text);
     vo.setValue(StringUtils.isBlank(value)?"":value);
     propList.add(vo);
  }
   /***
    * 查询redis中数据,对比后插入dockingtask
    * @param type
@@ -862,7 +892,7 @@
      for (DockingTask dockingTask:dockingTaskList){
         //每个task一个事务,开启
         String paramString="";
         String sendString="";
         Object sendString="";
         String backString="";
         //查询系统接口信息,ip method,dataType
         String systeminfooid = dockingTask.getSysInfoOid();//sysininfo 的oid
@@ -896,8 +926,8 @@
            DockingSystemConfig dockingSystemConfig = dockingSystemConfigService.getById(systeminfooid);
            String paramType = dockingSystemConfig.getParamType();//xml/json
            if(paramType.equals(DATATYPE_JSON)){
               Object object = JSONObject.toJSON(jsonRootDataDTO);
               sendString = object.toString();
                Object object = JSONObject.toJSON(jsonRootDataDTO);
                sendString = object;
            }else{
               //组织返回接口信息
               XStream xStream = new XStream(new DomDriver());
@@ -914,15 +944,16 @@
         }
      }
   }
   /***
    * 发送编码主数据
    */
   private void sendpushDataForService (List<DockingTask> dockingTaskS){
   private void sendpushDataForService(List<DockingTask> dockingTaskS){
      //每个task依次执行推送
      for (DockingTask dockingTask:dockingTaskS){
         //每个task一个事务,开启
         String paramString="";
         String sendString="";
         Object sendString="";
         String backString="";
         try {
            //查询系统接口信息,ip method,dataType
@@ -938,9 +969,28 @@
            List<CodeClassifyTemplateAttrVO> attrVOS = codeClassifyTemplateVO.getAttributes();
            Map<String/**英文名称**/, String/**中文名称**/> attrIdNameMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t.getName(), (o1, o2) -> o2));
            Map<String, String> data = new HashMap<>();
            if (r == null) {
               JSONObject josni = bladeRedis.get(DOCKING_CACHE2_DELETE + btmoid);
               data = (Map) josni;
            // TODO: 回收编码的情况,会出现数据已经回收,但是事务还未执行的情况,
            //  导致取不到码值,所以这儿通过查询码值表中存储的已回收的业务数据信息,解析出来
            if (!r.isSuccess() || Func.isEmpty(r.getData())) {
               List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getId, dockingTask.getId()));
               CodeAllCode codeAllCode = codeAllCodes.get(0);
               BaseModel baseModel = JSONObject.parseObject(codeAllCode.getBusinessData(), BaseModel.class);
               Map<String, Object> objectMap = VciBaseUtil.objectToMap(baseModel);
               for (Map.Entry<String,Object> entry : objectMap.entrySet()){
                  if(entry.getKey().equals("data") && Func.isNotEmpty(entry.getValue())){
                     Map<String, Object> dataMap = (Map<String,Object>)((JSONObject) entry.getValue());
                     for(Map.Entry<String,Object> dataEntry : dataMap.entrySet()){
                        String v = String.valueOf(dataEntry.getValue());
                        data.put(dataEntry.getKey().toLowerCase(Locale.ROOT), v == null ? "" : v);
                     }
                  }else{
                     String key = entry.getKey().toLowerCase(Locale.ROOT);
                     String value = String.valueOf(entry.getValue());
                     data.put(key, value == null ? "" : value);
                  }
               }
               /*JSONObject josni = bladeRedis.get(DOCKING_CACHE2_DELETE + btmoid);
               data = (Map) josni;*/
            } else {
               data = r.getData().get(0);
            }
@@ -970,8 +1020,10 @@
            }
            if(isGroupCodeFlage){
               code=data.getOrDefault("groupcode","");
               if(StringUtils.isBlank(code)) {//如果是集团码,没有领取到集团码则任务不结束等待集团码申请后再通过定时器调用集团码段
               if(StringUtils.isBlank(code)) {
                  //如果是推送集团码,没有领取到集团码则任务不结束等待集团码申请后再通过定时器调用集团码段
                  dockingTask.setDescription("等待集团申请集团码");
                  // TODO:可能会出现未获取到集团码,但是又立马执行了回收,此时这条任务就永远无法结束,所以这儿判断只要是集团码为空,并且是回收的就关闭推送这条任务
                  dockingTask.setSendFlag(MdmDuckingConstant.SEND_FLAG_FALSE);
                  dockingTask.setLastModifyTime(new Date());
                  dockingTaskService.updateById(dockingTask);
@@ -996,7 +1048,8 @@
            String paramType = dockingSystemConfig.getParamType();//xml/json
            if (paramType.equals(DATATYPE_JSON)) {
               Object object = JSONObject.toJSON(nodeJosnDTO);
               sendString = object.toString();
               //sendString = object.toString();
               sendString = object;
            } else {
               //组织返回接口信息
               XStream xStream = new XStream(new DomDriver());
@@ -1012,24 +1065,25 @@
         }
      }
   }
   /***
    * 调用接口
    * @param sendString
    * 调用接口,传参为JSON时传object类型,Content-Type改为界面配置的
    * @param sendObject
    * @param dockingSystemConfig
    * @param dockingTask
    * @throws Throwable
    */
   private void callInterface(String  sendString , DockingSystemConfig dockingSystemConfig,DockingTask dockingTask,String operation) throws  Throwable{
   private void callInterface(Object sendObject, DockingSystemConfig dockingSystemConfig,DockingTask dockingTask,String operation) throws  Throwable{
      String paramString = "";
      String backString = "";
      String msg="";
      String sendString = sendObject.toString();
      String msg= "" ;
      String url = dockingSystemConfig.getRequestUrl();//url
      List<ResultNodeObjectDTO> resultNodeObjectDTOS =new ArrayList<>();
      try {
         boolean usedFlag= dockingSystemConfig.getUsedFlag().equals("true")?true:false;
         if(!usedFlag){
            throw  new Throwable("接口已经停用!");
            throw new Throwable("接口已经停用!");
         }
         String type = dockingSystemConfig.getInterfaceType().toLowerCase(Locale.ROOT);//get/post/webserver/corba
         String paramType = dockingSystemConfig.getParamType();//xml/json
@@ -1054,17 +1108,22 @@
               paramString = sendurl;
               backString = HttpUtils.get(sendurl);
            } else if (requestmethod.equals(URLTYPE_POST)) {//POST请求
               MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
               MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
               for (DockingSysIntParam dockingSysIntParam : dockingSysIntParamList) {
                  params.add(dockingSysIntParam.getParamKey(), dockingSysIntParam.getParamValue());
               }
               params.add(DATA_PARAM_NAME,sendString);
               params.add(DATA_PARAM_NAME,sendObject);
               paramString = params.toString();
               MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
               for (DockingSysIntHeader dockingSysIntHeader : dockingSysIntHeaderList) {
                  headers.add(dockingSysIntHeader.getHeaderKey(), dockingSysIntHeader.getHeaderValue());
               }
               backString = HttpUtils.post(url, params, headers);
               backString = HttpUtils.postByMediaType(
                  url,
                  params,
                  headers,
                  Func.isNotBlank(dockingSystemConfig.getContentType()) ? MediaType.valueOf(dockingSystemConfig.getContentType()):MediaType.APPLICATION_FORM_URLENCODED
               );
            }
            if(backString.startsWith("\"")){
               backString=backString.substring(backString.indexOf("\"")+1);
@@ -1162,10 +1221,11 @@
         }
      }
   }
   /***
    * 查询需要集成的业务数据任务
    */
   private void sendpushDataForService (){
   private void sendpushDataForService(){
      initSysadmin();
      //查询哪些任务还没有执行完成
      //VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(DockingTaskDO.class);
@@ -1185,7 +1245,7 @@
    */
   private void sendpushClsfForService(){
      initSysadmin();
   /*   //查询哪些任务还没有执行完成
      /*   //查询哪些任务还没有执行完成
      VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(DockingTaskDO.class);
      queryWrapper.addQueryMap("sendFlag",MdmDuckingConstant.SEND_FLAG_FALSE);
      queryWrapper.addQueryMap("btmId",DOCKING_DEFAULT_CLASSIFY.toUpperCase(Locale.ROOT));
@@ -1198,6 +1258,7 @@
      List<DockingTask> dockingTaskDOS = dockingTaskService.list(queryWrapper);
      sendpushClsfForService(dockingTaskDOS);
   }
   public void initSysadmin(){
      SessionInfo sessionInfo = new SessionInfo();
      sessionInfo.setUserId("sysAdmin");
@@ -1207,6 +1268,7 @@
      sessionInfo.setUserSecret(UserSecretEnum.PRIVACY.getValue()+"");
      WebUtil.setSessionInfo(sessionInfo);
   }
   /**
    * dockingdata根据oid修改sendflag
    * @param oid
@@ -1222,5 +1284,6 @@
      }
      return u;
   }
}