Kaynağa Gözat

feat: 用户充值接口

xdd 3 hafta önce
ebeveyn
işleme
be62e8d0ae

+ 3 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -37,6 +37,9 @@ public interface FsUserMapper
      */
     public FsUser selectFsUserByUserId(Long userId);
 
+    @Select("select * from fs_user where user_id=#{userId}")
+    public FsUser selectFsUserByUserIdForUpdate(@Param("userId") Long userId);
+
     /**
      * 查询用户列表
      *

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -45,6 +45,8 @@ public interface IFsUserService
      */
     public FsUser selectFsUserByUserId(Long userId);
 
+    public FsUser selectFsUserByUserIdForUpdate(Long userId);
+
     /**
      * 查询用户列表
      *

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -177,6 +177,11 @@ public class FsUserServiceImpl implements IFsUserService
         return fsUserMapper.selectFsUserByUserId(userId);
     }
 
+    @Override
+    public FsUser selectFsUserByUserIdForUpdate(Long userId) {
+        return fsUserMapper.selectFsUserByUserIdForUpdate(userId);
+    }
+
     /**
      * 查询用户列表
      *

+ 136 - 0
fs-service/src/main/java/com/fs/recharge/domain/FsUserRechargeRecord.java

@@ -0,0 +1,136 @@
+package com.fs.recharge.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户充值记录实体类
+ */
+@Data
+@TableName("fs_user_recharge_record")
+public class FsUserRechargeRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 充值记录ID
+     */
+    @TableId(value = "recharge_id", type = IdType.AUTO)
+    private Long rechargeId;
+
+    /**
+     * 充值订单号
+     */
+    private String rechargeCode;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 充值模板ID
+     */
+    private Long templateId;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal rechargeAmount;
+
+    /**
+     * 赠送金额
+     */
+    private BigDecimal bonusAmount;
+
+    /**
+     * 总金额(充值金额+赠送金额)
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 状态:0-待支付,1-已支付,2-已取消
+     */
+    private Integer status;
+
+    /**
+     * 支付时间
+     */
+    private Date payTime;
+
+    /**
+     * 交易ID
+     */
+    private String transactionId;
+
+    /**
+     * 支付类型
+     */
+    private String payType;
+
+    /**
+     * 支付方式:weixin-微信支付,alipay-支付宝,balance-余额支付
+     */
+    private String payMode;
+
+    /**
+     * 关联优惠券ID列表
+     */
+    private String couponIds;
+
+    /**
+     * 用户OpenID
+     */
+    private String openId;
+
+    /**
+     * 第三方支付交易号
+     */
+    private String tradeNo;
+
+    /**
+     * 预支付ID
+     */
+    private String prepayId;
+
+    /**
+     * 支付参数JSON
+     */
+    private String payParams;
+
+    /**
+     * 支付回调地址
+     */
+    private String notifyUrl;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 公司ID
+     */
+    private Long companyId;
+
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+}

+ 55 - 0
fs-service/src/main/java/com/fs/recharge/mapper/FsUserRechargeRecordMapper.java

@@ -0,0 +1,55 @@
+package com.fs.recharge.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.recharge.domain.FsUserRechargeRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 用户充值记录Mapper接口
+ */
+@Mapper
+public interface FsUserRechargeRecordMapper extends BaseMapper<FsUserRechargeRecord> {
+
+    /**
+     * 根据充值订单号查询充值记录
+     *
+     * @param rechargeCode 充值订单号
+     * @return 充值记录
+     */
+    @Select("SELECT * FROM fs_user_recharge_record WHERE recharge_code = #{rechargeCode}")
+    FsUserRechargeRecord selectByRechargeCode(@Param("rechargeCode") String rechargeCode);
+
+    /**
+     * 更新充值记录状态
+     *
+     * @param rechargeId 充值记录ID
+     * @param status 状态
+     * @return 影响行数
+     */
+    @Update("UPDATE fs_user_recharge_record SET status = #{status}, update_time = NOW() WHERE recharge_id = #{rechargeId}")
+    int updateStatus(@Param("rechargeId") Long rechargeId, @Param("status") Integer status);
+
+    /**
+     * 查询用户充值记录列表
+     *
+     * @param userId 用户ID
+     * @return 充值记录列表
+     */
+    @Select("SELECT * FROM fs_user_recharge_record WHERE user_id = #{userId} ORDER BY create_time DESC")
+    List<FsUserRechargeRecord> selectByUserId(@Param("userId") Long userId);
+
+    /**
+     * 统计用户购买某充值模板的次数
+     *
+     * @param userId 用户ID
+     * @param templateId 模板ID
+     * @return 购买次数
+     */
+    @Select("SELECT COUNT(*) FROM fs_user_recharge_record WHERE user_id = #{userId} AND template_id = #{templateId} AND status = 1")
+    int countUserPurchaseByTemplateId(@Param("userId") Long userId, @Param("templateId") Long templateId);
+}

