From ae385398fcdeb542e8936845d87abf899932a52f Mon Sep 17 00:00:00 2001 From: Yuan <1450637472@qq.com> Date: Tue, 23 Dec 2025 09:24:28 +0800 Subject: [PATCH] =?UTF-8?q?bugfix=EF=BC=9A=E7=A7=BB=E5=8A=A8=E5=8C=BB?= =?UTF-8?q?=E4=BF=9D=E5=AF=B9=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MobileYbReconciliationController.java | 68 +++++++++++ .../PaymentStatisticsController.java | 10 ++ .../entity/MobileYbReconciliationResult.java | 36 ++++++ .../MobileYbReconciliationMapper.java | 22 ++++ .../job/MobileYbReconciliationJob.java | 24 ++++ .../MobileYbReconciliationMethod.java | 47 ++++++++ .../MobileYbReconciliationService.java | 16 +++ .../MobileYbReconciliationServiceImpl.java | 95 ++++++++++++++++ .../mapper/BankbillsHistoryMapper.xml | 1 - .../MobileYbReconciliationMapper.xml | 69 +++++++++++ .../TenpaySummaryMapper.xml | 9 +- .../mapper/TransactionDetailMapper.xml | 7 +- .../mobileYbReconciliation.html | 107 ++++++++++++++++++ 13 files changed, 502 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/saye/hospitalgd/controller/MobileYbReconciliationController.java create mode 100644 src/main/java/com/saye/hospitalgd/entity/MobileYbReconciliationResult.java create mode 100644 src/main/java/com/saye/hospitalgd/mapper/FinancialReconciliation/MobileYbReconciliationMapper.java create mode 100644 src/main/java/com/saye/hospitalgd/scheduler/job/MobileYbReconciliationJob.java create mode 100644 src/main/java/com/saye/hospitalgd/scheduler/jobMethod/MobileYbReconciliationMethod.java create mode 100644 src/main/java/com/saye/hospitalgd/service/FinancialReconciliation/MobileYbReconciliationService.java create mode 100644 src/main/java/com/saye/hospitalgd/service/impl/FinancialReconciliation/MobileYbReconciliationServiceImpl.java create mode 100644 src/main/resources/mapper/FinancialReconciliation/MobileYbReconciliationMapper.xml create mode 100644 src/main/resources/templates/paymentStatistics/mobileYbReconciliation.html diff --git a/src/main/java/com/saye/hospitalgd/controller/MobileYbReconciliationController.java b/src/main/java/com/saye/hospitalgd/controller/MobileYbReconciliationController.java new file mode 100644 index 0000000..f2a857a --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/controller/MobileYbReconciliationController.java @@ -0,0 +1,68 @@ +package com.saye.hospitalgd.controller; + +import com.saye.hospitalgd.commons.date.DateDUtil; +import com.saye.hospitalgd.commons.string.StringDUtil; +import com.saye.hospitalgd.service.FinancialReconciliation.MobileYbReconciliationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; + +@Controller +@RequestMapping("/mobileYbReconciliation") +@Api(tags = "微信移动医保对账") +public class MobileYbReconciliationController { + + @Autowired + private MobileYbReconciliationService mobileYbReconciliationService; + + @RequestMapping("/toMobileYb") + public String toMobileYb(ModelMap modelMap) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DATE, -1); + String startTime = DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, calendar.getTime()); + String endTime = DateDUtil.getCurrentDate(DateDUtil.yyyy_MM_dd); + modelMap.addAttribute("startTime", startTime); + modelMap.addAttribute("endTime", endTime); + return "paymentStatistics/mobileYbReconciliation"; + } + + @RequestMapping("/findData") + @ResponseBody + @ApiOperation("查询微信移动医保对账数据") + public HashMap findData(@RequestBody HashMap map) { + HashMap resp = new HashMap<>(); + String errCode = "0"; + String errMsg = ""; + try { + String tradeDate = StringDUtil.changeNullToEmpty(map.get("trade_date")); + if ("".equals(tradeDate)) { + errCode = "1"; + errMsg = "trade_date不能为空"; + } else { + resp = mobileYbReconciliationService.reconcile(tradeDate); + } + } catch (Exception e) { + errCode = "999"; + errMsg = e.getMessage(); + } + resp.put("errCode", errCode); + resp.put("errMsg", errMsg); + return resp; + } +} + + + + + + diff --git a/src/main/java/com/saye/hospitalgd/controller/PaymentStatisticsController.java b/src/main/java/com/saye/hospitalgd/controller/PaymentStatisticsController.java index de5474b..06b891a 100644 --- a/src/main/java/com/saye/hospitalgd/controller/PaymentStatisticsController.java +++ b/src/main/java/com/saye/hospitalgd/controller/PaymentStatisticsController.java @@ -452,6 +452,16 @@ public class PaymentStatisticsController { 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); diff --git a/src/main/java/com/saye/hospitalgd/entity/MobileYbReconciliationResult.java b/src/main/java/com/saye/hospitalgd/entity/MobileYbReconciliationResult.java new file mode 100644 index 0000000..742b05d --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/entity/MobileYbReconciliationResult.java @@ -0,0 +1,36 @@ +package com.saye.hospitalgd.entity; + +import lombok.Data; + +/** + * 微信移动医保对账结果 + */ +@Data +public class MobileYbReconciliationResult { + private String id; + private String tradeDate; + + private String bankMedfee; + private String bankAcctPay; + private String bankFundPay; + + private String hisMedfee; + private String hisAcctPay; + private String hisFundPay; + + private String diffMedfee; + private String diffAcctPay; + private String diffFundPay; + + /** 0-平,1-不平 */ + private String stmtRslt; + private String stmtRsltDscr; + private String createTime; + private String modifyTime; +} + + + + + + diff --git a/src/main/java/com/saye/hospitalgd/mapper/FinancialReconciliation/MobileYbReconciliationMapper.java b/src/main/java/com/saye/hospitalgd/mapper/FinancialReconciliation/MobileYbReconciliationMapper.java new file mode 100644 index 0000000..f38e329 --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/mapper/FinancialReconciliation/MobileYbReconciliationMapper.java @@ -0,0 +1,22 @@ +package com.saye.hospitalgd.mapper.FinancialReconciliation; + +import java.util.HashMap; + +public interface MobileYbReconciliationMapper { + + HashMap sumBankMobileYb(HashMap map); + + HashMap sumHisMobileYb(HashMap map); + + void insertResult(HashMap map); + + void deleteResultByDate(HashMap map); + + HashMap findResultByDate(HashMap map); +} + + + + + + diff --git a/src/main/java/com/saye/hospitalgd/scheduler/job/MobileYbReconciliationJob.java b/src/main/java/com/saye/hospitalgd/scheduler/job/MobileYbReconciliationJob.java new file mode 100644 index 0000000..6013db9 --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/scheduler/job/MobileYbReconciliationJob.java @@ -0,0 +1,24 @@ +package com.saye.hospitalgd.scheduler.job; + +import com.saye.hospitalgd.scheduler.jobMethod.MobileYbReconciliationMethod; + +import java.util.HashMap; + +/** + * Quartz 调度入口:微信移动医保对账 + * 方法名:executeMobileYbReconciliation + * 参数:trade_date(yyyy-MM-dd),为空则默认昨日 + */ +public class MobileYbReconciliationJob { + + public HashMap executeMobileYbReconciliation(String trade_date) { + MobileYbReconciliationMethod method = new MobileYbReconciliationMethod(); + return method.executeMobileYbReconciliation(trade_date); + } +} + + + + + + diff --git a/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/MobileYbReconciliationMethod.java b/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/MobileYbReconciliationMethod.java new file mode 100644 index 0000000..832b4bd --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/MobileYbReconciliationMethod.java @@ -0,0 +1,47 @@ +package com.saye.hospitalgd.scheduler.jobMethod; + +import com.saye.hospitalgd.commons.date.DateDUtil; +import com.saye.hospitalgd.commons.getBean.GetBeanUtil; +import com.saye.hospitalgd.commons.log.LogUtil; +import com.saye.hospitalgd.service.FinancialReconciliation.MobileYbReconciliationService; +import com.saye.hospitalgd.service.impl.FinancialReconciliation.MobileYbReconciliationServiceImpl; +import lombok.extern.slf4j.Slf4j; + +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; + +/** + * 微信移动医保对账方法 + * 被调度任务调用,传入 trade_date(yyyy-MM-dd),为空则默认昨日 + */ +@Slf4j +public class MobileYbReconciliationMethod { + + public HashMap executeMobileYbReconciliation(String trade_date) { + HashMap resp = new HashMap<>(); + String errCode = "0"; + String errMsg = ""; + try { + String targetDate = trade_date; + if (targetDate == null || "".equals(targetDate.trim())) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DATE, -1); + targetDate = DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, calendar.getTime()); + } + LogUtil.info(this.getClass(), "开始执行微信移动医保对账,日期:" + targetDate); + MobileYbReconciliationService svc = GetBeanUtil.getBean(MobileYbReconciliationServiceImpl.class); + resp = svc.reconcile(targetDate); + LogUtil.info(this.getClass(), "微信移动医保对账结束,结果:" + resp); + } catch (Exception e) { + errCode = "999"; + errMsg = e.getMessage(); + log.error("微信移动医保对账失败:{}", errMsg, e); + } + resp.put("errCode", errCode); + resp.put("errMsg", errMsg); + return resp; + } +} + diff --git a/src/main/java/com/saye/hospitalgd/service/FinancialReconciliation/MobileYbReconciliationService.java b/src/main/java/com/saye/hospitalgd/service/FinancialReconciliation/MobileYbReconciliationService.java new file mode 100644 index 0000000..e333794 --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/service/FinancialReconciliation/MobileYbReconciliationService.java @@ -0,0 +1,16 @@ +package com.saye.hospitalgd.service.FinancialReconciliation; + +import java.util.HashMap; + +public interface MobileYbReconciliationService { + + HashMap reconcile(String tradeDate) throws Exception; + + HashMap findResult(String tradeDate); +} + + + + + + diff --git a/src/main/java/com/saye/hospitalgd/service/impl/FinancialReconciliation/MobileYbReconciliationServiceImpl.java b/src/main/java/com/saye/hospitalgd/service/impl/FinancialReconciliation/MobileYbReconciliationServiceImpl.java new file mode 100644 index 0000000..ee84854 --- /dev/null +++ b/src/main/java/com/saye/hospitalgd/service/impl/FinancialReconciliation/MobileYbReconciliationServiceImpl.java @@ -0,0 +1,95 @@ +package com.saye.hospitalgd.service.impl.FinancialReconciliation; + +import com.saye.hospitalgd.mapper.FinancialReconciliation.MobileYbReconciliationMapper; +import com.saye.hospitalgd.service.FinancialReconciliation.MobileYbReconciliationService; +import com.saye.hospitalgd.commons.uuid.UUIDGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.HashMap; + +@Service +public class MobileYbReconciliationServiceImpl implements MobileYbReconciliationService { + + @Autowired + private MobileYbReconciliationMapper mobileYbReconciliationMapper; + + @Override + public HashMap reconcile(String tradeDate) throws Exception { + HashMap resp = new HashMap<>(); + String errCode = "0"; + String errMsg = ""; + + try { + HashMap param = new HashMap<>(); + param.put("trade_date", tradeDate); + + HashMap bank = mobileYbReconciliationMapper.sumBankMobileYb(param); + HashMap his = mobileYbReconciliationMapper.sumHisMobileYb(param); + + BigDecimal bankMedfee = getDecimal(bank.get("bank_medfee")); + BigDecimal bankAcct = getDecimal(bank.get("bank_acct_pay")); + BigDecimal bankFund = getDecimal(bank.get("bank_fund_pay")); + + BigDecimal hisMedfee = getDecimal(his.get("his_medfee")); + BigDecimal hisAcct = getDecimal(his.get("his_acct_pay")); + BigDecimal hisFund = getDecimal(his.get("his_fund_pay")); + + BigDecimal diffMedfee = bankMedfee.subtract(hisMedfee); + BigDecimal diffAcct = bankAcct.subtract(hisAcct); + BigDecimal diffFund = bankFund.subtract(hisFund); + + String stmtRslt = (diffMedfee.compareTo(BigDecimal.ZERO) == 0 + && diffAcct.compareTo(BigDecimal.ZERO) == 0 + && diffFund.compareTo(BigDecimal.ZERO) == 0) ? "0" : "1"; + + // 覆盖写结果 + mobileYbReconciliationMapper.deleteResultByDate(param); + HashMap insert = new HashMap<>(); + insert.put("id", UUIDGenerator.getUUID()); + insert.put("trade_date", tradeDate); + insert.put("bank_medfee", bankMedfee); + insert.put("bank_acct_pay", bankAcct); + insert.put("bank_fund_pay", bankFund); + insert.put("his_medfee", hisMedfee); + insert.put("his_acct_pay", hisAcct); + insert.put("his_fund_pay", hisFund); + insert.put("diff_medfee", diffMedfee); + insert.put("diff_acct_pay", diffAcct); + insert.put("diff_fund_pay", diffFund); + insert.put("stmt_rslt", stmtRslt); + insert.put("stmt_rslt_dscr", stmtRslt.equals("0") ? "平" : "不平"); + + mobileYbReconciliationMapper.insertResult(insert); + + resp.putAll(insert); + } catch (Exception e) { + errCode = "999"; + errMsg = e.getMessage(); + } + resp.put("errCode", errCode); + resp.put("errMsg", errMsg); + return resp; + } + + @Override + public HashMap findResult(String tradeDate) { + HashMap param = new HashMap<>(); + param.put("trade_date", tradeDate); + return mobileYbReconciliationMapper.findResultByDate(param); + } + + private BigDecimal getDecimal(Object obj) { + if (obj == null || "".equals(obj.toString().trim())) { + return BigDecimal.ZERO; + } + return new BigDecimal(obj.toString()); + } +} + + + + + + diff --git a/src/main/resources/mapper/BankbillsHistoryMapper.xml b/src/main/resources/mapper/BankbillsHistoryMapper.xml index 717ec4d..40e1999 100644 --- a/src/main/resources/mapper/BankbillsHistoryMapper.xml +++ b/src/main/resources/mapper/BankbillsHistoryMapper.xml @@ -41,7 +41,6 @@ from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0') - and (bill_table_name is null or bill_table_name != '微信医保账单') insert into bankbills_original ( diff --git a/src/main/resources/mapper/FinancialReconciliation/MobileYbReconciliationMapper.xml b/src/main/resources/mapper/FinancialReconciliation/MobileYbReconciliationMapper.xml new file mode 100644 index 0000000..125b2a8 --- /dev/null +++ b/src/main/resources/mapper/FinancialReconciliation/MobileYbReconciliationMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + INSERT INTO mobile_yb_reconciliation_result + (id, trade_date, + bank_medfee, bank_acct_pay, bank_fund_pay, + his_medfee, his_acct_pay, his_fund_pay, + diff_medfee, diff_acct_pay, diff_fund_pay, + stmt_rslt, stmt_rslt_dscr, create_time, modify_time) + VALUES + (#{id}, #{trade_date}, + #{bank_medfee}, #{bank_acct_pay}, #{bank_fund_pay}, + #{his_medfee}, #{his_acct_pay}, #{his_fund_pay}, + #{diff_medfee}, #{diff_acct_pay}, #{diff_fund_pay}, + #{stmt_rslt}, #{stmt_rslt_dscr}, now(), now()) + + + + DELETE FROM mobile_yb_reconciliation_result + WHERE trade_date = #{trade_date} + + + + + + diff --git a/src/main/resources/mapper/FinancialReconciliation/TenpaySummaryMapper.xml b/src/main/resources/mapper/FinancialReconciliation/TenpaySummaryMapper.xml index 4e129a5..635af9d 100644 --- a/src/main/resources/mapper/FinancialReconciliation/TenpaySummaryMapper.xml +++ b/src/main/resources/mapper/FinancialReconciliation/TenpaySummaryMapper.xml @@ -69,8 +69,9 @@ AND trade_date <= #{endTime} - AND LOWER(HisOperCode) = 'wx' + AND LOWER(HisOperCode) in ('wx' , 'yb') AND TradingStatus = '1' + AND PayType in ('2','1') UNION ALL SELECT '支付宝支付' AS PAY_NAME, @@ -92,8 +93,9 @@ AND trade_date <= #{endTime} - AND LOWER(HisOperCode) = 'wx' + AND LOWER(HisOperCode) in ('wx' , 'yb') AND TradingStatus = '2' + AND PayType in ('2','1') UNION ALL SELECT '合计' AS PAY_NAME, @@ -107,8 +109,9 @@ AND trade_date <= #{endTime} - AND LOWER(HisOperCode) = 'wx' + AND LOWER(HisOperCode) in ('wx' , 'yb') AND TradingStatus IN ('1','2') + AND PayType in ('2','1') diff --git a/src/main/resources/mapper/TransactionDetailMapper.xml b/src/main/resources/mapper/TransactionDetailMapper.xml index 9e91207..b1532c6 100644 --- a/src/main/resources/mapper/TransactionDetailMapper.xml +++ b/src/main/resources/mapper/TransactionDetailMapper.xml @@ -82,7 +82,6 @@ and b.C_JYRQ <= #{endTime} and a.PayMethod != '2' -- 排除不参与对账的记录 and (b.is_inpatient is null or b.is_inpatient = '0') -- 排除住院订单 - and (b.bill_table_name is null or b.bill_table_name != '微信医保账单') -- 排除微信医保账单 and a.PayType != #{prepayment_code} @@ -140,7 +139,7 @@ ) a inner join - (select * from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0') and (bill_table_name is null or bill_table_name != '微信医保账单')) b -- 排除住院订单与微信医保账单 + (select * from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0')) b -- 排除住院订单 on a.PlatformTransId = b.C_SHDDH and a.TradingStatus = b.C_JYLX and ROUND(CAST(a.Amount AS DECIMAL(18,2)), 2) = ROUND(CAST(b.C_JYJE AS DECIMAL(18,2)), 2) @@ -186,7 +185,7 @@ ) a left join - (select * from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0') and (bill_table_name is null or bill_table_name != '微信医保账单')) b -- 排除住院订单与微信医保账单 + (select * from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0')) b -- 排除住院订单 on a.PlatformTransId = b.C_SHDDH and a.TradingStatus = b.C_JYLX and ROUND(CAST(a.Amount AS DECIMAL(18,2)), 2) = ROUND(CAST(b.C_JYJE AS DECIMAL(18,2)), 2) where b.C_SHDDH is null @@ -237,13 +236,11 @@ select * from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0') - and (bill_table_name is null or bill_table_name != '微信医保账单') and C_SHDDH in ( select C_SHDDH from bankbill_history where C_JYRQ = #{trade_date} and (is_inpatient is null or is_inpatient = '0') - and (bill_table_name is null or bill_table_name != '微信医保账单') group by C_SHDDH having ROUND(SUM(CAST(C_JYJE AS DECIMAL(18,2))), 2) != 0 ) diff --git a/src/main/resources/templates/paymentStatistics/mobileYbReconciliation.html b/src/main/resources/templates/paymentStatistics/mobileYbReconciliation.html new file mode 100644 index 0000000..4b92ff4 --- /dev/null +++ b/src/main/resources/templates/paymentStatistics/mobileYbReconciliation.html @@ -0,0 +1,107 @@ + + + + + 微信移动医保对账 + + + + + + + +
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
微信移动医保对账结果
+
+
+ 银行-医疗总费用:0.00 + HIS-医疗总费用:0.00 + 差额:0.00 +
+
+ 银行-账户支付:0.00 + HIS-账户支付:0.00 + 差额:0.00 +
+
+ 银行-统筹支付:0.00 + HIS-统筹支付:0.00 + 差额:0.00 +
+
+ 结果: + +
+
+
+
+ + + +