Explorar o código

Merge remote-tracking branch 'origin/master'

TRX hai 1 ano
pai
achega
4acaa18f68
Modificáronse 15 ficheiros con 609 adicións e 9 borrados
  1. 44 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/ChinaumsSenselessUserSignInfoModel.java
  2. 33 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/PeriodDetailQueryModel.java
  3. 28 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/UnionApplySignParam.java
  4. 30 0
      FullCardClient/src/main/java/com/zhongshu/card/client/type/ContractState.java
  5. 44 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/pay/senseless/ChinaumsSenselessPayController.java
  6. 8 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/pay/statistics/PayOverviewController.java
  7. 12 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/ChinaumsSenselessUserSignInfoDao.java
  8. 4 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/extend/ChinaumsSenselessUserSignInfoDaoExtend.java
  9. 6 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/impl/ChinaumsSenselessUserSignInfoDaoImpl.java
  10. 82 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/pay/ChinaumsSenselessUserSignInfo.java
  11. 6 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/BalancePayService.java
  12. 226 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/ChinaumsSenselessPayService.java
  13. 55 6
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/OrgOverviewService.java
  14. 24 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/stream/ChinaumsSenselessSignStream.java
  15. 7 1
      FullCardServer/src/main/resources/application.yml

+ 44 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/ChinaumsSenselessUserSignInfoModel.java

@@ -0,0 +1,44 @@
+package com.zhongshu.card.client.model.pay;
+
+import com.zhongshu.card.client.type.ContractState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.stereotype.Indexed;
+
+@Data
+public class ChinaumsSenselessUserSignInfoModel {
+
+
+    @Schema(description = "用户id")
+    private String userId;
+
+    @Schema(description = "商户签约协议号")
+    private String contractNo;
+
+    @Schema(description = "银联受理单号")
+    private String relateSsn;
+
+    @Schema(description = "银行商户号")
+    private String mid;
+
+    @Schema(description = "银商免密支付签约协议号(签约成功时返回。云闪付侧的签约协议号,由银联生成。即标记化支付信息域的token。BASE64加密。)")
+    private String contractId;
+
+    @Schema(description = "签约状态")
+    private ContractState contractState;
+
+    @Schema(description = "协议签约时间")
+    private String contractSignedTime;
+
+    @Schema(description = "协议到期时间")
+    private String contractExpiredTime;
+
+    @Schema(description = "云闪付用户id")
+    private String acpId;
+
+    @Schema(description = "云闪付小程序id")
+    private String cqpMpAppId;
+
+    @Schema(description = "云闪付小程序path")
+    private String cqpMpPath;
+}

+ 33 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/PeriodDetailQueryModel.java

@@ -0,0 +1,33 @@
+package com.zhongshu.card.client.model.pay;
+
+import com.github.microservice.types.payment.PaymentChannelType;
+import com.github.microservice.types.payment.PaymentType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class PeriodDetailQueryModel {
+
+    @Schema(description = "projectOid")
+    private String projectOid;
+
+//    private String oid;
+
+    @Schema(description = "开始时间")
+    private Long startTime;
+
+    @Schema(description = "结束时间")
+    private Long endTime;
+
+    @Schema(description = "账单流水编号")
+    private String transactionLogId;
+
+    @Schema(description = "关联订单号")
+    private String orderNo;
+
+    @Schema(description = "账单类型: Credit(进账),Debit(出账)")
+    private String ledgerEntry;
+
+    @Schema(description = "支付方式:UserWallet(余额支付),UnionFrictionlessPay(银联无感支付)")
+    private PaymentType paymentType;
+}

+ 28 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/pay/UnionApplySignParam.java