+ 17 - 0
fs-service/src/main/java/com/fs/recharge/param/RechargeParam.java

@@ -0,0 +1,17 @@
+package com.fs.recharge.param;
+
+import lombok.Data;
+
+@Data
+public class RechargeParam {
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 充值模板ID
+     */
+    private Long templateId;
+}

+ 79 - 0
fs-service/src/main/java/com/fs/recharge/service/FsUserRechargeRecordService.java

@@ -0,0 +1,79 @@
+package com.fs.recharge.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.recharge.domain.FsUserRechargeRecord;
+
+import java.util.List;
+
+/**
+ * 用户充值记录服务接口
+ */
+public interface FsUserRechargeRecordService extends IService<FsUserRechargeRecord> {
+
+    /**
+     * 新增充值记录
+     *
+     * @param record 充值记录
+     * @return 结果
+     */
+    int insertRechargeRecord(FsUserRechargeRecord record);
+
+    /**
+     * 更新充值记录
+     *
+     * @param record 充值记录
+     * @return 结果
+     */
+    int updateRechargeRecord(FsUserRechargeRecord record);
+
+    /**
+     * 根据充值订单号查询充值记录
+     *
+     * @param rechargeCode 充值订单号
+     * @return 充值记录
+     */
+    FsUserRechargeRecord selectRechargeRecordByCode(String rechargeCode);
+
+    /**
+     * 根据ID查询充值记录
+     *
+     * @param rechargeId 充值记录ID
+     * @return 充值记录
+     */
+    FsUserRechargeRecord selectRechargeRecordById(Long rechargeId);
+
+    /**
+     * 查询用户充值记录列表
+     *
+     * @param userId 用户ID
+     * @return 充值记录列表
+     */
+    List<FsUserRechargeRecord> selectUserRechargeRecordList(Long userId);
+
+    /**
+     * 统计用户购买某充值模板的次数
+     *
+     * @param userId 用户ID
+     * @param templateId 模板ID
+     * @return 购买次数
+     */
+    int countUserPurchaseByTemplateId(Long userId, Long templateId);
+
+    /**
+     * 取消充值订单
+     *
+     * @param rechargeId 充值记录ID
+     * @return 结果
+     */
+    int cancelRechargeRecord(Long rechargeId);
+
+    /**
+     * 完成充值订单
+     *
+     * @param rechargeId 充值记录ID
+     * @param transactionId 交易ID
+     * @param payType 支付类型
+     * @return 结果
+     */
+    int completeRechargeRecord(Long rechargeId, String transactionId, String payType);
+}

+ 17 - 0
fs-service/src/main/java/com/fs/recharge/service/RechargeTemplateService.java

@@ -1,7 +1,9 @@
 package com.fs.recharge.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
 import com.fs.recharge.domain.RechargeTemplate;
+import com.fs.recharge.param.RechargeParam;
 import com.fs.recharge.vo.RechargeTemplateVO;
 
 import java.util.List;
