Commit 7f52d38b authored by wanglang's avatar wanglang

数据推送

parent 479df7fa
...@@ -37,6 +37,35 @@ ...@@ -37,6 +37,35 @@
<version>2.5.6</version> <version>2.5.6</version>
</dependency> </dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.4</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.26</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
......
package com.example.data_push.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author hl
* @Date 2022-10-31 09:33
* 省平台参数
*/
@Component
@ConfigurationProperties(prefix = "zyb")
@Data
public class ZybConfig {
/**
* 机构编码
*/
private String userId;
/**
* 机构名称
*/
private String name;
/**
* 机构密码
*/
private String password;
/**
* 私钥
*/
private String privateKey;
/**
* 申报地址
*/
private String url;
/**
* 填报人/报告人
*/
private String person;
/**
* 填报人电话/报告电话
*/
private String phone;
private String aa = "2233";
}
package com.example.data_push.controller;
import com.baomidou.mybatisplus.extension.api.R;
import com.example.data_push.dto.DataDto;
import com.example.data_push.service.PushDataService;
import com.example.data_push.vo.ZybVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
@RestController
@RequestMapping("pushData")
@Api(value = "数据推送调用", tags = {"pushData调用"})
public class PushDataController {
@Autowired
private PushDataService pushDataService;
@ApiOperation(value = "数据推送", response = ZybVo.class)
@PostMapping(value = "/push")
public R pushData(@RequestBody @Validated DataDto dto) throws Exception {
return pushDataService.pushData(dto);
}
}
package com.example.data_push.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
@Data
public class DataDto implements Serializable {
@ApiModelProperty(value = "用户原始数据")
private String dataJson;
}
package com.example.data_push.service;
import com.baomidou.mybatisplus.extension.api.R;
import com.example.data_push.dto.DataDto;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
public interface PushDataService {
/**
* 数据推送
* @param dto
* @return
*/
R pushData(DataDto dto) throws Exception;
}
package com.example.data_push.service.impl;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.api.R;
import com.example.data_push.config.ZybConfig;
import com.example.data_push.dto.DataDto;
import com.example.data_push.service.PushDataService;
import com.example.data_push.util.JsonToXml2;
import com.example.data_push.vo.ZybVo;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @Author: wl
* @Date: 2023/3/24
* @Description:
*/
@Slf4j
@Service
public class PushDataServiceImpl implements PushDataService {
@Autowired
private ZybConfig zybConfig;
@Override
public R pushData(DataDto dto) throws Exception {
if (StringUtils.isEmpty(dto.getDataJson())){
return R.failed("无法获取到推送数据");
}
log.info("获取原始数据成功,原始数据为:"+dto.getDataJson());
String result = HttpUtil.post(zybConfig.getUrl(), dto.getDataJson());
log.info("调用省直平台成功,转义前:" + result);
result = StringEscapeUtils.unescapeXml(result);
log.info("转义后:" + result);
if (!result.contains("<data>")){
return R.failed("调用省直平台推送失败");
}
String substring = result.substring(result.indexOf("<data>"), result.indexOf("</data>") + 7);
//获取data数据
JSONObject jsonObject = JsonToXml2.xmltoJson(substring).getJSONObject("data");
log.info("获取data数据:" + new Gson().toJson(jsonObject));
ZybVo zybVo = JSON.toJavaObject(jsonObject, ZybVo.class);
log.info("实体类转换后:" + new Gson().toJson(zybVo));
if ("-1".equals(zybVo.getReturnCode())) {
return R.failed(zybVo.getMessage() + "," + zybVo.getErrorList().getError().getMessage());
}
log.info("单位申报成功");
return R.ok(zybVo);
}
}
package com.example.data_push.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
public class JsonToXml2 {
private static final String STR_JSON = "{\"stakeapply\":{\"voltageLevel\":\"AC00062\",\"stakeList\":{\"stake\":[{\"stakeAssetNO\":45754745,\"otherStakeTypeRemark\":\"xxx\",\"stationId\":\"547547547547\"},{\"stakeAssetNO\":34325325322,\"otherStakeTypeRemark\":\"xxx\",\"stationId\":\"52354645462\"}]},\"otherStationTypeRemark\":\"xxx\",\"stationAddr\":\"哈哈\",\"custLists\":{\"custList\":{\"custId\":\"7547547547\",\"custPhone\":13666666666,\"contactMode\":1}},\"principalList\":{\"principal\":[{\"principalName\":121212,\"principalType\":1},{\"principalName\":12121233,\"principalType\":1}]}}}";
/**
* 将json字符串转换成xml
*
* @param json json字符串
* @param parentElement xml根节点
*/
public static Element jsonToXml(String json, Element parentElement) {
JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject();
return toXml(jsonObject, parentElement, null);
}
/**
* 将json字符串转换成xml
*
* @param jsonElement 待解析json对象元素
* @param parentElement 上一层xml的dom对象
* @param name 父节点
*/
public static Element toXml(JsonElement jsonElement, Element parentElement, String name) {
if (jsonElement instanceof JsonArray) {
//是json数据,需继续解析
JsonArray sonJsonArray = (JsonArray) jsonElement;
for (int i = 0; i < sonJsonArray.size(); i++) {
JsonElement arrayElement = sonJsonArray.get(i);
toXml(arrayElement, parentElement, name);
}
} else if (jsonElement instanceof JsonObject) {
//说明是一个json对象字符串,需要继续解析
JsonObject sonJsonObject = (JsonObject) jsonElement;
Element currentElement = null;
if (name != null) {
currentElement = parentElement.addElement(name);
}
Set<Entry<String, JsonElement>> set = sonJsonObject.entrySet();
for (Entry<String, JsonElement> s : set) {
toXml(s.getValue(), currentElement != null ? currentElement : parentElement, s.getKey());
}
} else {
//说明是一个键值对的key,可以作为节点插入了
addAttribute(parentElement, name, jsonElement.getAsString());
}
return parentElement;
}
/**
* @param element 父节点
* @param name 子节点的名字
* @param value 子节点的值
*/
public static void addAttribute(Element element, String name, String value) {
//增加子节点,并为子节点赋值
Element el = element.addElement(name);
el.addText(value);
}
/**
* 将xml转换为JSON对象
*
* @param xml xml字符串
* @return
* @throws Exception
*/
public static JSONObject xmltoJson(String xml) throws Exception {
JSONObject jsonObject = new JSONObject();
Document document = DocumentHelper.parseText(xml);
//获取根节点元素对象
Element root = document.getRootElement();
iterateNodes(root, jsonObject);
return jsonObject;
}
/**
* 遍历元素
*
* @param node 元素
* @param json 将元素遍历完成之后放的JSON对象
*/
@SuppressWarnings("unchecked")
public static void iterateNodes(Element node, JSONObject json) {
//获取当前元素的名称
String nodeName = node.getName();
//判断已遍历的JSON中是否已经有了该元素的名称
if (json.containsKey(nodeName)) {
//该元素在同级下有多个
Object Object = json.get(nodeName);
JSONArray array = null;
if (Object instanceof JSONArray) {
array = (JSONArray) Object;
} else {
array = new JSONArray();
array.add(Object);
}
//获取该元素下所有子元素
List<Element> listElement = node.elements();
if (listElement.isEmpty()) {
//该元素无子元素,获取元素的值
String nodeValue = node.getTextTrim();
array.add(nodeValue);
json.put(nodeName, array);
return;
}
//有子元素
JSONObject newJson = new JSONObject();
//遍历所有子元素
for (Element e : listElement) {
//递归
iterateNodes(e, newJson);
}
List<Attribute> attss = node.attributes();
// 获取book属性名和属性值
for (Attribute att : attss) {
newJson.put(att.getName(), att.getValue());
// System.out.println("节点名:" + att.getName() + "节点值:" + att.getValue());
}
array.add(newJson);
json.put(nodeName, array);
return;
}
//该元素同级下第一次遍历
//获取该元素下所有子元素
List<Element> listElement = node.elements();
if (listElement.isEmpty()) {
//该元素无子元素,获取元素的值
String nodeValue = node.getTextTrim();
json.put(nodeName, nodeValue);
return;
}
//有子节点,新建一个JSONObject来存储该节点下子节点的值
JSONObject object = new JSONObject();
//遍历所有一级子节点
for (Element e : listElement) {
//递归
iterateNodes(e, object);
}
List<Attribute> attss = node.attributes();
// 获取book属性名和属性值
for (Attribute att : attss) {
object.put(att.getName(), att.getValue());
// System.out.println("节点名:" + att.getName() + "节点值:" + att.getValue());
}
json.put(nodeName, object);
return;
}
/* public static void main(String[] args) throws Exception {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("data"); //默认根节点
ZybContactHazardFactor contactHazardFactor=new ZybContactHazardFactor();
contactHazardFactor.setHazardCode("331");
ZybContactHazardFactor contactHazardFactor2=new ZybContactHazardFactor();
contactHazardFactor2.setHazardCode("331");
List<ZybContactHazardFactor>list=new ArrayList<>();
list.add(contactHazardFactor);
list.add(contactHazardFactor2);
ZybReportCard zybReportCard=new ZybReportCard();
Map<String,List<ZybContactHazardFactor>> listMap=new HashMap<>();
listMap.put("contactHazardFactor",list);
zybReportCard.setContactHazardFactorList(listMap);
Element el = jsonToXml(new Gson().toJson(zybReportCard), root);
System.out.println(el.asXML());
}*/
/*
json串
{
"stakeapply": {
"voltageLevel": "AC00062",
"stakeList": {
"stake": [
{
"stakeAssetNO": 45754745,
"otherStakeTypeRemark": "xxx",
"stationId": "547547547547"
},
{
"stakeAssetNO": 34325325322,
"otherStakeTypeRemark": "xxx",
"stationId": "52354645462"
}
]
},
"otherStationTypeRemark": "xxx",
"stationAddr": "哈哈",
"custLists": {
"custList": {
"custId": "7547547547",
"custPhone": 13666666666,
"contactMode": 1
}
},
"principalList": {
"principal": [
{
"principalName": 121212,
"principalType": 1
},
{
"principalName": 12121233,
"principalType": 1
}
]
}
}
}
*/
/*
转换后的xml
<?xml version="1.0" encoding="UTF-8"?>
<stakeapply>
<voltageLevel>AC00062</voltageLevel>
<stakeList>
<stake>
<stakeAssetNO>45754745</stakeAssetNO>
<otherStakeTypeRemark>xxx</otherStakeTypeRemark>
<stationId>547547547547</stationId>
</stake>
<stake>
<stakeAssetNO>34325325322</stakeAssetNO>
<otherStakeTypeRemark>xxx</otherStakeTypeRemark>
<stationId>52354645462</stationId>
</stake>
</stakeList>
<otherStationTypeRemark>xxx</otherStationTypeRemark>
<stationAddr>哈哈</stationAddr>
<custLists>
<custList>
<custId>7547547547</custId>
<custPhone>13666666666</custPhone>
<contactMode>1</contactMode>
</custList>
</custLists>
<principalList>
<principal>
<principalName>121212</principalName>
<principalType>1</principalType>
</principal>
<principal>
<principalName>12121233</principalName>
<principalType>1</principalType>
</principal>
</principalList>
</stakeapply>
*/
}
\ No newline at end of file
package com.example.data_push.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author hl
* @Date 2022-10-31 10:50
*/
@Data
public class ZybError {
@ApiModelProperty(value = "请求错误响应码")
private String code;
@ApiModelProperty(value = "机构组织代码")
private String orgCode;
@ApiModelProperty(value = "请求错误响应提示")
private String message;
}
package com.example.data_push.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author hl
* @Date 2022-10-31 10:50
*/
@Data
public class ZybExtraInfo {
@ApiModelProperty(value = "请求响应总数")
private String total;
@ApiModelProperty(value = "请求响应成功数")
private String successTotal;
@ApiModelProperty(value = "请求响应失败数")
private String errorTotal;
}
package com.example.data_push.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author hl
* @Date 2022-10-31 10:53
*/
@Data
public class ZybList {
@ApiModelProperty(value = "请求错误响应")
private ZybError error;
}
package com.example.data_push.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author hl
* @Date 2022-10-31 10:48
* 返回体
*/
@Data
public class ZybVo {
@ApiModelProperty(value = "请求返回码")
private String returnCode;
@ApiModelProperty(value = "错误数据集合")
private ZybList errorList;
@ApiModelProperty(value = "请求提示语")
private String message;
@ApiModelProperty(value = "请求成功数据")
private ZybExtraInfo extraInfo;
}
...@@ -35,3 +35,18 @@ spring: ...@@ -35,3 +35,18 @@ spring:
zyb:
#申报地址
url: http://47.99.104.188:8083/ws_data/ws/TJ?wsdl
#机构编码
userId: 420502015
#机构名称
name: 宜昌市疾病预防控制中心
#机构密码
password: ycjk420502015#zyb
#填报人/报告人
person: 徐兵
#填报人电话/报告电话
phone: 15971628128
#私钥
privateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCzvxunu6Ijjzi6w5SvF+l4pfFR/wkO9tK7Mc25BkoIBcBrQAragOJ5DPZnq5Z+Bwm4yMTwWtlQTR/m9jG/t0yKWv5D715kuvJsZxk5ymkYU6PJ8E0WXp9Xkb3rsNaLCpwPQcQb3Hfvqtdbk7J56jjIMTGVNDYpQvvEQsZuoE64QKmsDV+FEcSAl8NBdZ2tblyafk7zn26HyEfuOJ8TXSdQ1HwQQAUP+ko0WSzTVDi4VkBbTlTzY74S4JughXIsSSWTXlRnsb/MHAFmA/7FEjMkLARPYUB1QBUZ0/lSy315B6HG3hBmT+W7nQMfz1jnHkbA6B3FFGmBV4Qtd7FjvVHZAgMBAAECggEBAJ8KEisoTv8No1FE6hK+oppYoZw+f0JZS/3LxE3Y7boJdMawpKnO7hPTT1ZNMVwTWBvCsNZGXA+8HeUaoswSIEwu1NlBO5D/BK67zkse+DxJDRwJXfvT/0LZNmULU9k0qv6o3x8TxJ8v11s05O8QOeuP82IkD2QU23U87BxIBT7qpCfRXw/Zh9pBAEYCsRK1kfpci7TaP9KMh5BkED5PGkny7/RAuYaQGSNyM8eskmIOURAMrMxjiBGRL/LN7GK/edB9DacjTQxFMil6aCi++jQxiP8FCP8rTd789rEEADxAo/Q8izd9cnzWhXepqqf0/dlVmvaHFMsxvGeSyC6RHu0CgYEA3Z3PcvQZ7IEN1Bb8ghjJCu7mlJkTNdCYjs9NlRkqaG7045nhdvhHkdyvjCUfC07Ru5y7zGUu4UuRqXjqK3992uE3E5rklxERFc2sWRhW5osA9xSrxkJ0Wmcm09KcoXH2VN9IIPDIvxyPs64E71B0jm8dqGCvsgST5S+MsIvN/SsCgYEAz6JNc49+0pdOcndF1YZtZfqEkmgwiothott9BjJW6K1FMYEgDBANqnpEwfkRUNwwRCwVDX9gM0gHcRsyeQOHDM0CUGNEJ4J3VQsp+BEwfWYIa9lStJC7c6muBIJWvLL+NcEJu66wBwYAEa0sXuOFf2BN/cTEl1ZzSFmzUzwr0wsCgYEArWcAXdLPwfUMq+m8c9MO44YgVx8bH91ysTNVYhdJzmMbLEdIWj1USrYhiYe2LbPjeWfercRyFQh7Fd6tY5GjGTNlU+q7d9R7yNKgSyo3PLaA79N1wHBY+C+D+vPtaIlyE+CNYHDmslqXuiCsbdBHEvewfgIBF0prqkU1USJi7/cCgYEAwpWOFCCEcANQh0Fz9rm2SH3QRAzUgOJCrAcaUfZXMFNBpzUlvWhGBl/zk/1A1xCjQyA00qNummCEaOFeGb7Oj5aI9qEwu/4uq0p9GHezg7FdbwUJ1yJUKf74kE090DXGusWfw33ghZR/+BDcpkh/UXIFZS9ENbfU7hbyUazwPSUCgYA2cuIVgWX4c3wkqgrZfFq7xhfMU7sPqqkPwao1hYpyACiF1LmL39FB+hFP68ZRYPVC1qWDdmSnxk/nXbEwvMormDtqxFWVttjxPDqnr3uQjbsuK3t9GFHmdrQB7kUzp0O7LJX6+4FxPTgd9MYcRJhXhHQ3JA02IiMqK7991fvnTA==
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment