Переглянути джерело

feature: 教职工自助
1.除了微信订单写入外,完整的教职工自助充值流程全部完成

luo.yibo@datuai.com 1 рік тому
батько
коміт
af8f4d9777

+ 67 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/self/SelfBusiness.java

@@ -1,14 +1,24 @@
 package org.dromara.backstage.business.self;
 
 import cn.hutool.core.codec.Base64;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.backstage.consumption.domain.bo.XfCreditAccountBackBo;
+import org.dromara.backstage.consumption.domain.vo.XfCreditAccountBackVo;
+import org.dromara.backstage.consumption.service.IXfCreditAccountBackService;
+import org.dromara.backstage.domain.convert.YcVoConvert;
+import org.dromara.backstage.payment.domain.bo.WxOrderBo;
+import org.dromara.backstage.payment.domain.vo.WxOrderVo;
+import org.dromara.backstage.payment.service.IWxOrderService;
 import org.dromara.backstage.task.AsyncTaskService;
 import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.enums.CreditStatusEnum;
 import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.enums.ResultCodeEnum;
 import org.dromara.common.core.exception.ApiException;
@@ -17,7 +27,9 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.text.MessageFormat;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -43,6 +55,8 @@ public class SelfBusiness {
     @Value("${third-api.pay-api}")
     String payApi;
     private final AsyncTaskService asyncTaskService;
+    private final IWxOrderService wxOrderService;
+    private final IXfCreditAccountBackService creditAccountBackService;
 
     /**
      * 获取短信平台token
@@ -55,7 +69,7 @@ public class SelfBusiness {
         String loginUrl = smsApi + "sms/api/v1/login";
         // String loginUrl = "https://ykt.hnswdx.gov.cn/sms/api/v1/login";
         HttpRequest req = HttpUtil.createPost(loginUrl);
-        try(HttpResponse res = req.execute()) {
+        try(HttpResponse res = req.body(JSONUtil.toJsonStr(mapAccount)).execute()) {
             ReturnResult result = JSONUtil.toBean(res.body(), ReturnResult.class);
             log.info("[短信平台登录]-{}", JSONUtil.toJsonStr(result));
             if(result.isSuccess()){
@@ -99,6 +113,58 @@ public class SelfBusiness {
         return createQrCode(creditType, userId, userXm, deptId, deptName, mobile, dealValue, callBackUrl);
     }
 
+    /**
+     * 根据人员Id和部门Id查询第三方支付订单的支付情况
+     * @param deptId 部门Id
+     * @param userId 人员Id
+     * @return 支付结果
+     */
+    public ReturnResult queryPayResultByUserAndDept(Long deptId,Long userId){
+        WxOrderBo bo = new WxOrderBo();
+        bo.setUserId(userId);
+        bo.setDeptId(deptId);
+
+        List<WxOrderVo> vos = wxOrderService.queryList(bo);
+        if(CollectionUtil.isEmpty(vos)){
+            return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND,
+                                        MessageFormat.format("无对应的支付订单,部门Id:{0},人员Id:{1}", deptId, userId));
+        }
+        String errMsg = String.format("[支付结果查询]-[deptId:%s,userId:%s]-[订单尚未支付成功]", deptId, userId);
+        WxOrderVo vo = vos.stream().filter(p-> ObjectUtil.equals(p.getCreditStatus(),"Y")).findFirst()
+                           .orElseThrow(() -> new ApiException(errMsg));
+
+       return ReturnResult.success(YcVoConvert.ycWxOrderConvert(vo));
+    }
+
+    /**
+     * 根据第三方订单号查询订单入账结果
+     * @param orderSn 订单号
+     * @return 入账结果
+     */
+    public ReturnResult getCreditBackByOrderSn(String orderSn){
+        XfCreditAccountBackBo bo = new XfCreditAccountBackBo();
+        bo.setOriginalId(orderSn);
+        List<XfCreditAccountBackVo> vos = creditAccountBackService.queryList(bo);
+        if(CollectionUtil.isEmpty(vos)){
+            return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND);
+        }
+        if (ObjectUtil.notEqual((vos.get(0).getCreditStatus()), CreditStatusEnum.SUCCESS.code())) {
+            return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND);
+        }
+        return ReturnResult.success();
+    }
+    /**
+     *  请求生成微信收款二维码
+     * @param creditType 交易类型
+     * @param userId 人员Id
+     * @param userXm 人员姓名
+     * @param deptId 部门Id
+     * @param deptName 部门名称
+     * @param mobile 手机号
+     * @param dealValue 充值金额
+     * @param callBackUrl 回调地址
+     * @return 二维码
+     */
     private ReturnResult createQrCode(CreditTypeEnum creditType, String userId, String userXm, String deptId, String deptName, String mobile, BigDecimal dealValue, String callBackUrl){
         String sendUrl = payApi + "?title=" + CreditTypeEnum.WECHAT_RECHARGE.message() + "&userId=" + userId
                              + "&name=" + userXm

+ 4 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfCreditAccountBackVo.java

@@ -1,16 +1,15 @@
 package org.dromara.backstage.consumption.domain.vo;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
-import org.dromara.backstage.consumption.domain.XfCreditAccountBack;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.backstage.consumption.domain.XfCreditAccountBack;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 
 /**
@@ -127,7 +126,7 @@ public class XfCreditAccountBackVo implements Serializable {
      * 交易状态
      */
     @ExcelProperty(value = "交易状态")
-    private Long creditStatus;
+    private Integer creditStatus;
 
     /**
      * 团充Id

+ 8 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/controller/self/SelfController.java

@@ -4,6 +4,8 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.business.self.SelfBusiness;
 import org.dromara.common.core.api.ResponseResult;
+import org.dromara.common.core.api.ReturnResult;
+import org.dromara.common.core.enums.ResultCodeEnum;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Map;
@@ -26,6 +28,7 @@ public class SelfController {
 
     /**
      * 发送手机短信
+     *
      * @param mapSendInfo 发送信息
      */
     @PostMapping(value = "/api/v1/sendSms")
@@ -36,11 +39,11 @@ public class SelfController {
         selfBusiness.sendSms(mobile, message);
     }
 
-    @GetMapping("api/v1/wechat/result/{deptId}/{userId}")
-    public boolean queryWxPayResult(@PathVariable("deptId") String deptId,@PathVariable("userId") String userId) {
-        // WxPayDetail getData = selfBusiness.getIsPayByDeptIdAndUserId(deptId,userId);
-        // return getData.isPayStatus();
+    @GetMapping("/api/v1/wechat/result/{deptId}/{userId}")
+    public ReturnResult queryWxPayResult(@PathVariable("deptId") String deptId, @PathVariable("userId") String userId) {
+        ReturnResult result = selfBusiness.queryPayResultByUserAndDept(Long.parseLong(deptId), Long.parseLong(userId));
+        return result.isSuccess() ? ReturnResult.success(true) : ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND,false);
 
-        return true;
     }
+
 }

