From 77bb4221e600610d48d3d7d47e60e12b5582be55 Mon Sep 17 00:00:00 2001 From: "kaixiang.xia" Date: Wed, 31 Mar 2021 15:07:59 +0800 Subject: [PATCH] =?utf8?q?=E6=B8=85=E7=AE=97=E7=A1=AE=E8=AE=A4=E4=BB=BB?= =?utf8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- config/application-devel-pg-xkx.properties | 2 + .../supwisdom/dlpay/api/dao/PersondtlDao.java | 5 +- .../service/CitizencardManagerService.java | 3 + .../impl/CitizencardManagerServiceImpl.java | 49 +++++++++++ .../task/CitizencardCheckConfirmTask.java | 84 +++++++++++++++++++ .../supwisdom/dlpay/util/ConstantUtil.java | 2 + .../src/main/resources/application.properties | 7 +- .../templates/system/param/busparaform.html | 2 +- 8 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCheckConfirmTask.java diff --git a/config/application-devel-pg-xkx.properties b/config/application-devel-pg-xkx.properties index 16830f55..e03fe08f 100644 --- a/config/application-devel-pg-xkx.properties +++ b/config/application-devel-pg-xkx.properties @@ -45,6 +45,7 @@ points.consume.cron=- #send.delay.notice.task.cron=29 0/1 * * * ? #points.outdate.cron=0 0 0 * * ? #points.consume.cron=0 0 0 * * ? +citizencard.confirm.chkdtl.cron=*/30 * * * * ? ############################################# spring.cloud.consul.enabled=false spring.cloud.consul.host=172.28.201.70 @@ -76,3 +77,4 @@ spring.kafka.consumer.auto-commit-interval=100 # \u6307\u5B9A\u6D88\u606Fkey\u548C\u6D88\u606F\u4F53\u7684\u7F16\u89E3\u7801\u65B9\u5F0F spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer + diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java index 3be44571..e91b8826 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java @@ -2,7 +2,6 @@ package com.supwisdom.dlpay.api.dao; import com.supwisdom.dlpay.api.domain.TPersondtl; import com.supwisdom.dlpay.framework.data.CountAmountBean; -import com.supwisdom.dlpay.framework.domain.TPointsdtl; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -27,4 +26,8 @@ public interface PersondtlDao extends JpaRepository,JpaSpeci List findAllByTransdateAndReverseFlagAndStatusAndTradeflag(String transdate,String reverseFlag,String status,String tradeflag); TPersondtl findTopByUseridAndStatusAndTradeflag(String userid, String status, String tradeFlag); + + @Query(value = "select sum(case when t.amount<=0 then 1 else -1 end) as totalcnt,sum(-1*t.amount) as totalamt from TPersondtl t where t.status='success' and t.accdate=?1 and t.sourceType=?2 ") + CountAmountBean getChkClearSumInfo(String accdate, String sourcetype); + } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/CitizencardManagerService.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/CitizencardManagerService.java index c799ee21..779e6dda 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/CitizencardManagerService.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/CitizencardManagerService.java @@ -19,4 +19,7 @@ public interface CitizencardManagerService { @Transactional(rollbackFor = Exception.class) TCitizencardLossApply doFinishCitizencardLoss(TCitizencardLossApply lossApply); + + @Transactional(rollbackFor = Exception.class) + boolean doConfirmCitizencardCheckProcess(String checkdate) throws Exception; } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java index c628015a..c19bc543 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java @@ -1,14 +1,26 @@ package com.supwisdom.dlpay.citizencard.service.impl; +import com.google.gson.Gson; +import com.supwisdom.dlpay.agent.citizencard.DlpayResp; +import com.supwisdom.dlpay.agent.citizencard.YnrccUtil; +import com.supwisdom.dlpay.agent.service.CitizencardPayService; import com.supwisdom.dlpay.api.dao.CardDao; +import com.supwisdom.dlpay.api.dao.PersondtlDao; import com.supwisdom.dlpay.api.domain.TCard; import com.supwisdom.dlpay.citizencard.dao.CitizencardLossApplyDao; import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply; import com.supwisdom.dlpay.citizencard.service.CitizencardManagerService; +import com.supwisdom.dlpay.framework.dao.BusinessparaDao; +import com.supwisdom.dlpay.framework.data.CountAmountBean; +import com.supwisdom.dlpay.framework.domain.TBusinesspara; import com.supwisdom.dlpay.framework.service.SystemUtilService; +import com.supwisdom.dlpay.framework.util.DateUtil; import com.supwisdom.dlpay.framework.util.StringUtil; import com.supwisdom.dlpay.framework.util.TradeDict; import com.supwisdom.dlpay.util.ConstantUtil; +import com.supwisdom.dlpay.util.WebCheckException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,8 +34,17 @@ public class CitizencardManagerServiceImpl implements CitizencardManagerService @Autowired private CardDao cardDao; @Autowired + private BusinessparaDao businessparaDao; + @Autowired + private PersondtlDao persondtlDao; + + @Autowired + private CitizencardPayService citizencardPayService; + @Autowired private SystemUtilService systemUtilService; + private static final Logger logger = LoggerFactory.getLogger(CitizencardManagerServiceImpl.class); + @Override public List getNewApplyCitizencardLossRecords() { List list = citizencardLossApplyDao.findCardlossApplyRecordsByStatus(ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_APPLY); @@ -58,4 +79,32 @@ public class CitizencardManagerServiceImpl implements CitizencardManagerService } return citizencardLossApplyDao.save(lossApply); } + + @Override + public boolean doConfirmCitizencardCheckProcess(String checkdate) throws Exception { + TBusinesspara param = businessparaDao.findByParakeyForUpdate(ConstantUtil.BUSINESS_CITIZENCARD_CLEARDATE); + if (null == param || !DateUtil.checkDatetimeValid(param.getParaval(), "yyyyMMdd") || !DateUtil.checkDatetimeValid(checkdate, "yyyyMMdd")) { + throw new WebCheckException("确认清算参数错误!"); + } + if (!checkdate.trim().equals(DateUtil.getNewDay(param.getParaval(), 1))) { + throw new WebCheckException("非连续清算确认!!! 上次清算确认日期【" + checkdate + "】,本次清算确认日期【" + checkdate + "】!"); + } + + CountAmountBean sumInfo = persondtlDao.getChkClearSumInfo(checkdate.trim(), TradeDict.PAYTYPE_CITIZEN_CARD); + if (null == sumInfo) throw new Exception("确认清算:统计本地流水信息异常!"); + final int totalcnt = sumInfo.getTotalcnt() == null ? 0 : sumInfo.getTotalcnt().intValue(); + final long totalamt = sumInfo.getTotalamt() == null ? 0 : Math.round(100 * sumInfo.getTotalamt()); + + logger.info("【" + checkdate + "】请求清算确认:jnlcount=[" + totalcnt + "],stlamt=[" + totalamt + "]"); + DlpayResp resp = citizencardPayService.makeSureCheckResult(checkdate.trim(), totalcnt, totalamt); + if (YnrccUtil.CODE_SUCCESS.equals(resp.getCode())) { + logger.info("【" + checkdate + "】确认清算成功!"); + param.setParaval(checkdate); + businessparaDao.save(param); + return true; + } + + logger.error("【" + checkdate + "】确认清算失败:" + new Gson().toJson(resp)); + throw new WebCheckException(resp.getMessage()); + } } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCheckConfirmTask.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCheckConfirmTask.java new file mode 100644 index 00000000..3cb0417c --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCheckConfirmTask.java @@ -0,0 +1,84 @@ +package com.supwisdom.dlpay.citizencard.task; + +import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus; +import com.supwisdom.dlpay.api.service.SourceTypeService; +import com.supwisdom.dlpay.citizencard.service.CitizencardManagerService; +import com.supwisdom.dlpay.framework.domain.TBusinesspara; +import com.supwisdom.dlpay.framework.service.SystemUtilService; +import com.supwisdom.dlpay.framework.tenant.TenantContext; +import com.supwisdom.dlpay.framework.util.Constants; +import com.supwisdom.dlpay.framework.util.DateUtil; +import com.supwisdom.dlpay.framework.util.TradeDict; +import com.supwisdom.dlpay.util.ConstantUtil; +import com.supwisdom.dlpay.util.WebCheckException; +import net.javacrumbs.shedlock.core.SchedulerLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 市民卡代扣对账成功后向银行确认任务 + */ +@Component +public class CitizencardCheckConfirmTask { + @Autowired + private CitizencardManagerService citizencardManagerService; + @Autowired + private SystemUtilService systemUtilService; + @Autowired + private SourceTypeService sourceTypeService; + + private static final Logger logger = LoggerFactory.getLogger(CitizencardCheckConfirmTask.class); + + @Scheduled(cron = "${citizencard.confirm.chkdtl.cron}") + @SchedulerLock(name = "CitizencardChkClearConfirmTask", lockAtMostForString = "PT10M") + public void doConfirmCitizenCardChkdtlTask() { + try { long t1 = System.currentTimeMillis(); + if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID); + + TBusinesspara businessParam = systemUtilService.getBusinessValueForUpdateNowait(ConstantUtil.BUSINESS_CITIZENCARD_CLEARDATE); + if (null == businessParam || !DateUtil.checkDatetimeValid(businessParam.getParaval(), "yyyyMMdd")) { + logger.error("市民卡代扣对账清算确认:未找到上次清算确认日期!"); + return; + } + + final String lastChkDate = businessParam.getParaval().trim(); //已确认清算的日期 + + TSourceTypeCheckStatus checkStatus = sourceTypeService.getSourceTypeCheckStatus(TradeDict.PAYTYPE_CITIZEN_CARD); + if (null == checkStatus) { + logger.error("市民卡代扣对账清算确认:未找到【市民卡代扣】对账状态!!!"); + return; + } + final String canChkDate = checkStatus.getSettleStatus() ? checkStatus.getCheckAccdate() : DateUtil.getNewDay(checkStatus.getCheckAccdate(), -1); + + long diffDays = DateUtil.getIntervalDay(lastChkDate, canChkDate); + if (diffDays > 0) logger.info("执行市民卡代扣对账清算确认任务开始:"); + + for (int i = 1; i <= diffDays; i++) { + final String clearDate = DateUtil.getNewDay(lastChkDate, i); + try { + citizencardManagerService.doConfirmCitizencardCheckProcess(clearDate); + } catch (WebCheckException be) { + logger.error("市民卡代扣对账清算确认【" + clearDate + "】失败! " + be.getMessage()); + break; + } catch (Exception e) { + logger.error("市民卡代扣对账清算确认【" + clearDate + "】失败! " + e.getMessage()); + e.printStackTrace(); + break; + } + } + + if (diffDays > 0) { + long t2 = System.currentTimeMillis(); + logger.info("执行市民卡代扣对账清算确认结束,耗时 " + (t2 - t1) + " ms"); + } + + } catch (Exception ex) { + logger.error("执行市民卡代扣对账确认任务报错!"); + ex.printStackTrace(); + } + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java index 4f6d4102..8efd3746 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java @@ -104,4 +104,6 @@ public class ConstantUtil { * */ public static final String KAFKA_MAGTYPE_NOTICE = "dlsmk_phone_notice"; public static final String KAFKA_MAGTYPE_CONSUME = "dlsmk_card_consume"; + + public static final String BUSINESS_CITIZENCARD_CLEARDATE = "citizencard.check.clear.lastdate"; } diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties index 0881a1c3..6e19153a 100644 --- a/payapi/src/main/resources/application.properties +++ b/payapi/src/main/resources/application.properties @@ -1,9 +1,9 @@ -#######################################springboot配置 start################################# +#######################################springboot\u914D\u7F6E start################################# spring.application.name=supwisdom.payapi spring.cloud.consul.discovery.health-check-path=${management.context-path}/api/common/version spring.cloud.consul.discovery.health-check-interval=10s spring.cloud.consul.discovery.instanceId=${spring.application.name}:${spring.application.instance_id:${random.value}} -# 单库数据库配置 +# \u5355\u5E93\u6570\u636E\u5E93\u914D\u7F6E spring.jpa.show-sql=true spring.datasource.hikari.connection-timeout=60000 spring.datasource.hikari.maximum-pool-size=5 @@ -23,7 +23,7 @@ spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.mode=HTML5 spring.thymeleaf.cache=false spring.thymeleaf.enabled=true -################## 全局字符编码设置 ###################### +################## \u5168\u5C40\u5B57\u7B26\u7F16\u7801\u8BBE\u7F6E ###################### spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true @@ -38,6 +38,7 @@ citizencard.dolosstask.cron=- send.delay.notice.task.cron=29 0/1 * * * ? points.outdate.cron=0 0 0 * * ? points.consume.cron=0 0 0 * * ? +citizencard.confirm.chkdtl.cron=* */30 * * * ? ################################################ # user password auth.password.bcrypt.length=10 diff --git a/payapi/src/main/resources/templates/system/param/busparaform.html b/payapi/src/main/resources/templates/system/param/busparaform.html index 39dd9de9..daccbb1f 100644 --- a/payapi/src/main/resources/templates/system/param/busparaform.html +++ b/payapi/src/main/resources/templates/system/param/busparaform.html @@ -2,7 +2,7 @@
-
-- 2.17.1