@@ -46,4 +48,19 @@ public interface RechargeTemplateService extends IService<RechargeTemplate> {
      * @return 充值模板详情
      */
     RechargeTemplateVO getTemplateDetail(Long id);
+
+    /**
+     * 用户充值
+     * @param param
+     * @return R
+     */
+    R payment(RechargeParam param);
+
+    /**
+     * 获取用户购买次数限制
+     * @param userId 用户id
+     * @param id 模板id
+     * @return 次数
+     */
+    Long countUserPurchaseByTemplateId(Long userId, Long id);
 }

+ 66 - 0
fs-service/src/main/java/com/fs/recharge/service/impl/FsUserRechargeRecordServiceImpl.java

@@ -0,0 +1,66 @@
+package com.fs.recharge.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.recharge.domain.FsUserRechargeRecord;
+import com.fs.recharge.mapper.FsUserRechargeRecordMapper;
+import com.fs.recharge.service.FsUserRechargeRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户充值记录服务实现类
+ */
+@Service
+public class FsUserRechargeRecordServiceImpl extends ServiceImpl<FsUserRechargeRecordMapper, FsUserRechargeRecord> implements FsUserRechargeRecordService {
+
+    @Override
+    public int insertRechargeRecord(FsUserRechargeRecord record) {
+        record.setCreateTime(new Date());
+        return baseMapper.insert(record);
+    }
+
+    @Override
+    public int updateRechargeRecord(FsUserRechargeRecord record) {
+        record.setUpdateTime(new Date());
+        return baseMapper.updateById(record);
+    }
+
+    @Override
+    public FsUserRechargeRecord selectRechargeRecordByCode(String rechargeCode) {
+        return baseMapper.selectByRechargeCode(rechargeCode);
+    }
+
+    @Override
+    public FsUserRechargeRecord selectRechargeRecordById(Long rechargeId) {
+        return baseMapper.selectById(rechargeId);
+    }
+
+    @Override
+    public List<FsUserRechargeRecord> selectUserRechargeRecordList(Long userId) {
+        return baseMapper.selectByUserId(userId);
+    }
+
+    @Override
+    public int countUserPurchaseByTemplateId(Long userId, Long templateId) {
+        return baseMapper.countUserPurchaseByTemplateId(userId, templateId);
+    }
+
+    @Override
+    public int cancelRechargeRecord(Long rechargeId) {
+        return baseMapper.updateStatus(rechargeId, 2);
+    }
+
+    @Override
+    public int completeRechargeRecord(Long rechargeId, String transactionId, String payType) {
+        FsUserRechargeRecord record = new FsUserRechargeRecord();
+        record.setRechargeId(rechargeId);
+        record.setStatus(1);
+        record.setPayTime(new Date());
+        record.setTransactionId(transactionId);
+        record.setPayType(payType);
+        record.setUpdateTime(new Date());
+        return baseMapper.updateById(record);
+    }
+}

+ 243 - 3
fs-service/src/main/java/com/fs/recharge/service/impl/RechargeTemplateServiceImpl.java

@@ -1,21 +1,60 @@
 package com.fs.recharge.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.core.domain.R;
+import com.fs.common.exception.CustomException;
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.ip.IpUtils;
+import com.fs.core.utils.OrderCodeUtils;
+import com.fs.his.domain.FsPayConfig;
+import com.fs.his.domain.FsStoreOrder;
+import com.fs.his.domain.FsStorePayment;
+import com.fs.his.domain.FsUser;
+import com.fs.his.dto.PayConfigDTO;
+import com.fs.his.enums.FsStoreOrderStatusEnum;
+import com.fs.his.param.FsCouponReceiveParam;
+import com.fs.his.param.FsStoreOrderDoPayParam;
+import com.fs.his.service.IFsCouponService;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.utils.PhoneUtil;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.service.HuiFuService;
+import com.fs.recharge.domain.FsUserRechargeRecord;
 import com.fs.recharge.domain.RechargeTemplate;
 import com.fs.recharge.mapper.RechargeTemplateMapper;
+import com.fs.recharge.param.RechargeParam;
+import com.fs.recharge.service.FsUserRechargeRecordService;
 import com.fs.recharge.service.RechargeTemplateService;
 import com.fs.recharge.vo.RechargeTemplateVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