@@ -0,0 +1,28 @@
+package com.zhongshu.card.client.model.pay;
+
+import com.zhongshu.card.client.model.payment.PaymentSettingMaxParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class UnionApplySignParam {
+
+    @Schema(description = "商户签约协议号", hidden = true)
+    private String contractNo;
+
+    @Schema(description = "超时时间,默认30分钟", hidden = true)
+    private String expireTime;
+
+    @Schema(description = "签约场景: 小程序:03, APP:01")
+    private String invokeScene;
+
+    @Schema(description = "商户微信小程序appId")
+    private String mchntWxMpAppId;
+
+    @Schema(description = "商户微信小程序path,用于签约完成/失败/取消后跳转")
+    private String mchntWxMpPath;
+
+    private String projectOid;
+
+    private String userId;
+}

+ 30 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/ContractState.java

@@ -0,0 +1,30 @@
+package com.zhongshu.card.client.type;
+
+import lombok.Getter;
+
+/**
+ * 银联无感支付签约状态
+ */
+public enum ContractState {
+
+    APPLY("初始状态(待银行通知或主动查询)"),
+
+    UNSIGNED("未签约"),
+
+    SIGNED("已签约"),
+
+    RESCISSION("已解约"),
+
+    DELETING_CONTRACT("解约中"),
+
+    UNKNOWN("未知"),
+    ;
+
+
+    @Getter
+    private String remark;
+
+    ContractState(String remark) {
+        this.remark = remark;
+    }
+}

+ 44 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/pay/senseless/ChinaumsSenselessPayController.java

@@ -0,0 +1,44 @@
+package com.zhongshu.card.server.core.controller.pay.senseless;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.pay.UnionApplySignParam;
+import com.zhongshu.card.server.core.service.pay.ChinaumsSenselessPayService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("senselessPay/chinaums")
+@Tag(name = "银联无感支付", description = "银联无感支付接口")
+public class ChinaumsSenselessPayController {
+
+    @Autowired
+    private ChinaumsSenselessPayService chinaumsSenselessPayService;
+
+
+    @Operation(summary = "签约申请", description = "签约申请")
+    @RequestMapping(value = "signApply", method = RequestMethod.POST)
+    @ResourceAuth(value = "user", type = AuthType.User)
+    public Object signApply(@RequestBody UnionApplySignParam param){
+        return chinaumsSenselessPayService.signApply(param);
+    }
+
+    @Operation(summary = "解约", description = "解约")
+    @RequestMapping(value = "signCancel", method = RequestMethod.GET)
+    @ResourceAuth(value = "user", type = AuthType.User)
+    public Object signCancel(){
+        return chinaumsSenselessPayService.signCancel(null, null);
+    }
+
+    @Operation(summary = "查询用户签约信息", description = "查询用户签约信息")
+    @RequestMapping(value = "queryUserSignInfo", method = RequestMethod.GET)
+    @ResourceAuth(value = "user", type = AuthType.User)
+    public Object queryUserSignInfo(){
+        return chinaumsSenselessPayService.queryUserSignInfo(null, null);
+    }
+}

+ 8 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/pay/statistics/PayOverviewController.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.controller.pay.statistics;
 
+import com.zhongshu.card.client.model.pay.PeriodDetailQueryModel;
 import com.zhongshu.card.client.model.pay.PeriodQueryModel;
 import com.zhongshu.card.server.core.service.pay.OrgOverviewService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -39,4 +40,11 @@ public class PayOverviewController {
                                   @Parameter(required = true) PeriodQueryModel param){
         return orgOverviewService.queryCreditBill(pageable, param);
     }
+
+    @Operation(summary = "查询收入账单详情", description = "查询收入账单详情")
+    @RequestMapping(value = "queryCreditBillDetail", method = RequestMethod.POST)
+    public Object queryCreditBillDetail(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+                                        @Parameter(required = true) PeriodDetailQueryModel periodDetailQueryModel){
+        return orgOverviewService.queryCreditBillDetail(pageable, periodDetailQueryModel);
+    }
 }

+ 12 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/ChinaumsSenselessUserSignInfoDao.java

