账户余额支付优化
diff --git a/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java b/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
index 0560c06..de2afe3 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
@@ -22,8 +22,7 @@
 
   private static final Logger logger = LoggerFactory.getLogger(DayendSettleTask.class);
 
-  @Scheduled(cron="0 3/30 2-3 * * ? ")
-//  @Scheduled(cron="0 0/2 * * * ? ")
+  @Scheduled(cron="${dayend.settletask.cron}")
   public void doSettleTask() {
     if (logger.isDebugEnabled()) logger.debug("进入日结算任务!");
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
index d474e2c..f2bc236 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
@@ -143,14 +143,14 @@
         shop.setShopaccno(shopacc.getShopaccno());
         shopDao.save(shop);
 
-        TShopPaytype shopPaytype = new TShopPaytype();
-        shopPaytype.setShopaccno(shopacc.getShopaccno());
-        shopPaytype.setPaytype(TradeDict.PAYTYPE_BALANCE);
-        shopPaytype.setConsumeEnable(true);
-        shopPaytype.setAnonymousEnable(false);
-        shopPaytype.setReverseEnable(false);
-        shopPaytype.setCreatetime(dt.getHostdatetime());
-        shopPaytypeDao.save(shopPaytype); //默认增加余额支付方式
+//        TShopPaytype shopPaytype = new TShopPaytype();
+//        shopPaytype.setShopaccno(shopacc.getShopaccno());
+//        shopPaytype.setPaytype(TradeDict.PAYTYPE_BALANCE);
+//        shopPaytype.setConsumeEnable(true);
+//        shopPaytype.setAnonymousEnable(false);
+//        shopPaytype.setReverseEnable(false);
+//        shopPaytype.setCreatetime(dt.getHostdatetime());
+//        shopPaytypeDao.save(shopPaytype); //默认增加余额支付方式
       }
       return true;
     }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
index c52dce2..3141e6c 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
@@ -123,6 +123,7 @@
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .data("refno", it.refno)
                     .data("billno", it.outTradeNo)
+                    .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
                     .success("交易确认成功"))
         }
 
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 390e8d1..7a15077 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -140,64 +140,69 @@
      * */
     @PostMapping("/balance/pay")
     fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
-                val account = accountUtilServcie.readAccount(person.userid)
-                val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
-
-                val dtl = TransactionBuilder().apply {
-                    setTransInfo(param.transdate, param.transtime,
-                            TradeCode.TRANSCODE_BALANCE_PAY,
-                            TradeDict.PAYTYPE_BALANCE)
-                    setOutTransInfo(shopacc.shopaccno, param.billno)
-                    operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
-                    payinfo = "账户余额消费"
-                    description = "账户余额消费"
-                }.person(account).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
-                    opposite = AccountProxy(shopacc)
-                }.and().shop(shopacc).apply {
-                    setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                    opposite = AccountProxy(account)
-                }.and().also { builder ->
-                    param.feelist?.forEach {
-                        when (it.feetype) {
-                            TradeDict.FEETYPE_CONSUME_MEALER -> {
-                                consumeMealer(param, builder, it, account, shopacc)
-                            }
-                            TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
-                                consumeDiscount(param, builder, it, account, shopacc)
-                            }
-                            else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                    "支付费率清单不支持feetype<${it.feetype}>")
-                        }
-                    }
-                }.init(transactionService)
-
-                transactionService.success(dtl.refno)
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("amount", dtl.personDtl.amount)
-                        .success("交易成功"))
-            }
-
+        if(!param.checkSign(commonService.getSecretByAppid(authentication.name))){
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
-
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
+                    .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
         }
+
+        val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+        if(consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
+            val account = accountUtilServcie.readAccount(person.userid)
+            val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
+
+            val dtl = TransactionBuilder().apply {
+                setTransInfo(param.transdate, param.transtime,
+                        TradeCode.TRANSCODE_BALANCE_PAY,
+                        TradeDict.PAYTYPE_BALANCE)
+                setOutTransInfo(shopacc.shopaccno, param.billno)
+                operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+                payinfo = param.cardNo  //fixme: 卡号或其他唯一信息
+                description = "账户余额消费"
+            }.person(account).apply {
+                setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
+                opposite = AccountProxy(shopacc)
+            }.and().shop(shopacc).apply {
+                setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
+                opposite = AccountProxy(account)
+            }.and().addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
+                    param.amount / 100.0, "账户余额消费")
+                    .also { builder ->
+                        param.feelist?.forEach {
+                            val feeamt = it.amount / 100.0
+                            when (it.feetype) {
+                                TradeDict.FEETYPE_CONSUME_MEALER -> {
+                                    //搭伙费
+                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
+                                    val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
+                                    when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
+                                        true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
+                                        false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
+                                    }
+                                }
+                                TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+                                    //优惠折扣
+                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
+                                    val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
+                                    builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
+
+                                }
+                                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                        "账户余额支付费用清单不支持feetype<${it.feetype}>")
+                            }
+                        }
+                    }.init(transactionService)
+
+            transactionService.success(dtl.refno)
+
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno", dtl.refno)
+                    .data("billno", dtl.outTradeNo)
+                    .data("amount", dtl.personDtl.amount)
+                    .success("交易成功"))
+        }
+
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
     }
 
 
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index a4d11c5..18ea9d2 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -26,6 +26,8 @@
 ##################################################
 ## quartz task scheduler
 shopbalance.updater.cron = 10/* * * * *
+dayend.settletask.cron = 0 3/30 2-3 * * ?
+#dayend.settletask.cron = 0 0/2 * * * ?
 ################################################
 # user password
 auth.password.bcrypt.length=10