Browse Source

95:红德堂APP调试 积分+现金支付、付费课程订阅加积分

Long 1 day ago
parent
commit
39d36473f4
32 changed files with 930 additions and 50 deletions
  1. 1 0
      fs-common/src/main/java/com/fs/common/constant/FsConstants.java
  2. 18 0
      fs-redis/src/main/java/com/fs/app/redis/RedisKeyExpirationListener.java
  3. 12 0
      fs-redis/src/main/resources/application.yml
  4. 14 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java
  5. 2 1
      fs-service/src/main/java/com/fs/his/config/IntegralConfig.java
  6. 4 0
      fs-service/src/main/java/com/fs/his/domain/FsIntegralGoods.java
  7. 19 1
      fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java
  8. 15 0
      fs-service/src/main/java/com/fs/his/enums/BusinessTypeEnum.java
  9. 1 0
      fs-service/src/main/java/com/fs/his/enums/FsUserIntegralLogTypeEnum.java
  10. 15 0
      fs-service/src/main/java/com/fs/his/enums/PaymentMethodEnum.java
  11. 9 2
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralGoodsMapper.java
  12. 5 1
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderMapper.java
  13. 13 0
      fs-service/src/main/java/com/fs/his/param/FsIntegralOrderDoPayParam.java
  14. 18 0
      fs-service/src/main/java/com/fs/his/param/FsIntegralOrderParam.java
  15. 47 0
      fs-service/src/main/java/com/fs/his/param/PayOrderParam.java
  16. 17 0
      fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderService.java
  17. 8 0
      fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java
  18. 235 29
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java
  19. 343 4
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  20. 5 1
      fs-service/src/main/java/com/fs/his/service/impl/FsUserIntegralLogsServiceImpl.java
  21. 3 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralGoodsListUVO.java
  22. 4 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralGoodsListVO.java
  23. 13 1
      fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderListUVO.java
  24. 1 1
      fs-service/src/main/java/com/fs/tzBankPay/doman/PayCreateOrder.java
  25. 8 0
      fs-service/src/main/resources/db/20250721-积分加现金.sql
  26. 7 1
      fs-service/src/main/resources/mapper/his/FsIntegralGoodsMapper.xml
  27. 21 1
      fs-service/src/main/resources/mapper/his/FsIntegralOrderMapper.xml
  28. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java
  29. 46 2
      fs-user-app/src/main/java/com/fs/app/controller/IntegralController.java
  30. 7 0
      fs-user-app/src/main/java/com/fs/app/controller/TzPayController.java
  31. 6 4
      fs-user-app/src/main/java/com/fs/app/controller/WxPayController.java
  32. 7 0
      fs-user-app/src/main/java/com/fs/app/controller/YbPayController.java

+ 1 - 0
fs-common/src/main/java/com/fs/common/constant/FsConstants.java

@@ -10,4 +10,5 @@ public interface FsConstants {
     String REDIS_QW_appKey_Active = "qwActive:";
 
     String FRIEND_WELCOME_VIDEO_KEY = "friend:welcome:";
+    String REDIS_INTEGRAL_ORDER_UNPAY = "integral:order:unpay:";
 }

+ 18 - 0
fs-redis/src/main/java/com/fs/app/redis/RedisKeyExpirationListener.java

@@ -6,10 +6,12 @@ import com.fs.event.TemplateBean;
 import com.fs.event.TemplateEvent;
 import com.fs.event.TemplateListenEnum;
 import com.fs.his.domain.FsInquiryOrder;
+import com.fs.his.domain.FsIntegralOrder;
 import com.fs.his.domain.FsPackageOrder;
 import com.fs.his.param.FsInquiryOrderCancelParam;
 import com.fs.his.service.IFsInquiryOrderLogsService;
 import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.service.IFsIntegralOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -97,5 +99,21 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
             }
 
         }
+        // 积分订单
+        else if (key.contains(FsConstants.REDIS_INTEGRAL_ORDER_UNPAY)) {
+            key = key.replace(FsConstants.REDIS_INTEGRAL_ORDER_UNPAY, "");
+            log.info("body:{}",key);
+
+            Long orderId = Long.parseLong(key);
+            IFsIntegralOrderService orderService = SpringUtils.getBean(IFsIntegralOrderService.class);
+            FsIntegralOrder order = orderService.selectFsIntegralOrderByOrderId(orderId);
+            if (!order.getStatus().equals(4)){
+                return;
+            }
+
+            // 取消订单
+            orderService.cannelOrder(orderId);
+            log.info("积分订单id:{},超时未支付取消成功",orderId);
+        }
     }
 }

+ 12 - 0
fs-redis/src/main/resources/application.yml

@@ -0,0 +1,12 @@
+server:
+  # 服务器的HTTP端口,默认为8080
+  port: 18004
+# Spring配置
+spring:
+  profiles:
+    active: dev
+#    active: druid-hdt
+#    active: druid-yzt
+#    active: druid-sxjz
+#    active: druid-sft
+

+ 14 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java

@@ -23,14 +23,17 @@ import com.fs.course.vo.FsUserCourseOrderListUVO;
 import com.fs.his.domain.*;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.enums.FsPackageOrderStatusEnum;
+import com.fs.his.enums.FsUserIntegralLogTypeEnum;
 import com.fs.his.mapper.FsStorePaymentErrorMapper;
 import com.fs.his.mapper.FsStorePaymentMapper;
 import com.fs.his.mapper.FsUserIntegralLogsMapper;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.FsPackageOrderDoPayParam;
+import com.fs.his.param.FsUserAddIntegralTemplateParam;
 import com.fs.his.service.IFsCouponService;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.service.IFsUserCouponService;
+import com.fs.his.service.IFsUserIntegralLogsService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
@@ -123,7 +126,8 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
     private WxPayProperties wxPayProperties;
     @Autowired
     private TzBankService tzBankService;
-
+    @Autowired
+    private IFsUserIntegralLogsService userIntegralLogsService;
 
 
 
@@ -645,6 +649,15 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
                     fsUserCourseStudyLogMapper.insertFsUserCourseStudyLog(log);
                 }
             }
