Files
dzpt/src/main/java/com/saye/hospitalgd/controller/PaymentStatisticsController.java

482 lines
21 KiB
Java
Raw Normal View History

2025-07-23 09:55:50 +08:00
package com.saye.hospitalgd.controller;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.saye.hospitalgd.commons.date.DateDUtil;
import com.saye.hospitalgd.commons.string.StringDUtil;
import com.saye.hospitalgd.model.Dicinfo;
import com.saye.hospitalgd.service.BankbillHistoryService;
import com.saye.hospitalgd.service.TransactionDetailService;
import com.saye.hospitalgd.service.system.DicinfoService;
import com.saye.hospitalgd.service.system.ServiceParamsService;
2025-12-07 11:46:49 +08:00
import com.saye.hospitalgd.service.FinancialReconciliation.TenpaySummaryService;
2025-07-23 09:55:50 +08:00
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author thuang
* @version 1.0
* @description: 支付统计
* @date 2021/9/18 16:32
*/
@Controller
@Slf4j
@RequestMapping("/paymentStatistics")
@Api(tags = "支付统计相关接口")
public class PaymentStatisticsController {
@Autowired
private DicinfoService dicinfoService;
@Autowired
private BankbillHistoryService bankbillHistoryService;
@Autowired
private TransactionDetailService transactionDetailService;
@Autowired
private ServiceParamsService serviceParamsService;
2025-12-07 11:46:49 +08:00
@Autowired
private TenpaySummaryService tenpaySummaryService;
2025-07-23 09:55:50 +08:00
@RequestMapping("/toPaymentStatistics")
public String toPaymentStatistics(ModelMap modelMap) {
return "paymentStatistics/paymentStatistics";
}
/**
* @description: 查询支付统计页面数据
* @author thuang
* @date 2021/10/22 16:55
* @version 1.0
*/
@PostMapping("/findpaymentStatisticsData")
@ResponseBody
@ApiOperation(value = "查询支付统计页面数据")
public HashMap<Object, Object> findpaymentStatisticsData(@RequestBody HashMap<Object, Object> map) {
HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
String errCode = "0";
String errMsg = "";
try {
String startTime = StringDUtil.changeNullToEmpty(map.get("startTime"));
String endTime = StringDUtil.changeNullToEmpty(map.get("endTime"));
List<String> betweenDate = DateDUtil.getBetweenDate(startTime, endTime);
2025-09-22 11:12:27 +08:00
// 查询字典表支付方式 - 使用THIRD_PAY三方支付方式字典
2025-07-23 09:55:50 +08:00
List<Dicinfo> pay_type = dicinfoService.findDicinfoTreeNodeList("THIRD_PAY");
HashMap<String, String> payMethodMap = new HashMap<>();
for (Dicinfo dicinfo : pay_type) {
String dicname = dicinfo.getDicname();
String dicvalue = dicinfo.getDicvalue();
2025-09-22 11:12:27 +08:00
// 根据三方支付字典配置映射支付方式
payMethodMap.put(dicvalue, dicname);
2025-07-23 09:55:50 +08:00
}
// 先组织好map
LinkedHashMap<String, LinkedHashMap<String, String>> numMap = new LinkedHashMap<>();
LinkedHashMap<String, LinkedHashMap<String, String>> moneyMap = new LinkedHashMap<>();
LinkedHashMap<String, String> addMap = new LinkedHashMap<>();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd");
List<String> betweenDateList = new ArrayList<>();
for (String s : betweenDate) {
addMap.put(s, "0");
Date date = DateDUtil.strToDate(DateDUtil.yyyy_MM_dd, s);
betweenDateList.add(sdf.format(date));
}
2025-09-22 11:12:27 +08:00
// 根据THIRD_PAY三方支付字典初始化统计分类
numMap.put("微信支付", new LinkedHashMap<String, String>() {{
2025-07-23 09:55:50 +08:00
putAll(addMap);
}});
2025-09-22 11:12:27 +08:00
numMap.put("刷卡支付", new LinkedHashMap<String, String>() {{
2025-07-23 09:55:50 +08:00
putAll(addMap);
}});
2025-09-22 11:12:27 +08:00
numMap.put("支付宝支付", new LinkedHashMap<String, String>() {{
2025-07-23 09:55:50 +08:00
putAll(addMap);
}});
2025-09-22 11:12:27 +08:00
numMap.put("其他支付", new LinkedHashMap<String, String>() {{
2025-07-23 09:55:50 +08:00
putAll(addMap);
}});
2025-09-22 11:12:27 +08:00
2025-07-23 09:55:50 +08:00
moneyMap.put("微信支付", new LinkedHashMap<String, String>() {{
putAll(addMap);
}});
2025-09-22 11:12:27 +08:00
moneyMap.put("刷卡支付", new LinkedHashMap<String, String>() {{
putAll(addMap);
}});
moneyMap.put("支付宝支付", new LinkedHashMap<String, String>() {{
putAll(addMap);
}});
moneyMap.put("其他支付", new LinkedHashMap<String, String>() {{
2025-07-23 09:55:50 +08:00
putAll(addMap);
}});
// 返回格式化后的日期数组
responseMap.put("betweenDate", betweenDateList);
List<HashMap<Object, Object>> thirdNumList = bankbillHistoryService.findBankBillNumByTime(map);
for (HashMap<Object, Object> hashMap : thirdNumList) {
String num1 = StringDUtil.changeNullToEmpty(hashMap.get("NUM"));
2025-09-22 11:12:27 +08:00
String c_jyrq = StringDUtil.changeNullToEmpty(hashMap.get("C_JYRQ"));
String c_zffs = StringDUtil.changeNullToEmpty(hashMap.get("C_ZFFS"));
2025-07-23 09:55:50 +08:00
String str_zffs = "";
String s = payMethodMap.get(c_zffs);
if (s == null) {
2025-09-22 11:12:27 +08:00
str_zffs = "其他支付";
2025-07-23 09:55:50 +08:00
} else {
str_zffs = s;
}
LinkedHashMap<String, String> zffsMap = numMap.get(str_zffs);
2025-09-22 11:12:27 +08:00
if (zffsMap != null) {
String countNum = zffsMap.get(c_jyrq);
2025-10-27 08:49:28 +08:00
// 安全处理countNum如果为null或空字符串则默认为"0"
if (countNum == null || countNum.isEmpty()) {
countNum = "0";
}
2025-09-22 11:12:27 +08:00
countNum = new BigDecimal(countNum).add(new BigDecimal(num1)).toString();
zffsMap.put(c_jyrq, countNum);
}
2025-07-23 09:55:50 +08:00
}
// 将linkedHashMap转为list<hashMap<>> hashMap 中 name 支付方式data list集合 内容为计算的数据
List<HashMap<String, Object>> resultNumList = new ArrayList<>();
for (String key : numMap.keySet()) {
LinkedHashMap<String, String> linkedHashMap = numMap.get(key);
List<String> newList = new ArrayList<>();
for (String key2 : linkedHashMap.keySet()) {
String s = linkedHashMap.get(key2);
newList.add(s);
}
HashMap<String, Object> newMap = new HashMap<>();
newMap.put("name", key);
newMap.put("data", newList);
resultNumList.add(newMap);
}
responseMap.put("resultNumList", resultNumList);
List<HashMap<Object, Object>> thirdMoneyList = bankbillHistoryService.findBankBillMoneyByTime(map);
for (HashMap<Object, Object> hashMap : thirdMoneyList) {
String money = StringDUtil.changeNullToEmpty(hashMap.get("MONEY"));
2025-09-22 11:12:27 +08:00
String c_jyrq = StringDUtil.changeNullToEmpty(hashMap.get("C_JYRQ"));
String c_zffs = StringDUtil.changeNullToEmpty(hashMap.get("C_ZFFS"));
2025-07-23 09:55:50 +08:00
String str_zffs = "";
String s = payMethodMap.get(c_zffs);
if (s == null) {
2025-09-22 11:12:27 +08:00
str_zffs = "其他支付";
2025-07-23 09:55:50 +08:00
} else {
str_zffs = s;
}
LinkedHashMap<String, String> zffsMap = moneyMap.get(str_zffs);
2025-09-22 11:12:27 +08:00
if (zffsMap != null) {
String countNum = zffsMap.get(c_jyrq);
2025-10-27 08:49:28 +08:00
// 安全处理countNum如果为null或空字符串则默认为"0"
if (countNum == null || countNum.isEmpty()) {
countNum = "0";
}
2025-09-22 11:12:27 +08:00
countNum = new BigDecimal(countNum).add(new BigDecimal(money)).toString();
zffsMap.put(c_jyrq, countNum);
}
2025-07-23 09:55:50 +08:00
}
// 将linkedHashMap转为list<hashMap<>> hashMap 中 name 支付方式data list集合 内容为计算的数据
List<HashMap<String, Object>> resultMoneyList = new ArrayList<>();
for (String key : moneyMap.keySet()) {
LinkedHashMap<String, String> linkedHashMap = moneyMap.get(key);
List<String> newList = new ArrayList<>();
for (String key2 : linkedHashMap.keySet()) {
String s = linkedHashMap.get(key2);
newList.add(s);
}
HashMap<String, Object> newMap = new HashMap<>();
newMap.put("name", key);
newMap.put("data", newList);
resultMoneyList.add(newMap);
}
responseMap.put("resultMoneyList", resultMoneyList);
} catch (Exception e) {
e.printStackTrace();
errCode = "999";
errMsg = "查询统计数据失败,原因:" + e.getMessage();
}
responseMap.put("errCode", errCode);
responseMap.put("errMsg", errMsg);
return responseMap;
}
/**
* @description: 对账汇总统计
* @author thuang
* @date 2021/12/1 14:53
* @version 1.0
*/
@RequestMapping("/toSummary")
@ApiOperation("对账汇总统计")
public String toPrint(HttpServletRequest request, ModelMap modelMap) {
String trade_date = StringDUtil.changeNullToEmpty(request.getParameter("trade_date"));
if ("".equals(trade_date)) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, -1);
Date startDate = calendar.getTime();
String startTime = DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, startDate);
String endTime = DateDUtil.getCurrentDate(DateDUtil.yyyy_MM_dd);
modelMap.addAttribute("startTime", startTime);
modelMap.addAttribute("endTime", endTime);
} else {
modelMap.addAttribute("startTime", trade_date);
modelMap.addAttribute("endTime", trade_date);
modelMap.addAttribute("isClick", "1");
}
List<HashMap<Object, Object>> serviceParams = serviceParamsService.findParamValByParamCode("dzhz_table_name");
String dzhz_table_name = StringDUtil.changeNullToEmpty(serviceParams.get(0).get("PARAM_VAL"));
modelMap.addAttribute("table_name", dzhz_table_name);
return "paymentStatistics/summary";
}
2025-12-07 11:46:49 +08:00
@RequestMapping("/toTenpaySummary")
@ApiOperation("财付通汇款汇总表")
public String toTenpaySummary(HttpServletRequest request, ModelMap modelMap) {
String trade_date = StringDUtil.changeNullToEmpty(request.getParameter("trade_date"));
if ("".equals(trade_date)) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, -1);
Date startDate = calendar.getTime();
String startTime = DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, startDate);
String endTime = DateDUtil.getCurrentDate(DateDUtil.yyyy_MM_dd);
modelMap.addAttribute("startTime", startTime);
modelMap.addAttribute("endTime", endTime);
} else {
modelMap.addAttribute("startTime", trade_date);
modelMap.addAttribute("endTime", trade_date);
modelMap.addAttribute("isClick", "1");
}
return "paymentStatistics/tenpaySummary";
}
2025-07-23 09:55:50 +08:00
/**
* @description: 查询汇总表数据
* @author thuang
* @date 2021/12/3 16:29
* @version 1.0
*/
@PostMapping("/findSummaryData")
@ResponseBody
@ApiOperation("查询汇总表数据")
public HashMap<Object, Object> findSummaryData(@RequestBody HashMap<Object, Object> map) {
HashMap<Object, Object> resultMap = new HashMap<>();
String errCode = "0";
String errMsg = "";
try {
map.put("is_active", "1");
List<HashMap<Object, Object>> list = transactionDetailService.findHisAndThirdJoinData(map);
2025-09-22 11:12:27 +08:00
// his需要统计自定义PayType编码: 1微信支付 2聚合支付 3军保支付 4其他 5现金支付
2025-07-23 09:55:50 +08:00
// 三方需要统计 1_1微信支付 1_2支付宝支付 云闪付支付 其他支付 2银行卡支付 3掌医支付 4现金支付 5其他
HashMap<Object, Object> hisMoneyData = new HashMap<>();
2025-09-22 11:12:27 +08:00
hisMoneyData.put("1", "0"); // 微信支付
hisMoneyData.put("2", "0"); // 聚合支付
hisMoneyData.put("3", "0"); // 军保支付
hisMoneyData.put("4", "0"); // 其他
hisMoneyData.put("5", "0"); // 现金支付
2025-07-23 09:55:50 +08:00
HashMap<Object, Object> thirdMoneyData = new HashMap<>();
thirdMoneyData.put("1_1", "0");
thirdMoneyData.put("1_2", "0");
thirdMoneyData.put("1_3", "0");
thirdMoneyData.put("1_4", "0");
thirdMoneyData.put("2", "0");
thirdMoneyData.put("3", "0");
thirdMoneyData.put("4", "0");
thirdMoneyData.put("5", "0");
HashMap<Object, Object> hisNumData = new HashMap<>();
2025-09-22 11:12:27 +08:00
hisNumData.put("1", "0"); // 微信支付
hisNumData.put("2", "0"); // 聚合支付
hisNumData.put("3", "0"); // 军保支付
hisNumData.put("4", "0"); // 其他
hisNumData.put("5", "0"); // 现金支付
2025-07-23 09:55:50 +08:00
HashMap<Object, Object> thirdNumData = new HashMap<>();
thirdNumData.put("1_1", "0");
thirdNumData.put("1_2", "0");
thirdNumData.put("1_3", "0");
thirdNumData.put("1_4", "0");
thirdNumData.put("2", "0");
thirdNumData.put("3", "0");
thirdNumData.put("4", "0");
thirdNumData.put("5", "0");
for (int i = 0; i < list.size(); i++) {
HashMap<Object, Object> hashMap = list.get(i);
String i_jyje = StringDUtil.changeNullToEmpty(hashMap.get("I_JYJE")).trim();
String i_zffs = StringDUtil.changeNullToEmpty(hashMap.get("I_JYQD")).trim();
String amount = StringDUtil.changeNullToEmpty(hashMap.get("AMOUNT")).trim();
String paytype = StringDUtil.changeNullToEmpty(hashMap.get("PAYTYPE")).trim();
2025-10-27 08:49:28 +08:00
// 数据核准确保PayType在预定义范围内
if (!hisMoneyData.containsKey(paytype)) {
log.warn("发现未预定义的PayType: [{}], 数据: {}, 已归类为其他支付方式", paytype, hashMap);
paytype = "4"; // 归类为其他支付方式
}
// 数据核准确保I_JYQD在预定义范围内
if (!thirdMoneyData.containsKey(i_zffs)) {
log.warn("发现未预定义的I_JYQD: [{}], 数据: {}, 已归类为其他支付方式", i_zffs, hashMap);
i_zffs = "5"; // 归类为其他支付方式
}
2025-07-23 09:55:50 +08:00
// 如果银行端金额不为空
if (StrUtil.isNotBlank(i_jyje)) {
2025-10-27 08:49:28 +08:00
try {
log.info("处理银行端数据: i_zffs={}, i_jyje={}", i_zffs, i_jyje);
// 验证金额格式
BigDecimal transAmount = new BigDecimal(i_jyje);
if (transAmount.compareTo(BigDecimal.ZERO) < 0) {
log.warn("发现负数金额: i_jyje={}, 数据: {}", i_jyje, hashMap);
}
// 安全获取当前金额如果为null则默认为BigDecimal.ZERO
BigDecimal money = Convert.toBigDecimal(thirdMoneyData.get(i_zffs), BigDecimal.ZERO);
money = money.add(transAmount);
thirdMoneyData.put(i_zffs, money.toString());
// 安全获取当前数量如果为null或空字符串则默认为"0"
String currentNumStr = StringDUtil.changeNullToEmpty(thirdNumData.get(i_zffs));
if (currentNumStr.isEmpty()) {
currentNumStr = "0";
}
int num = Integer.parseInt(currentNumStr);
num++;
thirdNumData.put(i_zffs, num + "");
} catch (NumberFormatException e) {
log.error("银行端金额格式错误: i_jyje=[{}], 数据: {}, 错误: {}", i_jyje, hashMap, e.getMessage());
}
2025-07-23 09:55:50 +08:00
}
// 如果his端金额不为空
if (StrUtil.isNotBlank(amount)) {
2025-10-27 08:49:28 +08:00
try {
log.info("处理HIS端数据: paytype={}, amount={}", paytype, amount);
// 验证金额格式
BigDecimal transAmount = new BigDecimal(amount);
if (transAmount.compareTo(BigDecimal.ZERO) < 0) {
log.warn("发现负数金额: amount={}, 数据: {}", amount, hashMap);
}
// 安全获取当前金额如果为null或空字符串则默认为"0"
String currentMoneyStr = StringDUtil.changeNullToEmpty(hisMoneyData.get(paytype));
if (currentMoneyStr.isEmpty()) {
currentMoneyStr = "0";
}
BigDecimal money = new BigDecimal(currentMoneyStr);
money = money.add(transAmount);
hisMoneyData.put(paytype, money.toString());
// 安全获取当前数量如果为null或空字符串则默认为"0"
String currentNumStr = StringDUtil.changeNullToEmpty(hisNumData.get(paytype));
if (currentNumStr.isEmpty()) {
currentNumStr = "0";
}
int num = Integer.parseInt(currentNumStr);
num++;
hisNumData.put(paytype, num + "");
} catch (NumberFormatException e) {
log.error("HIS端金额格式错误: amount=[{}], 数据: {}, 错误: {}", amount, hashMap, e.getMessage());
}
2025-07-23 09:55:50 +08:00
}
}
resultMap.put("hisMoneyData", hisMoneyData);
resultMap.put("thirdMoneyData", thirdMoneyData);
resultMap.put("hisNumData", hisNumData);
resultMap.put("thirdNumData", thirdNumData);
} catch (Exception e) {
e.printStackTrace();
errCode = "999";
errMsg = "查询对账汇总表信息失败,原因:" + e.getMessage();
}
resultMap.put("errCode", errCode);
resultMap.put("errMsg", errMsg);
return resultMap;
}
2025-12-07 11:46:49 +08:00
@RequestMapping("/findTenpaySummary")
@ResponseBody
@ApiOperation("查询财付通汇款汇总数据")
public HashMap<Object, Object> findTenpaySummary(String startTime, String endTime) {
HashMap<Object, Object> response = new HashMap<>();
try {
2025-12-23 09:24:28 +08:00
// 如果未选择日期,则默认查询昨日到今日,避免无条件查全量
if ((startTime == null || "".equals(startTime.trim())) && (endTime == null || "".equals(endTime.trim()))) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, -1);
Date startDate = calendar.getTime();
startTime = DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, startDate);
endTime = DateDUtil.getCurrentDate(DateDUtil.yyyy_MM_dd);
}
2025-12-07 11:46:49 +08:00
HashMap<Object, Object> map = new HashMap<>();
map.put("startTime", startTime);
map.put("endTime", endTime);
List<HashMap<Object, Object>> bankList = tenpaySummaryService.findTenpayBankSummary(map);
List<HashMap<Object, Object>> hisList = tenpaySummaryService.findTenpayHisSummary(map);
response.put("code", 0);
response.put("msg", "OK");
response.put("bankData", bankList);
response.put("hisData", hisList);
} catch (Exception e) {
response.put("code", 1);
response.put("msg", e.getMessage());
}
return response;
}
2025-07-23 09:55:50 +08:00
}