田源
2024-03-25 5dd6f4aa2123671e95907ee19f5925a98983cdc8
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeDuckingSyncServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.cloud.commons.lang.StringUtils;
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;
@@ -50,6 +51,7 @@
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.WebUtil;
import com.xkcoding.http.support.Http;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.CaseInsensitiveMap;
import org.springblade.core.redis.cache.BladeRedis;
@@ -59,6 +61,7 @@
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;
@@ -111,34 +114,53 @@
   @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;
@@ -269,7 +291,7 @@
    * 同步型号代号
    */
   @Override
   public void saveItemDataSyncScheduing(String endDate) {
   public void saveItemDataSyncScheduing(String endDate) throws ServiceException {
      String paramString="";
      String backString="成功";
      String msg="成功";
@@ -283,27 +305,25 @@
         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);
      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("");
         // 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",paramString,headers, HttpMethod.POST,MediaType.APPLICATION_JSON);
         // String res= mdmSearchItemCodeProvider.getppModelByElem(searchItemParam);
         SearchItemVO searchItemVO = JSONObject.toJavaObject(JSONObject.parseObject(res), SearchItemVO.class);
         if (searchItemVO != null) {
            BladeUser finalUser;
            paramString = JSONObject.toJSON(searchItemVO).toString();
@@ -338,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);
@@ -444,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;
@@ -466,7 +483,7 @@
               }
            }
         }else{
            throw  new Throwable("接口未返回信息");
            throw new Throwable("接口未返回信息");
         }
      }catch (Throwable e1){
         e1.printStackTrace();
@@ -481,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());
      }
   }