+ 20 - 13
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/controller/self/TeacherController.java

@@ -19,7 +19,6 @@ import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
 import java.text.MessageFormat;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -97,11 +96,17 @@ public class TeacherController {
         return ReturnResult.success(mapReturn);
     }
 
+    /**
+     * 微信充值入账
+     * @param userId 人员Id
+     * @param dealValue 充值金额
+     * @param workStationNumb 工作站编号
+     * @param orderSn 微信订单号
+     * @return 入账结果
+     */
     @GetMapping("/recharge/{userId}/{dealValue}/{workStationNumb}/{orderSn}")
     public boolean wechatRecharge(@PathVariable("userId") String userId,@PathVariable("dealValue") BigDecimal dealValue
         , @PathVariable("workStationNumb") int workStationNumb, @PathVariable("orderSn") String orderSn) {
-//        String callBackUrl = rechargeBackUrl + "/teacher/api/v1/recharge/" + cardNo + "/" + userId + "/" + bagCode + "/" + dealValue + "/" + workStationNumb + "/";
-        Date transDateTime = new Date();
         // 收支类型
         CreditTypeEnum creditType = CreditTypeEnum.RECHARGE;
         // 支付方式
@@ -111,27 +116,29 @@ public class TeacherController {
         PurseInOutBo bo = new PurseInOutBo();
         bo.setUserId(Long.valueOf(userId));
         bo.setBagCode("1");
-        // bo.setBalance();
         bo.setPayStyle(payStyle.code().toString());
         bo.setTakeCommission("N");
         bo.setReceiptMoney(dealValue);
         bo.setOperationMode(updateType);
         bo.setCreditType(creditType);
-        // bo.setCardId();
-        // bo.setCardTypeId();
-        // bo.setTermNo();
-        // bo.setTermRecordId();
         bo.setStationId((long) workStationNumb);
-        // bo.setOperatorId();
-        // bo.setOperatorName();
         bo.setUseType(SystemUseTypeEnum.CONSUME);
-        // bo.setOriginalId();
-        // bo.setCreditId();
         bo.setCustomerSn(orderSn);
-        // bo.setPayeeSn();
 
         R<PurseInOutBo> result = payOrderBusiness.recharge(bo);
 
         return R.isSuccess(result);
     }
+
+    /**
+     * 查询微信充值入账结果
+     * @param queryMap 查询条件
+     * @return 入账结果
+     */
+    @PostMapping("/api/v1/wechat/recharge/result")
+    public ReturnResult queryWxRechargeResult(@RequestBody Map<String, String> queryMap) {
+        String orderSn = queryMap.get("orderSn");
+        return selfBusiness.getCreditBackByOrderSn(orderSn);
+
+    }
 }

