From 4a3894dce5913a632ffea6db88fcf76327d318e8 Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Thu, 15 Aug 2019 14:44:24 +0800 Subject: [PATCH] =?utf8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/api/scheduler_sourcetype_chk.kt | 122 ++++++++++-------- 1 file changed, 66 insertions(+), 56 deletions(-) diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt index 05b5b5b9..4b01a8eb 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt @@ -5,7 +5,6 @@ import com.supwisdom.dlpay.agent.AgentResponse import com.supwisdom.dlpay.agent.CheckFileProvider import com.supwisdom.dlpay.api.domain.TSourceType import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus -import com.supwisdom.dlpay.api.domain.TTransactionChkdtl import com.supwisdom.dlpay.api.domain.TTransactionChkfile import com.supwisdom.dlpay.api.service.SourceTypeService import com.supwisdom.dlpay.api.service.TransactionReconciliationService @@ -26,6 +25,46 @@ import java.util.concurrent.Future import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException +/** + * 对账业务主要由三张表组成 TSourceTypeCheckStatus(对账状态表), TTransactionChkfile(对账文件表), TTransactionChkDtl(对账明细表) + * 对账状态表有五个状态: + * 1. checkFileOk: 表示对账文件是否成功导入对账文件表和对账明细表中。对应的"对账文件表"的 status 应该是 unchecked。 + * 2. checkStatus: 表示核对流水任务是否完成,当核对完成后根据对账文件表的 status 字段来判断,只有当 status 是 finish + * 时 checkStatus 才是 true。 + * 3. repairStatus: 表示核对完成,并且可以进行补帐交易。同时根据对"对账文件表"的对账结果(result)来判断是否完成核对,只有当 result + * 是 "一致" 或 "不平" 时 repairStatus 才为 true。对账任务判断 repairStatus == true 之后将会对所有不一致的交易进行补帐。 + * 4. settleStatus: 表示本次对账完成(核对与补帐都完成),对账任务会在补帐完成后将 settleStatus 置为 true。 + * 同时 TTransactionChkDtl 的 resovled 状态全部为 'equal'。系统结算任务只有当 settleStatus == true 的时候才会进行 + * 5. forceRecheck : 表示对当前的 checkDate 的对账文件重新下载并对账 + * + * + * 对账文件表的 status 表示本次核对的结果。对账文件表 status 有几种情况: + * 1. 初始状态(init),表示对账任务已经触发; + * 2. 待核对状态(unchecked), 表示对账文件已存入数据库中; + * 3. 错误状态(error), 保存数据有错误 + * 4. 完成状态(finish) , 表示核对完成状态; + * + * 对账文件表的对账结果字段(result) 表示本次对账处理结果: + * 1. 未核对(none), 表示还未与流水进行比对 + * 2. 一致( equal), 表示对账完全一致 + * 3. 不平( notequal), 表示对账不一致,但可以通过补帐交易完成结算 + * 4. 错误( error ) , 表示核对时数据校验不正确,系统不能通过补帐交易完成结算。需人工审核对账文件后,重新下载对账单并核对。 + * + * + * 对账明细表(TTransactionChkDtl) 的 chkstatus 表示核对结果: + * 1. 未检查(uncheck), 表示记录还未核对 + * 2. 一致( equal) ,表示记录核对与流水一致 + * 3. 交易流水不存在(notexist), 表示本地交易流水不存在,影响对账文件表的 result 状态,为error。 + * 4. 支付未记账 ( nocharge) ,表示本地流水未成功,需要补帐 + * 5. 金额不相等(diff), 表示对账明细金额与本地流水不一致, 影响对账文件表的 result 状态,为error。 + * 6. 本地多流水 (surplus), 表示本地的成功流水在对账单中不存在, 影响对账文件表的 result 状态,为error。 + * 6. 记账日期或支付方式错误 (error) , 其它类型错误,影响对账文件表的 result 状态,为error。 + * + * 对账明细表(TTransactionChkDtl) 的 result 表示处理结果 + * 1. 需要补帐("add") + * 2. 一致("equal") , 表示一致 + * 3. 挂起("hangup"), 表示补帐出现异常 + */ @Component class SourceTypeCheck { private val logger = KotlinLogging.logger { } @@ -39,22 +78,39 @@ class SourceTypeCheck { @Autowired private lateinit var sourceTypeCheckExecutor: SourceTypeCheckExecutor + private fun prepareCheckStatus(checkStatus: TSourceTypeCheckStatus) { + if (checkStatus.startAccdate.isNullOrEmpty()) { + // 没有对账文件状态时创建一条以当前系统记账日期为起始时间的对账明细 + checkStatus.startAccdate = systemUtilService.accdate + checkStatus.checkAccdate = checkStatus.startAccdate + checkStatus.checkFileDate = checkStatus.startAccdate + } else { + checkStatus.apply { + checkAccdate = DateUtil.getNewDay(checkAccdate, 1) + checkFileDate = DateUtil.getNewDay(checkFileDate, 1) + } + } + checkStatus.apply { + this.checkStatus = false + checkFileOk = false + repairStatus = false + settleStatus = false + forceRecheck = false + } + } + private fun newSourceTypeStatus(sourceType: TSourceType, accdate: String): TSourceTypeCheckStatus { return TSourceTypeCheckStatus().also { it.sourceType = sourceType.sourceType it.tenantId = sourceType.tenantid // 没有对账文件状态时创建一条以当前系统记账日期为起始时间的对账明细 - it.startAccdate = accdate - it.checkAccdate = it.startAccdate - it.forceRecheck = false - it.checkFileDate = it.startAccdate - it.checkFileOk = false - it.checkStatus = false - }.let { - sourceTypeService.saveOrUpdateSourceTypeCheckStatus(it) } } + private fun isCheckFinish(status: TSourceTypeCheckStatus): Boolean { + return (status.checkStatus && status.repairStatus) + } + private fun determineSourceTypeCheck(sourcetype: TSourceType): TSourceTypeCheckStatus? { if (!sourcetype.checkable || !sourcetype.enable) { return null @@ -69,13 +125,7 @@ class SourceTypeCheck { null } else if (status.checkStatus && interval > sourcetype.tplusN) { // 当前日期对账已完成 且 后面还有对账可以进行 - status.checkAccdate = DateUtil.getNewDay(status.checkAccdate, 1) - status.checkStatus = false - status.checkFileDate = DateUtil.getNewDay(status.checkFileDate, 1) - status.checkFileOk = false - status.repairStatus = false - status.settleStatus = false - status.forceRecheck = false + prepareCheckStatus(status) sourceTypeService.saveOrUpdateSourceTypeCheckStatus(status) } else if ((!status.checkStatus || !status.repairStatus) && interval >= sourcetype.tplusN) { // 当前对账并未完成 且满足对账条件 @@ -153,46 +203,6 @@ class SourceTypeCheck { } } -/** - * 对账业务主要由三张表组成 TSourceTypeCheckStatus(对账状态表), TTransactionChkfile(对账文件表), TTransactionChkDtl(对账明细表) - * 对账状态表有五个状态: - * 1. checkFileOk: 表示对账文件是否成功导入对账文件表和对账明细表中。对应的"对账文件表"的 status 应该是 unchecked。 - * 2. checkStatus: 表示核对流水任务是否完成,当核对完成后根据对账文件表的 status 字段来判断,只有当 status 是 finish - * 时 checkStatus 才是 true。 - * 3. repairStatus: 表示核对完成,并且可以进行补帐交易。同时根据对"对账文件表"的对账结果(result)来判断是否完成核对,只有当 result - * 是 "一致" 或 "不平" 时 repairStatus 才为 true。对账任务判断 repairStatus == true 之后将会对所有不一致的交易进行补帐。 - * 4. settleStatus: 表示本次对账完成(核对与补帐都完成),对账任务会在补帐完成后将 settleStatus 置为 true。 - * 同时 TTransactionChkDtl 的 resovled 状态全部为 'equal'。系统结算任务只有当 settleStatus == true 的时候才会进行 - * 5. forceRecheck : 表示对当前的 checkDate 的对账文件重新下载并对账 - * - * - * 对账文件表的 status 表示本次核对的结果。对账文件表 status 有几种情况: - * 1. 初始状态(init),表示对账任务已经触发; - * 2. 待核对状态(unchecked), 表示对账文件已存入数据库中; - * 3. 错误状态(error), 保存数据有错误 - * 4. 完成状态(finish) , 表示核对完成状态; - * - * 对账文件表的对账结果字段(result) 表示本次对账处理结果: - * 1. 未核对(none), 表示还未与流水进行比对 - * 2. 一致( equal), 表示对账完全一致 - * 3. 不平( notequal), 表示对账不一致,但可以通过补帐交易完成结算 - * 4. 错误( error ) , 表示核对时数据校验不正确,系统不能通过补帐交易完成结算。需人工审核对账文件后,重新下载对账单并核对。 - * - * - * 对账明细表(TTransactionChkDtl) 的 chkstatus 表示核对结果: - * 1. 未检查(uncheck), 表示记录还未核对 - * 2. 一致( equal) ,表示记录核对与流水一致 - * 3. 交易流水不存在(notexist), 表示本地交易流水不存在,影响对账文件表的 result 状态,为error。 - * 4. 支付未记账 ( nocharge) ,表示本地流水未成功,需要补帐 - * 5. 金额不相等(diff), 表示对账明细金额与本地流水不一致, 影响对账文件表的 result 状态,为error。 - * 6. 本地多流水 (surplus), 表示本地的成功流水在对账单中不存在, 影响对账文件表的 result 状态,为error。 - * 6. 记账日期或支付方式错误 (error) , 其它类型错误,影响对账文件表的 result 状态,为error。 - * - * 对账明细表(TTransactionChkDtl) 的 result 表示处理结果 - * 1. 需要补帐("add") - * 2. 一致("equal") , 表示一致 - * 3. 挂起("hangup"), 表示补帐出现异常 - */ @Component class SourceTypeCheckExecutor { companion object { -- 2.17.1