@@ -0,0 +1,12 @@
+package com.zhongshu.card.server.core.dao.pay;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.pay.extend.ChinaumsSenselessUserSignInfoDaoExtend;
+import com.zhongshu.card.server.core.domain.pay.ChinaumsSenselessUserSignInfo;
+
+public interface ChinaumsSenselessUserSignInfoDao extends MongoDao<ChinaumsSenselessUserSignInfo>, ChinaumsSenselessUserSignInfoDaoExtend {
+
+    ChinaumsSenselessUserSignInfo findTopByUserIdAndMid(String userId, String mid);
+
+    ChinaumsSenselessUserSignInfo findTopByContractNo(String contractNo);
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/extend/ChinaumsSenselessUserSignInfoDaoExtend.java

@@ -0,0 +1,4 @@
+package com.zhongshu.card.server.core.dao.pay.extend;
+
+public interface ChinaumsSenselessUserSignInfoDaoExtend {
+}

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/pay/impl/ChinaumsSenselessUserSignInfoDaoImpl.java

@@ -0,0 +1,6 @@
+package com.zhongshu.card.server.core.dao.pay.impl;
+
+import com.zhongshu.card.server.core.dao.pay.extend.ChinaumsSenselessUserSignInfoDaoExtend;
+
+public class ChinaumsSenselessUserSignInfoDaoImpl implements ChinaumsSenselessUserSignInfoDaoExtend {
+}

+ 82 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/pay/ChinaumsSenselessUserSignInfo.java

@@ -0,0 +1,82 @@
+package com.zhongshu.card.server.core.domain.pay;
+
+import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
+import com.zhongshu.card.client.type.ContractState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * 银联无感支付用户签约信息
+ */
+@Data
+@Builder
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChinaumsSenselessUserSignInfo extends SuperEntity {
+
+    /**
+     * 用户id
+     */
+    @Indexed
+    private String userId;
+
+    /**
+     * 商户签约协议号
+     */
+    @Indexed(unique = true)
+    private String contractNo;
+
+    /**
+     * 银联受理单号
+     */
+    private String relateSsn;
+
+    /**
+     * 银行商户号
+     */
+    @Indexed
+    private String mid;
+
+    /**
+     * 银商免密支付签约协议号(签约成功时返回。云闪付侧的签约协议号,由银联生成。即标记化支付信息域的token。BASE64加密。)
+     */
+    private String contractId;
+
+    /**
+     * 签约状态
+     */
+    @Indexed
+    private ContractState contractState;
+
+    /**
+     * 协议签约时间
+
+     */
+    private String contractSignedTime;
+
+    /**
+     * 协议到期时间
+     */
+    private String contractExpiredTime;
+
+    /**
+     * 云闪付用户id
+     */
+    private String acpId;
+
+    /**
+     * 云闪付小程序id
+     */
+    private String cqpMpAppId;
+
+    /**
+     * 云闪付小程序path
+     */
+    private String cqpMpPath;
+}

+ 6 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/BalancePayService.java

@@ -145,6 +145,7 @@ public class BalancePayService extends SuperService {
                 sourceTransaction.setTransactionStatus(TransactionStatus.Success);
                 sourceTransaction.setAmount(rechargeOrder.getTotal().negate().longValue());
                 sourceTransaction.setRemark("用户余额充值");
+                sourceTransaction.setMeta(Map.of("paymentType",PaymentType.WeChat, "description","用户充值"));
                 transferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{sourceTransaction});
 
                 //构建入账账户
@@ -155,6 +156,7 @@ public class BalancePayService extends SuperService {
                 destinationTransaction.setTransactionStatus(TransactionStatus.Success);
                 destinationTransaction.setAmount(rechargeOrder.getTotal().longValue());
                 destinationTransaction.setRemark("用户余额充值");
+                destinationTransaction.setMeta(Map.of("paymentType",PaymentType.WeChat, "description","用户充值"));
                 transferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{destinationTransaction});
                 //发起转账
                 ResultContent<List<TransactionLogModel>> transfer = transactionLogService.transfer(transferModel);
@@ -196,19 +198,21 @@ public class BalancePayService extends SuperService {
         TransferTransactionsModel.GeneralLedgerTransaction sourceTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
         sourceTransaction.setGeneralLedgerId(userBalancePayment.getLedgerId());
         sourceTransaction.setOrderNumber(orderNo);
-        sourceTransaction.setTransactionType(TransactionType.Pay);
+        sourceTransaction.setTransactionType(TransactionType.BalancePay);
         sourceTransaction.setTransactionStatus(TransactionStatus.Success);
         sourceTransaction.setAmount(total.negate().longValue());
         sourceTransaction.setRemark(remark);
+        sourceTransaction.setMeta(Map.of("paymentType",PaymentType.UserWallet, "description", "用户余额支付"));
         transferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{sourceTransaction});
         //构建入账账户
         TransferTransactionsModel.GeneralLedgerTransaction destinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
         destinationTransaction.setGeneralLedgerId(orgWaitSettle.getLedgerId());
         destinationTransaction.setOrderNumber(orderNo);
-        destinationTransaction.setTransactionType(TransactionType.Pay);
+        destinationTransaction.setTransactionType(TransactionType.BalancePay);
         destinationTransaction.setTransactionStatus(TransactionStatus.Success);
         destinationTransaction.setAmount(total.longValue());
         destinationTransaction.setRemark(remark);
+        destinationTransaction.setMeta(Map.of("paymentType",PaymentType.UserWallet, "description", "用户余额支付"));
         transferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{destinationTransaction});
         //发起转账
         return transactionLogService.transfer(transferModel);

