package com.ann.demo.service; import com.alibaba.fastjson.JSON; import com.ann.demo.utils.HttpClientUtils; import com.ann.demo.utils.JsonUtils; import com.ann.demo.utils.Md5Utils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.axis.client.Call; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import javax.xml.rpc.encoding.XMLType; import org.apache.axis.client.Service; import org.apache.axis.utils.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.rmi.RemoteException; import java.text.SimpleDateFormat; import java.util.*; /** * @author 曾文和 * @description: 外送报告采集类 * @createTime 2023/9/5 16:48 */ @Component @Slf4j public class CollectCheckService { private Map tokenCacheMap = new HashMap<>(); private String FILENAME = "fileName"; private String FILEBASE64 = "fileBase64"; @Value("${siteCode}") private String siteCode; @Value("${customerCode}") private String customerCode; @Value("${collectionLocation}") private String collectionLocation; @Value("${loginUrl}") private String loginUrl; @Value("${namespaceURI}") private String namespaceURI; @Value("${webServiceMethod}") private String webServiceMethod; @Value("${webServiceDownMethod}") private String webServiceDownMethod; @Value("${downfileUrl}") private String downfileUrl; public boolean downFileWithCheck(String masterId,String hospBarcode,String reportOdd,String fileUrl) { //登录 String token = getTokenByCheckKey(siteCode, customerCode, collectionLocation); System.out.println("获取token:"+token); //下载 return downFileWithCheck(masterId,hospBarcode,reportOdd,fileUrl,token); } /** * 下载文件 * @param masterId * @param hospBarcode * @param reportOdd * @param fileUrl * @param token * @return */ private boolean downFileWithCheck(String masterId,String hospBarcode,String reportOdd,String fileUrl,String token){ //根据参数请求接口返回json数据 String result = reqInterfaceByParam(hospBarcode, reportOdd, fileUrl, token); //解析返回json数据 Map map = analysisData(result); //唯一文件码 String serialnum = hospBarcode + "_" + reportOdd; //根据解析的数据调用下载 String reqResult = downFile(masterId,map,serialnum); if(!StringUtils.isEmpty(reqResult)) { String code = JsonUtils.getValueByKey(reqResult, "code"); if(!StringUtils.isEmpty(code) && "0".equals(code)){ return true; } } return false; } /** * 根据解析的数据调用下载 * @param map */ private String downFile(String masterId,Map map,String serialnum) { if(!CollectionUtils.isEmpty(map)){ //设置下载参数 Map rootMap = setDownReqParams(masterId, map, serialnum); //调用下载接口 String result = HttpClientUtils.doPost(downfileUrl,JSON.toJSONString(rootMap)); log.info("上传下载服务result:"+result); System.out.println("上传下载服务result:"+result); return result; } return null; } /** * 设置下载请求参数 * @param masterId * @param map * @param serialnum * @return */ private Map setDownReqParams(String masterId, Map map, String serialnum) { //设置文件信息参数 Map scanfilesMap = new HashMap<>(); scanfilesMap.put("taskid",-1); scanfilesMap.put("filetitle", map.get(FILENAME)); scanfilesMap.put("filesource",1); scanfilesMap.put("filestoragetype",1); scanfilesMap.put("filetype",2); scanfilesMap.put("downurl", map.get(FILEBASE64)); scanfilesMap.put("serialnum", serialnum +"1"); List> scanfilesList = new ArrayList<>(); scanfilesList.add(scanfilesMap); //设置患者信息参数 Map patientMap = new HashMap<>(); patientMap.put("patientid", masterId); //设置全部参数 Map rootMap = new HashMap<>(); rootMap.put("collectorid","10"); rootMap.put("ip","127.0.0.1"); rootMap.put("assortid","10"); rootMap.put("patient",patientMap); rootMap.put("scanfiles",scanfilesList); rootMap.put("scanusercode","zwh"); rootMap.put("scanusername","zwh"); return rootMap; } /** * 解析返回json数据 * @param result */ private Map analysisData(String result) { Map map = new HashMap<>(); if(!StringUtils.isEmpty(result)) { ObjectMapper objectMapper = new ObjectMapper(); //解析 try { // 将JSON字符串转换为Map对象 JsonNode jsonNode = objectMapper.readTree(result); String fileName = jsonNode.get("result").get("fileName").asText(); if (!StringUtils.isEmpty(fileName)) { fileName = fileName.substring(0, fileName.length() - 4); } map.put(FILENAME,fileName); String fileBase64 = jsonNode.get("result").get("file").asText(); map.put(FILEBASE64,fileBase64); } catch (IOException e) { e.printStackTrace(); } } return map; } /** * 根据参数请求接口 * @param hospBarcode * @param reportOdd * @param fileUrl * @param token * @return */ private String reqInterfaceByParam(String hospBarcode, String reportOdd, String fileUrl, String token) { Map paramMap = new HashMap<>(); paramMap.put("siteCode",siteCode); paramMap.put("customerCode",customerCode); paramMap.put("collectionLocation",collectionLocation); paramMap.put("hospBarcode", hospBarcode); paramMap.put("reportOdd", reportOdd); paramMap.put("fileUrl", fileUrl); String paramStr = JSON.toJSONString(paramMap); String jsonMd5 = Md5Utils.strToMd5(paramStr); //调用webService Object[] objects = {jsonMd5, token, paramStr}; String[] params ={"md5","token","postJson"}; String result = null; try { result = getWebService(loginUrl,namespaceURI,webServiceDownMethod,params,objects); } catch (Exception e) { e.printStackTrace(); log.info("调用接口失败:"+objects.toString()); } return result; } /** * 登录 * @param siteCode * @param customerCode * @param collectionLocation * @return */ private String getTokenByCheckKey(String siteCode,String customerCode,String collectionLocation){ //组织协定秘钥secretKey SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); String toDay = fmt.format(new Date()); //判断token是否存在 String token = tokenCacheMap.get(toDay); if(!StringUtils.isEmpty(token)){ //取缓存 return token; } String secretKey = collectionLocation + customerCode + siteCode + toDay; //MD5转换 String secretKeyMd5 = Md5Utils.strToMd5(secretKey); //调用第三方webService接口登录 //实例化org.apache.axis.client.Service对象 //创建service调用对象 Object[] objects = {siteCode, customerCode, collectionLocation, secretKeyMd5}; String[] params ={"siteCode","customerCode","collectionLocation","secretKey"}; String result = getWebService(loginUrl,namespaceURI,webServiceMethod,params,objects); ObjectMapper objectMapper = new ObjectMapper(); //解析 try { // 将JSON字符串转换为Map对象 JsonNode jsonNode = objectMapper.readTree(result); token = jsonNode.get("result").get("token").asText(); } catch (IOException e) { e.printStackTrace(); } if(!StringUtils.isEmpty(token)) { //存缓存 tokenCacheMap.clear(); tokenCacheMap.put(toDay, token); } return token; } /** * 调用webService * @return */ private String getWebService(String webServiceUrl,String namespaceURI,String webServiceMethod,String[] params,Object[] objects ){ try { Service service = new Service(); Call call; call=(Call) service.createCall(); QName opAddEntry = new QName(namespaceURI, webServiceMethod); //设置命名空间和需要调用的方法名 call.setTargetEndpointAddress(webServiceUrl); //设置请求路径 call.setOperationName(webServiceMethod); //调用的方法名 call.setTimeout(Integer.valueOf(2000)); //设置请求超时 //按顺序设置请求参数、请求类型,多个需多添加参数 for(String param : params){ call.addParameter(param, XMLType.XSD_STRING, ParameterMode.IN); } call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型 return (String) call.invoke(opAddEntry,objects); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } return null; } }