#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
# \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
+
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;
List<TPersondtl> 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);
+
}
@Transactional(rollbackFor = Exception.class)
TCitizencardLossApply doFinishCitizencardLoss(TCitizencardLossApply lossApply);
+
+ @Transactional(rollbackFor = Exception.class)
+ boolean doConfirmCitizencardCheckProcess(String checkdate) throws Exception;
}
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;
@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<TCitizencardLossApply> getNewApplyCitizencardLossRecords() {
List<TCitizencardLossApply> list = citizencardLossApplyDao.findCardlossApplyRecordsByStatus(ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_APPLY);
}
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());
+ }
}
--- /dev/null
+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();
+ }
+ }
+}
* */
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";
}
-#######################################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
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
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
<div class="layui-form-item">
<label class="layui-form-label">参数名</label>
<div class="layui-input-block">
- <input name="parakey" placeholder="请输入参数名" type="text" class="layui-input" maxlength="30"
+ <input name="parakey" placeholder="请输入参数名" type="text" class="layui-input" maxlength="50"
lay-verify="required|businame" required/>
</div>
</div>