+ 226 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/ChinaumsSenselessPayService.java

@@ -0,0 +1,226 @@
+package com.zhongshu.card.server.core.service.pay;
+
+import com.github.microservice.core.util.bean.BeanUtil;
+import com.github.microservice.net.ResultContent;
+import com.github.microservice.pay.client.model.AccountModel;
+import com.github.microservice.pay.client.model.PayProductParameter;
+import com.github.microservice.pay.client.model.chinaSenseless.ChinaSenselessSignRet;
+import com.github.microservice.pay.client.product.senseless.chinaumsSenseless.conf.ChinaumsSenselessConf;
+import com.github.microservice.pay.client.ret.ResultState;
+import com.github.microservice.pay.client.service.PayProductAccountService;
+import com.github.microservice.pay.client.service.product.SenselessPayService;
+import com.github.microservice.types.payment.PaymentType;
+import com.zhongshu.card.client.model.pay.ChinaumsSenselessUserSignInfoModel;
+import com.zhongshu.card.client.model.pay.UnionApplySignParam;
+import com.zhongshu.card.client.type.ContractState;
+import com.zhongshu.card.server.core.dao.pay.ChinaumsSenselessUserSignInfoDao;
+import com.zhongshu.card.server.core.domain.pay.ChinaumsSenselessUserSignInfo;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.paySetting.OrgPayAccountService;
+import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import io.micrometer.common.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import picocli.CommandLine;
+
+import java.util.Map;
+
+@Slf4j
+@Service
+public class ChinaumsSenselessPayService extends SuperService {
+
+    @Autowired
+    OrgPayAccountService orgPayAccountService;
+
+    @Autowired
+    ChinaumsSenselessUserSignInfoDao chinaumsSenselessUserSignInfoDao;
+
+    @Autowired
+    SenselessPayService senselessPayService;
+
+    @Autowired
+    PayProductAccountService payProductAccountService;
+
+
+    /**
+     * 银联申请签约
+     * @return
+     */
+    public Object signApply(UnionApplySignParam param){
+
+        String projectOid = param.getProjectOid();
+        String userId = param.getUserId();
+
+        if (StringUtils.isBlank(userId)){
+            userId = getCurrentUserId();
+        }
+
+        if (StringUtils.isBlank(projectOid)){
+            projectOid = getCurrentProjectOid();
+        }
+
+        //获取银联支付产品账户及需要签约的商户号
+        String accountName = orgPayAccountService.queryOgPayAccount(projectOid, PaymentType.UnionFrictionlessPay);
+        com.github.microservice.pay.client.ret.ResultContent<AccountModel> accountModelResultContent = payProductAccountService.get(accountName);
+        if (!accountModelResultContent.getState().equals(ResultState.Success)){
+            return accountModelResultContent;
+        }
+        ChinaumsSenselessConf conf = (ChinaumsSenselessConf) accountModelResultContent.getContent().getConf();
+        String mid = conf.getMchId();
+
+        ChinaumsSenselessUserSignInfo userSignInfo = chinaumsSenselessUserSignInfoDao.findTopByUserIdAndMid(userId, mid);
+        param.setContractNo(CommonUtil.UUID());
+
+        if (userSignInfo!=null && userSignInfo.getContractState()!=null){
+            switch (userSignInfo.getContractState()){
+                case SIGNED -> {//已签约
+                    return ResultContent.buildFail("签约已完成,请勿重复请求");
+                }
+                case UNSIGNED, RESCISSION -> {//未签约,已解约
+                    return signApply(param, accountName, userId, mid);
+                }
+                case DELETING_CONTRACT, APPLY -> {
+                    return ResultContent.buildFail("正在签约中,请等待银行返回结果");
+                }
+                case UNKNOWN ->{
+                    return ResultContent.buildFail("未知状态,请联系管理人员");
+                }
+            }
+        }else {
+            return signApply(param, accountName, userId, mid);
+        }
+
+        return ResultContent.buildFail("数据不存在,请联系管理员");
+    }
+
+    private Object signApply(UnionApplySignParam param, String accountName, String userId, String mid) {
+        PayProductParameter<Object> payProductParameter = new PayProductParameter<>();
+        payProductParameter.setAccountName(accountName);
+        payProductParameter.setMeta(BeanUtil.bean2Map(param));
+        com.github.microservice.pay.client.ret.ResultContent<Object> signApplyResultContent = senselessPayService.signApply(payProductParameter);
+        if (signApplyResultContent.getState().equals(ResultState.Success)){
+            Object content = signApplyResultContent.getContent();
+            Map<String, Object> resultMap = BeanUtil.bean2Map(content);
+            String errCode = (String) resultMap.get("errCode");
+            if ("SUCCESS".equals(errCode)){
+                ChinaumsSenselessUserSignInfo userSignInfo = new ChinaumsSenselessUserSignInfo();
+                userSignInfo.setUserId(userId);
+                userSignInfo.setContractNo(param.getContractNo());
+                userSignInfo.setContractState(ContractState.APPLY);
+                userSignInfo.setMid(mid);
+                userSignInfo.setRelateSsn((String) resultMap.get("relateSsn"));
+                userSignInfo.setCqpMpAppId((String) resultMap.get("cqpMpAppId"));
+                userSignInfo.setCqpMpPath((String) resultMap.get("cqpMpPath"));
+                chinaumsSenselessUserSignInfoDao.save(userSignInfo);
+                return signApplyResultContent;
+            }else {
+                return ResultContent.buildFail((String) resultMap.get("errMsg"));
+            }
+        }
+        return ResultContent.buildFail("银联请求失败");
+    }
+
+    /**
+     * 解约
+     */
+    public Object signCancel(String userId, String projectOid) {
+        if (StringUtils.isBlank(userId)){
+            userId = getCurrentUserId();
+        }
+
+        if (StringUtils.isBlank(projectOid)){
+            projectOid = getCurrentProjectOid();
+        }
+
+        //获取银联支付产品账户及需要签约的商户号
+        String accountName = orgPayAccountService.queryOgPayAccount(projectOid, PaymentType.UnionFrictionlessPay);
+        com.github.microservice.pay.client.ret.ResultContent<AccountModel> accountModelResultContent = payProductAccountService.get(accountName);
+        if (!accountModelResultContent.getState().equals(ResultState.Success)){
+            return accountModelResultContent;
+        }
+        ChinaumsSenselessConf conf = (ChinaumsSenselessConf) accountModelResultContent.getContent().getConf();
+        String mid = conf.getMchId();
+
+        ChinaumsSenselessUserSignInfo userSignInfo = chinaumsSenselessUserSignInfoDao.findTopByUserIdAndMid(userId, mid);
+        if (userSignInfo==null){
+            return ResultContent.buildFail("用户与该商户未签约");
+        }
+
+        if (userSignInfo.getContractState()==null){
+            return ResultContent.buildFail("签约状态数据异常");
+        }
+
+        if (userSignInfo.getContractState().equals(ContractState.RESCISSION)){
+            return ResultContent.buildFail("当前已经处于解约状态");
+        }
+
+        if (userSignInfo.getContractState().equals(ContractState.SIGNED)){
+            PayProductParameter<Object> payProductParameter = new PayProductParameter<>();
+            payProductParameter.setAccountName(accountName);
+            payProductParameter.setMeta(Map.of("contractId", userSignInfo.getContractId()));
+            com.github.microservice.pay.client.ret.ResultContent<Object> objectResultContent = senselessPayService.signCancel(payProductParameter);
+            if (objectResultContent.getState().equals(ResultState.Success)){
+                userSignInfo.setContractState(ContractState.DELETING_CONTRACT);
+                chinaumsSenselessUserSignInfoDao.save(userSignInfo);
+                return ResultContent.buildSuccess();
+            }
+            return ResultContent.buildFail("解约失败");
+        }
+
+        return ResultContent.buildFail("当前状态不可解约,请稍后再试");
+    }
+
+    public Object queryUserSignInfo(String userId, String projectOid){
+        if (StringUtils.isBlank(userId)){
+            userId = getCurrentUserId();
+        }
+
+        if (StringUtils.isBlank(projectOid)){
+            projectOid = getCurrentProjectOid();
+        }
+
+        //获取银联支付产品账户及需要签约的商户号
+        String accountName = orgPayAccountService.queryOgPayAccount(projectOid, PaymentType.UnionFrictionlessPay);
+        com.github.microservice.pay.client.ret.ResultContent<AccountModel> accountModelResultContent = payProductAccountService.get(accountName);
+        if (!accountModelResultContent.getState().equals(ResultState.Success)){
+            return accountModelResultContent;
+        }
+        ChinaumsSenselessConf conf = (ChinaumsSenselessConf) accountModelResultContent.getContent().getConf();
+        String mid = conf.getMchId();
+
+        ChinaumsSenselessUserSignInfo userSignInfo = chinaumsSenselessUserSignInfoDao.findTopByUserIdAndMid(userId, mid);
+        if (userSignInfo==null){
+            ChinaumsSenselessUserSignInfoModel model = new ChinaumsSenselessUserSignInfoModel();
+            model.setUserId(userId);
+            model.setContractState(ContractState.UNSIGNED);
+            return ResultContent.buildContent(model);
+        }
+        return ResultContent.buildContent(toUserSignModel(userSignInfo));
+    }
+
+
+    private ChinaumsSenselessUserSignInfoModel toUserSignModel(ChinaumsSenselessUserSignInfo userSignInfo){
+        ChinaumsSenselessUserSignInfoModel model = new ChinaumsSenselessUserSignInfoModel();
+        if (userSignInfo!=null){
+            BeanUtils.copyProperties(userSignInfo, model);
+        }
+        return model;
+    }
+
+    public void handleSignRetMessage(ChinaSenselessSignRet chinaSenselessSignRet){
+        ChinaumsSenselessUserSignInfo userSignInfo = chinaumsSenselessUserSignInfoDao.findTopByContractNo(chinaSenselessSignRet.getContractNo());
+        if (userSignInfo == null){
+            log.info("签约通知回调:找不到签约用户信息 contractNo:{}", chinaSenselessSignRet.getContractNo());
+            return;
+        }
+        userSignInfo.setContractState(ContractState.valueOf(chinaSenselessSignRet.getContractState()));
+        userSignInfo.setContractId(chinaSenselessSignRet.getContractId());
+        userSignInfo.setContractSignedTime(chinaSenselessSignRet.getContractSignedTime());
+        userSignInfo.setContractExpiredTime(chinaSenselessSignRet.getContractExpiredTime());
+        userSignInfo.setAcpId(chinaSenselessSignRet.getAcpId());
+        chinaumsSenselessUserSignInfoDao.save(userSignInfo);
+    }
+}

