Explorar o código

益寿缘app-完善App发红包回显数据

cgp hai 5 días
pai
achega
09830a7993

+ 20 - 0
fs-service/src/main/java/com/fs/his/domain/FsAppRewardCourseRedPacketLog.java

@@ -37,6 +37,26 @@ public class FsAppRewardCourseRedPacketLog {
      * 转帐金额
      */
     private BigDecimal amount;
+
+    /**
+     * 批次单号
+     * */
+    private String outBatchNo;
+
+    /**
+     * 微信批次单号
+     * */
+    private String batchId;
+
+    /**
+     * 唤起收款参数
+     * */
+    private String packageInfo;
+
+    /**
+     * 商户号
+     * */
+    private String mchId;
     
     /**
      * 创建时间

+ 4 - 2
fs-service/src/main/java/com/fs/his/param/WxSendRedPacketParam.java

@@ -5,7 +5,9 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-
+/**
+ *  App发微信红包参数
+ * */
 @Data
 public class WxSendRedPacketParam implements Serializable {
 
@@ -15,7 +17,7 @@ public class WxSendRedPacketParam implements Serializable {
 
     private Long companyId; //公司id
 
-    private Integer source=1;//来源 1:h5  2:看课小程序
+    private Integer source=1;//来源 1:h5  2:看课小程序 3:App
 
     private Integer redPacketMode;//红包模式
 

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

@@ -1,6 +1,7 @@
 package com.fs.his.service;
 
 import com.fs.app.domain.FsAppRole;
+import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsUserRewards;
 import com.fs.his.dto.ClaimRewardsAddDTO;
 
@@ -12,7 +13,7 @@ public interface IAppUserRewardService {
      * 用户领取奖励
      * @param claimRewardsAddDTO 用户ID,奖品ID,地址ID
      * */
-    public void claimRewards(ClaimRewardsAddDTO claimRewardsAddDTO);
+    public R claimRewards(ClaimRewardsAddDTO claimRewardsAddDTO);
 
     /**
      * 为当前用户增加首次注册登录待领取的奖励

+ 8 - 6
fs-service/src/main/java/com/fs/his/service/impl/AppUserRewardServiceImpl.java

@@ -1,8 +1,8 @@
 package com.fs.his.service.impl;
 
+import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
-import com.fs.his.mapper.FsAppRewardCourseRedPacketLogMapper;
 import me.chanjar.weixin.common.util.locks.RedisTemplateSimpleDistributedLock;
 import com.fs.app.domain.FsAppRole;
 import com.fs.app.mapper.FsAppRoleMapper;
@@ -69,17 +69,17 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
     private static final String LOCK_WATCH_REWARD_KEY ="lock:watch:reward:";
 
     @Override
-    public void claimRewards(ClaimRewardsAddDTO claimRewardsAddDTO) {
+    public R claimRewards(ClaimRewardsAddDTO claimRewardsAddDTO) {
         Long fsUserId=claimRewardsAddDTO.getFsUserId();
         Long rewardsId=claimRewardsAddDTO.getRewardsId();
         FsUserRewards reward = rewardsMapper.selectByUserIdAndRewardsId(claimRewardsAddDTO.getFsUserId(), rewardsId);
         if (reward==null){
             log.info("用户:{}没有可领取的奖品:{}", fsUserId, rewardsId);
-            return;
+            return R.error("操作频繁,请稍后再试!");
         }
         if (reward.getStatus()==1||reward.getStatus()==2){
             log.info("用户:{}奖品已领取: rewardsId={}",fsUserId, rewardsId);
-            return;
+            return R.error("操作频繁,请稍后再试!");
         }
         // 校验是否过期(目前只有看课奖品需要校验过期)
         if (ActivityTypeEnum.WATCH_COURSE.getCode().equals(reward.getActivityType())) {
@@ -87,17 +87,19 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
                 log.info("奖品已过期: rewardsId={}", rewardsId);
                 // 更新奖品状态为已过期
                 rewardsMapper.updateStatus(reward.getId(), 2, null, null);
-                return;
+                return R.error("操作频繁,请稍后再试!");
             }
         }
         reward.setAddressId(claimRewardsAddDTO.getAddressId());
-        //执行奖品领取逻辑
+        //执行奖品领取逻辑(红包、积分、商品)
         RewardStrategy strategy = strategyFactory.getStrategy(reward.getActivityType(), reward.getRewardType());
         RewardResult result = strategy.process(reward);
         if (result.isSuccess()) {
             // 更新奖品状态
             rewardsMapper.updateStatus(rewardsId, 1, result.getOrderCode(), DateUtils.getNowDate());
             log.info("奖品领取成功: rewardsId={}, orderCode={}", rewardsId, result.getOrderCode());
+            if (reward.getRewardType()==1) return (R)result.getExtData();
+            return R.ok();
         } else {
             log.error("奖品领取失败: rewardsId={}, reason={}", rewardsId, result.getMessage());
             throw new CustomException(result.getMessage(),result.getCode());

+ 16 - 0
fs-service/src/main/java/com/fs/his/strategy/RewardResult.java

@@ -32,6 +32,11 @@ public class RewardResult {
      */
     private String message;
 
+    /**
+     * 扩展数据(用于携带额外信息,如红包发送结果)
+     */
+    private Object extData;
+
     /**
      * 成功静态工厂方法
      */
@@ -50,6 +55,17 @@ public class RewardResult {
         return result;
     }
 
+    /**
+     * 成功并携带扩展数据
+     */
+    public static RewardResult successWithExt(Object extData) {
+        RewardResult result = new RewardResult();
+        result.setCode(200);
+        result.setSuccess(true);
+        result.setExtData(extData);
+        return result;
+    }
+
     /**
      * 失败静态工厂方法(默认错误码400)
      */

+ 29 - 87
fs-service/src/main/java/com/fs/his/strategy/impl/FirstLoginRedPacketStrategy.java

@@ -1,21 +1,9 @@
 package com.fs.his.strategy.impl;
 
-import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSON;
+
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
-import com.fs.common.utils.StringUtils;
 import com.fs.core.config.WxOpenProperties;
-import com.fs.course.config.CourseConfig;
-import com.fs.course.domain.FsCourseAnswerLogs;
-import com.fs.course.domain.FsCourseRedPacketLog;
-import com.fs.course.domain.FsCourseWatchLog;
-import com.fs.course.domain.FsUserCourseVideo;
-import com.fs.course.mapper.FsCourseAnswerLogsMapper;
-import com.fs.course.mapper.FsCourseRedPacketLogMapper;
-import com.fs.course.mapper.FsCourseWatchLogMapper;
-import com.fs.course.mapper.FsUserCourseVideoMapper;
-import com.fs.course.param.FsCourseSendRewardUParam;
 import com.fs.his.domain.FsAppRewardCourseRedPacketLog;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserRewards;
@@ -26,11 +14,13 @@ import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.strategy.RewardResult;
 import com.fs.his.strategy.RewardStrategy;
-import com.fs.system.service.ISysConfigService;
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
+
 @Slf4j
 @Component
 public class FirstLoginRedPacketStrategy implements RewardStrategy {
@@ -40,22 +30,6 @@ public class FirstLoginRedPacketStrategy implements RewardStrategy {
 
     @Autowired
     private IFsStorePaymentService fsStorePaymentService;
-
-    @Autowired
-    private FsCourseWatchLogMapper courseWatchLogMapper;
-
-    @Autowired
-    private FsCourseAnswerLogsMapper courseAnswerLogsMapper;
-
-    @Autowired
-    private FsCourseRedPacketLogMapper redPacketLogMapper;
-
-    @Autowired
-    private FsUserCourseVideoMapper fsUserCourseVideoMapper;
-
-    @Autowired
-    private ISysConfigService configService;
-
     @Autowired
     private WxOpenProperties openProperties;
 
@@ -73,76 +47,45 @@ public class FirstLoginRedPacketStrategy implements RewardStrategy {
                 WxSendRedPacketParam param=buildRedPacketParam(reward, fsUser);
                 //调用发送红包接口逻辑
                 R sendRedPacket = fsStorePaymentService.sendRedPacketAppReward(param);
+
                 if (sendRedPacket.get("code").equals(200)) {
                     FsAppRewardCourseRedPacketLog record=new FsAppRewardCourseRedPacketLog();
+                    TransferBillsResult transferBillsResult;
+                    if (sendRedPacket.get("isNew").equals(1)) {
+                        transferBillsResult = (TransferBillsResult) sendRedPacket.get("data");
+                        record.setOutBatchNo(transferBillsResult.getOutBillNo());
+                        record.setBatchId(transferBillsResult.getTransferBillNo());
+                    } else {
+                        record.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                        record.setBatchId(sendRedPacket.get("batchId").toString());
+                    }
+                    record.setUpdateTime(new Date());
+                    Object aPackage = sendRedPacket.get("package");
+                    if (aPackage != null) {
+                        record.setPackageInfo(aPackage.toString());
+                    }
+                    Object mchIdObj = sendRedPacket.get("mchId");
+                    if (mchIdObj != null) {
+                        record.setMchId(mchIdObj.toString());
+                    }
                     record.setUserId(fsUser.getUserId());
                     record.setActivityType(ActivityTypeEnum.FIRST_LOGIN.getCode());
                     record.setAmount(reward.getRewardAmount());
                     record.setVideoId(reward.getGoodsId());
                     record.setCreateTime(DateUtils.getNowDate());
+                    //保存App红包发放记录
                     appRewardCourseRedPacketLogMapper.insert(record);
+                    return RewardResult.successWithExt(sendRedPacket);
                 } else {
                     return RewardResult.fail("红包发放失败,请联系客服");
                 }
             }
-            return RewardResult.success();
+            return RewardResult.fail("红包发放失败,用户不存在");
         } catch (Exception e) {
             return RewardResult.fail("红包发放失败,请联系客服");
         }
     }
 
-    public R sendRewardByFsUser(FsCourseSendRewardUParam param) {
-        FsUser user = fsUserMapper.selectFsUserByUserId(param.getUserId());
-        if (user == null){
-            return R.error("未识别到用户信息");
-        }
-        FsCourseWatchLog watchLog = courseWatchLogMapper.getWatchCourseVideoByFsUser(param.getUserId(), param.getVideoId(), param.getCompanyUserId());
-        if (watchLog == null) {
-            return R.error("无记录");
-        }
-
-        FsCourseAnswerLogs rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
-
-        if (rightLog == null) {
-            log.error("未答题:{}",param.getUserId());
-            return R.error("未答题");
-        }
-        if (watchLog.getRewardType() != null ) {
-            if (watchLog.getRewardType() == 1){
-                FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
-                if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
-                    return R.error("已领取该课程奖励,不可重复领取!");
-                }
-                if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 0) {
-                    if(StringUtils.isNotEmpty(fsCourseRedPacketLog.getResult())){
-                        R r = JSON.parseObject(fsCourseRedPacketLog.getResult(), R.class);
-                        return r;
-                    } else {
-                        return R.error("操作频繁,请稍后再试!");
-                    }
-                }
-            }else if (watchLog.getRewardType() == 2){
-                return R.error("已领取该课程奖励,不可重复领取!");
-            }
-
-        }
-
-
-
-        // 获取视频信息
-        FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(param.getVideoId());
-
-        // 获取配置信息
-        String json = configService.selectConfigByKey("course.config");
-        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        // 红包奖励
-        //return sendRedPacketRewardFsUser(param, user, watchLog, video, config);
-        return new R();
-
-    }
-
-
-
     /**
      * 构建红包参数
      */
@@ -150,11 +93,10 @@ public class FirstLoginRedPacketStrategy implements RewardStrategy {
         WxSendRedPacketParam param = new WxSendRedPacketParam();
         param.setAppId(openProperties.getAppId());
         param.setOpenId(fsUser.getAppOpenId());
-        param.setRedPacketMode(1);//1:为总公司
-        param.setCompanyId(reward.getCompanyId());
-        param.setUser(fsUser);
-        param.setSource(1);
         param.setAmount(reward.getRewardAmount());
+        param.setRedPacketMode(1);//总公司
+        param.setSource(3);//3:app端
+        param.setUser(fsUser);
         return param;
     }
 

+ 27 - 4
fs-service/src/main/java/com/fs/his/strategy/impl/WatchCourseRedPacketStrategy.java

@@ -14,10 +14,13 @@ import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.strategy.RewardResult;
 import com.fs.his.strategy.RewardStrategy;
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
+
 @Slf4j
 @Component
 public class WatchCourseRedPacketStrategy implements RewardStrategy {
@@ -48,14 +51,35 @@ public class WatchCourseRedPacketStrategy implements RewardStrategy {
                 WxSendRedPacketParam param=buildRedPacketParam(reward, fsUser);
                 //调用发送红包接口逻辑
                 R sendRedPacket = fsStorePaymentService.sendRedPacketAppReward(param);
+
                 if (sendRedPacket.get("code").equals(200)) {
                     FsAppRewardCourseRedPacketLog record=new FsAppRewardCourseRedPacketLog();
+                    TransferBillsResult transferBillsResult;
+                    if (sendRedPacket.get("isNew").equals(1)) {
+                        transferBillsResult = (TransferBillsResult) sendRedPacket.get("data");
+                        record.setOutBatchNo(transferBillsResult.getOutBillNo());
+                        record.setBatchId(transferBillsResult.getTransferBillNo());
+                    } else {
+                        record.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                        record.setBatchId(sendRedPacket.get("batchId").toString());
+                    }
+                    record.setUpdateTime(new Date());
+                    Object aPackage = sendRedPacket.get("package");
+                    if (aPackage != null) {
+                        record.setPackageInfo(aPackage.toString());
+                    }
+                    Object mchIdObj = sendRedPacket.get("mchId");
+                    if (mchIdObj != null) {
+                        record.setMchId(mchIdObj.toString());
+                    }
                     record.setUserId(fsUser.getUserId());
                     record.setActivityType(ActivityTypeEnum.WATCH_COURSE.getCode());
                     record.setAmount(reward.getRewardAmount());
                     record.setVideoId(reward.getGoodsId());
                     record.setCreateTime(DateUtils.getNowDate());
+                    //保存App红包发放记录
                     appRewardCourseRedPacketLogMapper.insert(record);
+                    return RewardResult.successWithExt(sendRedPacket);
                 } else {
                     return RewardResult.fail("红包发放失败,请联系客服");
                 }
@@ -74,11 +98,10 @@ public class WatchCourseRedPacketStrategy implements RewardStrategy {
         WxSendRedPacketParam param = new WxSendRedPacketParam();
         param.setAppId(openProperties.getAppId());
         param.setOpenId(fsUser.getAppOpenId());
-        param.setRedPacketMode(1);
-        param.setCompanyId(reward.getCompanyId());
-        param.setUser(fsUser);
-        param.setSource(2);
         param.setAmount(reward.getRewardAmount());
+        param.setRedPacketMode(1);//总公司
+        param.setSource(3);//3:app端
+        param.setUser(fsUser);
         return param;
     }
 

+ 23 - 1
fs-service/src/main/resources/mapper/his/FsAppRewardCourseRedPacketLogMapper.xml

@@ -11,6 +11,10 @@
         <result property="videoId" column="video_id"/>
         <result property="activityType" column="activity_type"/>
         <result property="amount" column="amount"/>
+        <result property="outBatchNo" column="out_batch_no"/>
+        <result property="batchId" column="batch_id"/>
+        <result property="packageInfo" column="package_info"/>
+        <result property="mchId" column="mch_id"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
         <result property="remark" column="remark"/>
@@ -19,7 +23,9 @@
     <!-- 基础字段列表 -->
     <sql id="baseColumns">
         select log_id, user_id, video_id, activity_type, amount,
-        create_time, update_time, remark from fs_app_reward_course_red_packet_log
+               out_batch_no, batch_id, package_info, mch_id,
+               create_time, update_time, remark
+        from fs_app_reward_course_red_packet_log
     </sql>
 
     <!-- 根据ID查询 -->
@@ -65,6 +71,10 @@
             <if test="videoId != null"> AND video_id = #{videoId}</if>
             <if test="activityType != null and activityType != ''"> AND activity_type = #{activityType}</if>
             <if test="amount != null"> AND amount = #{amount}</if>
+            <if test="outBatchNo != null and outBatchNo != ''"> AND out_batch_no = #{outBatchNo}</if>
+            <if test="batchId != null and batchId != ''"> AND batch_id = #{batchId}</if>
+            <if test="packageInfo != null and packageInfo != ''"> AND package_info = #{packageInfo}</if>
+            <if test="mchId != null and mchId != ''"> AND mch_id = #{mchId}</if>
             <if test="remark != null and remark != ''"> AND remark LIKE CONCAT('%', #{remark}, '%')</if>
         </where>
         ORDER BY create_time DESC
@@ -78,6 +88,10 @@
             <if test="videoId != null">video_id,</if>
             <if test="activityType != null and activityType != ''">activity_type,</if>
             <if test="amount != null">amount,</if>
+            <if test="outBatchNo != null and outBatchNo != ''">out_batch_no,</if>
+            <if test="batchId != null and batchId != ''">batch_id,</if>
+            <if test="packageInfo != null and packageInfo != ''">package_info,</if>
+            <if test="mchId != null and mchId != ''">mch_id,</if>
             <if test="remark != null and remark != ''">remark,</if>
             create_time,
             update_time
@@ -87,6 +101,10 @@
             <if test="videoId != null">#{videoId},</if>
             <if test="activityType != null and activityType != ''">#{activityType},</if>
             <if test="amount != null">#{amount},</if>
+            <if test="outBatchNo != null and outBatchNo != ''">#{outBatchNo},</if>
+            <if test="batchId != null and batchId != ''">#{batchId},</if>
+            <if test="packageInfo != null and packageInfo != ''">#{packageInfo},</if>
+            <if test="mchId != null and mchId != ''">#{mchId},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
             SYSDATE(),
             SYSDATE()
@@ -101,6 +119,10 @@
             <if test="videoId != null">video_id = #{videoId},</if>
             <if test="activityType != null and activityType != ''">activity_type = #{activityType},</if>
             <if test="amount != null">amount = #{amount},</if>
+            <if test="outBatchNo != null and outBatchNo != ''">out_batch_no = #{outBatchNo},</if>
+            <if test="batchId != null and batchId != ''">batch_id = #{batchId},</if>
+            <if test="packageInfo != null and packageInfo != ''">package_info = #{packageInfo},</if>
+            <if test="mchId != null and mchId != ''">mch_id = #{mchId},</if>
             <if test="remark != null and remark != ''">remark = #{remark},</if>
             update_time = SYSDATE()
         </set>

+ 1 - 2
fs-user-app/src/main/java/com/fs/app/controller/AppUserRewardController.java

@@ -115,8 +115,7 @@ public class AppUserRewardController  extends AppBaseController{
         }
         claimRewardsAddDTO.setFsUserId(Long.valueOf(loginUserId));
         try {
-            appUserRewardService.claimRewards(claimRewardsAddDTO);
-            return R.ok();
+            return appUserRewardService.claimRewards(claimRewardsAddDTO);
         } catch (CustomException e) {
             log.error("领取奖品失败: {}", e.getMessage());
             if (e.getCode() != null) {