+import com.fs.tzBankPay.doman.PayCreateOrder;
+import com.fs.tzBankPay.doman.PayCreateOrderResult;
+import com.fs.tzBankPay.doman.TzBankResult;
+import com.fs.ybPay.domain.CreateWxOrderResult;
+import com.fs.ybPay.dto.WxJspayDTO;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.google.gson.Gson;
+import jodd.util.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -82,6 +121,207 @@ public class RechargeTemplateServiceImpl extends ServiceImpl<RechargeTemplateMap
         return convertToVO(template);
     }
 
+
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private IFsUserService fsUserService;
+
+    @Autowired
+    private RechargeTemplateService rechargeTemplateService;
+
+    @Autowired
+    private HuiFuService huiFuService;
+
+    @Autowired
+    private FsUserRechargeRecordService fsUserRechargeRecordService;
+
+    @Override
+    public R payment(RechargeParam param) {
+
+        // 1. 验证充值参数
+        if (param.getTemplateId() == null) {
+            return R.error("请选择充值模板");
+        }
+        if (param.getUserId() == null) {
+            return R.error("用户ID不能为空");
+        }
+        // 2. 获取充值模板
+        RechargeTemplate template = this.getById(param.getTemplateId());
+        if (template == null) {
+            return R.error("充值模板不存在");
+        }
+        // 3. 验证模板状态
+        if (template.getStatus() != 1) {
+            return R.error("充值模板已下线");
+        }
+        // 4. 验证模板有效期
+        LocalDateTime now = LocalDateTime.now();
+        if (template.getStartTime() != null && now.isBefore(template.getStartTime())) {
+            return R.error("充值模板未生效");
+        }
+        if (template.getEndTime() != null && now.isAfter(template.getEndTime())) {
+            return R.error("充值模板已过期");
+        }
+        // 5. 验证用户类型限制
+        FsUser user = fsUserService.selectFsUserByUserId(param.getUserId());
+        if (user == null) {
+            return R.error("用户不存在");
+        }
+
+        // 6. 验证购买次数限制
+        if (template.getPurchaseLimit() > 0) {
+            Long purchaseCount = this.countUserPurchaseByTemplateId(user.getUserId(), template.getId());
+            if (purchaseCount >= template.getPurchaseLimit()) {
+                return R.error("您已达到该充值模板的购买次数上限");
+            }
+        }
+        // 7. 生成充值订单
+        String rechargeCode = OrderCodeUtils.getOrderSn();
+        if (StringUtils.isEmpty(rechargeCode)) {
+            return R.error("订单生成失败,请重试");
+        }
+        // 8. 创建充值记录
+        FsUserRechargeRecord rechargeRecord = new FsUserRechargeRecord();
+        rechargeRecord.setRechargeCode(rechargeCode);
+        rechargeRecord.setUserId(user.getUserId());
+        rechargeRecord.setTemplateId(template.getId());
+        rechargeRecord.setRechargeAmount(template.getRechargeAmount());
+        rechargeRecord.setBonusAmount(template.getBonusAmount());
+        rechargeRecord.setTotalAmount(template.getRechargeAmount().add(template.getBonusAmount()));
+        rechargeRecord.setStatus(0); // 0-待支付
+        rechargeRecord.setCouponIds(template.getCouponIds());
+        rechargeRecord.setCreateTime(new Date());
+        rechargeRecord.setCompanyId(user.getCompanyId());
+
+        // 9. 判断是否需要支付
+        if (template.getRechargeAmount().compareTo(new BigDecimal(0)) == 0) {
+            // 免费充值,直接完成
+            rechargeRecord.setStatus(1);
+            rechargeRecord.setPayTime(new Date());
+            rechargeRecord.setPayMode("free");
+            rechargeRecord.setRemark("免费充值");
+
+            if (fsUserRechargeRecordService.insertRechargeRecord(rechargeRecord) <= 0) {
+                return R.error("充值订单创建失败");
+            }
+
+            // 处理充值完成逻辑
+            this.processRechargeSuccess(rechargeRecord);
+
+            return R.ok().put("data", rechargeRecord.getRechargeId()).put("isPay", "1");
+        } else {
+            // 10. 在线支付
+            if (StringUtil.isNotBlank(user.getMaOpenId())) {
+                String json = configService.selectConfigByKey("his.pay");
+                PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
+
+                rechargeRecord.setOpenId(user.getMaOpenId());
+                rechargeRecord.setPayMode(payConfigDTO.getType());
+
+                if (fsUserRechargeRecordService.insertRechargeRecord(rechargeRecord) <= 0) {
+                    return R.error("充值订单创建失败");
+                }
+
+                // 11. 根据支付方式创建支付订单
+                if ("hf".equals(payConfigDTO.getType())) {
+                    // 汇付支付
+                    return createHuifuPayOrder(rechargeRecord, user);
+                }
+            } else {
+                return R.error("用户未绑定微信,无法完成支付");
+            }
+        }
+        return R.error("支付创建失败");
+    }
+
+
+    @Autowired
+    private IFsCouponService fsCouponService;
+
+    /**
+     * 处理充值成功逻辑
+     */
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    public void processRechargeSuccess(FsUserRechargeRecord rechargeRecord) {
+        try {
+            // 1. 查询充值模板
+            RechargeTemplate template = rechargeTemplateService.getById(rechargeRecord.getTemplateId());
+            if (template == null) {
+                log.error("充值模板不存在,templateId={}", rechargeRecord.getTemplateId());
+                throw new RuntimeException("充值模板不存在");
+            }
+            // 2. 增加用户余额
+            FsUser user = fsUserService.selectFsUserByUserIdForUpdate(rechargeRecord.getUserId());
+            BigDecimal totalAmount = rechargeRecord.getRechargeAmount().add(rechargeRecord.getBonusAmount());
+            BigDecimal money = user.getMoney();
+            if(ObjectUtils.isNull(money)) {
+                money = BigDecimal.ZERO;
+            }
+            user.setMoney(money.add(totalAmount));
+
+            // 3. 发放优惠券
+            if (StringUtil.isNotEmpty(template.getCouponIds())) {
+                String[] couponIds = template.getCouponIds().split(",");
+                for (String couponId : couponIds) {
+                    try {
+                        Long cId = Long.parseLong(couponId);
+
+                        FsCouponReceiveParam param = new FsCouponReceiveParam();
+                        param.setCouponId(cId);
+                        param.setUserId(rechargeRecord.getUserId());
+                        param.setCompanyId(user.getCompanyId());
+                        param.setCompanyUserId(user.getCompanyUserId());
+                        fsCouponService.receive(param);
+                    } catch (Exception e) {
+                        log.error("发放优惠券失败,couponId={}, userId={}", couponId, rechargeRecord.getUserId(), e);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("处理充值成功逻辑失败", e);
+            throw new RuntimeException("处理充值成功逻辑失败", e);
+        }
+    }
+
+    /**
+     * 创建汇付支付订单
+     */
+    private R createHuifuPayOrder(FsUserRechargeRecord rechargeRecord, FsUser user) {
+        try {
+            HuiFuCreateOrder order = new HuiFuCreateOrder();
+            order.setTradeType("T_MINIAPP");
+            order.setOpenid(user.getMaOpenId());
+            order.setReqSeqId("recharge-" + rechargeRecord.getRechargeCode());
+            order.setTransAmt(rechargeRecord.getRechargeAmount().toString());
+            order.setGoodsDesc("账户充值");
+
+            HuifuCreateOrderResult result = huiFuService.createOrder(order);
+            if (result != null && StringUtil.isNotEmpty(result.getHf_seq_id())) {
+                // 更新充值记录
+                FsUserRechargeRecord updateRecord = new FsUserRechargeRecord();
+                updateRecord.setRechargeId(rechargeRecord.getRechargeId());
+                updateRecord.setTradeNo(result.getHf_seq_id());
+                updateRecord.setPayParams(JSONUtil.toJsonStr(result));
+                updateRecord.setUpdateTime(new Date());
+                fsUserRechargeRecordService.updateRechargeRecord(updateRecord);
+
+                return R.ok().put("isPay", 0).put("data", result).put("type", "hf");
+            } else {
+                return R.error("支付创建失败");
+            }
+        } catch (Exception e) {
+            log.error("创建汇付支付订单失败", e);
+            return R.error("支付创建失败:" + e.getMessage());
+        }
+    }
+
+
+    @Override
+    public Long countUserPurchaseByTemplateId(Long userId, Long id) {
+        return 0L;
+    }
+
     /**
      * 将实体对象转换为VO对象
      */

+ 76 - 0
fs-service/src/main/java/com/fs/recharge/vo/UserRechargeRecordVO.java

@@ -0,0 +1,76 @@
+package com.fs.recharge.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户充值记录VO对象
+ */
+@Data
+public class UserRechargeRecordVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 充值记录ID
+     */
+    private Long rechargeId;
+
+    /**
+     * 充值订单号
+     */
+    private String rechargeCode;
+
+    /**
+     * 充值模板名称
+     */
+    private String templateName;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal rechargeAmount;
+
+    /**
+     * 赠送金额
+     */
+    private BigDecimal bonusAmount;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 状态:0-待支付,1-已支付,2-已取消
+     */
+    private Integer status;
+
+    /**
+     * 状态文本
+     */
+    private String statusText;
+
+    /**
+     * 支付时间
+     */
+    private Date payTime;
+
+    /**
+     * 支付方式
+     */
+    private String payMode;
+
+    /**
+     * 支付方式文本
+     */
+    private String payModeText;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}

+ 11 - 1
fs-user-app/src/main/java/com/fs/app/controller/RechargeTemplateController.java

@@ -2,6 +2,7 @@ package com.fs.app.controller;
 
 import com.fs.common.core.domain.R;
 import com.fs.recharge.domain.RechargeTemplate;
+import com.fs.recharge.param.RechargeParam;
 import com.fs.recharge.service.RechargeTemplateService;
 import com.fs.recharge.vo.RechargeTemplateVO;
 import io.swagger.annotations.Api;
@@ -19,7 +20,7 @@ import java.util.List;
 @Slf4j
 @Api(tags = "充值模板管理")
 @RestController
-@RequestMapping("/api/recharge-templates")
+@RequestMapping("/recharge-templates")
 public class RechargeTemplateController {
 
     @Autowired
@@ -29,6 +30,8 @@ public class RechargeTemplateController {
     @GetMapping("/list")
     public R getValidTemplates(
             @ApiParam(value = "用户类型", required = false) @RequestParam(required = false, defaultValue = "ALL") String userType) {
+        log.info("获取可用的充值模板列表 参数 userType: {}",userType);
+
         List<RechargeTemplateVO> templates = rechargeTemplateService.getValidTemplates(userType);
         return R.ok().put("data",templates);
     }
@@ -69,4 +72,11 @@ public class RechargeTemplateController {
         boolean success = rechargeTemplateService.updateStatus(id, status);
         return R.ok();
     }
+
+    @ApiOperation("用户支付")
+    @PostMapping("/payment")
+    public R payment(@RequestBody RechargeParam rechargeParam){
+        R payment = rechargeTemplateService.payment(rechargeParam);
+        return payment;
+    }
 }

+ 5 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/IndexScrmController.java

@@ -16,6 +16,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -120,7 +121,10 @@ public class IndexScrmController extends AppBaseController {
 		map.setIsDel(0);
 		map.setType(1);
 		List<FsStoreCanvasScrm> canvas=storeCanvasService.selectFsStoreCanvasList(map);
-		return R.ok().put("data", canvas.get(0));
+		if(CollectionUtils.isNotEmpty(canvas)) {
+			return R.ok().put("data", canvas.get(0));
+		}
+		return R.ok();
 	}