TRX il y a 1 an
Parent
commit
b2cbb6c1ab

+ 1 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/RechargeType.java

@@ -8,6 +8,7 @@ import lombok.Getter;
 public enum RechargeType {
     Active("主动充值"),
     Refund("退款"),
+    Expend("消费"),
     ;
 
     @Getter

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/RefundState.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.utils.type;
+
+import lombok.Getter;
+
+/**
+ * 退款状态
+ */
+public enum RefundState {
+    Applying("申请中"),
+    Refunding("退款中"),
+    Refunded("已退款"),
+    Refuse("已拒绝"),
+    ;
+
+    @Getter
+    private String remark;
+
+    RefundState(String remark) {
+        this.remark = remark;
+    }
+}

+ 40 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -1,13 +1,16 @@
 package com.zhongshu.card.server.core.domain.payment;
 
 import cn.hutool.json.JSONObject;
+import com.zhongshu.card.client.utils.type.RefundState;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
+import com.zhongshu.card.server.core.domain.school.CardInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.checkerframework.common.aliasing.qual.NonLeaked;
 import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.DBRef;
 import org.springframework.data.mongodb.core.mapping.Document;
 
 import java.math.BigDecimal;
@@ -25,12 +28,23 @@ import java.math.BigDecimal;
 @NonLeaked
 public class ExpenseFlow extends SuperMain {
 
+    //-----------------------------订单信息 start---------------------
     @Schema(description = "用户userId")
     private String userId;
 
     @Schema(description = "消费机设备ID")
     private String deviceId;
 
+    @Schema(description = "卡片的编号,也是终端刷卡的 卡号")
+    private String cardNo;
+
+    @Schema(description = "卡片信息")
+    private CardInfo cardInfo;
+
+    @Schema(description = "关联钱包信息")
+    @DBRef(lazy = true)
+    private Wallet wallet;
+
     @Schema(description = "消费类型,如:餐饮消费")
     private String payType;
 
@@ -59,8 +73,33 @@ public class ExpenseFlow extends SuperMain {
 
     @Schema(description = "关联信息")
     @Indexed
-    private JSONObject goodsInfo;
+    private Object goodsInfo;
+
+    //------------------支付结果 start-------------------------
 
     @Schema(description = "支付订单状态")
     private String paymentStatus;
+
+    @Schema(description = "支付是否成功")
+    private Boolean isPaySuccess;
+
+    @Schema(description = "支付结果备注")
+    private String payRemark;
+
+    //-----------------------退款 start--------------------------
+    @Schema(description = "是否退款")
+    private Boolean isRefund;
+
+    @Schema(description = "退款状态")
+    private RefundState refundState;
+
+    @Schema(description = "申请退款时间")
+    private Long refundTime;
+
+    @Schema(description = "申请退款备注")
+    private String refundRemark;
+
+    @Schema(description = "退款处理备注")
+    private String refuseRemark;
+
 }

+ 11 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/model/payment/ExpendParam.java

@@ -1,6 +1,8 @@
 package com.zhongshu.card.server.core.model.payment;
 
+import com.github.microservice.models.type.PaymentType;
 import com.zhongshu.card.server.core.domain.school.CardInfo;
+import com.zhongshu.card.server.core.domain.school.DeviceInfo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -22,6 +24,12 @@ public class ExpendParam {
     @Schema(description = "卡片信息")
     private CardInfo cardInfo;
 
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "硬件设备")
+    private DeviceInfo deviceInfo;
+
     @Schema(description = "消费金额")
     private BigDecimal amount = BigDecimal.ZERO;
 
@@ -30,4 +38,7 @@ public class ExpendParam {
 
     @Schema(description = "物联网传来的参数")
     private Object iotParam;
+
+    @Schema(description = "支付方式")
+    PaymentType paymentType;
 }

+ 84 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -9,24 +9,31 @@ import com.zhongshu.card.client.model.school.BookInfoSearch;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.ret.ResultMessage;
 import com.zhongshu.card.client.service.payment.ExpenseFlowService;
+import com.zhongshu.card.client.utils.type.DataState;
+import com.zhongshu.card.client.utils.type.RechargeType;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
 import com.zhongshu.card.server.core.dao.payment.WalletDao;
+import com.zhongshu.card.server.core.dao.payment.WalletRechargeDao;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
 import com.zhongshu.card.server.core.domain.payment.Wallet;
+import com.zhongshu.card.server.core.domain.payment.WalletRecharge;
 import com.zhongshu.card.server.core.domain.school.BookInfo;
 import com.zhongshu.card.server.core.domain.school.CardInfo;
 import com.zhongshu.card.server.core.model.payment.ExpendParam;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
 import com.zhongshu.card.server.core.util.DateUtils;
+import com.zhongshu.card.server.core.util.NextNoUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 
@@ -49,14 +56,21 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
     @Autowired
     WalletService walletService;
 
+    @Autowired
+    WalletRechargeDao walletRechargeDao;
+
     /**
      * 消费付款
      *
      * @param param
      * @return
      */
+    @Transactional
     public ResultContent expendPay(ExpendParam param) {
         CardInfo cardInfo = param.getCardInfo();
+
+        String userId = cardInfo.getUserId();
+        UserAccount userAccount = userCountDao.findTopByUserId(userId);
         // 得到钱包的金额
         BigDecimal amount = param.getAmount();
         ResultContent result = walletService.checkUserWallet(cardInfo.getUserId(), amount);
@@ -64,6 +78,76 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
             return result;
         }
 
+        // 钱包信息
+        Wallet wallet = walletService.getUserWalletByUserId(userId);
+        if (wallet.getDataState() != DataState.Enable) {
+            return ResultContent.buildFail(String.format("支付失败钱包", wallet.getDataState().getRemark()));
+        }
+        if (wallet.getAmount().compareTo(amount) < 0) {
+            return ResultContent.buildFail("余额不足");
+        }
+
+        // 记录流水
+        ExpenseFlow expenseFlow = new ExpenseFlow();
+        // 设备信息
+        expenseFlow.setDeviceId(param.getDeviceId());
+        // 用户信息
+        expenseFlow.setUserId(cardInfo.getUserId());
+        // 卡片信息
+        expenseFlow.setCardNo(cardInfo.getCode());
+        expenseFlow.setCardInfo(cardInfo);
+        // 消费时间
+        if (param.getDeviceInfo() != null && param.getDeviceInfo().getDeviceType() != null) {
+            expenseFlow.setPayType(param.getDeviceInfo().getDeviceType().getRemark());
+        } else {
+            expenseFlow.setPayType("消费");
+        }
+
+        expenseFlow.setYear(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyy));
+        expenseFlow.setMonth(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternMM));
+        expenseFlow.setPaymentTime(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS));
+        // 消费订单号
+        expenseFlow.setOrderNo(param.getOrder());
+        String paymentNo = NextNoUtil.getNextPaymentNo(null);
+        expenseFlow.setPaymentNo(paymentNo);
+        // 消费金额
+        expenseFlow.setPayAmount(amount);
+        expenseFlow.setPaymentWay(param.getPaymentType().getRemark());
+        // 关联参数
+        expenseFlow.setGoodsInfo(param.getIotParam());
+        expenseFlow.setPaymentStatus("支付成功");
+        expenseFlow.setIsPaySuccess(Boolean.TRUE);
+        expenseFlow.setPayRemark("支付成功");
+        expenseFlowDao.save(expenseFlow);
+
+        // 扣款
+        // 消费金额
+        try {
+            WalletRecharge walletRecharge = new WalletRecharge();
+            initEntityNoCheckOid(walletRecharge);
+            BigDecimal preAmount = wallet.getAmount();
+            BigDecimal afterAmount = preAmount.subtract(amount);
+            wallet.setAmount(afterAmount);
+
+            walletRecharge.setPreAmount(preAmount);
+            walletRecharge.setAmount(amount);
+            walletRecharge.setRechargeType(RechargeType.Expend);
+            walletRecharge.setAfterAmount(afterAmount);
+            walletRecharge.setUserId(userId);
+            walletRecharge.setUserAccount(userAccount);
+            walletRecharge.setWallet(wallet);
+            walletRecharge.setUserName(userAccount.getName());
+            walletRecharge.setPhone(userAccount.getPhone());
+            walletRecharge.setYear(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyy));
+            walletRecharge.setMonth(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternMM));
+            walletRecharge.setTimeStr(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS));
+
+            walletDao.save(wallet);
+            walletRechargeDao.save(walletRecharge);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
         return ResultContent.buildSuccess();
     }
 

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/HxzService.java

