Files
gzh-server/src/main/java/com/guahao/h5/hsjc/service/HsjcService.java

2003 lines
84 KiB
Java
Raw Normal View History

package com.guahao.h5.hsjc.service;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.setting.Setting;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.guahao.api.task.mapper.AdminSystemMapper;
import com.guahao.api.task.mapper.UserMzjfMapper;
import com.guahao.api.task.model.AdminSystem;
import com.guahao.api.task.model.UserMzjf;
import com.guahao.api.walkinto.model.JhClientInfo;
import com.guahao.common.Exception.LogicException;
import com.guahao.common.util.*;
import com.guahao.h5.hsjc.mapper.PhysicalMapper;
import com.guahao.h5.hsjc.vo.*;
import com.guahao.h5.hsjc.mapper.HsjcMapper;
import com.guahao.h5.reserve.service.Reserve8Service;
import com.guahao.h5.user.mapper.UserCardMapper;
import com.guahao.h5.user.model.UserCardVo;
import com.guahao.h5.user.model.UserVo;
import com.guahao.h5.user.service.UserService;
// sang:注释icbc部分
// import com.icbc.api.utils.IcbcSignature;
// import com.icbc.api.utils.WebUtils;
import com.itextpdf.text.DocumentException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.xml.sax.SAXException;
import tk.mybatis.mapper.entity.Example;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.StringReader;
import org.xml.sax.InputSource;
import java.util.Map;
@Service
public class HsjcService {
// @Autowired
// private JhPayServiceImpl jhPayService;
private Logger log = LoggerFactory.getLogger(HsjcService.class);
//joju微信APPID
//public static final String WX_APP_ID="wx7a0981df44f66897";
public static final String WX_APP_ID = "wx45acd2b4907cb8f4";
//joju微信AppSecret
//public static final String WX_SECRET="4c329fa399103dd27edd84617c620e8e";
public static final String WX_SECRET = "895b90585c4698485c07e113711eac85";
@Autowired
private UserMzjfMapper userMzjfMapper;
@Autowired
private AdminSystemMapper adminSystemMapper;
@Autowired
private PhysicalMapper physicalMapper;
@Autowired
private HsjcMapper hsjcMapper;
// @Autowired
// private PayService payService;
@Autowired
private Reserve8Service reserve8Service;
@Autowired
private UserService userService;
@Autowired
private UserCardMapper userCardMapper;
@Autowired
private TXSendMsg txSendMsg;
@Autowired
private DateUtils dateUtils;
/**
* 查询PACS报告单
*
* @param
* @return
*/
public JSONObject MOP_OutpLisReportQuery(String QueryCode, String StartTime, String EndTime) throws Exception {
JSONObject resSuc = new JSONObject();
String strPdfUrl = "";
StringBuffer str = new StringBuffer();
str.append("<QueryCode>");
str.append(QueryCode);
str.append("</QueryCode>");
str.append("<StartTime>");
str.append(StartTime);
str.append("</StartTime>");
str.append("<EndTime>");
str.append(EndTime);
str.append("</EndTime>");
String reqXml = requestXml("MOP_OutpPacsReptMasterQuery", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpPacsReptMasterQuery:" + reqXml);
log.debug("MOP_OutpPacsReptMasterQuery:" + respXml);
// 解析报文
List<Map<String, Object>> maplist = XmlUtil.getPacsRes(respXml, "MOP_OutpPacsReptMasterQuery");
if (maplist.get(0).get("returncode").toString().equals("1")) {
for (int i = 0; i < maplist.size(); i++) {
if (maplist.get(i).get("pdfurl") != null) {
//ftp 文件地址
String pdfname = FileUtil.getName(maplist.get(i).get("pdfurl").toString());
log.debug("pdfname:" + pdfname);
if (!pdfname.equals("")) {
PasDownloadPdf(pdfname);
}
}
}
JSONArray allrate = JSONArray.parseArray(JSON.toJSONString(maplist));
resSuc.put("response", allrate);
}
return resSuc;
}
public Map<String, Object> opTiQuery(String hospitalZone, String startDate, String endDate,String type) {
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> dataList = new ArrayList<>();
try {
StringBuffer str = new StringBuffer();
str.append("&lt;HospitalZone&gt;");
str.append(hospitalZone);
str.append("&lt;/HospitalZone&gt;");
str.append("&lt;StartDate&gt;");
str.append(startDate);
str.append("&lt;/StartDate&gt;");
str.append("&lt;EndDate&gt;");
str.append(endDate);
str.append("&lt;/EndDate&gt;");
str.append("&lt;class&gt;");
str.append(type);
str.append("&lt;/class&gt;");
String respXml = SoapUtil.soapMethod4(str.toString(),"mop_canreservationphysicalprogram");
// log.debug("【原始SOAP响应】:\n{}", respXml);
// 解析SOAP响应
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析外层SOAP响应
Document soapDoc = builder.parse(new InputSource(new StringReader(respXml)));
NodeList resultNodes = soapDoc.getElementsByTagName("mop_canreservationphysicalprogramResult");
if (resultNodes.getLength() > 0) {
String innerXml = resultNodes.item(0).getTextContent();
// 解析内层XMLCDATA内容
Document innerDoc = builder.parse(new InputSource(new StringReader(innerXml)));
NodeList responseNodes = innerDoc.getElementsByTagName("response");
if (responseNodes.getLength() > 0) {
Element responseElement = (Element) responseNodes.item(0);
// 检查返回结果
NodeList returnResultNodes = responseElement.getElementsByTagName("returnresult");
if (returnResultNodes.getLength() > 0) {
Element returnResult = (Element) returnResultNodes.item(0);
String returnCode = getElementText(returnResult, "returncode");
String errorMsg = getElementText(returnResult, "errormsg");
result.put("returncode", returnCode);
result.put("errormsg", errorMsg);
// 如果返回成功,解析数据
if ("1".equals(returnCode)) {
NodeList dataRows = responseElement.getElementsByTagName("data_row");
for (int i = 0; i < dataRows.getLength(); i++) {
Element dataRow = (Element) dataRows.item(i);
Map<String, Object> item = new HashMap<>();
item.put("program_id", getElementText(dataRow, "program_id"));
item.put("program_name", getElementText(dataRow, "program_name"));
item.put("booking_date", getElementText(dataRow, "booking_date"));
item.put("price", getElementText(dataRow, "price"));
item.put("category", getElementText(dataRow, "category"));
item.put("description", getElementText(dataRow, "description"));
dataList.add(item);
}
}
}
}
}
result.put("data", dataList);
} catch (Exception e) {
log.error("解析SOAP响应失败", e);
result.put("returncode", "0");
result.put("errormsg", "解析响应失败: " + e.getMessage());
result.put("data", Collections.emptyList());
}
return result;
}
private String getElementText(Element parent, String tagName) {
NodeList nodes = parent.getElementsByTagName(tagName);
if (nodes.getLength() > 0) {
return nodes.item(0).getTextContent();
}
return "";
}
public Map<String, Object> getDetail(String programId, String bookindDate,String Type) {
try {
StringBuffer str = new StringBuffer();
str.append("&lt;program_id&gt;");
str.append(programId);
str.append("&lt;/program_id&gt;");
str.append("&lt;booking_date&gt;");
str.append(bookindDate);
str.append("&lt;/booking_date&gt;");
str.append("&lt;class&gt;");
str.append(Type);
str.append("&lt;/class&gt;");
String respXml = SoapUtil.soapMethod4(str.toString(),"mop_queryphysicalprogramdetail");
// log.debug("【原始SOAP响应】:\n{}", respXml);
Map<String, Object> map = XmlUtil.parse(respXml);
log.info("map:" + map);
// 解析SOAP响应
return map;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Map<String, Object> opTjYy(AppointmentSubmitVO vo, Integer userId) {
log.info("收到预约请求: {}", vo);
try {
String hisDate = DateUtils.getHisDate();
// 判断当天是否已预约(精确到天)
if (physicalMapper.IsselectByIdCard(vo.getIdCard(), vo.getBookingdate())) {
throw new RuntimeException("该就诊人 [" + vo.getUsername() + "] 已有该天的体检预约,不可重复预约!");
}
// 判断是否有未过期的预约(防止跨天重复)
if (physicalMapper.existsValidAppointmentByIdCard(vo.getIdCard(), hisDate)) {
throw new RuntimeException("该就诊人 [" + vo.getUsername() + "] 已有未过期的预约,不可重复预约!");
}
// 1. 拼接 SOAP 请求(略,保留你原有的 str 拼接逻辑)
StringBuffer str = new StringBuffer();
str.append("&lt;booking_date&gt;").append(vo.getBookingdate()).append("&lt;/booking_date&gt;");
str.append("&lt;programs&gt;");
List<ProgramDetailVO> programDetails = vo.getProgramDetails();
StringBuilder programIdsBuilder = new StringBuilder(); // 用于拼接所有 programId
if (programDetails != null && !programDetails.isEmpty()) {
for (int i = 0; i < programDetails.size(); i++) {
ProgramDetailVO detail = programDetails.get(i);
String programId = detail.getProgramId();
// 拼接到 SOAP
str.append("&lt;program&gt;");
str.append("&lt;program_id&gt;").append(programId).append("&lt;/program_id&gt;");
str.append("&lt;time_period&gt;").append(detail.getTimePeriod()).append("&lt;/time_period&gt;");
str.append("&lt;time&gt;").append(detail.getTime()).append("&lt;/time&gt;");
str.append("&lt;class&gt;").append(detail.getType()).append("&lt;/class&gt;");
str.append("&lt;/program&gt;");
// 拼接到本地存储的字符串101,102,103
if (i > 0) programIdsBuilder.append(",");
programIdsBuilder.append(programId);
}
}
str.append("&lt;/programs&gt;");
// 继续拼接其他字段...
str.append("&lt;booking_time&gt;").append(vo.getBookingtime()).append("&lt;/booking_time&gt;");
str.append("&lt;name&gt;").append(vo.getUsername()).append("&lt;/name&gt;");
str.append("&lt;gender&gt;").append(vo.getGender()).append("&lt;/gender&gt;");
str.append("&lt;age&gt;").append(vo.getAge()).append("&lt;/age&gt;");
str.append("&lt;phone&gt;").append(vo.getPhone()).append("&lt;/phone&gt;");
str.append("&lt;idCard&gt;").append(vo.getIdCard()).append("&lt;/idCard&gt;");
str.append("&lt;location&gt;用户住址暂无&lt;/location&gt;");
// 调用外部接口
String respXml = SoapUtil.soapMethod4(str.toString(), "mop_bookingphysical");
Map<String, Object> resultMap = XmlUtil.parse(respXml);
log.info("SOAP响应结果: {}", resultMap);
// 2. 获取拼接好的 programIds 字符串
String programIds = programIdsBuilder.toString(); // 如 "101,102,103"
// 3. 插入本地记录(假设 insertInfo 方法已扩展)
physicalMapper.insertInfo(
userId,
vo.getUsername(),
vo.getPhone(),
vo.getIdCard(),
vo.getBookingdate(),
(String) resultMap.get("program_id"), // 主套餐ID
programIds // 新增子项目ID列表
);
// 4. 发送通知
UserVo userVo = userService.queryUserInfoDetails(userId);
txSendMsg.SendNotifyYY(
"预约体检成功",
userVo.getOpenid(),
vo.getUsername(),
vo.getPhone(),
vo.getBookingdate(),
"武警宁夏总队医院",
resultMap.get("program_id"),
"KASRtwl48DvmJS5It4y6dlzfDLOdX9rV8MRCkRMz6bQ"
);
return resultMap;
} catch (Exception e) {
log.error("预约失败", e);
throw new RuntimeException("预约失败:" + e.getMessage(), e);
}
}
public String GetPdfReportsAddress(String patientsID, String studiesDateTime, String requestElectronic, String accessionNumber, String studiesModalities, String admissionSource) {
try {
String requestXml = XmlUtil.getPdfReports(patientsID, studiesDateTime, requestElectronic, accessionNumber, studiesModalities, admissionSource);
log.info("PACS请求XML: {}", requestXml);
String responseXml = SoapUtil.soapMethod3(requestXml);
return responseXml;
}catch (Exception e){
throw new RuntimeException(e);
}
}
/**
* 从外部URL下载PDF文件到本地并返回前端可访问的路径按HIS系统时间创建多级目录
* @param reportPdfFilePath 外部PDF文件URLhttp://192.168.12.23:8080/PacsReportPDF/20250908000011.pdf
* @return 转换后的Web路径/LISPDF/2025/09/08/20250908000011.pdf
*/
public String getPacsPdf(String reportPdfFilePath) {
// 1. 验证输入
if (StrUtil.isBlank(reportPdfFilePath)) {
throw new IllegalArgumentException("PDF文件路径不能为空");
}
try {
// 2. 解析原始URL
URL url = new URL(reportPdfFilePath);
String path = url.getPath();
// 3. 提取文件名处理URL编码
// 3. 手动提取文件名(无工具类)
String fileName;
int lastSlashIndex = path.lastIndexOf('/');
if (lastSlashIndex == -1) {
fileName = path; // 无斜杠路径(如根路径)
} else {
fileName = path.substring(lastSlashIndex + 1);
}
// 4. 移除查询参数(如 ?token=abc
int queryIndex = fileName.indexOf('?');
if (queryIndex != -1) {
fileName = fileName.substring(0, queryIndex);
}
// 5. 验证文件名
if (fileName == null || fileName.isEmpty()) {
throw new IllegalArgumentException("无法从URL提取文件名: " + reportPdfFilePath);
}
// 4. 获取HIS系统时间格式yyyy-MM-dd
String hisDate = DateUtils.getHisDate();
if (StrUtil.isBlank(hisDate)) {
// 如果HIS时间获取失败使用系统时间东八区
hisDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
log.warn("HIS时间获取失败使用系统时间: {}", hisDate);
}
// 5. 从HIS日期提取年月日确保格式为YYYY-MM-DD
String[] dateParts = hisDate.split("-");
if (dateParts.length != 3) {
throw new IllegalArgumentException("HIS日期格式错误: " + hisDate);
}
String year = dateParts[0];
String month = String.format("%02d", Integer.parseInt(dateParts[1])); // 确保两位月份
String day = String.format("%02d", Integer.parseInt(dateParts[2])); // 确保两位日期
// 6. 构建本地目录路径(年月日)
String localDir = "/home/igzh/nxwj-gzhsvr/LISPDF/PACS" + File.separator + year + month + day;
File localDirFile = new File(localDir);
// 7. 确保本地目录存在(递归创建)
if (!localDirFile.exists()) {
if (!localDirFile.mkdirs()) {
throw new RuntimeException("无法创建目录: " + localDir);
}
log.info("创建目录成功: {}", localDir);
}
// 8. 构建本地文件路径
String localFilePath = localDir + File.separator + fileName;
File localFile = new File(localFilePath);
// 仅改动这里:先检查文件是否存在,存在则直接返回路径
if (localFile.exists()) {
log.info("文件已存在,跳过下载: {}", localFilePath);
// 直接返回路径,不进行下载
String webPath = "/LISPDF/PACS/" + year + month + day + "/" + fileName;
log.info("返回Web路径: {}", webPath);
return webPath;
}
int maxRetries = 3;
for (int attempt = 1; attempt <= maxRetries; attempt++) {
// 9. 文件不存在才下载(保持原样)
log.info("开始下载PDF文件(第{}次尝试): {} -> {}", attempt, reportPdfFilePath, localFilePath);
HttpUtil.downloadFile(reportPdfFilePath, localFile);
if (localFile.exists()) {
log.info("PDF文件下载成功: {}", localFilePath);
break;
} else if (attempt == maxRetries) {
throw new RuntimeException("文件下载失败: " + reportPdfFilePath);
}
}
// 11. 返回Web路径保持原样
String webPath = "/LISPDF/PACS/" + year + month + day + "/" + fileName;
log.info("返回Web路径: {}", webPath);
return webPath;
} catch (Exception e) {
log.error("处理PDF文件失败: {}", reportPdfFilePath, e);
throw new RuntimeException("PDF处理失败: " + e.getMessage(), e);
}
}
static class ReportVo {
private String ReportName;
private String ReportId;
private String ReportPdfFilePath;
@Override
public String toString() {
return "ReportVo{" +
"ReportName='" + ReportName + '\'' +
", ReportId='" + ReportId + '\'' +
", ReportPdfFilePath='" + ReportPdfFilePath + '\'' +
'}';
}
public ReportVo() {
}
public ReportVo(String reportName, String reportId, String reportPdfFilePath) {
ReportName = reportName;
ReportId = reportId;
ReportPdfFilePath = reportPdfFilePath;
}
public String getReportName() {
return ReportName;
}
public void setReportName(String reportName) {
ReportName = reportName;
}
public String getReportId() {
return ReportId;
}
public void setReportId(String reportId) {
ReportId = reportId;
}
public String getReportPdfFilePath() {
return ReportPdfFilePath;
}
public void setReportPdfFilePath(String reportPdfFilePath) {
ReportPdfFilePath = reportPdfFilePath;
}
}
/**
* 查询PACS报告单
*
* @param
* @return
*/
public JSONObject MOP_OutpPacsReptMasterQuery(String QueryCode, Integer QueryType, String StartTime, String EndTime) throws Exception {
JSONObject resSuc = null;
// log.info("查询PACS报告单");
if (QueryType == 1){
resSuc = pacsQuery1(QueryCode, QueryType, StartTime, EndTime);
}else {
resSuc = pacsQuery2(QueryCode, QueryType, StartTime, EndTime);
}
return resSuc;
}
private JSONObject pacsQuery2(String queryCode, Integer queryType, String startTime, String endTime) {
try {
PacsVo pacsVo = new PacsVo();
pacsVo.setPatientsID(queryCode);
String studyTime = DateUtils.formatRange(startTime, endTime);
pacsVo.setStudiesDateTime(studyTime);
log.info("PACS查询参数病人ID={}, 时间范围={}", pacsVo.getPatientsID(), studyTime);
String requestXml = XmlUtil.getPacsQuery(pacsVo);
log.info("PACS请求XML: {}", requestXml);
String responseXml = SoapUtil.soapMethod3(requestXml);
// log.info("PACS响应XML: {}", responseXml);
JSONObject result = SoapPacsXmlParser.parseSoapResponseToJson(responseXml);
log.info("pacs解析出来的内容{}", result.toJSONString());
return result;
// 解析响应(使用优化后的工具类)
// Map<String, Object> resultMap = XmlParserUtils.parseSoapXml(responseXml);
//
// if (resultMap == null) {
// log.warn("PACS XML解析结果为空返回默认空JSON");
// return new JSONObject();
// }
// 安全转换为JSONObject过滤null值
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("result",responseXml);
// for (Map.Entry<String, Object> entry : resultMap.entrySet()) {
// if (entry.getValue() != null) {
// jsonObject.put(entry.getKey(), entry.getValue());
// }
// }
// return jsonObject;
} catch (Exception e) {
log.error("PACS查询异常", e);
throw new RuntimeException("PACS查询失败", e);
}
}
public JSONObject pacsQuery1(String QueryCode, Integer QueryType, String StartTime, String EndTime) throws Exception{
JSONObject resSuc = new JSONObject();
// StringBuffer str = new StringBuffer();
String url = "http://localhost:8089/nxpdf/api/reports/search"; // 可配置为 wxPayConfig 属性
JSONObject objParams = new JSONObject();
objParams.put("patientId", QueryCode);
objParams.put("startDate", StartTime);
objParams.put("endDate", EndTime);
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
// 1. 创建 URL 对象
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
// 2. 设置请求方式和参数
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true); // 允许写入请求体
connection.setDoInput(true); // 允许读取响应
connection.setConnectTimeout(10000);
connection.setReadTimeout(30000);
// 3. 写入请求体
try (OutputStream os = connection.getOutputStream()) {
byte[] input = objParams.toJSONString().getBytes("utf-8");
os.write(input, 0, input.length);
}
// 4. 获取响应码
int code = connection.getResponseCode();
log.info("code:" + code);
if (code == 200) {
// 5. 读取响应内容
StringBuilder response = new StringBuilder();
try (InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
String line;
while ((line = br.readLine()) != null) {
response.append(line);
}
}
String a = response.toString();
log.info("a:" + a);
JSONObject jsonObject = JSON.parseObject(a);
log.info("jsonObject:" + jsonObject.toString());
String success = (String) jsonObject.get("success");
log.info("查询报告接口响应结果:" + success);
if (!StringUtils.isEmpty(success)) {//响应成功
String reportIdList = JSON.toJSONString(jsonObject.get("ReportIdList"));
log.info("reportIdList" + reportIdList);
log.info("响应成功");
List<ReportVo> reportVos = JSONObject.parseArray(reportIdList, ReportVo.class);
log.info("reportVos:" + reportVos + ",size:" + reportVos.size());
List<ReportVo> resultList = new ArrayList<>();
if (reportVos.size() != 0) {
for (ReportVo re : reportVos) {
// log.info("re:" + re);
String pdfUrl = re.getReportPdfFilePath();
// log.debug("pdf url:" + pdfUrl);
// 转换为Web可访问路径
if (pdfUrl != null && !pdfUrl.isEmpty()) {
try {
URL newurl = new URL(pdfUrl);
String path = newurl.getPath(); // 获取 /20250901/20250901-3-29.pdf
String newPath = "/LISPDF" + path; // 转换为 /LISPDF/20250901/20250901-3-29.pdf
re.setReportPdfFilePath(newPath);
} catch (Exception e) {
log.error("URL解析失败: " + pdfUrl, e);
re.setReportPdfFilePath(pdfUrl); // 保持原URL
}
}
resultList.add(re);
// 下载文件到本地(可选)
if (pdfUrl != null && !pdfUrl.isEmpty()) {
// 检查本地文件是否存在
try {
URL newurl = new URL(pdfUrl);
String path = newurl.getPath();
String[] pathParts = path.split("/");
if (pathParts.length >= 3) {
String downUrl = pathParts[1]; // 20250901
String newFileName = pathParts[2]; // 20250901-3-29.pdf
File file = new File("/home/igzh/nxwj-gzhsvr/LISPDF/" + downUrl + "/" + newFileName);
// log.info("文件是否存在:" + file.exists());
if (!file.exists()) {
// 启动线程下载文件
String finalPdfUrl = pdfUrl;
new Thread(() -> new HsjcService().downloadHttpFile(finalPdfUrl, downUrl, newFileName)).start();
}
}
} catch (Exception e) {
log.error("文件检查失败: " + pdfUrl, e);
}
}
}
}
JSONArray allrate = JSONArray.parseArray(JSON.toJSONString(resultList));
resSuc.put("response", allrate);
return resSuc;
}
} else {
throw new LogicException("获取pdf地址异常请联系管理员。响应码: " + code);
}
} catch (IOException e) {
log.error("调用PACS查询接口失败", e);
throw new RuntimeException("网络请求失败: " + e.getMessage(), e);
} finally {
if (connection != null) {
connection.disconnect();
}
}
return resSuc;
}
/**
* 通过HTTP下载文件
* @param fileUrl 文件URL
* @param downUrl 日期目录
* @param fileName 文件名
*/
public void downloadHttpFile(String fileUrl, String downUrl, String fileName) {
try {
// log.info("开始下载文件: " + fileUrl);
// 创建本地目录
String localDir = "/home/igzh/nxwj-gzhsvr/LISPDF/" + downUrl;
if (!FileUtil.exist(localDir)) {
FileUtil.mkdir(localDir);
}
// 下载文件
URL url = new URL(fileUrl);
File localFile = new File(localDir + "/" + fileName);
// 使用Hutool工具类下载文件
FileUtil.writeFromStream(url.openStream(), localFile);
log.info("文件下载成功: " + fileUrl + " -> " + localFile.getAbsolutePath());
} catch (Exception e) {
log.error("文件下载失败: " + fileUrl, e);
}
}
public void PasDownloadPdf(String pdfname) {
try {
// FtpWebUtil ftpWebUtil = new FtpWebUtil();
//读取classpath下的XXX.setting不使用变量
Setting setting = new Setting("btby.setting");
//获取分组为group下key为name的值
String sftpname = setting.getByGroup("ftpname", "sys");
String sftppass = setting.getByGroup("ftppass", "sys");
String sftpip = setting.getByGroup("pacsftpip", "sys");
String sftpport = setting.getByGroup("ftpport", "sys");
//本地文件夹
String sftplocalpath = setting.getByGroup("localpath", "sys");
log.debug("pdf localpath:" + sftplocalpath);
FTPClient ftpClient = FtpWebUtil.ftpConnection(sftpip, sftpport, sftpname, sftppass);
String[] split = pdfname.split("/");
String downUrl = split[0];
String newFileName = split[1];
String fileName = split[1];
// log.info("newFileName" + newFileName);
// log.info("downUrl" + downUrl);
// log.info("fileName" + fileName);
//// String localpath = sftplocalpath;
// log.debug("download from ftp: " + downUrl);
String localDir = "/home/igzh/hnwj-pdf" + sftplocalpath + downUrl;
//检查文件夹,如果没有就新建
if (!cn.hutool.core.io.FileUtil.exist(localDir)) {
FileUtil.mkdir(localDir);
}
FtpWebUtil.downFile(ftpClient, newFileName, fileName, downUrl);
//// "ftp://reportpdf:123.com@192.168.150.3:20015/15100142_0219515.pdf"
// String urlname = "ftp://" + sftpname + ":" + sftppass + "@" + sftpip + ":" + sftpport + "/" + pdfname;
// ftpWebUtil.downloadpdf(urlname, localpath, pdfname);
} catch (IOException e) {
e.printStackTrace();
}
return;
}
public Map<String, Object> BillPay(Integer userId, String patientid, String jsonData) throws Exception {
int resultInt = 0;
Map<String, Object> mapRes = new HashMap<>();
BigDecimal bdBillAmount = BigDecimal.valueOf(0);
BigDecimal bdBillAmountMid;
DecimalFormat format = new DecimalFormat("###.00");
String payOrderNo = "";
String billMoney = "";
try {
//如有多条单据,需要计算总金额
//把json字符串解析成json对象进行操作
String billString = "";
String hsjcname = "";
List<DjJson> lstDjJson;
JSONObject billData = new JSONObject();
JSONObject jb = JSONObject.parseObject(jsonData);
String data = jb.getString("data_row");
//这样判断的是否是JSONArray还是JSONObject
if (data.contains("[") && data.contains("]")) {
//这是jsonArray
log.debug("jsonArray");
//取“value”的键值value里面是个json数组
List<Object> jsonArray = jb.getJSONArray("data_row");
//把json数组转为json字符串
billString = JSONObject.toJSONString(jsonArray);
//又把json字符串转为java集合得到我们需要的数据
lstDjJson = JSONObject.parseArray(billString, DjJson.class);
//插入mzjf表查询如果有则不管
// 设置六位数支付订单号
payOrderNo = "MZ" + VeDate.getNo(6);
List<HsjcVo> lstJf = new ArrayList<>();
for (int i = 0; i < lstDjJson.size(); i++) {
HsjcVo jfvo = new HsjcVo();
//查询
jfvo.setUserId(userId);
jfvo.setPatientid(patientid);
jfvo.setFlowno(lstDjJson.get(i).getFlowno());
jfvo.setSetdepartcode(lstDjJson.get(i).getSetdepartcode());
jfvo.setSetdepartname(lstDjJson.get(i).getSetdepartname());
jfvo.setDodepartcode(lstDjJson.get(i).getDodepartcode());
jfvo.setDoctorname(lstDjJson.get(i).getDoctorname());
jfvo.setBilltype(lstDjJson.get(i).getBilltype());
jfvo.setBillname(lstDjJson.get(i).getBillname());
jfvo.setBilldes(lstDjJson.get(i).getBilldes());
jfvo.setBilltime(lstDjJson.get(i).getBilltime());
jfvo.setBillmoney(lstDjJson.get(i).getBillmoney());
bdBillAmountMid = new BigDecimal(lstDjJson.get(i).getBillmoney());
bdBillAmount = bdBillAmount.add(bdBillAmountMid);
jfvo.setDoctorcode(lstDjJson.get(i).getDoctorcode());
jfvo.setDoctorname(lstDjJson.get(i).getDoctorname());
jfvo.setSincemoney(lstDjJson.get(i).getSincemoney());
jfvo.setFairmoney(lstDjJson.get(i).getFairmoney());
jfvo.setSerialno(lstDjJson.get(i).getSerialno());
jfvo.setAppointno(lstDjJson.get(i).getAppointno());
jfvo.setSerialflowno(lstDjJson.get(i).getSerialflowno());
jfvo.setJzlb(lstDjJson.get(i).getJzlb());
jfvo.setBzdm(lstDjJson.get(i).getBzdm());
jfvo.setUpdatedate(lstDjJson.get(i).getUpdatedate());
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
jfvo.setAppStatus(3);
jfvo.setOrderno(payOrderNo);
hsjcMapper.opHsjcAppoint(jfvo);
// lstJf = hsjcMapper.getMzjfListByFlow(jfvo);
// if (lstJf.size() == 0) {
// //插入 mzjf 表
// jfvo.setOrderno(payOrderNo);
//
// jfvo.setAppStatus(3);
// hsjcMapper.opHsjcAppoint(jfvo);
// }
// else {
// //已经有记录则取出payorderno
// //已经有记录则需要更新orderno工行订单号会过期
// String oldPayOrderNo = lstJf.get(0).getOrderno();
// String newUpdateTime = lstDjJson.get(i).getUpdatedate();
//
// //已经有记录 需要检查下是否已经付款
// log.debug("the use has the old orderno:" + oldPayOrderNo);
//
//下单!!!修改为建行支付
//这里修改为从建行下单,返回给公众号订单信息调出支付界面,完成支付后在回调接口里完成后续的订单处理
// String ret = payService.inq(oldPayOrderNo);
// JSONObject resJb = JSON.parseObject(ret);
// if ((resJb.getInteger("returnCode") == 0) &&
// (resJb.getInteger("pay_status") == 0)) {
// //交易结果标志0-成功1-失败2-未知
// //直接去做确认
// log.debug("the old orderno already pay: " + oldPayOrderNo);
//
// //更新时间
// hsjcMapper.opUpdateOrder(oldPayOrderNo, oldPayOrderNo, newUpdateTime);
//
// paybills(oldPayOrderNo, "", "");
//
// mapRes.put("code", "300");
// mapRes.put("result", "success");
// mapRes.put("id", 1);
// return mapRes;
// } else {
// //已经有记录先判断order时间是否过了5分钟
// String oldOrdernoTime = oldPayOrderNo.substring(10, 16);
// Date currentTime = new Date();
// SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
// String CurrentTime = formatter.format(currentTime);
// if (Integer.valueOf(CurrentTime) - Integer.parseInt(oldOrdernoTime) <= 600) {
// log.debug("the user old orderno create time less then 5 minutes");
//
// mapRes.put("code", "500");
// mapRes.put("result", "success");
// mapRes.put("id", 1);
// return mapRes;
// }
//
// log.debug("the old orderno not pay: " + oldPayOrderNo);
// hsjcMapper.opUpdateOrder(payOrderNo, oldPayOrderNo, newUpdateTime);
// }
// }
}
//多单据的总金额
billMoney = bdBillAmount.toPlainString();
} else {
//这是jsonObject
log.debug("jsonObject");
billData = jb.getJSONObject("data_row");
//插入mzjf表查询如果有则不管
// 设置六位数支付订单号
payOrderNo = "MZ" + VeDate.getNo(6);
HsjcVo jfvo = new HsjcVo();
//查询
jfvo.setUserId(userId);
jfvo.setPatientid(patientid);
jfvo.setFlowno(billData.getString("FlowNo"));
jfvo.setSetdepartcode(billData.getString("SetDepartCode"));
jfvo.setSetdepartname(billData.getString("SetDepartName"));
jfvo.setDodepartcode(billData.getString("DoDepartCode"));
jfvo.setDoctorname(billData.getString("DoDepartName"));
jfvo.setBilltype(billData.getString("BillType"));
jfvo.setBillname(billData.getString("BillName"));
jfvo.setBilldes(billData.getString("BillDes"));
jfvo.setBilltime(billData.getString("BillTime"));
jfvo.setBillmoney(billData.getString("BillMoney"));
jfvo.setDoctorcode(billData.getString("DoctorCode"));
jfvo.setDoctorname(billData.getString("DoctorName"));
jfvo.setSincemoney(billData.getString("SinceMoney"));
jfvo.setFairmoney(billData.getString("FairMoney"));
jfvo.setSerialno(billData.getString("SerialNo"));
jfvo.setAppointno(billData.getString("AppointNo"));
jfvo.setSerialflowno(billData.getString("SerialFlowNo"));
jfvo.setJzlb(billData.getString("JZLB"));
jfvo.setBzdm(billData.getString("BZDM"));
jfvo.setUpdatedate(billData.getString("Updatedate"));
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
jfvo.setAppStatus(3);
jfvo.setOrderno(payOrderNo);
hsjcMapper.opHsjcAppoint(jfvo);
// List<HsjcVo> lstJf = new ArrayList<>();
// lstJf = hsjcMapper.getMzjfListByFlow(jfvo);
// if (lstJf.size() == 0) {
// //插入 mzjf 表
// jfvo.setOrderno(payOrderNo);
//
// jfvo.setAppStatus(3);
// hsjcMapper.opHsjcAppoint(jfvo);
// }
// else {
// //已经有记录则取出payorderno
// String oldPayOrderNo = lstJf.get(0).getOrderno();
// String newUpdateTime = billData.getString("Updatedate");
//
// //已经有记录 需要检查下是否已经付款
// log.debug("the use has the old orderno:" + oldPayOrderNo);
// String ret = payService.inq(oldPayOrderNo);
// JSONObject resJb = JSON.parseObject(ret);
// if ((resJb.getInteger("returnCode") == 0) &&
// (resJb.getInteger("pay_status") == 0)) {
// //交易结果标志0-成功1-失败2-未知
// //直接去做确认
// log.debug("the old orderno already pay: " + oldPayOrderNo);
// //更新时间
// hsjcMapper.opUpdateOrder(oldPayOrderNo, oldPayOrderNo, newUpdateTime);
// paybills(oldPayOrderNo, "", "");
//
// mapRes.put("code", "300");
// mapRes.put("result", "success");
// mapRes.put("id", 1);
// return mapRes;
// } else {
// //已经有记录先判断order时间是否过了5分钟
// String oldOrdernoTime = oldPayOrderNo.substring(10, 16);
// Date currentTime = new Date();
// SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
// String CurrentTime = formatter.format(currentTime);
// if (Integer.valueOf(CurrentTime) - Integer.parseInt(oldOrdernoTime) <= 600) {
// log.debug("the user old orderno create time less then 5 minutes");
//
// mapRes.put("code", "500");
// mapRes.put("result", "success");
// mapRes.put("id", 1);
// return mapRes;
// }
//
// log.debug("the old orderno not pay: " + oldPayOrderNo);
// hsjcMapper.opUpdateOrder(payOrderNo, oldPayOrderNo, newUpdateTime);
// }
// }
//单据的金额
billMoney = billData.getString("BillMoney");
}
//建行发起订单 缴费
// String result = "";
return httpHsjcAppAppoint(userId, payOrderNo, billMoney);
} catch (Exception e) {
throw new LogicException("系统异常");
}
}
/**
* 建行订单 webService
*/
public Map<String, Object> httpHsjcAppAppoint(int userId, String payOrderNo, String billMoney) throws Exception {
// 设置六位数支付订单号
UserVo userVo = userService.queryUserInfoDetails(userId);
JhClientInfo jhClientInfo = new JhClientInfo(payOrderNo, userVo.getOpenid(), billMoney);
// Map<String, Object> stringObjectMap = jhPayService.unifiedPlaceOrder(jhClientInfo);
Map<String, Object> stringObjectMap =new HashMap<>();
// String str = payService.pay(money, payOrderNo, "/reserve/callback", "挂号费");
return stringObjectMap;
}
public Map<String, Object> HsjcCreate(HsjcVo vo) throws Exception {
int resultInt = 0;
Integer iLimitCount = 0;
Map<String, Object> mapRes = new HashMap<>();
//做限号处理 早上150 下午150
if (vo.getCreatitemname().equals("新型冠状病毒抗体检测")) {
Example exampleSys = new Example(AdminSystem.class);
Example.Criteria criteriaSys = exampleSys.createCriteria();
criteriaSys.andEqualTo("name", "hsjc");
List<AdminSystem> lstadminsystem = adminSystemMapper.selectByExample(exampleSys);
if (lstadminsystem.size() >= 1) {
iLimitCount = lstadminsystem.get(0).getLimitcount();
} else {
throw new LogicException("查询系统限额失败");
}
Example example = new Example(UserMzjf.class);
Example.Criteria criteria = example.createCriteria();
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
criteria.andEqualTo("creatitemname", "新型冠状病毒抗体检测");
criteria.andEqualTo("appointmenttime", vo.getAppointmenttime());
List<UserMzjf> lstmzjf = userMzjfMapper.selectByExample(example);
log.debug("核酸检测已达:" + vo.getAppointmenttime() + " count:" + lstmzjf.size());
if (lstmzjf.size() >= iLimitCount) {
mapRes.put("result", "核酸预约已达限号");
mapRes.put("id", 888);
return mapRes;
}
}
//开单
String xml = MOP_OutpBillstoPayCreat(vo);
// 解析报文
Map<String, Object> mapCreate = XmlUtil.parse(xml);
if (mapCreate.get("returncode").toString().equals("1")) {
if (mapCreate.get("FlowNo") != null) {
vo.setFlowno(mapCreate.get("FlowNo").toString());
}
//允许退号标志 N 不允许 Y 允许
vo.setAppFlag("Y");
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
vo.setAppStatus(1);
// 设置六位数支付订单号
String payOrderNo = "MZ" + VeDate.getNo(6);
vo.setOrderno(payOrderNo);
resultInt = hsjcMapper.opHsjcAppoint(vo);
} else {
throw new LogicException(mapCreate.get("errormsg").toString());
}
if (resultInt == 1) {
mapRes.put("result", "success");
mapRes.put("id", 1);
} else {
mapRes.put("result", "fail");
mapRes.put("id", 1);
}
// if (resultInt == 1) {
// //查询单据
//// public String MOP_OutpBillstoPayQuery(String PatientId, Integer QueryType, String OrderNo)
// String resxml = MOP_OutpBillstoPayQuery(vo.getPatientid(), 2, vo.getFlowno());
// Map<String, Object> map = XmlUtil.parse(resxml);
// if (map.get("returncode").toString().equals("1")) {
//
// if (map.get("FlowNo") != null) {
// vo.setFlowno(map.get("FlowNo").toString());
// }
// if (map.get("SetDepartCode") != null) {
// vo.setSetdepartcode(map.get("SetDepartCode").toString());
// }
// if (map.get("SetDepartName") != null) {
// vo.setSetdepartname(map.get("SetDepartName").toString());
// }
// if (map.get("DoDepartCode") != null) {
// vo.setDodepartcode(map.get("DoDepartCode").toString());
// }
// if (map.get("DoDepartName") != null) {
// vo.setDoctorname(map.get("DoDepartName").toString());
// }
// if (map.get("BillType") != null) {
// vo.setBilltype(map.get("BillType").toString());
// }
// if (map.get("BillName") != null) {
// vo.setBillname(map.get("BillName").toString());
// }
// if (map.get("BillDes") != null) {
// vo.setBilldes(map.get("BillDes").toString());
// }
// if (map.get("BillTime") != null) {
// vo.setBilltime(map.get("BillTime").toString());
// }
// if (map.get("BillMoney") != null) {
// vo.setBillmoney(map.get("BillMoney").toString());
// }
// if (map.get("DoctorCode") != null) {
// vo.setDoctorcode(map.get("DoctorCode").toString());
// }
// if (map.get("DoctorName") != null) {
// vo.setDoctorname(map.get("DoctorName").toString());
// }
// if (map.get("SinceMoney") != null) {
// //vo.setSincemoney(map.get("SinceMoney").toString());
// vo.setSincemoney("");
// }
// if (map.get("FairMoney") != null) {
// //vo.setFairmoney(map.get("FairMoney").toString());
// vo.setFairmoney("");
// }
// if (map.get("SerialNo") != null) {
// vo.setSerialno(map.get("SerialNo").toString());
// }
// if (map.get("AppointNo") != null) {
// vo.setAppointno(map.get("AppointNo").toString());
// }
// if (map.get("SerialFlowNo") != null) {
// vo.setSerialflowno(map.get("SerialFlowNo").toString());
// }
// if (map.get("JZLB") != null) {
// vo.setJzlb(map.get("JZLB").toString());
// }
// if (map.get("BZDM") != null) {
// vo.setBzdm(map.get("BZDM").toString());
// }
// if (map.get("Updatedate") != null) {
// vo.setUpdatedate(map.get("Updatedate").toString());
// }
//
// //允许退号标志 N 不允许 Y 允许
// vo.setAppFlag("Y");
// //单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
// vo.setAppStatus(3);
//
// resultInt = hsjcMapper.opHsjcQueryAppoint(vo);
//
// //ICBC 缴费 如果缴费失败则做开单取消
// Map<String, Object> stringObjectMap = httpHsjcAppAppoint(vo.getUserId(), vo.getOrderno(), vo.getBillmoney());
//
//// mapRes.put("result", result);
//// mapRes.put("id", 1);
// return stringObjectMap;
// } else {
// throw new LogicException(map.get("errormsg").toString());
// }
// } else {
// mapRes.put("result", "");
// mapRes.put("id", 1);
// return mapRes;
// }
return mapRes;
}
/**
* 核酸自助开单
*
* @param
* @return
*/
public String MOP_OutpBillstoPayCreat(HsjcVo vo) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<PatientId>");
// str.append("00093777");
str.append(vo.getPatientid());
str.append("</PatientId>");
str.append("<IDType>");
// str.append("0");
str.append(vo.getIdtype());
str.append("</IDType>");
str.append("<LockType>");
// str.append("1");
str.append(vo.getLocktype());
str.append("</LockType>");
str.append("<CreatItemName>");
// str.append("新型冠状病毒抗体检测");
str.append(vo.getCreatitemname());
str.append("</CreatItemName>");
str.append("<CreatItemType>");
str.append("1");
str.append("</CreatItemType>");
str.append("<AppointmentTime>");
// str.append("2021-01-29 10:00:00");
str.append(vo.getAppointmenttime());
str.append("</AppointmentTime>");
str.append("<Creatdate>");
// str.append("2021-01-29 10:00:00");
str.append(vo.getCreatdate());
str.append("</Creatdate>");
String reqXml = requestXml("MOP_OutpBillstoPayCreat", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpBillstoPayCreat:" + reqXml);
log.debug("MOP_OutpBillstoPayCreat:" + respXml);
return respXml;
}
/**
* 核酸自助开单
*
* @param
* @return
*/
public String MOP_OutpBillstoPayConfirm(HsjcVo vo) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<PatientId>");
str.append(vo.getPatientid());
str.append("</PatientId>");
str.append("<BillsMsg>");
str.append(vo.getBillsmsg());
str.append("</BillsMsg>");
str.append("<CostAmount>");
str.append(vo.getZfamount());
str.append("</CostAmount>");
str.append("<ZFAmount>");
str.append(vo.getZfamount());
str.append("</ZFAmount>");
// str.append("<ChargAmount>");
// str.append(vo.getZfamount());
// str.append("</ChargAmount>");
str.append("<PayNature>");
str.append(vo.getPaynature());
str.append("</PayNature>");
str.append("<PayType>");
str.append(vo.getPaytype());
str.append("</PayType>");
str.append("<PowerTranID>");
str.append(vo.getPowertranid());
str.append("</PowerTranID>");
str.append("<PayInfo>");
str.append(vo.getPowertranid());
str.append("</PayInfo>");
// str.append("<TerminalId>");
// str.append(vo.getTerminalid());
// str.append("</TerminalId>");
// str.append("<ReferNo>");
// str.append(vo.getReferno());
// str.append("</ReferNo>");
// str.append("<YBZHAmount>");
// //str.append(vo.getYbzhamount());
// str.append("0.00");
// str.append("</YBZHAmount>");
// str.append("<YBTCAmount>");
//// str.append(vo.getYbtcamount());
// str.append("0.00");
// str.append("</YBTCAmount>");
2026-01-26 17:57:47 +08:00
if (vo.getYboutmsg() != null && !vo.getYboutmsg().isEmpty()) {
str.append("<YBOutMsg>");
str.append(vo.getYboutmsg());
str.append("</YBOutMsg>");
}
str.append("<HisOperNum>");
str.append(vo.getHisopernum());
str.append("</HisOperNum>");
// str.append("<Updatedate>");
// str.append(vo.getUpdatedate());
// str.append("</Updatedate>");
String reqXml = requestXml("MOP_OutpBillsPayedConfirm", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpBillsPayedConfirm:" + reqXml);
log.debug("MOP_OutpBillsPayedConfirm:" + respXml);
return respXml;
}
/**
* 查询缴费状态
*
* @param
* @return
*/
public String MOP_OutpBillsStateQuery(String PowerTranID) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<PowerTranID>");
str.append(PowerTranID);
str.append("</PowerTranID>");
String reqXml = requestXml("MOP_OutpBillsStateQuery", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpBillsStateQuery:" + reqXml);
log.debug("MOP_OutpBillsStateQuery:" + respXml);
return respXml;
}
/**
* 查询检验报告单明细信息
*
* @param
* @return
*/
public String MOP_OutpLisReptDetailQuery(String ReportId) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<ReportId>");
str.append(ReportId);
str.append("</ReportId>");
String reqXml = requestXml("MOP_OutpLisReptDetailQuery", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpLisReptDetailQuery:" + reqXml);
log.debug("MOP_OutpLisReptDetailQuery:" + respXml);
return respXml;
}
public String MOP_OutpBillsDetailQuery(String FlowNo, String PatientId, Integer InsuranceType) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<FlowNo>");
str.append(FlowNo);
str.append("</FlowNo>");
str.append("<PatientId>");
str.append(PatientId);
str.append("</PatientId>");
str.append("<InsuranceType>");
str.append(InsuranceType);
str.append("</InsuranceType>");
String reqXml = requestXml("MOP_OutpBillsDetailQuery", str.toString());
String respXml = SoapUtil.soapMethod2(reqXml);
log.debug("MOP_OutpBillsDetailQuery:" + reqXml);
log.debug("MOP_OutpBillsDetailQuery:" + respXml);
return respXml;
}
/**
* 查询检验报告单主信息
*
* @param
* @return
*/
public String MOP_OutpLisReptMasterQuery(String QueryCode, Integer QueryType, String StartTime, String EndTime) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<QueryCode>");
str.append(QueryCode);
str.append("</QueryCode>");
str.append("<QueryType>");
str.append(QueryType);
str.append("</QueryType>");
str.append("<StartTime>");
str.append(StartTime);
str.append("</StartTime>");
str.append("<EndTime>");
str.append(EndTime);
str.append("</EndTime>");
String reqXml = requestXml("MOP_OutpLisReptMasterQuery", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpLisReptMasterQuery:" + reqXml);
log.debug("MOP_OutpLisReptMasterQuery:" + respXml);
return respXml;
}
/**
* 查询缴费单据
*
* @param
* @return
*/
public String MOP_OutpBillstoPayQuery(String PatientId, Integer QueryType, String OrderNo) throws Exception {
StringBuffer str = new StringBuffer();
str.append("<PatientId>");
str.append(PatientId);
str.append("</PatientId>");
str.append("<QueryType>");
str.append(QueryType);
str.append("</QueryType>");
str.append("<OrderNo>");
str.append(OrderNo);
str.append("</OrderNo>");
String reqXml = requestXml("MOP_OutpBillstoPayQuery", str.toString());
String respXml = SoapUtil.soapMethod(reqXml);
log.debug("MOP_OutpBillstoPayQuery:" + reqXml);
log.debug("MOP_OutpBillstoPayQuery:" + respXml);
return respXml;
}
/**
*
*/
public static String requestXml(String method, String xml) {
StringBuffer str = new StringBuffer();
str.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">");
str.append("<soapenv:Header/>");
str.append("<soapenv:Body>");
str.append("<tem:" + method);
str.append("><tem:InMsg>");
str.append("<![CDATA[");
str.append("<request>");
str.append(xml);
str.append("</request>");
str.append("]]>");
str.append("</tem:InMsg>");
str.append("</tem:" + method);
str.append("></soapenv:Body>");
str.append("</soapenv:Envelope>");
return str.toString();
}
// @Async("asyncServiceExecutor")
public void callback(HttpServletRequest request, HttpServletResponse response) {
PrintWriter out = null;
try {
log.debug("enter the ICBC hsjc callback");
Map<String, String> params = new HashMap<String, String>();
String from = request.getParameter("from");
String api = request.getParameter("api");
String app_id = request.getParameter("app_id");
String charset = request.getParameter("charset");
String format = request.getParameter("format");
String encrypt_type = request.getParameter("encrypt_type");
String timestamp = request.getParameter("timestamp");
String biz_content = request.getParameter("biz_content");
String sign_type = request.getParameter("sign_type");
String sign = request.getParameter("sign");
log.debug("from:" + from);
log.debug("api:" + api);
log.debug("app_id:" + app_id);
log.debug("charset:" + charset);
log.debug("format:" + format);
log.debug("encrypt_type:" + encrypt_type);
log.debug("timestamp:" + timestamp);
log.debug("biz_content:" + biz_content);
log.debug("sign_type:" + sign_type);
log.debug("sign:" + sign);
params.put("from", from);
params.put("api", api);
params.put("app_id", app_id);
params.put("charset", charset);
params.put("format", format);
params.put("encrypt_type", encrypt_type);
params.put("timestamp", timestamp);
params.put("biz_content", biz_content);
params.put("sign_type", sign_type);//目前上行网关签名暂时仅支持RSA
/**********验证工行上行网关RSA签名**********/
//回调接口
String path = "/assess/callback";
// WebUtils.buildOrderedSignStr(path, params);
String signStr;
String results = null;
String responseBizContent = null;
Map<String, Object> respMap = (Map<String, Object>) JSON.parse(biz_content);
responseBizContent = callbackHanldle(respMap);
//2、商户以RSA签名为例如下其中priKey为商户私钥
signStr = "\"response_biz_content\":" + responseBizContent + "," + "\"sign_type\":" + "\"RSA2\"";
// sang:注释icbc部分
// IcbcSignature.sign(signStr, "RSA2", PayService.MY_PRIVATE_KEY,
// charset);
sign = null;
results = "{" + signStr + ",\"sign\":\"" + sign + "\"}";
response.setContentType("application/json; charset=utf-8");
out = response.getWriter();
out.write(results);
} catch (Throwable e) {
e.printStackTrace();
out.write(e.getMessage());
} finally {
out.flush();
out.close();
}
}
public String callbackHanldle(Map<String, Object> respMap) {
String responseBizContent = "";
try {
if (!respMap.get("return_code").toString().equals("0")) {
//支付失败
log.debug("-----------------支付失败-------------------");
//业务请求字段获取
String outTradeNo = (String) respMap.get("out_trade_no");
log.debug("outTradeNo" + outTradeNo);
//业务处理逻辑......
HsjcVo vo = new HsjcVo();
vo.setOrderno(outTradeNo);
//获取挂号信息
List<HsjcVo> list = hsjcMapper.getMzjfList(vo);
if (list.size() != 1) {
//没有查到
log.debug("没有对应订单号的记录");
} else {
//做消号操作
HsjcVo voCancel = new HsjcVo();
voCancel = list.get(0);
voCancel.setLocktype(-1);
// 封装xml
String strXML = MOP_OutpBillstoPayCreat(voCancel);
// // 发送soap请求
// String respXml = SoapUtil.soapMethod(strXML);
// 解析报文
Map<String, Object> map = XmlUtil.parse(strXML);
if (map.get("returncode").toString().equals("1")) {
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
hsjcMapper.opUpdateOrderByHis(2, outTradeNo);
//推送消息给公众号
} else {
// throw new LogicException(map.get("errormsg").toString());
log.debug("消号返回 errormsg:" + map.get("errormsg").toString());
}
}
// responseBizContent = "{\"return_code\":-12345,\"return_msg\":\"" + respMap.get("return_msg") + "\"}";
//业务返回参数设置
int return_code = 0;
String return_msg = "success.";
String msg_id = respMap.get("msg_id").toString();
responseBizContent = "{\"return_code\":" + return_code + ",\"return_msg\":\"" + return_msg + "\",\"msg_id\":\"" + msg_id + "\","
+ "\"busi_param_rp\":\"thisisresponseparameter\"}";
} else {
log.debug("-----------------支付成功-------------------");
/**********合作方/分行 业务逻辑处理**********/
// @SuppressWarnings("unchecked")
String icbc_orderid = respMap.get("order_id").toString();
String icbc_paytime = respMap.get("pay_time").toString();
String msg_id = respMap.get("msg_id").toString();
//业务请求字段获取
String outTradeNo = (String) respMap.get("out_trade_no");
log.debug("outTradeNo:" + outTradeNo);
//业务处理逻辑......
HsjcVo vo = new HsjcVo();
vo.setOrderno(outTradeNo);
//获取挂号信息
List<HsjcVo> list = hsjcMapper.getMzjfList(vo);
if (list.size() == 1) {
vo = list.get(0);
log.debug("userid:" + vo.getUserId());
// 设置六位数支付订单号
String powerid = "HS" + VeDate.getNo(6);
// 封装xml
vo.setBillsmsg(vo.getFlowno());
vo.setPaynature("1");
vo.setPaytype("JHZF");
vo.setPowertranid(outTradeNo);
vo.setPowertrancard("");
vo.setTerminalid("0001");
vo.setReferno("");
vo.setZfamount(vo.getBillmoney());
// vo.setYbzhamount();
// vo.setYbtcamount();
vo.setYboutmsg("医保结算信息");
vo.setHisopernum("WX");
String respXml = MOP_OutpBillstoPayConfirm(vo);
// 解析报文
Map<String, Object> map = XmlUtil.parse(respXml);
if (map.get("returncode").toString().equals("1")) {
//允许退号标志 N 不允许 Y 允许
vo.setAppFlag("Y");
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
vo.setAppStatus(4);
vo.setIcbcorderid(icbc_orderid);
vo.setIcbcpaytime(icbc_paytime);
hsjcMapper.opHsjcConfirmAppoint(vo);
UserVo voUser = userService.queryUserInfoDetails(vo.getUserId());
log.debug("get hsjc userid:" + voUser.getName());
String cardNo = vo.getPatientid();
List<UserCardVo> UCList = userCardMapper.queryUserCardListByCardno(cardNo);
log.debug("real name:" + UCList.get(0).getName());
//推送消息给公众号
log.debug("start push message");
txSendMsg.SendNotifyJF("缴费成功", voUser.getOpenid(), UCList.get(0).getName(), vo.getPatientid(),
vo.getBillmoney(), vo.getFlowno(), "u2MOIbFKkqSyhfZt2uZriiSRaIVMVhiu-Y4MzWS5p6Y");
log.debug("end push message");
} else {
//工行成功HIS失败需要原路返回退款
//查询his缴费状态如果缴费正常认为缴费是成功的
String inqResXml = MOP_OutpBillsStateQuery(outTradeNo);
// 解析报文
Map<String, Object> mapInq = XmlUtil.parse(inqResXml);
if (mapInq.get("returncode").toString().equals("1") &&
mapInq.get("FlowNo").toString().equals(vo.getFlowno())) {
log.debug("his confirm faile, but inq success");
//允许退号标志 N 不允许 Y 允许
vo.setAppFlag("Y");
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
vo.setAppStatus(4);
vo.setIcbcorderid(icbc_orderid);
vo.setIcbcpaytime(icbc_paytime);
hsjcMapper.opHsjcConfirmAppoint(vo);
UserVo voUser = userService.queryUserInfoDetails(vo.getUserId());
log.debug("get hsjc userid:" + voUser.getName());
String cardNo = vo.getPatientid();
List<UserCardVo> UCList = userCardMapper.queryUserCardListByCardno(cardNo);
log.debug("real name:" + UCList.get(0).getName());
//推送消息给公众号
log.debug("start push message");
txSendMsg.SendNotifyJF("缴费成功", voUser.getOpenid(), UCList.get(0).getName(), vo.getPatientid(),
vo.getBillmoney(), vo.getFlowno(), "u2MOIbFKkqSyhfZt2uZriiSRaIVMVhiu-Y4MzWS5p6Y");
log.debug("end push message");
} else {
//做消号操作
HsjcVo voCancel = new HsjcVo();
voCancel = list.get(0);
voCancel.setLocktype(-1);
// 封装xml
String strXML = MOP_OutpBillstoPayCreat(voCancel);
// // 发送soap请求
// String resp1Xml = SoapUtil.soapMethod(strXML);
// 解析报文
Map<String, Object> mapCancel = XmlUtil.parse(strXML);
if (mapCancel.get("returncode").toString().equals("1")) {
//单据状态 0 正常 1 开具 2 已消号 3 挂号成功(待缴费) 4 已缴费 5 已退费
hsjcMapper.opUpdateOrderByHis(2, outTradeNo);
//自动退费
log.debug("his failed, auto-refund:" + vo.getBillmoney() + " orderno:" + outTradeNo);
// String ret = payService.refundHis(Double.valueOf(vo.getBillmoney()), outTradeNo);
} else {
// throw new LogicException(mapCancel.get("errormsg").toString());
log.debug("消号返回 errormsg:" + map.get("errormsg").toString());
}
}
}
} else {
log.debug("list size:" + list.size());
}
//业务返回参数设置
int return_code = 0;
String return_msg = "success.";
responseBizContent = "{\"return_code\":" + return_code + ",\"return_msg\":\"" + return_msg + "\",\"msg_id\":\"" + msg_id + "\","
+ "\"busi_param_rp\":\"thisisresponseparameter\"}";
}
} catch (Throwable e) {
e.printStackTrace();
}
return responseBizContent;
}
public int SendNotifyJF(String Title, String userOpenid, String username, String patienid, String amount, String kahao, String templateId) {
log.debug("in param:Title|" + Title + " userOpenid|" + userOpenid + " username|" + username + " patienid|" +
patienid + " amount|" + amount + " kahao|" + kahao + " templateId|" + templateId);
//第一步 获取token
String accessUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" +
"&appid=" + WX_APP_ID + "&secret=" + WX_SECRET;
String accessTokenStr = HttpClientUtil.doGet(accessUrl, null);
log.debug("step 1 get accesstoken:" + accessTokenStr);
JSONObject jsonObject = JSON.parseObject(accessTokenStr);
String accessToken = jsonObject.get("access_token").toString();
//第三步 发送模板消息
// 行业医疗护理
// 详细内容{{first.DATA}}
// 姓名:{{keyword1.DATA}}
// 卡号:{{keyword2.DATA}}
// 金额:{{keyword3.DATA}}
// 收费单:{{keyword4.DATA}}
// {{remark.DATA}}
String sendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
JSONObject sendPara = new JSONObject();
JSONObject dataPara = new JSONObject();
JSONObject first = new JSONObject();
first.put("value", Title);
first.put("color", "#173177");
JSONObject key1 = new JSONObject();
key1.put("value", username);
key1.put("color", "#173177");
JSONObject key2 = new JSONObject();
key2.put("value", patienid);
key2.put("color", "#173177");
JSONObject key3 = new JSONObject();
key3.put("value", amount);
key3.put("color", "#173177");
JSONObject key4 = new JSONObject();
key4.put("value", kahao);
key4.put("color", "#173177");
JSONObject remark = new JSONObject();
remark.put("value", "");
remark.put("color", "#173177");
dataPara.put("first", first);
dataPara.put("keyword1", key1);
dataPara.put("keyword2", key2);
dataPara.put("keyword3", key3);
dataPara.put("keyword4", key4);
dataPara.put("remark", remark);
sendPara.put("touser", userOpenid);
sendPara.put("template_id", templateId);
sendPara.put("url", "http://wx.btdbyy.cn:9081/jojugongzhonghao/#/Member_wdzd");
sendPara.put("data", dataPara);
String sendRes = HttpClientUtil.doPost(sendUrl, sendPara);
log.debug("step 2 send notify:" + sendRes);
JSONObject jsonSend = JSON.parseObject(sendRes);
return 0;
}
// @Async("asyncServiceExecutor")
public void zjcallback(HttpServletRequest request, HttpServletResponse response) {
PrintWriter out = null;
try {
log.debug("enter the ICBC hsjc zjcallback");
Map<String, String> params = new HashMap<String, String>();
String from = request.getParameter("from");
String api = request.getParameter("api");
String app_id = request.getParameter("app_id");
String charset = request.getParameter("charset");
String format = request.getParameter("format");
String encrypt_type = request.getParameter("encrypt_type");
String timestamp = request.getParameter("timestamp");
String biz_content = request.getParameter("biz_content");
String sign_type = request.getParameter("sign_type");
String sign = request.getParameter("sign");
log.debug("from:" + from);
log.debug("api:" + api);
log.debug("app_id:" + app_id);
log.debug("charset:" + charset);
log.debug("format:" + format);
log.debug("encrypt_type:" + encrypt_type);
log.debug("timestamp:" + timestamp);
log.debug("biz_content:" + biz_content);
log.debug("sign_type:" + sign_type);
log.debug("sign:" + sign);
params.put("from", from);
params.put("api", api);
params.put("app_id", app_id);
params.put("charset", charset);
params.put("format", format);
params.put("encrypt_type", encrypt_type);
params.put("timestamp", timestamp);
params.put("biz_content", biz_content);
params.put("sign_type", sign_type);//目前上行网关签名暂时仅支持RSA
/**********验证工行上行网关RSA签名**********/
//回调接口
String path = "/assess/zjcallback";
// WebUtils.buildOrderedSignStr(path, params);
String signStr;
String results = null;
String responseBizContent = null;
Map<String, Object> respMap = (Map<String, Object>) JSON.parse(biz_content);
if (!respMap.get("return_code").toString().equals("0")) {
//支付失败
log.debug("-----------------支付失败-------------------");
//业务请求字段获取
String outTradeNo = (String) respMap.get("out_trade_no");
log.debug("outTradeNo" + outTradeNo + " payment failed");
//业务处理逻辑......
// responseBizContent = "{\"return_code\":-12345,\"return_msg\":\"" + respMap.get("return_msg") + "\"}";
//业务返回参数设置
int return_code = 0;
String return_msg = "success.";
String msg_id = respMap.get("msg_id").toString();
responseBizContent = "{\"return_code\":" + return_code + ",\"return_msg\":\"" + return_msg + "\",\"msg_id\":\"" + msg_id + "\","
+ "\"busi_param_rp\":\"thisisresponseparameter\"}";
} else {
log.debug("-----------------支付成功-------------------");
/**********合作方/分行 业务逻辑处理**********/
@SuppressWarnings("unchecked")
String icbc_orderid = respMap.get("order_id").toString();
String icbc_paytime = respMap.get("pay_time").toString();
String msg_id = respMap.get("msg_id").toString();
//业务请求字段获取
String outTradeNo = (String) respMap.get("out_trade_no");
log.debug("outTradeNo:" + outTradeNo + " start MOP_OutpBillstoPayConfirm");
paybills(outTradeNo, icbc_orderid, icbc_paytime);
//业务返回参数设置
int return_code = 0;
String return_msg = "success.";
responseBizContent = "{\"return_code\":" + return_code + ",\"return_msg\":\"" + return_msg + "\",\"msg_id\":\"" + msg_id + "\","
+ "\"busi_param_rp\":\"thisisresponseparameter\"}";
}
//2、商户以RSA签名为例如下其中priKey为商户私钥
signStr = "\"response_biz_content\":" + responseBizContent + "," + "\"sign_type\":" + "\"RSA2\"";
// sang:注释icbc部分
// IcbcSignature.sign(signStr, "RSA2", PayService.MY_PRIVATE_KEY,
// charset);
sign = null;
results = "{" + signStr + ",\"sign\":\"" + sign + "\"}";
response.setContentType("application/json; charset=utf-8");
out = response.getWriter();
out.write(results);
} catch (Throwable e) {
e.printStackTrace();
out.write(e.getMessage());
} finally {
out.flush();
out.close();
}
}
public String paybills(String outTradeNo, String icbc_orderid, String icbc_paytime) {
try {
//业务处理逻辑......
HsjcVo vo = new HsjcVo();
vo.setOrderno(outTradeNo);
//通过orderno获取待缴费信息
List<HsjcVo> list = hsjcMapper.getMzjfListByFlow(vo);
BigDecimal bdBillAmount = BigDecimal.valueOf(0);
BigDecimal bdBillAmountMid = BigDecimal.valueOf(0);
DecimalFormat formatAmt = new DecimalFormat("###.00");
String billMsg = "";
String updateDate = "";
log.debug("unpay order: " + outTradeNo + " count:" + list.size());
for (int j = 0; j < list.size(); j++) {
if (j == (list.size() - 1)) {
billMsg += list.get(j).getFlowno();
if (list.get(j).getUpdatedate() == null || "".equals(list.get(j).getUpdatedate())) {
updateDate += list.get(j).getBilltime();
} else {
updateDate += list.get(j).getUpdatedate();
}
} else {
billMsg += list.get(j).getFlowno() + ",";
if (list.get(j).getUpdatedate() == null || "".equals(list.get(j).getUpdatedate())) {
updateDate += list.get(j).getBilltime() + ",";
} else {
updateDate += list.get(j).getUpdatedate() + ",";
}
}
bdBillAmountMid = new BigDecimal(list.get(j).getBillmoney());
bdBillAmount = bdBillAmount.add(bdBillAmountMid);
}
// 设置六位数支付订单号
String powerid = "HS" + VeDate.getNo(6);
String billMoney = bdBillAmount.toPlainString();
//单据集合用,分隔
vo.setBillsmsg(billMsg);
vo.setUserId(list.get(0).getUserId());
vo.setPatientid(list.get(0).getPatientid());
vo.setUpdatedate(updateDate);
vo.setPaynature("1");
vo.setPaytype("JHZF");
vo.setPowertranid(outTradeNo);
vo.setPowertrancard("");
vo.setTerminalid("0001");
vo.setReferno("");
//金额是总金额
vo.setZfamount(billMoney);
// vo.setYbzhamount();
// vo.setYbtcamount();
vo.setYboutmsg("医保结算信息");
vo.setHisopernum("WX");
String respXml = MOP_OutpBillstoPayConfirm(vo);
// 解析报文
Map<String, Object> map = XmlUtil.parse(respXml);
if (map.get("returncode").toString().equals("1")) {
//允许退号标志 N 不允许 Y 允许·
vo.setAppFlag("Y");
//单据状态 1 已退费 0 正常 2 已消号 3 挂号成功 4 已缴费
vo.setAppStatus(4);
vo.setIcbcorderid(icbc_orderid);
vo.setIcbcpaytime(icbc_paytime);
hsjcMapper.opHsjcConfirmAppoint(vo);
UserVo voUser = userService.queryUserInfoDetails(vo.getUserId());
log.debug("get hsjc userid:" + voUser.getName());
String cardNo = vo.getPatientid();
List<UserCardVo> UCList = userCardMapper.queryUserCardListByCardno(cardNo);
log.debug("real name:" + UCList.get(0).getName());
//推送消息给公众号
txSendMsg.SendNotifyJF("缴费成功", voUser.getOpenid(), UCList.get(0).getName(), vo.getPatientid(),
billMoney, billMsg, "u2MOIbFKkqSyhfZt2uZriiSRaIVMVhiu-Y4MzWS5p6Y");
} else {
//throw new LogicException(map.get("errormsg").toString());
log.debug("errormsg:" + map.get("errormsg").toString());
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
}