+
+            // 付费课程订阅
+            FsUserAddIntegralTemplateParam integralParam = new FsUserAddIntegralTemplateParam();
+            integralParam.setUserId(order.getUserId());
+            integralParam.setLogType(FsUserIntegralLogTypeEnum.TYPE_24.getValue());
+            integralParam.setBusinessId(order.getOrderId().toString());
+            integralParam.setPoints(order.getPayMoney().intValue());
+            userIntegralLogsService.addIntegralTemplate(integralParam);
+
             return R.ok();
         }catch (Exception e){
             logger.info("支付错误:"+e.getMessage());

+ 2 - 1
fs-service/src/main/java/com/fs/his/config/IntegralConfig.java

@@ -23,6 +23,7 @@ public class IntegralConfig implements Serializable {
     private Integer integralRegister;//完成手机号绑定注册
     private Integer integralFinishConsultation;//完成专家问诊
     private Integer integralFirstOrderPoint;//首次积分商城下单
-    private Integer IntegralAddPatient;//新用户完善就诊人获得积分
+    private Integer integralAddPatient;//新用户完善就诊人获得积分
     private Integer integralAddUserAddress;//新用户填写收货地址获取积分
+    private Integer integralSubscriptCourse;//付费课程订阅积分比例
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/domain/FsIntegralGoods.java

@@ -47,6 +47,10 @@ public class FsIntegralGoods extends BaseEntity
     @Excel(name = "所需积分")
     private Long integral;
 
+    /** 支付金额 */
+    @Excel(name = "支付金额")
+    private BigDecimal cash;
+
     /** 排序 */
     @Excel(name = "排序")
     private Long sort;

+ 19 - 1
fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java

@@ -5,6 +5,8 @@ import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -49,7 +51,23 @@ public class FsIntegralOrder extends BaseEntity
     @Excel(name = "支付积分")
     private String integral;
 
-    /** 1:待发货;2:待收货;3:已完成 */
+    /** 支付金额 */
+    @Excel(name = "支付金额")
+    private BigDecimal payMoney;
+
+    /** 是否支付 0未支付 1已支付 */
+    @Excel(name = "是否支付 0未支付 1已支付")
+    private Integer isPay;
+
+    /** 支付时间 */
+    @Excel(name = "支付时间")
+    private LocalDateTime payTime;
+
+    /** 支付类型 1积分 2现金 3积分+现金 */
+    @Excel(name = "支付类型 1积分 2现金 3积分+现金")
+    private Integer payType;
+
+    /** 1:待发货;2:待收货;3:已完成 4待支付 5取消 */
     @Excel(name = "状态",dictType="sys_integral_order_status")
     private Integer status;
     @Excel(name = "商品编号")

+ 15 - 0
fs-service/src/main/java/com/fs/his/enums/BusinessTypeEnum.java

@@ -0,0 +1,15 @@
+package com.fs.his.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum BusinessTypeEnum {
+    INTEGRAL_ORDER("integral", 6, "积分商城订单支付"),
+    ;
+
+    private final String prefix;
+    private final Integer code;
+    private final String desc;
+}

+ 1 - 0
fs-service/src/main/java/com/fs/his/enums/FsUserIntegralLogTypeEnum.java

@@ -31,6 +31,7 @@ public enum FsUserIntegralLogTypeEnum {
     TYPE_21(21,"首次完成专家咨询"),
     TYPE_22(22,"首次完成积分商城下单"),
     TYPE_23(23,"管理员添加"),
+    TYPE_24(24, "付费课程订阅"),
     ;
 
 

+ 15 - 0
fs-service/src/main/java/com/fs/his/enums/PaymentMethodEnum.java

@@ -0,0 +1,15 @@
+package com.fs.his.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum PaymentMethodEnum {
+    MINIAPP_WECHAT("weixin"), // 小程序微信支付
+    H5_WECHAT("微信"),      // H5微信支付
+    ALIPAY("alipay"),         // 支付宝支付
+    H5_ALIPAY("alipay");       // H5支付宝支付
+
+    private final String desc;
+}

+ 9 - 2
fs-service/src/main/java/com/fs/his/mapper/FsIntegralGoodsMapper.java

@@ -6,6 +6,7 @@ import com.fs.his.vo.FsIntegralGoodsListUVO;
 import com.fs.his.vo.FsIntegralGoodsListVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
 
@@ -65,7 +66,7 @@ public interface FsIntegralGoodsMapper
      */
     public int deleteFsIntegralGoodsByGoodsIds(Long[] goodsIds);
 
-    @Select({"<script> select goods_id, img_url, images, goods_name, ot_price, goods_type, status, integral, sort, stock, descs, create_time from fs_integral_goods" +
+    @Select({"<script> select goods_id, img_url, images, goods_name, ot_price, goods_type, status, integral, cash, sort, stock, descs, create_time from fs_integral_goods" +
             "<where>  \n" +
             "            <if test=\"goodsName != null  and goodsName != ''\"> and goods_name like concat('%', #{goodsName}, '%')</if>\n" +
             "            <if test=\"goodsType != null \"> and goods_type = #{goodsType}</if>\n" +
@@ -75,7 +76,7 @@ public interface FsIntegralGoodsMapper
             "</script>"})
     List<FsIntegralGoodsListVO> selectFsIntegralGoodsListVO(FsIntegralGoods fsIntegralGoods);
     @Select({"<script> " +
-            "select g.goods_id,g.img_url,g.images,g.goods_name,g.ot_price,g.goods_type,g.integral,g.sort  from fs_integral_goods g  " +
+            "select g.goods_id,g.img_url,g.images,g.goods_name,g.ot_price,g.goods_type,g.integral,g.cash,g.sort  from fs_integral_goods g  " +
             "where g.status=1  " +
             "<if test = 'maps.goodsType != null and maps.goodsType != 0     '> " +
             "and g.goods_type = #{maps.goodsType}  " +
@@ -90,4 +91,10 @@ public interface FsIntegralGoodsMapper
      * @return 商品列表
      */
     List<FsIntegralGoods> selectFsIntegralGoodsByStage(FsIntegralGoodsListUParam param);
+
+    @Update("update fs_integral_goods set stock = stock - #{num} where goods_id = #{goodsId} and stock >= #{num}")
+    int subStock(@Param("goodsId") Long goodsId, @Param("num") int num);
+
+    @Update("update fs_integral_goods set stock = stock + #{num} where goods_id = #{goodsId}")
+    int addStock(@Param("goodsId") Long goodsId, @Param("num") int num);
 }

+ 5 - 1
fs-service/src/main/java/com/fs/his/mapper/FsIntegralOrderMapper.java

@@ -66,12 +66,16 @@ public interface FsIntegralOrderMapper
      * @return 结果
      */
     public int deleteFsIntegralOrderByOrderIds(Long[] orderIds);
-    @Select({"<script> select order_id, order_code, user_id, user_name, user_phone, user_address, item_json, integral, status, delivery_code, delivery_name, delivery_sn, delivery_time, create_time,qw_user_id,company_user_id,company_id, remark from fs_integral_order " +
+    @Select({"<script> select order_id, order_code, user_id, user_name, user_phone, user_address, item_json, integral,pay_money,is_pay,pay_time,pay_type, status, delivery_code, delivery_name, delivery_sn, delivery_time, create_time,qw_user_id,company_user_id,company_id, remark from fs_integral_order " +
             "<where>  \n" +
             "            <if test=\"orderCode != null  and orderCode != ''\"> and order_code = #{orderCode}</if>\n" +
             "            <if test=\"userName != null  and userName != ''\"> and user_name like concat('%', #{userName}, '%')</if>\n" +
             "            <if test=\"userPhone != null  and userPhone != ''\"> and user_phone = #{userPhone}</if>\n" +
             "            <if test=\"integral != null  and integral != ''\"> and integral = #{integral}</if>\n" +
+            "            <if test=\"payMoney != null  and payMoney != ''\"> and pay_money = #{payMoney}</if>\n" +
+            "            <if test=\"isPay != null  and isPay != ''\"> and is_pay = #{isPay}</if>\n" +
+            "            <if test=\"payTime != null  and payTime != ''\"> and pay_time = #{payTime}</if>\n" +
+            "            <if test=\"payType != null  and payType != ''\"> and pay_type = #{payType}</if>\n" +
             "            <if test=\"status != null  and status != ''\"> and status = #{status}</if>\n" +
             "            <if test=\"deliverySn != null  and deliverySn != ''\"> and delivery_sn like concat('%', #{deliverySn}, '%')</if>\n" +
             "            <if test=\"qwUserId != null  and qwUserId != ''\"> and qw_user_id = #{qwUserId}</if>\n" +

+ 13 - 0
fs-service/src/main/java/com/fs/his/param/FsIntegralOrderDoPayParam.java

@@ -0,0 +1,13 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class FsIntegralOrderDoPayParam {
+    @NotNull(message = "订单号不能为空")
+    private Long orderId;
+
+    private Long userId;
+}

+ 18 - 0
fs-service/src/main/java/com/fs/his/param/FsIntegralOrderParam.java

@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 @Data
@@ -39,6 +41,22 @@ public class FsIntegralOrderParam {
     @Excel(name = "支付积分")
     private String integral;
 
+    /** 支付金额 */
+    @Excel(name = "支付金额")
+    private BigDecimal payMoney;
+
+    /** 是否支付 0未支付 1已支付 */
+    @Excel(name = "是否支付 0未支付 1已支付")
+    private Integer isPay;
+
+    /** 支付时间 */
+    @Excel(name = "支付时间")
+    private LocalDateTime payTime;
+
+    /** 支付类型 1积分 2现金 3积分+现金 */
+    @Excel(name = "支付类型 1积分 2现金 3积分+现金")
+    private Integer payType;
+
     /** 1:待发货;2:待收货;3:已完成 */
     @Excel(name = "1:待发货;2:待收货;3:已完成")
     private String status;

+ 47 - 0
fs-service/src/main/java/com/fs/his/param/PayOrderParam.java

@@ -0,0 +1,47 @@
+package com.fs.his.param;
+
+import com.fs.his.enums.BusinessTypeEnum;
+import com.fs.his.enums.PaymentMethodEnum;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class PayOrderParam {
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+    /**
+     * 订单编码
+     */
+    private String orderCode;
+    /**
+     * 支付金额
+     */
+    private BigDecimal amount;
+    /**
+     * 公司ID
+     */
+    private Long companyId;
+    /**
+     * 销售ID
+     */
+    private Long companyUserId;
+    /**
+     * 门店ID
+     */
+    private Long storeId;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 支付方式
+     */
+    private PaymentMethodEnum paymentMethod;
+    /**
+     * 业务类型
+     */
+    private BusinessTypeEnum businessType;
+}

+ 17 - 0
fs-service/src/main/java/com/fs/his/service/IFsIntegralOrderService.java

@@ -2,7 +2,9 @@ package com.fs.his.service;
 
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsIntegralOrder;
+import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.param.FsIntegralOrderCreateParam;
+import com.fs.his.param.FsIntegralOrderDoPayParam;
 import com.fs.his.param.FsIntegralOrderListUParam;
 import com.fs.his.param.FsIntegralOrderParam;
 import com.fs.his.vo.FsIntegralOrderListUVO;
@@ -79,4 +81,19 @@ public interface IFsIntegralOrderService
     String importProductDeliver(List<FsStoreProductDeliverExcelVO> list);
 
     FsIntegralOrderPVO selectFsIntegralOrderPVO(Long orderId);
+
+    /**
+     * 取消订单
+     */
+    R cannelOrder(Long orderId);
+
+    /**
+     * 预支付
+     */
+    R payment(FsIntegralOrderDoPayParam param, PaymentMethodEnum paymentMethod);
+
+    /**
+     * 支付回调
+     */
+    R payConfirm(String orderSn, String payCode, String tradeNo, String payType, int type);
 }

+ 8 - 0
fs-service/src/main/java/com/fs/his/service/IFsStorePaymentService.java

@@ -9,6 +9,7 @@ import com.fs.company.param.FsStoreStatisticsParam;
 import com.fs.company.vo.FsStorePaymentStatisticsVO;
 import com.fs.his.domain.FsStorePayment;
 import com.fs.his.param.FsStorePaymentParam;
+import com.fs.his.param.PayOrderParam;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
@@ -106,4 +107,11 @@ public interface IFsStorePaymentService
     R sendRedPacketTest(WxSendRedPacketParam param);
 
     List<FsStorePaymentVO> selectFsStorePaymentListQueryVO(FsStorePaymentParam fsStorePayment);
+
+    /**
+     * 发起支付
+     * @param payOrderParam 入参
+     * @return R
+     */
+    R processPayment(PayOrderParam payOrderParam);
 }

+ 235 - 29
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java

@@ -2,36 +2,70 @@ package com.fs.his.service.impl;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.ip.IpUtils;
+import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.his.domain.*;
+import com.fs.his.dto.PayConfigDTO;
+import com.fs.his.enums.BusinessTypeEnum;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
+import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.mapper.*;
-import com.fs.his.param.FsIntegralOrderCreateParam;
-import com.fs.his.param.FsIntegralOrderListUParam;
-import com.fs.his.param.FsIntegralOrderParam;
-import com.fs.his.param.FsUserAddIntegralTemplateParam;
+import com.fs.his.param.*;
 import com.fs.his.service.IFsIntegralOrderService;
+import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.service.IFsUserIntegralLogsService;
+import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsIntegralOrderListUVO;
 import com.fs.his.vo.FsIntegralOrderListVO;
 import com.fs.his.vo.FsIntegralOrderPVO;
 import com.fs.his.vo.FsStoreProductDeliverExcelVO;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
+import com.fs.huifuPay.service.HuiFuService;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.mapper.QwUserMapper;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
+import com.fs.tzBankPay.TzBankService.TzBankService;
+import com.fs.tzBankPay.doman.PayCreateOrder;
+import com.fs.tzBankPay.doman.PayCreateOrderResult;
+import com.fs.tzBankPay.doman.PayType;
+import com.fs.tzBankPay.doman.TzBankResult;
+import com.fs.ybPay.domain.CreateWxOrderResult;
+import com.fs.ybPay.domain.OrderResult;
+import com.fs.ybPay.dto.OrderQueryDTO;
+import com.fs.ybPay.dto.WxJspayDTO;
+import com.fs.ybPay.service.IPayService;
+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.github.binarywang.wxpay.service.WxPayService;
+import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 积分商品订单Service业务层处理
@@ -39,6 +73,7 @@ import java.util.List;
  * @author fs
  * @date 2023-11-02
  */
+@Slf4j
 @Service
 public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
 {
@@ -60,6 +95,12 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
     private QwUserMapper qwUserMapper;
     @Autowired
     private IFsUserIntegralLogsService userIntegralLogsService;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private IPayService ybPayService;
+    @Autowired
+    private IFsStorePaymentService storePaymentService;
 
     /**
      * 查询积分商品订单
@@ -185,9 +226,25 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         if(StringUtils.isEmpty(orderSn)){
             return R.error("订单生成失败,请重试");
         }
+
+        // 现金
+        if (integralGoods.getCash().compareTo(BigDecimal.ZERO) > 0) {
+            // 现金+积分
+            order.setPayType(integralGoods.getIntegral() > 0 ? 3 : 2);
+            order.setStatus(4);
+            order.setIsPay(0);
+            order.setPayMoney(integralGoods.getCash());
+        }
+        // 积分
+        else {
+            order.setPayType(1);
+            order.setStatus(1);
+            order.setIsPay(1);
+            order.setPayTime(LocalDateTime.now());
+        }
+
         order.setOrderCode(orderSn);
         order.setUserId(user.getUserId());
-        order.setStatus(1);
         order.setBarCode(integralGoods.getBarCode());
         order.setIntegral(integralGoods.getIntegral().toString());
         order.setItemJson(JSONUtil.toJsonStr(integralGoods));
@@ -209,28 +266,44 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
         }
 
         if(fsIntegralOrderMapper.insertFsIntegralOrder(order)>0){
-            //写入日志
-            FsUser userMap=new FsUser();
-            userMap.setUserId(user.getUserId());
-            userMap.setIntegral(user.getIntegral()-integralGoods.getIntegral());
-            fsUserMapper.updateFsUser(userMap);
-            FsUserIntegralLogs logs = new FsUserIntegralLogs();
-            logs.setIntegral(-integralGoods.getIntegral());
-            logs.setUserId(order.getUserId());
-            logs.setBalance(userMap.getIntegral().longValue());
-            logs.setLogType(5);
-            logs.setBusinessId(order.getOrderId().toString());
-            logs.setCreateTime(new Date());
-            fsUserIntegralLogsMapper.insertFsUserIntegralLogs(logs);
-
-            // 首次完成专家咨询得积分
-            FsUserAddIntegralTemplateParam integralParam = new FsUserAddIntegralTemplateParam();
-            integralParam.setUserId(order.getUserId());
-            integralParam.setLogType(FsUserIntegralLogTypeEnum.TYPE_22.getValue());
-            integralParam.setBusinessId(order.getOrderId().toString());
-            userIntegralLogsService.addIntegralTemplate(integralParam);
-
-            return R.ok("兑换成功").put("order",order);
+            if (order.getPayType() != 2) {
+                //写入日志
+                FsUser userMap=new FsUser();
+                userMap.setUserId(user.getUserId());
+                userMap.setIntegral(user.getIntegral()-integralGoods.getIntegral());
+                fsUserMapper.updateFsUser(userMap);
+                FsUserIntegralLogs logs = new FsUserIntegralLogs();
+                logs.setIntegral(-integralGoods.getIntegral());
+                logs.setUserId(order.getUserId());
+                logs.setBalance(userMap.getIntegral().longValue());
+                logs.setLogType(5);
+                logs.setBusinessId(order.getOrderId().toString());
+                logs.setCreateTime(new Date());
+                fsUserIntegralLogsMapper.insertFsUserIntegralLogs(logs);
+            }
+
+            // 减库存
+            if (fsIntegralGoodsMapper.subStock(integralGoods.getGoodsId(), 1) <= 0) {
+                throw new CustomException("库存不足");
+            }
+
+            // 积分支付
+            if (order.getPayType() == 1) {
+                // 首次完成积分商城下单
+                FsUserAddIntegralTemplateParam integralParam = new FsUserAddIntegralTemplateParam();
+                integralParam.setUserId(order.getUserId());
+                integralParam.setLogType(FsUserIntegralLogTypeEnum.TYPE_22.getValue());
+                integralParam.setBusinessId(order.getOrderId().toString());
+                userIntegralLogsService.addIntegralTemplate(integralParam);
+
+                return R.ok("兑换成功").put("order",order).put("isPay", 1);
+            }
+            // 现金 或 积分+现金
+            else {
+                String redisKey = String.valueOf(StrUtil.format("{}{}", FsConstants.REDIS_INTEGRAL_ORDER_UNPAY, order.getOrderId()));
+                redisCache.setCacheObject(redisKey,order.getOrderId(),30, TimeUnit.MINUTES);
+                return R.ok().put("order",order).put("isPay", 0);
+            }
         }
         else{
 
@@ -310,4 +383,137 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
     public FsIntegralOrderPVO selectFsIntegralOrderPVO(Long orderId) {
         return fsIntegralOrderMapper.selectFsIntegralOrderPVO(orderId);
     }
+
+    /**
+     * 取消订单
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public R cannelOrder(Long orderId) {
+        // 取消订单
+        FsIntegralOrder order = fsIntegralOrderMapper.selectFsIntegralOrderByOrderId(orderId);
+        if (!order.getStatus().equals(4)){
+            return R.error("非法操作");
+        }
+
+        order.setStatus(5);
+        fsIntegralOrderMapper.updateFsIntegralOrder(order);
+
+        // 还原库存
+        FsIntegralGoods integralGoods = JSONUtil.toBean(order.getItemJson(), FsIntegralGoods.class);
+        fsIntegralGoodsMapper.addStock(integralGoods.getGoodsId(), 1);
+
+        // 还原积分
+        FsUser user=fsUserMapper.selectFsUserByUserId(order.getUserId());
+        FsUser userMap=new FsUser();
+        userMap.setUserId(user.getUserId());
+        userMap.setIntegral(user.getIntegral()+integralGoods.getIntegral());
+        fsUserMapper.updateFsUser(userMap);
+        FsUserIntegralLogs logs = new FsUserIntegralLogs();
+        logs.setIntegral(Long.parseLong(order.getIntegral()));
+        logs.setUserId(order.getUserId());
+        logs.setBalance(userMap.getIntegral().longValue());
+        logs.setLogType(5);
+        logs.setBusinessId(order.getOrderId().toString());
+        logs.setCreateTime(new Date());
+        fsUserIntegralLogsMapper.insertFsUserIntegralLogs(logs);
+
+        return R.ok();
+    }
+
+    /**
+     * 预支付
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public R payment(FsIntegralOrderDoPayParam param, PaymentMethodEnum paymentMethod) {
+        FsIntegralOrder order = fsIntegralOrderMapper.selectFsIntegralOrderByOrderId(param.getOrderId());
+        if (Objects.isNull(order) || !order.getStatus().equals(4)
+                || order.getPayMoney().compareTo(BigDecimal.ZERO) <= 0){
+            return R.error("非法操作");
+        }
+
+        PayOrderParam payOrderParam = buildPayOrderParam(paymentMethod, order);
+        return storePaymentService.processPayment(payOrderParam);
+    }
+
+    /**
+     * 构建参数
+     */
+    private static PayOrderParam buildPayOrderParam(PaymentMethodEnum paymentMethod, FsIntegralOrder order) {
+        PayOrderParam payOrderParam = new PayOrderParam();
+        payOrderParam.setOrderId(order.getOrderId());
+        payOrderParam.setOrderCode(order.getOrderCode());
+        payOrderParam.setAmount(order.getPayMoney());
+        payOrderParam.setUserId(order.getUserId());
+        payOrderParam.setCompanyId(order.getCompanyId());
+        payOrderParam.setCompanyUserId(order.getCompanyUserId());
+        payOrderParam.setPaymentMethod(paymentMethod);
+        payOrderParam.setBusinessType(BusinessTypeEnum.INTEGRAL_ORDER);
+        return payOrderParam;
+    }
+
+    /**
+     * 支付回调
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public R payConfirm(String orderSn, String payCode, String tradeNo, String payType, int type) {
+        log.info("进入积分商城订单支付回调 orderSn: {}, payCode: {}, tradeNo: {}, payType: {}, type: {}",
+                orderSn, payCode, tradeNo, payType, type);
+        FsIntegralOrder order = null;
+        if (type == 1) {
+            FsStorePayment storePayment = storePaymentService.selectFsStorePaymentByPaymentCode(payCode);
+            if (Objects.isNull(storePayment)) {
+                log.info("支付单号不存在 payCode: {}", payCode);
+                return R.error("支付单号不存在");
+            }
+
+            if(storePayment.getStatus() == 0){
+                FsStorePayment paymentMap = new FsStorePayment();
+                paymentMap.setPaymentId(storePayment.getPaymentId());
+                paymentMap.setStatus(1);
+                paymentMap.setPayTime(new Date());
+                paymentMap.setTradeNo(tradeNo);
+                if(payType.equals(PayType.WECHAT_MINI_PROGRAM_PAYMENT.getCode())){
+                    paymentMap.setPayTypeCode(PayType.WECHAT_MINI_PROGRAM_PAYMENT.name());
+                }
+                else if(payType.equals(PayType.ALIPAY_BARCODE_PAYMENT.getCode())){
+                    paymentMap.setPayTypeCode(PayType.ALIPAY_BARCODE_PAYMENT.name());
+                }
+                if (storePayment.getPayMode().equals("yb")){
+                    OrderQueryDTO orderQueryDTO = new OrderQueryDTO();
+                    orderQueryDTO.setUpOrderId(tradeNo);
+                    OrderResult orderResult = ybPayService.getOrder(orderQueryDTO);
+                    paymentMap.setBankSerialNo(orderResult.getBankOrderId());
+                    paymentMap.setBankTransactionId(orderResult.getBankTrxId());
+                }
+                log.info("更新支付记录");
+                storePaymentService.updateFsStorePayment(paymentMap);
+                order = fsIntegralOrderMapper.selectFsIntegralOrderByOrderId(Long.parseLong(storePayment.getBusinessId()));
+            }
+        }
+        else if (type == 2) {
+            order = fsIntegralOrderMapper.selectFsIntegralOrderByOrderCode(orderSn);
+        }
+
+        if (Objects.isNull(order) || order.getStatus() != 4) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return R.error("非法操作");
+        }
+
+        // 首次完成积分商城下单
+        FsUserAddIntegralTemplateParam integralParam = new FsUserAddIntegralTemplateParam();
+        integralParam.setUserId(order.getUserId());
+        integralParam.setLogType(FsUserIntegralLogTypeEnum.TYPE_22.getValue());
+        integralParam.setBusinessId(order.getOrderId().toString());
+        userIntegralLogsService.addIntegralTemplate(integralParam);
+
+        order.setIsPay(1);
+        order.setStatus(1);
+        order.setPayTime(LocalDateTime.now());
+        fsIntegralOrderMapper.updateFsIntegralOrder(order);
+        return R.ok();
+    }
+
 }

+ 343 - 4
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.his.service.impl;
 
 import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -13,7 +14,9 @@ import com.fs.common.core.domain.AjaxResult;
 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.StringUtils;
+import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.param.FsStoreStatisticsParam;
@@ -30,19 +33,26 @@ import com.fs.erp.dto.ErpRefundUpdateRequest;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.domain.FsPayConfig;
 import com.fs.his.domain.FsStorePayment;
+import com.fs.his.domain.FsUser;
 import com.fs.his.dto.PayConfigDTO;
+import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.mapper.FsExportTaskMapper;
 import com.fs.his.mapper.FsStorePaymentMapper;
+import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.FsStoreOrderParam;
 import com.fs.his.param.FsStorePaymentParam;
+import com.fs.his.param.PayOrderParam;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
+import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStorePaymentExcelVO;
 import com.fs.his.vo.FsStorePaymentVO;
+import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
+import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
@@ -51,19 +61,19 @@ import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.tzBankPay.TzBankService.TzBankService;
 import com.fs.tzBankPay.TzBankService.TzBankServiceImpl.TzBankServiceImpl;
-import com.fs.tzBankPay.doman.QueryOrderResult;
-import com.fs.tzBankPay.doman.RefundParam;
-import com.fs.tzBankPay.doman.TzBankResult;
-import com.fs.tzBankPay.doman.payQueryOrder;
+import com.fs.tzBankPay.doman.*;
+import com.fs.ybPay.domain.CreateWxOrderResult;
 import com.fs.ybPay.domain.OrderResult;
 import com.fs.ybPay.dto.OrderQueryDTO;
 import com.fs.ybPay.dto.RefundDTO;
+import com.fs.ybPay.dto.WxJspayDTO;
 import com.fs.ybPay.service.IPayService;
 import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest;
 import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateResult;
 import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
 import com.github.binarywang.wxpay.bean.notify.WxPayTransferBatchesNotifyV3Result;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
 import com.github.binarywang.wxpay.bean.request.WxPaySendRedpackRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
@@ -79,6 +89,7 @@ import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.RedpackServiceImpl;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.google.gson.Gson;
+import com.hc.openapi.tool.fastjson.JSON;
 import com.wechat.pay.java.service.transferbatch.TransferBatchService;
 import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
@@ -136,6 +147,9 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     private IFsCourseRedPacketLogService redPacketLogService;
     @Autowired
     private CompanyConfigMapper companyConfigMapper;
+    @Autowired
+    private FsUserMapper userMapper;
+
     /**
      * 查询支付明细
      *
@@ -781,4 +795,329 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     public List<FsStorePaymentVO> selectFsStorePaymentListQueryVO(FsStorePaymentParam fsStorePayment) {
         return fsStorePaymentMapper.selectFsStorePaymentListQueryVO(fsStorePayment);
     }
+
+    /**
+     * 发起支付
+     * @param payOrderParam 入参
+     * @return R
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public R processPayment(PayOrderParam payOrderParam) {
+        logger.info("发起支付 payOrderParam: {}", JSON.toJSONString(payOrderParam));
+
+        if (payOrderParam.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
+            throw new CustomException("支付金额不正确");
+        }
+
+        FsUser user = userMapper.selectFsUserById(payOrderParam.getUserId());
+        if (Objects.isNull(user)){
+            throw new CustomException("用户不存在");
+        }
+
+        if (isWechatPayment(payOrderParam.getPaymentMethod())) {
+            String openId = getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod());
+            if (StringUtils.isBlank(openId)){
+                throw new CustomException("用户OPENID不存在");
+            }
+        }
+
+        String json = configService.selectConfigByKey("his.pay");
+        logger.debug("支付配置 his.pay: {}", json);
+        FsPayConfig payConfig = JSONUtil.toBean(json, FsPayConfig.class);
+
+        // 创建记录
+        FsStorePayment storePayment = createStorePayment(payConfig, user, payOrderParam);
+
+        // 根据配置类型创建第三方支付订单
+        return createThirdPartyPayment(payConfig, storePayment, user, payOrderParam);
+    }
+
+    /**
+     * 发起预支付
+     */
+    private R createThirdPartyPayment(FsPayConfig payConfig, FsStorePayment storePayment, FsUser user, PayOrderParam payOrderParam) {
+        switch (payConfig.getType()) {
+            case "wx":
+                return createWxPayment(payConfig, storePayment, user, payOrderParam);
+            case "yb":
+                return createYbPayment(storePayment, user, payOrderParam);
+            case "tz":
+                return createTzPayment(storePayment, user, payOrderParam);
+            case "hf":
+                return createHfPayment(storePayment, user, payOrderParam);
+            default:
+                throw new CustomException("不支持的支付方式");
+        }
+    }
+
+    /**
+     * 汇付
+     */
+    private R createHfPayment(FsStorePayment storePayment, FsUser user, PayOrderParam payOrderParam) {
+        logger.debug("创建汇付订单");
+
+        HuiFuCreateOrder order = new HuiFuCreateOrder();
+        order.setTradeType(getHfTradeType(payOrderParam.getPaymentMethod()));
+        order.setReqSeqId(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
+        order.setTransAmt(storePayment.getPayMoney().toString());
+        order.setGoodsDesc(payOrderParam.getBusinessType().getDesc());
+
+        // 微信支付需要设置openid
+        if (isWechatPayment(payOrderParam.getPaymentMethod())) {
+            order.setOpenid(getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod()));
+        }
+
+        HuifuCreateOrderResult result = huiFuService.createOrder(order);
+        logger.debug("汇付支付创建结果: {}", result);
+
+        updateStorePaymentTradeNo(storePayment.getPaymentId(), result.getHf_seq_id());
+        return R.ok().put("isPay", 0).put("data", result).put("type", "hf");
+    }
+
+    /**
+     * 获取汇付交易类型
+     */
+    private String getHfTradeType(PaymentMethodEnum paymentMethod) {
+        switch (paymentMethod) {
+            case MINIAPP_WECHAT:
+                return "T_MINIAPP";
+            case H5_WECHAT:
+                return "T_JSAPI";
+            case ALIPAY:
+            case H5_ALIPAY:
+                return "A_NATIVE";
+            default:
+                throw new CustomException("不支持的支付方式");
+        }
+    }
+
+    /**
+     * 台州银行
+     */
+    private R createTzPayment(FsStorePayment storePayment, FsUser user, PayOrderParam payOrderParam) {
+        PayCreateOrder payOrder = buildTzPayOrder(storePayment, user, payOrderParam);
+        TzBankResult<PayCreateOrderResult> result = tzBankService.createOrder(payOrder);
+
+        updateStorePaymentTradeNo(storePayment.getPaymentId(), result.getBody().getOrderFlowNo());
+        return R.ok().put("isPay", 0).put("data", result).put("type", "tz");
+    }
+
+    /**
+     * 构建台州银行支付
+     */
+    private PayCreateOrder buildTzPayOrder(FsStorePayment storePayment, FsUser user, PayOrderParam payOrderParam) {
+        PayCreateOrder payOrder = new PayCreateOrder();
+        payOrder.setOrderNo(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
+        payOrder.setTrxAmt(storePayment.getPayMoney().doubleValue());
+        payOrder.setBusinessCstNo(payOrderParam.getUserId().toString());
+        payOrder.setGoodsInfo(payOrderParam.getBusinessType().getDesc());
+        payOrder.setOrderType(payOrderParam.getBusinessType().getCode());
+        payOrder.setOrderId(payOrderParam.getOrderId().toString());
+
+        // 设置支付方式
+        setTzPaymentType(payOrder, payOrderParam.getPaymentMethod());
+
+        // 设置用户信息
+        String phone = getPhoneNumber(user);
+        payOrder.setPayerName("微信用户" + phone);
+
+        if (payOrderParam.getPaymentMethod() == PaymentMethodEnum.MINIAPP_WECHAT) {
+            payOrder.setPayerMobileNo(getDecryptedPhone(user));
+        }
+
+        if (isWechatPayment(payOrderParam.getPaymentMethod())) {
+            payOrder.setOpenId(getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod()));
+        }
+
+        return payOrder;
+    }
+
+    /**
+     * 获取解密后的手机号
+     */
+    private String getDecryptedPhone(FsUser user) {
+        if (user.getPhone() != null) {
+            if (user.getPhone().length() > 11) {
+                return PhoneUtil.decryptPhone(user.getPhone());
+            } else {
+                return user.getPhone();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取手机号后4位
+     */
+    private String getPhoneNumber(FsUser user) {
+        if (user.getPhone() != null && user.getPhone().length() > 4) {
+            return user.getPhone().substring(user.getPhone().length() - 4);
+        }
+        return "";
+    }
+
+    /**
+     * 设置支付类型
+     */
+    private void setTzPaymentType(PayCreateOrder payOrder, PaymentMethodEnum paymentMethod) {
+        switch (paymentMethod) {
+            case ALIPAY:
+            case H5_ALIPAY:
+                payOrder.setPayType(Collections.singletonList(PayType.ALIPAY_BARCODE_PAYMENT.getCode()));
+                break;
+            case H5_WECHAT:
+                payOrder.setPayType(Collections.singletonList(PayType.WECHAT_PUBLIC_ACCOUNT.getCode()));
+                break;
+            default:
+                // 小程序微信支付不需要设置payType
+                break;
+        }
+    }
+
+    /**
+     * 易宝支付
+     */
+    private R createYbPayment(FsStorePayment storePayment, FsUser user, PayOrderParam payOrderParam) {
+        PaymentMethodEnum paymentMethod = payOrderParam.getPaymentMethod();
+        if (paymentMethod == PaymentMethodEnum.ALIPAY || paymentMethod == PaymentMethodEnum.H5_ALIPAY
+                || paymentMethod == PaymentMethodEnum.H5_WECHAT) {
+            throw new CustomException("支付暂不可用!");
+        }
+
+        WxJspayDTO payDto = new WxJspayDTO();
+        payDto.setPayMoney(storePayment.getPayMoney().toString());
+        payDto.setLowOrderId(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
+        payDto.setBody(payOrderParam.getBusinessType().getDesc());
+        payDto.setIsMinipg("1");
+        payDto.setOpenId(getOpenIdForPaymentMethod(user, paymentMethod));
+        payDto.setAttach("");
+        payDto.setStoreid("0");
+
+        CreateWxOrderResult wxOrder = payService.createWxOrder(payDto);
+        logger.info("易宝支付返回: {}", wxOrder);
+
+        if ("100".equals(wxOrder.getStatus())) {
+            updateStorePaymentTradeNo(storePayment.getPaymentId(), wxOrder.getUpOrderId());
+            return R.ok().put("isPay", 0).put("data", wxOrder).put("type", "yb");
+        } else {
+            throw new CustomException("支付失败");
+        }
+    }
+
+    /**
+     * 更新支付订单交易号
+     */
+    private void updateStorePaymentTradeNo(Long paymentId, String tradeNo) {
+        FsStorePayment updatePayment = new FsStorePayment();
+        updatePayment.setPaymentId(paymentId);
+        updatePayment.setTradeNo(tradeNo);
+        fsStorePaymentMapper.updateFsStorePayment(updatePayment);
+    }
+
+    /**
+     * 微信支付
+     */
+    private R createWxPayment(FsPayConfig payConfig, FsStorePayment storePayment, FsUser user, PayOrderParam payOrderParam) {
+        PaymentMethodEnum paymentMethod = payOrderParam.getPaymentMethod();
+        if (paymentMethod != PaymentMethodEnum.MINIAPP_WECHAT) {
+            logger.debug("微信支付 PaymentMethod: {}", paymentMethod.name());
+            throw new CustomException("不支持的支付方式");
+        }
+
+        WxPayConfig wxPayConfig = buildWxPayConfig(payConfig);
+        wxPayService.setConfig(wxPayConfig);
+
+        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+        orderRequest.setOpenid(getOpenIdForPaymentMethod(user, paymentMethod));
+        orderRequest.setBody(payOrderParam.getBusinessType().getDesc());
+        orderRequest.setOutTradeNo(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
+        orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));
+        orderRequest.setTradeType("JSAPI");
+        orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+
+        try {
+            WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
+            return R.ok().put("data", orderResult).put("type", "wx").put("isPay", 0);
+        } catch (WxPayException e) {
+            logger.error("微信支付发起失败: {}", e.getMessage(), e);
+            throw new CustomException("支付失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 构建微信支付配置
+     */
+    private WxPayConfig buildWxPayConfig(FsPayConfig fsPayConfig) {
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(fsPayConfig.getAppId());
+        payConfig.setMchId(fsPayConfig.getWxMchId());
+        payConfig.setMchKey(fsPayConfig.getWxMchKey());
+        payConfig.setSubAppId(StringUtils.trimToNull(null));
+        payConfig.setSubMchId(StringUtils.trimToNull(null));
+        payConfig.setKeyPath(null);
+        payConfig.setNotifyUrl(wxPayProperties.getNotifyUrl());
+        return payConfig;
+    }
+
+    /**
+     * 判断是否微信支付
+     * @param method 支付类型
+     * @return boolean
+     */
+    private boolean isWechatPayment(PaymentMethodEnum method) {
+        return method == PaymentMethodEnum.MINIAPP_WECHAT || method == PaymentMethodEnum.H5_WECHAT;
+    }
+
+    /**
+     * 根据支付方式获取对应的openId
+     */
+    private String getOpenIdForPaymentMethod(FsUser user, PaymentMethodEnum method) {
+        switch (method) {
+            case MINIAPP_WECHAT:
+                return user.getMaOpenId();
+            case H5_WECHAT:
+                return user.getMpOpenId();
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * 创建支付订单
+     */
+    private FsStorePayment createStorePayment(FsPayConfig payConfig, FsUser user, PayOrderParam payOrderParam) {
+        String payCode = OrderCodeUtils.getOrderSn();
+        if (StringUtils.isEmpty(payCode)) {
+            throw new CustomException("订单生成失败,请重试");
+        }
+
+        FsStorePayment storePayment = new FsStorePayment();
+        storePayment.setStatus(0);
+        storePayment.setPayMode(payConfig.getType());
+        storePayment.setBusinessCode(payOrderParam.getOrderCode());
+        storePayment.setPayCode(payCode);
+        storePayment.setPayMoney(payOrderParam.getAmount());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode(payOrderParam.getPaymentMethod().getDesc());
+        storePayment.setBusinessType(payOrderParam.getBusinessType().getCode());
+        storePayment.setCompanyId(payOrderParam.getCompanyId());
+        storePayment.setCompanyUserId(payOrderParam.getCompanyUserId());
+        storePayment.setRemark(payOrderParam.getBusinessType().getDesc());
+        storePayment.setStoreId(payOrderParam.getStoreId());
+        storePayment.setUserId(user.getUserId());
+        storePayment.setBusinessId(payOrderParam.getOrderId().toString());
+
+        // 设置openId(如果是微信支付)
+        if (isWechatPayment(payOrderParam.getPaymentMethod())) {
+            storePayment.setOpenId(getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod()));
+        }
+
+        if (fsStorePaymentMapper.insertFsStorePayment(storePayment) <= 0) {
+            throw new CustomException("支付订单创建失败");
+        }
+
+        return storePayment;
+    }
+
 }

+ 5 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsUserIntegralLogsServiceImpl.java

@@ -356,10 +356,14 @@ public class FsUserIntegralLogsServiceImpl implements IFsUserIntegralLogsService
                     integralNum = config.getIntegralFirstOrderPoint();
                     logsType = FsUserIntegralLogTypeEnum.TYPE_22;
                     break;
-                case 23: //完成首次积分商城下单
+                case 23: //管理员添加
                     integralNum = param.getPoints();
                     logsType = FsUserIntegralLogTypeEnum.TYPE_23;
                     break;
+                case 24: //付费课程订阅
+                    integralNum = param.getPoints() * config.getIntegralSubscriptCourse();
+                    logsType = FsUserIntegralLogTypeEnum.TYPE_24;
+                    break;
                 default:
                     return R.error("积分类型错误,联系管理员");
             }

+ 3 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralGoodsListUVO.java

@@ -35,6 +35,9 @@ public class FsIntegralGoodsListUVO implements Serializable {
     /** 所需积分 */
     private Long integral;
 
+    /** 需支付金额 **/
+    private BigDecimal cash;
+
     /** 排序 */
     private Long sort;
 

+ 4 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralGoodsListVO.java

@@ -39,6 +39,10 @@ public class FsIntegralGoodsListVO {
     @Excel(name = "所需积分")
     private Long integral;
 
+    /** 需支付金额 */
+    @Excel(name = "需支付金额")
+    private BigDecimal cash;
+
     /** 排序 */
     @Excel(name = "排序")
     private Long sort;

+ 13 - 1
fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderListUVO.java

@@ -1,11 +1,11 @@
 package com.fs.his.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fs.common.annotation.Excel;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 @Data
@@ -36,6 +36,18 @@ public class FsIntegralOrderListUVO implements Serializable {
     /** 支付积分 */
     private String integral;
 
+    /** 支付金额 */
+    private BigDecimal payMoney;
+
+    /** 是否支付 0未支付 1已支付 */
+    private Integer isPay;
+
+    /** 支付时间 */
+    private LocalDateTime payTime;
+
+    /** 支付类型 1积分 2现金 3积分+现金 */
+    private Integer payType;
+
     /** 1:待发货;2:待收货;3:已完成 */
     private Integer status;
 

+ 1 - 1
fs-service/src/main/java/com/fs/tzBankPay/doman/PayCreateOrder.java

@@ -33,5 +33,5 @@ public class PayCreateOrder {
     private String identityName; // 用户真实名称 银联签约支付时需要上送
     private String openId;
     private String orderId;
-    private Integer orderType;//1问诊 2药品 3套餐包 4课程订单 5开通会员
+    private Integer orderType;//1问诊 2药品 3套餐包 4课程订单 5开通会员 6积分商城
 }

+ 8 - 0
fs-service/src/main/resources/db/20250721-积分加现金.sql

@@ -0,0 +1,8 @@
+alter table fs_integral_goods
+    add column cash decimal(10,2) default 0 comment '需支付金额' after `integral`;
+
+alter table fs_integral_order
+    add column pay_money decimal(11,2) DEFAULT NULL COMMENT '支付金额' after `integral`,
+    add column is_pay tinyint(1) DEFAULT NULL COMMENT '是否支付 0未支付 1已支付' after `pay_money`,
+    add column `pay_time` datetime DEFAULT NULL COMMENT '支付时间' after `is_pay`,
+    add column `pay_type` int DEFAULT NULL COMMENT '支付类型 1积分 2现金 3积分+现金' after `pay_time`;

+ 7 - 1
fs-service/src/main/resources/mapper/his/FsIntegralGoodsMapper.xml

@@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="goodsType"    column="goods_type"    />
         <result property="status"    column="status"    />
         <result property="integral"    column="integral"    />
+        <result property="cash"    column="cash"    />
         <result property="sort"    column="sort"    />
         <result property="stock"    column="stock"    />
         <result property="descs"    column="descs"    />
@@ -21,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectFsIntegralGoodsVo">
-        select goods_id, img_url, images,bar_code, goods_name, ot_price, goods_type, status, integral, sort, stock, descs, create_time from fs_integral_goods
+        select goods_id, img_url, images,bar_code, goods_name, ot_price, goods_type, status, integral, cash, sort, stock, descs, create_time from fs_integral_goods
     </sql>
 
     <select id="selectFsIntegralGoodsList" parameterType="FsIntegralGoods" resultMap="FsIntegralGoodsResult">
@@ -31,6 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="goodsType != null "> and goods_type = #{goodsType}</if>
             <if test="status != null "> and status = #{status}</if>
             <if test="integral != null "> and integral = #{integral}</if>
+            <if test="cash != null "> and cash = #{cash}</if>
             <if test="createTime != null "> and create_time = #{createTime}</if>
         </where>
     </select>
@@ -51,6 +53,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="goodsType != null">goods_type,</if>
             <if test="status != null">status,</if>
             <if test="integral != null">integral,</if>
+            <if test="cash != null">cash,</if>
             <if test="sort != null">sort,</if>
             <if test="stock != null">stock,</if>
             <if test="descs != null">descs,</if>
@@ -66,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="goodsType != null">#{goodsType},</if>
             <if test="status != null">#{status},</if>
             <if test="integral != null">#{integral},</if>
+            <if test="cash != null">#{cash},</if>
             <if test="sort != null">#{sort},</if>
             <if test="stock != null">#{stock},</if>
             <if test="descs != null">#{descs},</if>
@@ -84,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="goodsType != null">goods_type = #{goodsType},</if>
             <if test="status != null">status = #{status},</if>
             <if test="integral != null">integral = #{integral},</if>
+            <if test="cash != null">cash = #{cash},</if>
             <if test="sort != null">sort = #{sort},</if>
             <if test="stock != null">stock = #{stock},</if>
             <if test="descs != null">descs = #{descs},</if>
@@ -113,6 +118,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             g.goods_name,
             g.img_url ,
             g.integral,
+            g.cash,
             g.status,
             g.ot_price
         FROM fs_integral_goods g

+ 21 - 1
fs-service/src/main/resources/mapper/his/FsIntegralOrderMapper.xml

@@ -13,6 +13,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="userAddress"    column="user_address"    />
         <result property="itemJson"    column="item_json"    />
         <result property="integral"    column="integral"    />
+        <result property="payMoney"    column="pay_money"    />
+        <result property="isPay"    column="is_pay"    />
+        <result property="payTime"    column="pay_time"    />
+        <result property="payType"    column="pay_type"    />
         <result property="status"    column="status"    />
         <result property="deliveryCode"    column="delivery_code"    />
         <result property="deliveryName"    column="delivery_name"    />
@@ -24,7 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectFsIntegralOrderVo">
-        select order_id, order_code, user_id,bar_code, user_name, user_phone, user_address, item_json, integral, status, delivery_code, delivery_name, delivery_sn, delivery_time, create_time,qw_user_id,company_user_id,company_id,remark from fs_integral_order
+        select order_id, order_code, user_id,bar_code, user_name, user_phone, user_address, item_json, integral,pay_money,is_pay,pay_time,pay_type, status, delivery_code, delivery_name, delivery_sn, delivery_time, create_time,qw_user_id,company_user_id,company_id,remark from fs_integral_order
     </sql>
 
     <select id="selectFsIntegralOrderList" parameterType="FsIntegralOrder" resultMap="FsIntegralOrderResult">
@@ -34,6 +38,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userName != null  and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
             <if test="userPhone != null  and userPhone != ''"> and user_phone = #{userPhone}</if>
             <if test="integral != null  and integral != ''"> and integral = #{integral}</if>
+            <if test="payMoney != null  and payMoney != ''"> and pay_money = #{payMoney}</if>
+            <if test="isPay != null  and isPay != ''"> and is_pay = #{isPay}</if>
+            <if test="payTime != null  and payTime != ''"> and pay_time = #{payTime}</if>
+            <if test="payType != null  and payType != ''"> and pay_type = #{payType}</if>
             <if test="status != null  and status != ''"> and status = #{status}</if>
             <if test="deliverySn != null  and deliverySn != ''"> and delivery_sn like concat('%', #{deliverySn}, '%')</if>
             <if test="qwUserId != null  and qwUserId != ''"> and qw_user_id = #{qwUserId}</if>
@@ -58,6 +66,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userAddress != null">user_address,</if>
             <if test="itemJson != null">item_json,</if>
             <if test="integral != null">integral,</if>
+            <if test="payMoney != null">pay_money,</if>
+            <if test="isPay != null">is_pay,</if>
+            <if test="payTime != null">pay_time,</if>
+            <if test="payType != null">pay_type,</if>
             <if test="status != null and status != ''">status,</if>
             <if test="deliveryCode != null">delivery_code,</if>
             <if test="deliveryName != null">delivery_name,</if>
@@ -79,6 +91,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userAddress != null">#{userAddress},</if>
             <if test="itemJson != null">#{itemJson},</if>
             <if test="integral != null">#{integral},</if>
+            <if test="payMoney != null">#{payMoney},</if>
+            <if test="isPay != null">#{isPay},</if>
+            <if test="payTime != null">#{payTime},</if>
+            <if test="payType != null">#{payType},</if>
             <if test="status != null and status != ''">#{status},</if>
             <if test="deliveryCode != null">#{deliveryCode},</if>
             <if test="deliveryName != null">#{deliveryName},</if>
@@ -103,6 +119,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userAddress != null">user_address = #{userAddress},</if>
             <if test="itemJson != null">item_json = #{itemJson},</if>
             <if test="integral != null">integral = #{integral},</if>
+            <if test="payMoney != null">pay_money = #{payMoney},</if>
+            <if test="isPay != null">is_pay = #{isPay},</if>
+            <if test="payTime != null">pay_time = #{payTime},</if>
+            <if test="payType != null">pay_type = #{payType},</if>
             <if test="status != null and status != ''">status = #{status},</if>
             <if test="deliveryCode != null">delivery_code = #{deliveryCode},</if>
             <if test="deliveryName != null">delivery_name = #{deliveryName},</if>

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/HuifuPayController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.IFsUserVipOrderService;
 import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.service.IFsIntegralOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.huifuPay.domain.HuiFuOnlinePay;
@@ -28,6 +29,8 @@ public class HuifuPayController {
     private IFsUserCourseOrderService courseOrderService;
     @Autowired
     private IFsUserVipOrderService vipOrderService;
+    @Autowired
+    private IFsIntegralOrderService integralOrderService;
 
     org.slf4j.Logger logger= LoggerFactory.getLogger(getClass());
     @RequestMapping("/payNotifyUrl")
@@ -52,6 +55,9 @@ public class HuifuPayController {
                 case "appvip":
                     vipOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1);
                     break;
+                case "integral":
+                    integralOrderService.payConfirm("",orderId[1],huiFuResult.getHf_seq_id(),"",1);
+                    break;
             }
         }
 

+ 46 - 2
fs-user-app/src/main/java/com/fs/app/controller/IntegralController.java

@@ -2,11 +2,11 @@ package com.fs.app.controller;
 
 
 import com.fs.app.annotation.Login;
-import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.*;
 import com.fs.his.enums.FsUserIntegralLogTypeEnum;
+import com.fs.his.enums.PaymentMethodEnum;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.vo.*;
@@ -97,11 +97,55 @@ public class IntegralController extends  AppBaseController {
     @ApiOperation("创建订单")
     @PostMapping("/createOrder")
     @RepeatSubmit
-    public R createOrder(@Validated @RequestBody FsIntegralOrderCreateParam param, HttpServletRequest request){
+    public R createOrder(@Validated @RequestBody FsIntegralOrderCreateParam param){
         param.setUserId(Long.parseLong(getUserId()));
         return integralOrderService.createOrder(param);
     }
 
+    @Login
+    @ApiOperation("取消订单")
+    @PostMapping("/cannelOrder")
+    @RepeatSubmit
+    public R cannelOrder(@Validated @RequestBody FsIntegralOrderDoPayParam param){
+        return integralOrderService.cannelOrder(param.getOrderId());
+    }
+
+    @Login
+    @RepeatSubmit
+    @ApiOperation("支付")
+    @PostMapping("/payment")
+    public R payment(@Validated @RequestBody FsIntegralOrderDoPayParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+        return integralOrderService.payment(param, PaymentMethodEnum.MINIAPP_WECHAT);
+    }
+
+    @Login
+    @RepeatSubmit
+    @ApiOperation("支付宝支付")
+    @PostMapping("/aliPayment")
+    public R aliPayment(@Validated @RequestBody FsIntegralOrderDoPayParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+        return integralOrderService.payment(param, PaymentMethodEnum.ALIPAY);
+    }
+
+    @Login
+    @RepeatSubmit
+    @ApiOperation("H5微信支付")
+    @PostMapping("/H5WxPayment")
+    public R h5WxPayment(@Validated @RequestBody FsIntegralOrderDoPayParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+        return integralOrderService.payment(param, PaymentMethodEnum.H5_WECHAT);
+    }
+
+    @Login
+    @RepeatSubmit
+    @ApiOperation("支付宝支付")
+    @PostMapping("/H5AliPayment")
+    public R h5AliPayment(@Validated @RequestBody FsIntegralOrderDoPayParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+        return integralOrderService.payment(param, PaymentMethodEnum.H5_ALIPAY);
+    }
+
     @Login
     @ApiOperation("获取用户签到记录")
     @GetMapping("/getUserSign")

+ 7 - 0
fs-user-app/src/main/java/com/fs/app/controller/TzPayController.java

@@ -9,6 +9,7 @@ import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.IFsUserVipOrderService;
 import com.fs.his.domain.FsPayConfig;
 import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.service.IFsIntegralOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.system.domain.SysConfig;
@@ -41,6 +42,9 @@ public class TzPayController extends BaseController
 
     @Autowired
     private IFsUserVipOrderService userVipOrderService;
+    @Autowired
+    private IFsIntegralOrderService integralOrderService;
+
     @RequestMapping(value = "/payNotify",method = RequestMethod.POST)
     public String payNotify(@RequestBody String  decryptForm) throws Exception {
         SysConfigMapper sysConfigMapper= SpringUtils.getBean(SysConfigMapper.class);
@@ -67,6 +71,9 @@ public class TzPayController extends BaseController
             else if(tzBankOrderDecrypt.getOrderNo().indexOf("appvip")>-1){
                 userVipOrderService.payConfirm("",tzBankOrderDecrypt.getOrderNo().substring(6),tzBankOrderDecrypt.getOrderFlowNo(),tzBankOrderDecrypt.getPayType(),1);
             }
+            else if (tzBankOrderDecrypt.getOrderNo().indexOf("integral")>-1) {
+                integralOrderService.payConfirm("",tzBankOrderDecrypt.getOrderNo().substring(8),tzBankOrderDecrypt.getOrderFlowNo(),tzBankOrderDecrypt.getPayType(),1);
+            }
         }
         return decrypt;
     }

+ 6 - 4
fs-user-app/src/main/java/com/fs/app/controller/WxPayController.java

@@ -12,10 +12,7 @@ import com.fs.common.core.domain.R;
 import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.IFsUserVipOrderService;
 import com.fs.his.domain.FsPayConfig;
-import com.fs.his.service.IFsInquiryOrderService;
-import com.fs.his.service.IFsPackageOrderService;
-import com.fs.his.service.IFsStoreOrderService;
-import com.fs.his.service.IFsStorePaymentService;
+import com.fs.his.service.*;
 import com.fs.sop.service.ISopUserLogsInfoService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
@@ -72,6 +69,8 @@ public class WxPayController {
 
     @Autowired
     private ISopUserLogsInfoService iSopUserLogsInfoService;
+    @Autowired
+    private IFsIntegralOrderService integralOrderService;
 
 
     /**
@@ -107,6 +106,9 @@ public class WxPayController {
                         courseOrderService.payConfirm("",orderId[1],tradeNo,"",1);
                     case "appvip":
                         userVipOrderService.payConfirm("",orderId[1],tradeNo,"",1);
+                    case "integral":
+                        integralOrderService.payConfirm("",orderId[1],tradeNo,"",1);
+                        break;
                 }
                 return WxPayNotifyResponse.success("处理成功!");
             }else{

+ 7 - 0
fs-user-app/src/main/java/com/fs/app/controller/YbPayController.java

@@ -7,6 +7,7 @@ import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.IFsUserVipOrderService;
 import com.fs.his.domain.FsPayConfig;
 import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.service.IFsIntegralOrderService;
 import com.fs.his.service.IFsPackageOrderService;
 import com.fs.his.service.IFsStoreOrderService;
 
@@ -43,6 +44,9 @@ public class YbPayController extends BaseController
     private IFsUserCourseOrderService courseOrderService;
     @Autowired
     private IFsUserVipOrderService userVipOrderService;
+    @Autowired
+    private IFsIntegralOrderService integralOrderService;
+
     @PostMapping("/payNotify")
     public String payNotify(@RequestBody Map<String, String> params, @RequestBody OrderCallback o) {
         System.out.println("支付回调");
@@ -72,6 +76,9 @@ public class YbPayController extends BaseController
             case "appvip":
                 userVipOrderService.payConfirm("",orderId[1],o.getUpOrderId(),"",1);
                 break;
+            case "integral":
+                integralOrderService.payConfirm("",orderId[1],o.getUpOrderId(),"",1);
+                break;
         }
         System.out.println(o);
         return "SUCCESS";