@@ -135,11 +135,17 @@ public class HxzService extends SuperService {
             expendParam.setOrder(iotParam.getOrder());
             expendParam.setAmount(CommonUtil.turnMoney2BigDecimal(Amount));
             expendParam.setIotParam(iotParam);
+            expendParam.setDeviceId(iotParam.getDeviceId());
+            expendParam.setDeviceInfo(deviceInfo);
+            expendParam.setPaymentType(param.getPaymentType());
             ResultContent resultContent = expenseFlowService.expendPay(expendParam);
+
             if (resultContent.isSuccess()) {
                 // 消费成功 设置返回参数
                 resultModel.setSuccess();
                 resultModel.setText("支付成功");
+                resultModel.setCardNo(iotParam.getCardNo());
+                resultModel.setAmount(iotParam.getAmount());
             } else {
                 resultModel.setFailed(resultContent.getMsg());
                 requestInfoService.addRequestInfo(param, resultModel);

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/WalletService.java

@@ -210,6 +210,8 @@ public class WalletService extends SuperService {
         return ResultContent.buildSuccess();
     }
 
+
+
     /**
      * 得到充值详情
      *

+ 16 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/NextNoUtil.java

@@ -14,6 +14,20 @@ import java.util.Date;
 public class NextNoUtil {
 
     private final static SimpleDateFormat shortSdf = new SimpleDateFormat("yyyyMMdd");
+    private final static SimpleDateFormat longSdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+
+    public static String getNextPaymentNo(String sign) {
+        if (sign == null) {
+            sign = "P";
+        }
+        CollectionIdDao collectionIdDao = ApplicationContextHolder.getContext().getBean(CollectionIdDao.class);
+        String collectionName = sign + longSdf.format(new Date());
+        Long no = collectionIdDao.getNextId(collectionName);
+        if (no != null) {
+            return String.format("%s%s%04d", sign, longSdf.format(new Date()), no);
+        }
+        return "";
+    }
 
     /**
      * 生成编码 (每天从 0001开始)
@@ -34,7 +48,7 @@ public class NextNoUtil {
     /**
      * 生成编码 (每天从 0001开始)
      *
-     * @param oid 企业ID
+     * @param oid  企业ID
      * @param sign 开头,如:XS
      * @return 如:XS202303290001
      */
@@ -51,7 +65,7 @@ public class NextNoUtil {
     /**
      * 生成编码 (一直累加)
      *
-     * @param oid 企业ID
+     * @param oid  企业ID
      * @param sign 开头,如:XS
      * @return 如:XS202303290001
      */