+ 55 - 6
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/pay/OrgOverviewService.java

@@ -12,6 +12,7 @@ import com.github.microservice.pay.client.type.ledger.TransactionStatus;
 import com.github.microservice.pay.client.type.ledger.TransactionType;
 import com.github.microservice.types.payment.PaymentChannelType;
 import com.zhongshu.card.client.model.pay.BalanceOverviewModel;
+import com.zhongshu.card.client.model.pay.PeriodDetailQueryModel;
 import com.zhongshu.card.client.model.pay.PeriodQueryModel;
 import com.zhongshu.card.client.model.pay.RealTimeOverviewModel;
 import com.zhongshu.card.client.type.PeriodType;
@@ -24,11 +25,10 @@ import org.apache.commons.lang3.StringUtils;
 import org.bson.Document;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static org.springframework.integration.IntegrationPatternType.filter;
@@ -46,6 +46,9 @@ public class OrgOverviewService extends SuperService {
     @Autowired
     PayAccountService payAccountService;
 
+    @Autowired
+    OrganizationUserServiceImpl organizationUserService;
+
     /**
      * 查询用户流水
      */
@@ -179,8 +182,6 @@ public class OrgOverviewService extends SuperService {
         return ResultContent.buildContent(realTimeOverviewModel);
     }
 
-    @Autowired
-    OrganizationUserServiceImpl organizationUserService;
 
     public Object queryCreditBill(Pageable pageable, PeriodQueryModel param){
         String projectOid = param.getProjectOid();
@@ -215,6 +216,54 @@ public class OrgOverviewService extends SuperService {
         return com.github.microservice.net.ResultContent.buildFail("周期类型不存在");
     }
 
+    public Object queryCreditBillDetail(Pageable pageable, PeriodDetailQueryModel periodDetailQueryModel){
+        String projectOid = periodDetailQueryModel.getProjectOid();
+        if (StringUtils.isBlank(projectOid)) {
+            projectOid = getCurrentProjectOid();
+        }
+
+        List<String> oidList = organizationUserService.getUserOrgListOids(getCurrentUserId(), projectOid);
+        if (oidList==null || oidList.isEmpty()){
+            return com.github.microservice.net.ResultContent.buildFail("未加入机构");
+        }
+
+        PayAccount payAccount = payAccountService.getOrgChildren(projectOid, oidList.get(0), PaymentChannelType.WaitSettle);
+
+        GeneralLedgerQueryTransactionLogModel queryModel = new GeneralLedgerQueryTransactionLogModel();
+
+        PageableModel pageableModel = new PageableModel();
+        pageableModel.setPage(pageable.getPageNumber());
+        pageableModel.setSize(pageable.getPageSize());
+        pageableModel.setSort("createTime");
+        pageableModel.setDirection(Sort.Direction.DESC);
+        queryModel.setPage(pageableModel);
+
+        queryModel.setStartTime(periodDetailQueryModel.getStartTime());
+        queryModel.setEndTime(periodDetailQueryModel.getEndTime());
+        queryModel.setGeneralLedgerId(new String[]{payAccount.getLedgerId()});
+
+        Map<String, Object> filter = new HashMap<>();
+        Optional.ofNullable(periodDetailQueryModel.getTransactionLogId()).ifPresent((it) ->{
+            filter.put("transactionLogId", it);
+        });
+
+        Optional.ofNullable(periodDetailQueryModel.getLedgerEntry()).ifPresent((it) ->{
+            filter.put("ledgerEntry", it);
+        });
+
+        Optional.ofNullable(periodDetailQueryModel.getOrderNo()).ifPresent((it) ->{
+            filter.put("orderNumber", it);
+        });
+
+        Optional.ofNullable(periodDetailQueryModel.getPaymentType()).ifPresent((it) ->{
+            filter.put("meta.paymentType", it);
+        });
+
+        filter.put("transactionType",new Document("$ne", "Settle"));
+        queryModel.setFilter(filter);
+        return ResultContent.buildContent(transactionLogService.aggregate(queryModel).getContent().getPages());
+    }
+
 
     private static Long changeRate(Long todayAmount, Long yesterdayAmount) {
         Long amountChangeRate = null;
@@ -231,7 +280,7 @@ public class OrgOverviewService extends SuperService {
         if (modelList !=null){
             yesterdayMap = modelList.stream().collect(Collectors.toMap(TransactionLogRealTimeAggregateRetModel::getDateTime, TransactionLogRealTimeAggregateRetModel::getAmount));
             for (String point : currentIntegralPoint) {
-                amountList.add(yesterdayMap.getOrDefault(point, 0L));
+                amountList.add(yesterdayMap.getOrDefault(point, 0L)/100);
             }
         }else {
             for (int i = 0; i < currentIntegralPoint.size(); i++) {

+ 24 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/stream/ChinaumsSenselessSignStream.java

@@ -0,0 +1,24 @@
+package com.zhongshu.card.server.core.stream;
+
+import com.github.microservice.app.stream.StreamConsumer;
+import com.github.microservice.core.util.JsonUtil;
+import com.github.microservice.pay.client.model.chinaSenseless.ChinaSenselessSignRet;
+import com.github.microservice.pay.client.model.weChatMiniApp.WeChatMiniAppPayRet;
+import com.zhongshu.card.server.core.service.pay.ChinaumsSenselessPayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component("chinaumsSenselessSignStreamConsumer")
+public class ChinaumsSenselessSignStream extends StreamConsumer<ChinaSenselessSignRet> {
+
+    @Autowired
+    ChinaumsSenselessPayService chinaumsSenselessPayService;
+
+    @Override
+    public void accept(ChinaSenselessSignRet chinaSenselessSignRet) {
+        log.info("****************收到银联签约结果通知:{}", JsonUtil.toJson(chinaSenselessSignRet));
+        chinaumsSenselessPayService.handleSignRetMessage(chinaSenselessSignRet);
+    }
+}

+ 7 - 1
FullCardServer/src/main/resources/application.yml

@@ -36,8 +36,14 @@ spring:
         weChatMiniAppPayStreamConsumer-in-0:
           destination: WeChatAppMiniPayStream
           group: ${project.artifactId}
+        weChatMiniAppReFundStreamConsumer-in-0:
+          destination: WeChatAppMiniRefundStream
+          group: ${project.artifactId}
+        chinaumsSenselessSignStreamConsumer-in-0:
+          destination: ChinaumsSenselessSignStream
+          group: ${project.artifactId}
     function: #注意:此处有调整
-      definition: userLogStreamConsumer;unionFrictionChangeStream;weChatMiniAppPayStreamConsumer
+      definition: userLogStreamConsumer;unionFrictionChangeStream;weChatMiniAppPayStreamConsumer;weChatMiniAppReFundStreamConsumer,chinaumsSenselessSignStreamConsumer
 
     bus:
       enabled: true