Ver código fonte

机构类型

TRX 1 ano atrás
pai
commit
cb23fdafb9

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

@@ -7,7 +7,7 @@ import lombok.Getter;
  */
 public enum DataState {
     Enable("启用"),
-    Disable("停用"),
+    Disable("停用"),
     ;
 
     @Getter

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/school/CardState.java

@@ -7,7 +7,7 @@ import lombok.Getter;
  */
 public enum CardState {
     Enable("正常"),
-    Lock("锁定"),
+    Lock("锁定"),
     Loss("已挂失"),
     ;
 

+ 3 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/HxzController.java

@@ -5,6 +5,7 @@ import com.github.microservice.models.hxz.ConsumTransactionsFullParam;
 import com.github.microservice.models.hxz.ConsumTransactionsFullResult;
 import com.github.microservice.models.hxz.ServerTimeModel;
 import com.github.microservice.models.hxz.ServerTimeResult;
+import com.github.microservice.models.hxz.base.BaseResultModel;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.server.core.service.payment.HxzService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -31,14 +32,14 @@ public class HxzController {
      */
     @Operation(summary = "获取服务器时间接口")
     @PostMapping(value = "ServerTime", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent<ServerTimeResult> serverTime(@RequestBody ServerTimeModel serverTimeModel) {
+    public ResultContent serverTime(@RequestBody ServerTimeModel serverTimeModel) {
         return hxzService.serverTime(serverTimeModel);
     }
 
 
     @Operation(summary = "用户刷卡综合接口")
     @PostMapping(value = "ConsumTransactions", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent<ConsumTransactionsFullResult> consumTransactions(@RequestBody ConsumTransactionsFullParam param) {
+    public ResultContent consumTransactions(@RequestBody ConsumTransactionsFullParam param) {
         return hxzService.consumTransactions(param);
     }
 

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/CardInfoDao.java

@@ -17,6 +17,8 @@ public interface CardInfoDao extends MongoDao<CardInfo> {
 
     CardInfo findTopById(String id);
 
+    CardInfo findByCode(String code);
+
     CardInfo findTopByIccid(String iccid);
 
     // 查询用户code的卡片

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/CardInfo.java

@@ -30,7 +30,7 @@ public class CardInfo extends SuperMain {
     @Schema(description = "卡片类型")
     private CardType cardType;
 
-    @Schema(description = "卡片号码")
+    @Schema(description = "卡片号码,唯一标识, 卡号")
     private String code;
 
     @Schema(description = "卡片uid")

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

@@ -0,0 +1,33 @@
+package com.zhongshu.card.server.core.model.payment;
+
+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 java.math.BigDecimal;
+
+/**
+ * 消费数据
+ *
+ * @author TRX
+ * @date 2024/6/29
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExpendParam {
+
+    @Schema(description = "卡片信息")
+    private CardInfo cardInfo;
+
+    @Schema(description = "消费金额")
+    private BigDecimal amount = BigDecimal.ZERO;
+
+    @Schema(description = "消费序号")
+    private String order;
+
+    @Schema(description = "物联网传来的参数")
+    private Object iotParam;
+}

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

@@ -9,9 +9,15 @@ 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.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.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.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.DateUtils;
@@ -22,6 +28,8 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+
 /**
  * @author TRX
  * @date 2024/6/17
@@ -32,6 +40,33 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
     @Autowired
     ExpenseFlowDao expenseFlowDao;
 
+    @Autowired
+    UserCountDao userCountDao;
+
+    @Autowired
+    WalletDao walletDao;
+
+    @Autowired
+    WalletService walletService;
+
+    /**
+     * 消费付款
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent expendPay(ExpendParam param) {
+        CardInfo cardInfo = param.getCardInfo();
+        // 得到钱包的金额
+        BigDecimal amount = param.getAmount();
+        ResultContent result = walletService.checkUserWallet(cardInfo.getUserId(), amount);
+        if (result.isFailed()) {
+            return result;
+        }
+
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 查询分页数据
      *
@@ -60,6 +95,7 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
 
     /**
      * 统计用户今天支付的总金额
+     *
      * @param userId 用户ID
      * @return
      */

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

@@ -1,11 +1,21 @@
 package com.zhongshu.card.server.core.service.payment;
 
+import cn.hutool.json.JSONUtil;
 import com.github.microservice.models.hxz.*;
+import com.github.microservice.models.hxz.base.BaseResultModel;
 import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.utils.type.UserState;
+import com.zhongshu.card.client.utils.type.school.CardState;
+import com.zhongshu.card.server.core.dao.CardInfoDao;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.domain.school.CardInfo;
 import com.zhongshu.card.server.core.domain.school.DeviceInfo;
 import com.zhongshu.card.server.core.httpRequest.ApiRequestService;
+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.CommonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,13 +39,22 @@ public class HxzService extends SuperService {
     @Autowired
     ApiRequestService apiRequestService;
 
+    @Autowired
+    CardInfoDao cardInfoDao;
+
+    @Autowired
+    UserCountDao userCountDao;
+
+    @Autowired
+    ExpenseFlowServiceImpl expenseFlowService;
+
     /**
      * 得到系统时间
      *
      * @param param
      * @return
      */
-    public ResultContent<ServerTimeResult> serverTime(ServerTimeModel param) {
+    public ResultContent serverTime(ServerTimeModel param) {
         String deviceId = param.getDeviceID().toString();
         ServerTimeResult result = new ServerTimeResult();
         DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(deviceId);
@@ -46,8 +65,9 @@ public class HxzService extends SuperService {
         } else {
             result.setSuccess();
         }
+        String str = JSONUtil.toJsonStr(result);
         requestInfoService.addRequestInfo(param, result);
-        return ResultContent.buildSuccess(result);
+        return ResultContent.buildSuccess(str);
     }
 
     /**
@@ -56,13 +76,85 @@ public class HxzService extends SuperService {
      * @param param
      * @return
      */
-    public ResultContent<ConsumTransactionsFullResult> consumTransactions(@RequestBody ConsumTransactionsFullParam param) {
+    public ResultContent consumTransactions(ConsumTransactionsFullParam param) {
+        // 返回参数
         ConsumTransactionsFullResult result = new ConsumTransactionsFullResult();
-        ConsumTransactionsResult model = new ConsumTransactionsResult();
+        result.setPaymentType(param.getPaymentType());
 
-        requestInfoService.addRequestInfo(param, model);
+        ConsumTransactionsResult resultModel = new ConsumTransactionsResult();
+        // 参数
+        ConsumTransactionsModel iotParam = param.getParam();
 
-        return ResultContent.buildSuccess(result);
+        // 检查设备
+        String deviceId = iotParam.getDeviceId();
+        DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(deviceId);
+        if (ObjectUtils.isEmpty(deviceInfo)) {
+            resultModel.setFailed("业务设备未注册");
+            requestInfoService.addRequestInfo(param, resultModel);
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
+        // 验证卡片
+        CardInfo cardInfo = cardInfoDao.findByCode(iotParam.getCardNo());
+        if (ObjectUtils.isEmpty(cardInfo)) {
+            resultModel.setFailed("卡片未注册");
+            requestInfoService.addRequestInfo(param, resultModel);
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
+
+        if (cardInfo.getCardState() != CardState.Enable) {
+            resultModel.setFailed(String.format("卡片", cardInfo.getCardState().getRemark()));
+            requestInfoService.addRequestInfo(param, resultModel);
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
+
+        // 验证持卡人的钱包
+        String userId = cardInfo.getUserId();
+        UserAccount userAccount = userCountDao.findTopByUserId(userId);
+        if (ObjectUtils.isEmpty(userAccount)) {
+            resultModel.setFailed("持卡人为空");
+            requestInfoService.addRequestInfo(param, resultModel);
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
+
+        if (userAccount.getState() == UserState.Locked) {
+            resultModel.setFailed("持卡人已锁定");
+            requestInfoService.addRequestInfo(param, resultModel);
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
+
+        if (iotParam.getMode() == 0 && iotParam.getPayType() == 0) {
+            // 手动 刷卡扣费
+            String Amount = iotParam.getAmount();
+            ExpendParam expendParam = new ExpendParam();
+            expendParam.setCardInfo(cardInfo);
+            expendParam.setOrder(iotParam.getOrder());
+            expendParam.setAmount(CommonUtil.turnMoney2BigDecimal(Amount));
+            expendParam.setIotParam(iotParam);
+            ResultContent resultContent = expenseFlowService.expendPay(expendParam);
+            if (resultContent.isSuccess()) {
+                // 消费成功 设置返回参数
+                resultModel.setSuccess();
+                resultModel.setText("支付成功");
+            } else {
+                resultModel.setFailed(resultContent.getMsg());
+                requestInfoService.addRequestInfo(param, resultModel);
+                result.setModel(resultModel);
+                return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+            }
+        } else {
+            resultModel.setFailed("消费模式不支持");
+            requestInfoService.addRequestInfo(param, resultModel);
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
+        result.setModel(resultModel);
+        requestInfoService.addRequestInfo(param, resultModel);
+        return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
     }
 
 }

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

@@ -58,6 +58,17 @@ public class WalletService extends SuperService {
 
     private final ReentrantLock lock = new ReentrantLock();
 
+    public ResultContent checkUserWallet(String userId, BigDecimal amount) {
+        Wallet wallet = getUserWalletByUserId(userId);
+        if (wallet.getDataState() != DataState.Enable) {
+            return ResultContent.buildFail(String.format("支付失败钱包", wallet.getDataState().getRemark()));
+        }
+        if(wallet.getAmount().compareTo(amount) < 0) {
+            return ResultContent.buildFail("余额不足");
+        }
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 初始当前用户钱包
      *

+ 16 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CommonUtil.java

@@ -150,6 +150,22 @@ public class CommonUtil {
         return false;
     }
 
+    /**
+     * 把消费机的金额转为 数字 单位:分,
+     *
+     * @param amount 2.45 (传过来的单位是:元)
+     * @return
+     */
+    public static BigDecimal turnMoney2BigDecimal(String amount) {
+        BigDecimal money = BigDecimal.ZERO;
+        try {
+            money = new BigDecimal(amount).multiply(BigDecimal.valueOf(100));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return money;
+    }
+
     /**
      * 2个Long是否相等
      *