wjj пре 2 дана
родитељ
комит
c79bfcacf0

+ 24 - 0
fs-service/src/main/java/com/fs/his/param/FsReceivePhoneRedPacketParam.java

@@ -0,0 +1,24 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class FsReceivePhoneRedPacketParam {
+
+    //领取手机号码
+    private String phone;
+
+    //领取授权红包记录id
+    private Long recordId;
+
+    //领取用户id
+    private Long userId;
+
+    //领取小程序id
+    private String appId;
+
+    // 企微主体id
+    private String corpId;
+}

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

@@ -32,4 +32,6 @@ public class WxSendRedPacketParam implements Serializable {
 
     private String appAppId;
 
+    private boolean isPhoneTag;
+
 }

+ 6 - 2
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.his.service.impl;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -657,9 +658,12 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         if (StringUtils.isEmpty(code)) {
             return R.error("订单生成失败,请重试");
         }
+        if(ObjectUtil.isNotNull(param.isPhoneTag()) && param.isPhoneTag()) {
+            request.setOutBillNo("phonePacket"+code);
+        } else {
+            request.setOutBillNo("fsCourse" + code);
+        }
 //        String code = String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
-        request.setOutBillNo("fsCourse" + code);
-
         Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount() != null ? param.getAmount().toString() : "0.1");
         request.setTransferAmount(amount);
         request.setTransferRemark("活动奖励");

+ 5 - 0
fs-service/src/main/java/com/fs/qw/domain/BindPhoneRedPacketRecord.java

@@ -90,5 +90,10 @@ public class BindPhoneRedPacketRecord extends BaseEntity{
     @Excel(name = "群聊名称")
     private String externalUserName;
 
+    private String outBatchNo;
+
+    private String batchId;//微信批次单号
+
+    private String result;
 
 }

+ 8 - 0
fs-service/src/main/java/com/fs/qw/mapper/BindPhoneRedPacketRecordMapper.java

@@ -3,6 +3,8 @@ package com.fs.qw.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.qw.domain.BindPhoneRedPacketRecord;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 绑定手机号红包领取记录Mapper接口
@@ -58,4 +60,10 @@ public interface BindPhoneRedPacketRecordMapper extends BaseMapper<BindPhoneRedP
      * @return 结果
      */
     int deleteBindPhoneRedPacketRecordByIds(Long[] ids);
+
+    @Select("SELECT count(*) FROM `bind_phone_red_packet_record` WHERE user_id = #{userId} AND collect_type = #{collectType}")
+    Long selectBindPhoneRedPacketRecordListCountByUserId(@Param("userId") Long userId, @Param("collectType")String collectType);
+
+    @Select("SELECT count(*) FROM `bind_phone_red_packet_record` WHERE phone = #{phone} AND collect_type = #{collectType}")
+    Long selectBindPhoneRedPacketRecordListCountByPhone(@Param("userId") String phone, @Param("collectType")String collectType);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -551,4 +551,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
     @Select("select * from qw_external_contact where fs_user_id = #{fsUserId} and status = 0 ")
     List<QwExternalContact> selectBuyAddTagExUserBuyFsUserId(Long fsUserId);
+
+    @Select("SELECT count(*) FROM `qw_external_contact` WHERE unionid = #{unionId} ")
+    Long selectCountByUnionId(String unionId);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/qw/service/IRedPacketService.java

@@ -3,6 +3,7 @@ package com.fs.qw.service;
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
+import com.fs.his.param.FsReceivePhoneRedPacketParam;
 import com.fs.qw.domain.RedPacket;
 
 /**
@@ -65,4 +66,6 @@ public interface IRedPacketService extends IService<RedPacket>{
      * @param recordId 记录id
      */
     R getPhoneRedPacketInfo(Long recordId);
+
+    R receivePhoneRedPacket(FsReceivePhoneRedPacketParam param);
 }

+ 127 - 3
fs-service/src/main/java/com/fs/qw/service/impl/RedPacketServiceImpl.java

@@ -1,21 +1,34 @@
 package com.fs.qw.service.impl;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.StringUtils;
+import com.fs.his.domain.FsUser;
+import com.fs.his.domain.FsUserWx;
+import com.fs.his.param.FsReceivePhoneRedPacketParam;
+import com.fs.his.param.WxSendRedPacketParam;
+import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.service.IFsUserWxService;
 import com.fs.qw.domain.BindPhoneRedPacketRecord;