@@ -517,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);
   }
   /***
@@ -908,9 +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();
               sendString = jsonRootDataDTO;
                Object object = JSONObject.toJSON(jsonRootDataDTO);
                sendString = object;
            }else{
               //组织返回接口信息
               XStream xStream = new XStream(new DomDriver());
@@ -936,7 +953,7 @@
      for (DockingTask dockingTask:dockingTaskS){
         //每个task一个事务,开启
         String paramString="";
         String sendObject="";
         Object sendString="";
         String backString="";
         try {
            //查询系统接口信息,ip method,dataType
@@ -1010,16 +1027,17 @@
            String paramType = dockingSystemConfig.getParamType();//xml/json
            if (paramType.equals(DATATYPE_JSON)) {
               Object object = JSONObject.toJSON(nodeJosnDTO);
               sendObject = object.toString();
               //sendString = object.toString();
               sendString = object;
            } else {
               //组织返回接口信息
               XStream xStream = new XStream(new DomDriver());
               xStream.processAnnotations(NodedataDTO.class);
               xStream.autodetectAnnotations(true);
               sendObject = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + xStream.toXML(nodeDataDTO);
               sendString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + xStream.toXML(nodeDataDTO);
            }
            //调用接口
            callInterface(sendObject,dockingSystemConfig, dockingTask,"pushData");
            callInterface(sendString,dockingSystemConfig, dockingTask,"pushData");
         }catch (Throwable e){
            e.printStackTrace();
         }finally {
@@ -1037,7 +1055,7 @@
   private void callInterface(Object sendObject, DockingSystemConfig dockingSystemConfig,DockingTask dockingTask,String operation) throws  Throwable{
      String paramString = "";
      String backString = "";
      String sendString = dockingSystemConfig.getContentType().equals(DATATYPE_JSON) ? JSONObject.toJSON(sendObject).toString():sendObject.toString();
      String sendString = sendObject.toString();
      String msg= "" ;
      String url = dockingSystemConfig.getRequestUrl();//url
      List<ResultNodeObjectDTO> resultNodeObjectDTOS =new ArrayList<>();
@@ -1079,160 +1097,12 @@
               for (DockingSysIntHeader dockingSysIntHeader : dockingSysIntHeaderList) {
                  headers.add(dockingSysIntHeader.getHeaderKey(), dockingSysIntHeader.getHeaderValue());
               }
               backString = HttpUtils.postByMediaType(url, params, headers,new MediaType(dockingSystemConfig.getContentType()));
            }
            if(backString.startsWith("\"")){
               backString=backString.substring(backString.indexOf("\"")+1);
            }
            if(backString.endsWith("\"")){
               backString=backString.substring(0,backString.lastIndexOf("\""));
            }
            if(backString.contains("\n")){
               String res="\n";
               backString=  backString.replaceAll(res,"");
            }
            if(backString.contains("\\")){
               String res="\\\\\"";
               backString=  backString.replaceAll(res,"\"").trim();
            }
         }else if (type.equals(URLTYPE_WEBSERVICE)) {//webserver请求
            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
            for (DockingSysIntParam dockingSysIntParam : dockingSysIntParamList) {
               params.add(dockingSysIntParam.getParamKey(), dockingSysIntParam.getParamValue());
            }
            paramString = sendString;
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            for (DockingSysIntHeader dockingSysIntHeader : dockingSysIntHeaderList) {
               headers.add(dockingSysIntHeader.getHeaderKey(), dockingSysIntHeader.getHeaderValue());
            }
            backString = WsErpClientUtil.sendMsg(url, namespace, soapaction, interfaceFunction, targName, sendString, 10000);
         } else {//corba接口
            //paramString=sendString;
            //  backString = jacorbClient.getBOFactoryService().sendCode(sendString);
         }
         ResultJsonDTO resultJsonDTO = new ResultJsonDTO();
         if(returnType.equals(DATATYPE_JSON)){
            resultJsonDTO =JSONObject.toJavaObject(JSONObject.parseObject(backString), ResultJsonDTO.class);
         }else {
            //组织返回接口信息
            XStream xStream = new XStream(new DomDriver());
            xStream.processAnnotations(ResultNodeDataDTO.class);
            xStream.autodetectAnnotations(true);
            ResultNodeDataDTO resultNodeDataDTO = (ResultNodeDataDTO) xStream.fromXML(backString);
            resultJsonDTO.setData(resultNodeDataDTO);
         }
         ResultNodeDataDTO resultNodeDataDTO=resultJsonDTO.getData();
         resultNodeObjectDTOS=resultNodeDataDTO.getObject();
      }catch (Throwable e){
         msg="调用接口失败:"+e.getMessage();
         e.printStackTrace();
         log.error("调用接口失败:"+e);
         //   throw  new Throwable("调用接口失败:"+e);
         ResultNodeObjectDTO   resultNodeObjectDTO=new ResultNodeObjectDTO();
         resultNodeObjectDTO.setErroid("1");
         resultNodeObjectDTO.setMsg(msg);
         resultNodeObjectDTO.setCode(dockingSystemConfig.getPushType().equalsIgnoreCase("2")?dockingTask.getClassifyId():dockingTask.getId());
         resultNodeObjectDTO.setItemid(dockingTask.getBtmOid());
         resultNodeObjectDTOS.add(resultNodeObjectDTO);
      }finally {
         boolean isSend = false;
         for (ResultNodeObjectDTO resultNodeObjectDTO:resultNodeObjectDTOS){
            String erroid = resultNodeObjectDTO.getErroid();
            msg = resultNodeObjectDTO.getMsg();
            if("0".equals(erroid)){
               isSend = true;
            }else if("1".equals(erroid)){
               isSend=false;
            }else{
               isSend=false;
            }
            DockingLog dockingLogeDO = new DockingLog();
            String oid=VciBaseUtil.getPk();
            dockingLogeDO.setOid(oid);
            dockingLogeDO.setSystemCode(dockingTask.getSystemCode());
            dockingLogeDO.setSystemName(dockingTask.getSystemName());
            dockingLogeDO.setSystemOid(dockingTask.getSystemOid());
            dockingLogeDO.setClassifyOid(dockingTask.getClassifyOid());
            dockingLogeDO.setClassifyId(dockingTask.getClassifyId());
            dockingLogeDO.setClassifyName(dockingTask.getClassifyName());
            dockingLogeDO.setCreateTime(new Date());
            dockingLogeDO.setId(dockingTask.getId());
            dockingLogeDO.setUniqueCode(dockingTask.getUniqueCode());
            dockingLogeDO.setParamString(paramString);
            dockingLogeDO.setReturnString(backString);
            dockingLogeDO.setInterfaceStatus(isSend?"true":"false");
            dockingLogeDO.setType(operation);
            dockingLogeDO.setMsg(msg);
            log.error("集成推送数据,systemcode:"+dockingTask.getSystemCode()+",systemname:"+dockingTask.getSystemName()+",url:"+url+",param:"+paramString+",e:"+msg);
            dockingLogeService.save(dockingLogeDO);
         }
         //全都接收成功的情况下,修改dockingtask sendflag为已发送
         if(isSend) {
            dockingTask.setSendFlag(MdmDuckingConstant.SEND_FLAG_TRUE);
            dockingTask.setLastModifyTime(new Date());
            dockingTaskService.updateById(dockingTask);
         }
      }
   }
   /**
    * 调用接口,传参为JSON时传object类型
    * @param sendObject
    * @param dockingSystemConfig
    * @param dockingTask
    * @param operation
    * @throws Throwable
    */
   private void callInterfaceByContentType(Object sendObject, DockingSystemConfig dockingSystemConfig,DockingTask dockingTask,String operation,String sendType) throws  Throwable{
      String paramString = "";
      String sendString = sendType.equals(DATATYPE_JSON) ? JSONObject.toJSON(sendObject).toString():sendObject.toString();
      String backString = "";
      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("接口已经停用!");
         }
         String type = dockingSystemConfig.getInterfaceType().toLowerCase(Locale.ROOT);//get/post/webserver/corba
         String paramType = dockingSystemConfig.getParamType();//xml/json
         String returnType = dockingSystemConfig.getReturnType();//xml/json
         String requestmethod= dockingSystemConfig.getRequestMethod();
         String interfaceFunction = dockingSystemConfig.getInterfaceFunction();//主要是webservice的方法名
         String namespace = dockingSystemConfig.getNamespace();//namespace
         String soapaction = dockingSystemConfig.getSoapAction();//soapaction
         String targName = dockingSystemConfig.getTargetName();//targName
         String cxfaxis = dockingSystemConfig.getCxfAxis();//webservice是cxf/axis
         //查询param
         List<DockingSysIntParam> dockingSysIntParamList = dockingSysIntParamService.list(Wrappers.<DockingSysIntParam>query().lambda().eq(DockingSysIntParam::getInfoOid,dockingSystemConfig.getOid()));
         //查询header
         List<DockingSysIntHeader> dockingSysIntHeaderList = dockingSysIntHeaderService.list(Wrappers.<DockingSysIntHeader>query().lambda().eq(DockingSysIntHeader::getInfoOid,dockingSystemConfig.getOid()));
         if(type.equals(URLTYPE_HTTP)) {
            if (requestmethod.equals(URLTYPE_GET)) {//GET请求
               String sendurl = url + "?" + DATA_PARAM_NAME + "=" + sendString;
               //拼接param
               for (DockingSysIntParam dockingSysIntParam : dockingSysIntParamList) {
                  sendurl = sendurl + "&" + dockingSysIntParam.getParamKey() + "=" + dockingSysIntParam.getParamValue();
               }
               paramString = sendurl;
               backString = HttpUtils.get(sendurl);
            } else if (requestmethod.equals(URLTYPE_POST)) {//POST请求
               MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
               for (DockingSysIntParam dockingSysIntParam : dockingSysIntParamList) {
                  params.add(dockingSysIntParam.getParamKey(), dockingSysIntParam.getParamValue());
               }
               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());
               }
               // TODO: 2024-02-25改,为了满足HR以及其他情况下根据Content-type的类型来发请求,并且param中的json是最后的时候发送请求再转
               backString = HttpUtils.postByMediaType(url, params, headers, MediaType.APPLICATION_FORM_URLENCODED);
               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);