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; import com.saye.hospitalgd.service.FinancialReconciliation.TenpaySummaryService; 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; @Autowired private TenpaySummaryService tenpaySummaryService; @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 findpaymentStatisticsData(@RequestBody HashMap map) { HashMap responseMap = new HashMap(); String errCode = "0"; String errMsg = ""; try { String startTime = StringDUtil.changeNullToEmpty(map.get("startTime")); String endTime = StringDUtil.changeNullToEmpty(map.get("endTime")); List betweenDate = DateDUtil.getBetweenDate(startTime, endTime); // 查询字典表支付方式 - 使用THIRD_PAY三方支付方式字典 List pay_type = dicinfoService.findDicinfoTreeNodeList("THIRD_PAY"); HashMap payMethodMap = new HashMap<>(); for (Dicinfo dicinfo : pay_type) { String dicname = dicinfo.getDicname(); String dicvalue = dicinfo.getDicvalue(); // 根据三方支付字典配置映射支付方式 payMethodMap.put(dicvalue, dicname); } // 先组织好map LinkedHashMap> numMap = new LinkedHashMap<>(); LinkedHashMap> moneyMap = new LinkedHashMap<>(); LinkedHashMap addMap = new LinkedHashMap<>(); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd"); List 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)); } // 根据THIRD_PAY三方支付字典初始化统计分类 numMap.put("微信支付", new LinkedHashMap() {{ putAll(addMap); }}); numMap.put("刷卡支付", new LinkedHashMap() {{ putAll(addMap); }}); numMap.put("支付宝支付", new LinkedHashMap() {{ putAll(addMap); }}); numMap.put("其他支付", new LinkedHashMap() {{ putAll(addMap); }}); moneyMap.put("微信支付", new LinkedHashMap() {{ putAll(addMap); }}); moneyMap.put("刷卡支付", new LinkedHashMap() {{ putAll(addMap); }}); moneyMap.put("支付宝支付", new LinkedHashMap() {{ putAll(addMap); }}); moneyMap.put("其他支付", new LinkedHashMap() {{ putAll(addMap); }}); // 返回格式化后的日期数组 responseMap.put("betweenDate", betweenDateList); List> thirdNumList = bankbillHistoryService.findBankBillNumByTime(map); for (HashMap hashMap : thirdNumList) { String num1 = StringDUtil.changeNullToEmpty(hashMap.get("NUM")); String c_jyrq = StringDUtil.changeNullToEmpty(hashMap.get("C_JYRQ")); String c_zffs = StringDUtil.changeNullToEmpty(hashMap.get("C_ZFFS")); String str_zffs = ""; String s = payMethodMap.get(c_zffs); if (s == null) { str_zffs = "其他支付"; } else { str_zffs = s; } LinkedHashMap zffsMap = numMap.get(str_zffs); if (zffsMap != null) { String countNum = zffsMap.get(c_jyrq); // 安全处理countNum,如果为null或空字符串则默认为"0" if (countNum == null || countNum.isEmpty()) { countNum = "0"; } countNum = new BigDecimal(countNum).add(new BigDecimal(num1)).toString(); zffsMap.put(c_jyrq, countNum); } } // 将linkedHashMap转为list> hashMap 中 name 支付方式,data list集合 内容为计算的数据 List> resultNumList = new ArrayList<>(); for (String key : numMap.keySet()) { LinkedHashMap linkedHashMap = numMap.get(key); List newList = new ArrayList<>(); for (String key2 : linkedHashMap.keySet()) { String s = linkedHashMap.get(key2); newList.add(s); } HashMap newMap = new HashMap<>(); newMap.put("name", key); newMap.put("data", newList); resultNumList.add(newMap); } responseMap.put("resultNumList", resultNumList); List> thirdMoneyList = bankbillHistoryService.findBankBillMoneyByTime(map); for (HashMap hashMap : thirdMoneyList) { String money = StringDUtil.changeNullToEmpty(hashMap.get("MONEY")); String c_jyrq = StringDUtil.changeNullToEmpty(hashMap.get("C_JYRQ")); String c_zffs = StringDUtil.changeNullToEmpty(hashMap.get("C_ZFFS")); String str_zffs = ""; String s = payMethodMap.get(c_zffs); if (s == null) { str_zffs = "其他支付"; } else { str_zffs = s; } LinkedHashMap zffsMap = moneyMap.get(str_zffs); if (zffsMap != null) { String countNum = zffsMap.get(c_jyrq); // 安全处理countNum,如果为null或空字符串则默认为"0" if (countNum == null || countNum.isEmpty()) { countNum = "0"; } countNum = new BigDecimal(countNum).add(new BigDecimal(money)).toString(); zffsMap.put(c_jyrq, countNum); } } // 将linkedHashMap转为list> hashMap 中 name 支付方式,data list集合 内容为计算的数据 List> resultMoneyList = new ArrayList<>(); for (String key : moneyMap.keySet()) { LinkedHashMap linkedHashMap = moneyMap.get(key); List newList = new ArrayList<>(); for (String key2 : linkedHashMap.keySet()) { String s = linkedHashMap.get(key2); newList.add(s); } HashMap 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> 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"; } @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"; } /** * @description: 查询汇总表数据 * @author thuang * @date 2021/12/3 16:29 * @version 1.0 */ @PostMapping("/findSummaryData") @ResponseBody @ApiOperation("查询汇总表数据") public HashMap findSummaryData(@RequestBody HashMap map) { HashMap resultMap = new HashMap<>(); String errCode = "0"; String errMsg = ""; try { map.put("is_active", "1"); List> list = transactionDetailService.findHisAndThirdJoinData(map); // his需要统计(自定义PayType编码): 1微信支付 2聚合支付 3军保支付 4其他 5现金支付 // 三方需要统计 1_1微信支付 1_2支付宝支付 云闪付支付 其他支付 2银行卡支付 3掌医支付 4现金支付 5其他 HashMap hisMoneyData = new HashMap<>(); hisMoneyData.put("1", "0"); // 微信支付 hisMoneyData.put("2", "0"); // 聚合支付 hisMoneyData.put("3", "0"); // 军保支付 hisMoneyData.put("4", "0"); // 其他 hisMoneyData.put("5", "0"); // 现金支付 HashMap 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 hisNumData = new HashMap<>(); hisNumData.put("1", "0"); // 微信支付 hisNumData.put("2", "0"); // 聚合支付 hisNumData.put("3", "0"); // 军保支付 hisNumData.put("4", "0"); // 其他 hisNumData.put("5", "0"); // 现金支付 HashMap 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 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(); // 数据核准:确保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"; // 归类为其他支付方式 } // 如果银行端金额不为空 if (StrUtil.isNotBlank(i_jyje)) { 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()); } } // 如果his端金额不为空 if (StrUtil.isNotBlank(amount)) { 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()); } } } 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; } @RequestMapping("/findTenpaySummary") @ResponseBody @ApiOperation("查询财付通汇款汇总数据") public HashMap findTenpaySummary(String startTime, String endTime) { HashMap response = new HashMap<>(); try { // 如果未选择日期,则默认查询昨日到今日,避免无条件查全量 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); } HashMap map = new HashMap<>(); map.put("startTime", startTime); map.put("endTime", endTime); List> bankList = tenpaySummaryService.findTenpayBankSummary(map); List> 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; } }