| | |
| | | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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.nio.charset.StandardCharsets; |
| | | 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; |
| | |
| | | @Service |
| | | @Slf4j |
| | | public class CodeDuckingSyncServiceImpl implements ICodeDuckingSyncService { |
| | | |
| | | @Value("${dataSyncPush.dataParamName:xmlData}") |
| | | public String DATA_PARAM_NAME; |
| | | @Value("${dataSyncPush.dataId:itemid}") |
| | |
| | | |
| | | @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(); |
| | | |
| | | } |
| | | |
| | | /*** |
| | |
| | | }); |
| | | return R.success("手动推送完成,请核对是否推送成功"); |
| | | } |
| | | |
| | | private SearchItemDataVO initData(String status,String itemCode,String mmCode){ |
| | | SearchItemDataVO searchItemDataVO=new SearchItemDataVO(); |
| | | searchItemDataVO.setLastchangedon(new Date()); |
| | |
| | | } |
| | | 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="成功"; |
| | |
| | | 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); |
| | |
| | | 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); |
| | |
| | | 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; |
| | |
| | | } |
| | | } |
| | | }else{ |
| | | throw new Throwable("接口未返回信息"); |
| | | throw new Throwable("接口未返回信息"); |
| | | } |
| | | }catch (Throwable e1){ |
| | | e1.printStackTrace(); |
| | |
| | | } catch (Throwable e) { |
| | | e.printStackTrace(); |
| | | log.error(e.getMessage()); |
| | | throw new VciBaseException(e.getMessage()); |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | throw new ServiceException(e1.getMessage()); |
| | | } |
| | | } |
| | | |
| | |
| | | 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); |
| | | } |
| | | |
| | | /*** |
| | |
| | | } |
| | | return codeOrderSecDTOList; |
| | | } |
| | | |
| | | /*** |
| | | * 读取属性映射配置信息 |
| | | * @param systemId |
| | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | for (DockingTask dockingTask:dockingTaskList){ |
| | | //每个task一个事务,开启 |
| | | String paramString=""; |
| | | String sendString=""; |
| | | Object sendString=""; |
| | | String backString=""; |
| | | //查询系统接口信息,ip method,dataType |
| | | String systeminfooid = dockingTask.getSysInfoOid();//sysininfo 的oid |
| | |
| | | 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()); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | /*** |
| | | * 发送编码主数据 |
| | | */ |
| | | 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 |
| | |
| | | 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); |
| | | } |
| | |
| | | } |
| | | 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); |
| | |
| | | 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()); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | /*** |
| | | * 调用接口 |
| | | * @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 |
| | |
| | | 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); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | /*** |
| | | * 查询需要集成的业务数据任务 |
| | | */ |
| | | private void sendpushDataForService (){ |
| | | private void sendpushDataForService(){ |
| | | initSysadmin(); |
| | | //查询哪些任务还没有执行完成 |
| | | //VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(DockingTaskDO.class); |
| | |
| | | */ |
| | | 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)); |
| | |
| | | List<DockingTask> dockingTaskDOS = dockingTaskService.list(queryWrapper); |
| | | sendpushClsfForService(dockingTaskDOS); |
| | | } |
| | | |
| | | public void initSysadmin(){ |
| | | SessionInfo sessionInfo = new SessionInfo(); |
| | | sessionInfo.setUserId("sysAdmin"); |
| | |
| | | sessionInfo.setUserSecret(UserSecretEnum.PRIVACY.getValue()+""); |
| | | WebUtil.setSessionInfo(sessionInfo); |
| | | } |
| | | |
| | | /** |
| | | * dockingdata根据oid修改sendflag |
| | | * @param oid |
| | |
| | | } |
| | | return u; |
| | | } |
| | | |
| | | } |
| | | |