update:对账消息推送,军保账单统计,退款数据统计

This commit is contained in:
Yuan
2025-10-20 14:39:29 +08:00
parent 9fb2ea9cb4
commit ff5bad9967
35 changed files with 3649 additions and 100 deletions

View File

@@ -0,0 +1,263 @@
package com.saye.hospitalgd.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.saye.hospitalgd.commons.string.StringDUtil;
import com.saye.hospitalgd.model.FinanceUser;
import com.saye.hospitalgd.service.NotifyService;
import com.saye.hospitalgd.service.system.FinanceUserService;
import com.saye.hospitalgd.service.system.ServiceParamsService;
import com.saye.hospitalgd.util.HttpClientUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
/**
* @author thuang
* @version 1.0
* @description: 消息推送服务实现类
* @date 2024/12/19 18:00
*/
@Service
public class NotifyServiceImpl implements NotifyService {
private static final Logger log = LoggerFactory.getLogger(NotifyServiceImpl.class);
@Autowired
private FinanceUserService financeUserService;
@Autowired
private ServiceParamsService serviceParamsService;
@Override
public void sendReconciliationNotify(String tradeDate, String status, String message) throws Exception {
try {
// 获取所有启用的财务人员
List<FinanceUser> financeUsers = financeUserService.findActiveFinanceUsers();
if (financeUsers == null || financeUsers.isEmpty()) {
log.info("没有启用的财务人员,跳过消息推送");
return;
}
// 获取中转服务地址
List<HashMap<Object, Object>> serviceParams = serviceParamsService.findParamValByParamCode("hgd_dmz");
String transferUrl = StringDUtil.changeNullToEmpty(serviceParams.get(0).get("PARAM_VAL"));
if (transferUrl == null || transferUrl.trim().isEmpty()) {
log.error("未配置中转服务地址(hgd_dmz)");
return;
}
// 构建消息推送URL
String notifyUrl = transferUrl.endsWith("/") ?
transferUrl + "sendNotifyYJJ" :
transferUrl + "/sendNotifyYJJ";
// 为每个财务人员发送通知
for (FinanceUser financeUser : financeUsers) {
if (financeUser.getOpenId() != null && !financeUser.getOpenId().trim().isEmpty()) {
sendNotifyToFinanceUser(financeUser, tradeDate, status, message, notifyUrl);
} else {
log.warn("财务人员 {} 没有OpenID跳过消息推送", financeUser.getName());
}
}
} catch (Exception e) {
log.error("发送对账通知失败", e);
throw e;
}
}
/**
* 发送通知给指定财务人员
* @param financeUser 财务人员信息
* @param tradeDate 对账日期
* @param status 对账状态
* @param message 对账消息
* @param notifyUrl 通知URL
*/
private void sendNotifyToFinanceUser(FinanceUser financeUser, String tradeDate, String status,
String message, String notifyUrl) {
try {
// 构建通知参数
HashMap<String, Object> notifyParams = new HashMap<>();
notifyParams.put("openid", financeUser.getOpenId());
notifyParams.put("tradeDate", tradeDate);
notifyParams.put("status", status);
notifyParams.put("message", message);
notifyParams.put("userName", financeUser.getName());
// 发送通知
String response = HttpClientUtil.doPost(notifyUrl, notifyParams);
log.debug("发送对账通知响应: " + response);
// 增加空值检查
if (response == null || response.trim().isEmpty()) {
log.error("调用中转服务失败,返回为空,接收人: {}", financeUser.getName());
return;
}
JSONObject jsonResponse = JSON.parseObject(response);
// 兼容多种成功状态码格式
Integer code = jsonResponse.getInteger("code");
Integer errCode = jsonResponse.getInteger("errcode");
Integer errCodeInt = jsonResponse.getInteger("errCode");
// 判断成功条件code=0 或 errcode=0 或 errCode=0 或 errCode="0"
boolean isSuccess = (code != null && code == 0) ||
(errCode != null && errCode == 0) ||
(errCodeInt != null && errCodeInt == 0) ||
"0".equals(jsonResponse.getString("errCode"));
if (isSuccess) {
log.info("对账通知发送成功,接收人: {}", financeUser.getName());
} else {
// 兼容多种错误消息字段msg/errMsg
String errorMsg = jsonResponse.getString("msg");
if (errorMsg == null || errorMsg.trim().isEmpty()) {
errorMsg = jsonResponse.getString("errMsg");
}
log.error("对账通知发送失败,接收人: {}, 错误信息: {}",
financeUser.getName(), errorMsg);
}
} catch (Exception e) {
log.error("发送对账通知异常,接收人: {}", financeUser.getName(), e);
}
}
@Override
public String getUserOpenId(String wechatName) throws Exception {
try {
// 获取中转服务地址
List<HashMap<Object, Object>> serviceParams = serviceParamsService.findParamValByParamCode("hgd_dmz");
String transferUrl = StringDUtil.changeNullToEmpty(serviceParams.get(0).get("PARAM_VAL"));
if (transferUrl == null || transferUrl.trim().isEmpty()) {
throw new Exception("未配置中转服务地址(hgd_dmz)");
}
// 构建获取OpenID的URL
String openIdUrl = transferUrl.endsWith("/") ?
transferUrl + "getUserOpenId" :
transferUrl + "/getUserOpenId";
// 构建请求参数
HashMap<String, Object> params = new HashMap<>();
params.put("wechatName", wechatName);
// 发送请求
String response = HttpClientUtil.doPost(openIdUrl, params);
log.debug("获取OpenID响应: " + response);
// 增加空值检查
if (response == null || response.trim().isEmpty()) {
throw new Exception("调用中转服务失败,返回为空。请检查中转服务地址是否正确或网络是否可达");
}
JSONObject jsonResponse = JSON.parseObject(response);
// 兼容两种返回格式code/errCode
Integer code = jsonResponse.getInteger("code");
Integer errCode = jsonResponse.getInteger("errCode");
// 判断成功条件code=0 或 errCode="0"
boolean isSuccess = (code != null && code == 0) ||
(errCode != null && errCode == 0) ||
"0".equals(jsonResponse.getString("errCode"));
if (isSuccess) {
// 兼容两种数据字段data/openid
String openId = jsonResponse.getString("data");
if (openId == null || openId.trim().isEmpty()) {
openId = jsonResponse.getString("openid");
}
if (openId != null && !openId.trim().isEmpty()) {
log.info("成功获取OpenID: {} for 微信名: {}", openId, wechatName);
return openId;
} else {
throw new Exception("返回的OpenID为空");
}
} else {
// 兼容两种错误消息字段msg/errMsg
String errorMsg = jsonResponse.getString("msg");
if (errorMsg == null || errorMsg.trim().isEmpty()) {
errorMsg = jsonResponse.getString("errMsg");
}
throw new Exception("获取OpenID失败: " + errorMsg);
}
} catch (Exception e) {
log.error("获取OpenID异常微信名: {}", wechatName, e);
throw e;
}
}
@Override
public String getUserOpenIdByPhone(String phone) throws Exception {
try {
// 获取中转服务地址
List<HashMap<Object, Object>> serviceParams = serviceParamsService.findParamValByParamCode("hgd_dmz");
String transferUrl = StringDUtil.changeNullToEmpty(serviceParams.get(0).get("PARAM_VAL"));
if (transferUrl == null || transferUrl.trim().isEmpty()) {
throw new Exception("未配置中转服务地址(hgd_dmz)");
}
// 构建获取OpenID的URL
String openIdUrl = transferUrl.endsWith("/") ?
transferUrl + "getUserOpenId" :
transferUrl + "/getUserOpenId";
// 构建请求参数
HashMap<String, Object> params = new HashMap<>();
params.put("phone", phone);
params.put("yz", "joju@");
// 发送请求
String response = HttpClientUtil.doPost(openIdUrl, params);
log.debug("根据手机号获取OpenID响应: " + response);
// 增加空值检查
if (response == null || response.trim().isEmpty()) {
throw new Exception("调用中转服务失败,返回为空。请检查中转服务地址是否正确或网络是否可达");
}
JSONObject jsonResponse = JSON.parseObject(response);
// 兼容两种返回格式code/errCode
Integer code = jsonResponse.getInteger("code");
Integer errCode = jsonResponse.getInteger("errCode");
// 判断成功条件code=0 或 errCode="0"
boolean isSuccess = (code != null && code == 0) ||
(errCode != null && errCode == 0) ||
"0".equals(jsonResponse.getString("errCode"));
if (isSuccess) {
String openId = jsonResponse.getString("openid");
if (openId != null && !openId.trim().isEmpty()) {
log.info("成功根据手机号获取OpenID: {} for 手机号: {}", openId, phone);
return openId;
} else {
throw new Exception("返回的OpenID为空");
}
} else {
// 兼容两种错误消息字段msg/errMsg
String errorMsg = jsonResponse.getString("msg");
if (errorMsg == null || errorMsg.trim().isEmpty()) {
errorMsg = jsonResponse.getString("errMsg");
}
throw new Exception("根据手机号获取OpenID失败: " + errorMsg);
}
} catch (Exception e) {
log.error("根据手机号获取OpenID异常手机号: {}", phone, e);
throw e;
}
}
}

View File

@@ -29,6 +29,11 @@ public class OperatorServiceImpl implements OperatorService {
return operatorMapper.findAllOperator(map);
}
@Override
public List<HashMap<Object, Object>> findMilitaryOperators(HashMap<Object, Object> map) throws Exception {
return operatorMapper.findMilitaryOperators(map);
}
@Override
public void addOperator(HashMap<Object, Object> map) throws Exception {
String hisOperCode = StringDUtil.changeNullToEmpty(map.get("hisOperCode"));