+ 60 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/convert/YcVoConvert.java

@@ -8,6 +8,7 @@ import org.dromara.backstage.domain.vo.card.PtCardVo;
 import org.dromara.backstage.domain.vo.yc.*;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.domain.vo.WxOrderVo;
 import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.enums.CardStatusEnum;
 import org.dromara.common.core.enums.UserAccountStatusEnum;
@@ -26,6 +27,12 @@ import java.util.List;
  * @since jdk17
  */
 public class YcVoConvert {
+    /**
+     * 一卡通卡信息转换
+     *
+     * @param vo 一卡通卡信息
+     * @return 转换结果
+     */
     public static YcCardVo cardVoConvert(PtCardVo vo) {
         YcCardVo cardVo = new YcCardVo();
         cardVo.setCardId(vo.getCardId().toString());
@@ -41,14 +48,20 @@ public class YcVoConvert {
         cardVo.setMainDeputyTypeName(ObjectUtil.equals(vo.getMainCard(), "Y") ? "主卡" : "副卡");
         cardVo.setVersion(0);
         cardVo.setCardTypeName(vo.getCardTypeName());
-        cardVo.setDeposit(ObjectUtil.equals(vo.getDeposit(),null) ? BigDecimal.ZERO : vo.getDeposit());
-        cardVo.setIssueFee(ObjectUtil.equals(vo.getProductCost(),null) ? BigDecimal.ZERO : vo.getProductCost());
-        cardVo.setCommissionCharge(ObjectUtil.equals(vo.getCommissionCharge(),null) ? BigDecimal.ZERO : vo.getCommissionCharge());
-        cardVo.setZheJiuFee(ObjectUtil.equals(vo.getDepreciation(),null) ? BigDecimal.ZERO : vo.getDepreciation());
+        cardVo.setDeposit(ObjectUtil.equals(vo.getDeposit(), null) ? BigDecimal.ZERO : vo.getDeposit());
+        cardVo.setIssueFee(ObjectUtil.equals(vo.getProductCost(), null) ? BigDecimal.ZERO : vo.getProductCost());
+        cardVo.setCommissionCharge(ObjectUtil.equals(vo.getCommissionCharge(), null) ? BigDecimal.ZERO : vo.getCommissionCharge());
+        cardVo.setZheJiuFee(ObjectUtil.equals(vo.getDepreciation(), null) ? BigDecimal.ZERO : vo.getDepreciation());
 
         return cardVo;
     }
 
+    /**
+     * 一卡通账户信息转换
+     *
+     * @param vo 一卡通账户信息
+     * @return 转换结果
+     */
     public static YcUserVo YcUserConvert(PtUserAccountVo vo) {
         YcUserVo userVo = new YcUserVo();
         userVo.setUserId(vo.getUserId().toString());
@@ -73,6 +86,12 @@ public class YcVoConvert {
         return userVo;
     }
 
+    /**
+     * 一卡通钱包信息转换
+     *
+     * @param vo 一卡通钱包信息
+     * @return 转换结果
+     */
     public static YcBagVo ycBagVoConvert(PtBagVo vo) {
         YcBagVo bagVo = new YcBagVo();
         bagVo.setCardBagId(vo.getBagId());
@@ -86,6 +105,12 @@ public class YcVoConvert {
         return bagVo;
     }
 
+    /**
+     * 一卡通卡片初始化数据转换
+     *
+     * @param vo 一卡通卡片数据
+     * @return 转换结果
+     */
     public static YcInitCardVo initCardVoCovert(InitCardVo vo) {
         YcInitCardVo ycInitCardVo = new YcInitCardVo();
 
@@ -100,6 +125,12 @@ public class YcVoConvert {
         return ycInitCardVo;
     }
 
+    /**
+     * 一卡通账户信息转换
+     *
+     * @param vo 账户信息
+     * @return 转换结果
+     */
     public static YcUserAccount ycUserAccountConvert(AccountInfoVo vo) {
         YcUserAccount ycUserAccount = new YcUserAccount();
         ycUserAccount.setUserBase(YcUserConvert(vo.getAccountBase()));
@@ -118,4 +149,29 @@ public class YcVoConvert {
 
         return ycUserAccount;
     }
+
+    public static ycWxOrder ycWxOrderConvert(WxOrderVo vo) {
+        ycWxOrder ycWxOrder = new ycWxOrder();
+        ycWxOrder.setCustSn(vo.getOrderId().toString());
+        ycWxOrder.setBankSn(vo.getPaySn());
+        ycWxOrder.setDealType(vo.getCreditType());
+        ycWxOrder.setAmount(vo.getReceiptMoney());
+        ycWxOrder.setPayStatus(ObjectUtil.equals(vo.getCreditStatus(), "Y") ? Boolean.TRUE : Boolean.FALSE);
+        ycWxOrder.setName(vo.getRealName());
+        ycWxOrder.setDeptName(vo.getDeptName());
+        ycWxOrder.setMobile(vo.getPhone());
+        ycWxOrder.setTitle(vo.getTitle());
+        ycWxOrder.setCallBackUrl(vo.getBackUrl());
+        ycWxOrder.setPayTime(vo.getCreditTime());
+        // ycWxOrder.setCreateTime();
+        // ycWxOrder.setCreateUser(vo.getcrea);
+        ycWxOrder.setIsDelete(0);
+        ycWxOrder.setOrderIndex(0);
+        // ycWxOrder.setUpdateTime();
+        // ycWxOrder.setUpdateUser();
+        ycWxOrder.setUserId(vo.getUserId().toString());
+        ycWxOrder.setDeptId(vo.getDeptId().toString());
+
+        return ycWxOrder;
+    }
 }

+ 59 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/vo/yc/ycWxOrder.java

@@ -0,0 +1,59 @@
+package org.dromara.backstage.domain.vo.yc;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @ClassName ycWxOrder
+ * @Description TODO
+ * @Author luoyibo
+ * @Date 2024-11-13 21:16
+ * @Version 1.0
+ * @since jdk17
+ */
+@Data
+@Accessors(chain = true)
+public class ycWxOrder implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4013490176171779108L;
+    private String custSn;
+    // 微信订单号
+    private String bankSn;
+    // 圈存类型(学员缴费,微信充值)
+    private String dealType;
+    // 支付金额
+    private BigDecimal amount;
+    // 支付状态
+    private boolean payStatus;
+    // 姓名
+    private String name;
+    // 部门名称
+    private String deptName;
+    // 手机号
+    private String mobile;
+    // 支付时显示的标题
+    private String title;
+    // 回调地址
+    private String callBackUrl;
+    //支付时间
+    private Date payTime;
+    // 创建时间
+    private Date createTime;
+    // 创建者
+    private String createUser;
+    // 逻辑删除标志 0-未删除 1-已删除
+    private Integer isDelete;
+    // 排序号
+    private Integer orderIndex;
+    // 更新时间
+    private Date updateTime;
+    // 更新者
+    private String updateUser;
+    private String userId;
+    private String deptId;
+}

+ 7 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/WxOrder.java

@@ -1,13 +1,15 @@
 package org.dromara.backstage.payment.domain;
 
-import org.dromara.common.tenant.core.TenantEntity;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 微信支付订单对象 t_wx_order
@@ -52,7 +54,7 @@ public class WxOrder extends TenantEntity {
     /**
      * 交易金额
      */
-    private Long receiptMoney;
+    private BigDecimal receiptMoney;
 
     /**
      * 交易状态,见 sys_yes_no字典类别

+ 9 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/WxOrderBo.java

@@ -1,15 +1,17 @@
 package org.dromara.backstage.payment.domain.bo;
 
-import org.dromara.backstage.payment.domain.WxOrder;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
+import org.dromara.backstage.payment.domain.WxOrder;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 
 /**
  * 微信支付订单业务对象 t_wx_order
@@ -56,7 +58,7 @@ public class WxOrderBo extends BaseEntity {
      * 交易金额
      */
     @NotNull(message = "交易金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long receiptMoney;
+    private BigDecimal receiptMoney;
 
     /**
      * 交易状态,见 sys_yes_no字典类别

+ 3 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/vo/WxOrderVo.java

@@ -1,17 +1,14 @@
 package org.dromara.backstage.payment.domain.vo;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.dromara.backstage.payment.domain.WxOrder;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.backstage.payment.domain.WxOrder;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 
@@ -64,7 +61,7 @@ public class WxOrderVo implements Serializable {
      * 交易金额
      */
     @ExcelProperty(value = "交易金额")
-    private Long receiptMoney;
+    private BigDecimal receiptMoney;
 
     /**
      * 交易状态,见 sys_yes_no字典类别