-import com.fs.qw.service.IBindPhoneRedPacketRecordService;
+import com.fs.qw.mapper.BindPhoneRedPacketRecordMapper;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.qw.mapper.RedPacketMapper;
 import com.fs.qw.domain.RedPacket;
 import com.fs.qw.service.IRedPacketService;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 授权手机号红包配置Service业务层处理
@@ -23,6 +36,7 @@ import com.fs.qw.service.IRedPacketService;
  * @author fs
  * @date 2026-03-17
  */
+@Slf4j
 @Service
 public class RedPacketServiceImpl extends ServiceImpl<RedPacketMapper, RedPacket> implements IRedPacketService {
 
@@ -30,11 +44,20 @@ public class RedPacketServiceImpl extends ServiceImpl<RedPacketMapper, RedPacket
     private RedPacketMapper redPacketMapper;
 
     @Autowired
-    private IBindPhoneRedPacketRecordService bindPhoneRedPacketRecordService;
+    private BindPhoneRedPacketRecordMapper bindPhoneRedPacketRecordMapper;
 
     @Autowired
     private IFsUserService userService;
 
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+
+    @Autowired
+    private IFsStorePaymentService paymentService;
+
+    @Autowired
+    private IFsUserWxService fsUserWxService;
+
     /**
      * 查询授权手机号红包配置
      * 
@@ -111,7 +134,7 @@ public class RedPacketServiceImpl extends ServiceImpl<RedPacketMapper, RedPacket
 
     @Override
     public R getPhoneRedPacketInfo(Long recordId) {
-        BindPhoneRedPacketRecord record = bindPhoneRedPacketRecordService.selectBindPhoneRedPacketRecordById(recordId);
+        BindPhoneRedPacketRecord record = bindPhoneRedPacketRecordMapper.selectBindPhoneRedPacketRecordById(recordId);
         if (ObjectUtil.isNull(record)) {
             return R.error().put("msg","未找到授权红包信息");
         }
@@ -121,4 +144,105 @@ public class RedPacketServiceImpl extends ServiceImpl<RedPacketMapper, RedPacket
         map.put("amount",record.getAmount());
         return R.ok().put("data",map);
     }
+
+    @Override
+    @Transactional
+    public R receivePhoneRedPacket(FsReceivePhoneRedPacketParam param) {
+        FsUser user = userService.selectFsUserByUserId(param.getUserId());
+        if (ObjectUtil.isNull(user)) {
+            return R.error("没有用户信息,领取授权红包失败");
+        }
+        //当前用户是否添加企微
+        Long qwCount = qwExternalContactMapper.selectCountByUnionId(user.getUnionId());
+        if (qwCount < 1) {
+            return R.error("请添加企微后领取");
+        }
+        //领取授权红包记录
+        BindPhoneRedPacketRecord record = bindPhoneRedPacketRecordMapper.selectBindPhoneRedPacketRecordById(param.getRecordId());
+        if (ObjectUtil.isNull(record)) {
+            return R.error("授权红包信息错误");
+        }
+        //检测是否可领取授权红包
+        R r = checkIsReceiveRedPacket(param.getUserId(), param.getPhone());
+        if (!r.get("code").equals(200)) {
+            return r;
+        }
+
+        //构建领取红包参数
+        WxSendRedPacketParam redPacketParam = new WxSendRedPacketParam();
+        //处理多小程序问题
+        FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(param.getAppId(),user.getUserId(),1);
+        if (fsUserWx ==null){
+            try {
+                handleFsUserWx(user,param.getAppId());
+            }catch (Exception e){
+                log.error("【更新或插入用户与小程序的绑定关系失败】:{}", user.getUserId());
+            }
+        }else {
+            redPacketParam.setOpenId(fsUserWx.getOpenId());
+        }
+        redPacketParam.setAmount(record.getAmount());
+        redPacketParam.setRedPacketMode(1);
+        redPacketParam.setAppId(param.getAppId());
+        redPacketParam.setMpAppId(param.getAppId());
+        redPacketParam.setUser(user);
+        redPacketParam.setPhoneTag(true);
+        //小程序
+        redPacketParam.setSource(2);
+        redPacketParam.setCompanyId(record.getCompanyId());
+        //发送红包
+        R result = paymentService.sendRedPacket(redPacketParam);
+        log.error("红包发送结果:{}", result);
+        if (result.get("code").equals(200)) {
+
+            BindPhoneRedPacketRecord map = new BindPhoneRedPacketRecord();
+            TransferBillsResult transferBillsResult;
+            if (result.get("isNew").equals(1)) {
+                transferBillsResult = (TransferBillsResult) result.get("data");
+                map.setResult(JSON.toJSONString(result));
+                map.setOutBatchNo(transferBillsResult.getOutBillNo());
+            } else {
+                map.setOutBatchNo(result.get("orderCode").toString());
+            }
+            map.setId(record.getId());
+            map.setPhone(param.getPhone());
+            map.setCollectType("1");
+            int updateBindPhoneRedPacketRecord = bindPhoneRedPacketRecordMapper.updateBindPhoneRedPacketRecord(map);
+            if (updateBindPhoneRedPacketRecord > 0) {
+                return R.ok().put("msg","领取授权红包成功");
+            }
+        }
+        return R.error("领取授权红包失败");
+    }
+
+    private R checkIsReceiveRedPacket(Long userId,String phone) {
+        if (StringUtils.isEmpty(phone)) {
+            return R.error("手机号错误");
+        }
+
+        Long userRecordCount = bindPhoneRedPacketRecordMapper.selectBindPhoneRedPacketRecordListCountByUserId(userId, "1");
+        if (userRecordCount > 0) {
+            return R.error("已领取一次授权红包");
+        }
+
+        Long phoneRecordCount = bindPhoneRedPacketRecordMapper.selectBindPhoneRedPacketRecordListCountByPhone(phone, "1");
+        if (phoneRecordCount > 0) {
+            return R.error("该手机号已领取过授权红包");
+        }
+        return R.ok();
+    }
+
+    private void handleFsUserWx(FsUser user, String appId) {
+        FsUserWx fsUserWx = new FsUserWx();
+        fsUserWx.setType(1);
+        fsUserWx.setFsUserId(user.getUserId());
+        fsUserWx.setAppId(appId);
+        fsUserWx.setOpenId(user.getCourseMaOpenId());
+        fsUserWx.setUnionId(user.getUnionId());
+        fsUserWx.setCreateTime(new Date());
+        fsUserWx.setUpdateTime(new Date());
+        fsUserWxService.saveOrUpdateByUniqueKey(fsUserWx);
+
+        log.info("【更新或插入用户与小程序{}的绑定关系】:{}", appId, user.getUserId());
+    }
 }

+ 3 - 0
fs-service/src/main/resources/mapper/qw/BindPhoneRedPacketRecordMapper.xml

@@ -112,6 +112,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwUserId != null">qw_user_id = #{qwUserId},</if>
             <if test="qwUserName != null">qw_user_name = #{qwUserName},</if>
             <if test="phone != null">phone = #{phone},</if>
+            <if test="outBatchNo != null">out_batch_no = #{outBatchNo},</if>
+            <if test="batchId != null">batch_id = #{batchId},</if>
+            <if test="result != null">result = #{result},</if>
         </trim>
         where id = #{id}
     </update>

+ 10 - 7
fs-user-app/src/main/java/com/fs/app/controller/RedPacketController.java

@@ -1,22 +1,19 @@
 package com.fs.app.controller;
 
-import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
+import com.fs.his.param.FsReceivePhoneRedPacketParam;
 import com.fs.qw.service.IRedPacketService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 
 @Api("授权红包接口")
 @RestController
 @RequestMapping(value="/app/packet")
-public class RedPacketController extends BaseController {
+public class RedPacketController extends AppBaseController {
 
     @Autowired
     private IRedPacketService redPacketService;
@@ -28,5 +25,11 @@ public class RedPacketController extends BaseController {
         return redPacketService.getPhoneRedPacketInfo(recordId);
     }
 
-
+    @ApiOperation("领取授权红包")
+    @PostMapping("/receivePhoneRedPacket")
+    public R receivePhoneRedPacket(@RequestBody FsReceivePhoneRedPacketParam param, HttpServletRequest request) {
+        Long userId = Long.parseLong(getUserId());
+        param.setUserId(userId);
+        return redPacketService.receivePhoneRedPacket(param);
+    }
 }