Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

yuhongqi vor 2 Wochen
Ursprung
Commit
4f8d0cbc4b
34 geänderte Dateien mit 214 neuen und 45 gelöschten Zeilen
  1. 5 0
      fs-admin/src/main/java/com/fs/his/controller/FsCourseCouponController.java
  2. 1 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  3. 9 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  4. 12 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  5. 1 1
      fs-live-app/src/main/java/com/fs/live/task/Task.java
  6. 1 1
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  7. 0 0
      fs-service/src/main/java/com/fs/company/service/impl/GeneralCustomerEntryServiceImpl.java
  8. 1 1
      fs-service/src/main/java/com/fs/course/domain/FsCourseAnswerReward.java
  9. 5 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCourseVideo.java
  10. 2 2
      fs-service/src/main/java/com/fs/course/domain/LuckyBagCollectRecord.java
  11. 2 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  12. 5 0
      fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoQVO.java
  13. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsCourseCouponMapper.java
  14. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsCourseCouponService.java
  15. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsCourseCouponServiceImpl.java
  16. 2 2
      fs-service/src/main/java/com/fs/his/service/impl/FsUserInvitedServiceImpl.java
  17. 1 1
      fs-service/src/main/java/com/fs/his/vo/GetFsIntegralCartDetailsVo.java
  18. 1 1
      fs-service/src/main/java/com/fs/his/vo/GetFsIntegralCartListVo.java
  19. 7 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreAfterSalesScrm.java
  20. 4 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  21. 2 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsMyStoreOrderListQueryVO.java
  22. 2 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreAfterSalesQueryVO.java
  23. 2 2
      fs-service/src/main/java/com/fs/live/domain/LiveUserRedRecord.java
  24. 22 22
      fs-service/src/main/java/com/fs/live/service/impl/LiveRedConfServiceImpl.java
  25. 5 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  26. 26 0
      fs-service/src/main/java/com/fs/qw/param/RepeatRecordListParam.java
  27. 5 0
      fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  28. 1 1
      fs-service/src/main/java/com/fs/qw/service/impl/LuckyBagServiceImpl.java
  29. 5 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  30. 33 0
      fs-service/src/main/java/com/fs/qw/vo/QwRepeatRecordListVO.java
  31. 5 0
      fs-service/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml
  32. 6 2
      fs-service/src/main/resources/mapper/hisStore/FsStoreAfterSalesScrmMapper.xml
  33. 25 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml
  34. 4 0
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreAfterSalesScrmController.java

+ 5 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCourseCouponController.java

@@ -108,4 +108,9 @@ public class FsCourseCouponController extends BaseController
     {
         return toAjax(fsCourseCouponService.deleteFsCourseCouponByIds(ids));
     }
+
+    @GetMapping("/options")
+    public AjaxResult selectFsCourseCouponOptions(){
+        return AjaxResult.success(fsCourseCouponService.selectFsCourseCouponOptions());
+    }
 }

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -99,7 +99,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
         if(!StringUtils.isEmpty(param.getDeliverySendTimeRange())){
             param.setDeliverySendTimeList(param.getDeliverySendTimeRange().split("--"));
         }
-        param.setIsHealth("1");
+//        param.setIsHealth("1");
         List<FsStoreOrderVO> list = fsStoreOrderService.selectFsStoreOrderListVO(param);
         //金牛需求 区别其他项目 status = 6 (金牛代服管家) ,其他项目请避免使用订单状态status = 6
         TableDataInfo dataTable = getDataTable(list);

+ 9 - 4
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -681,14 +681,19 @@ public class FsStoreOrderScrmController extends BaseController {
             user.setPhone(ParseUtils.parsePhone(user.getPhone()));
         }
 
+
         if (order.getCompanyUserId() != null) {
             CompanyUser companyUser = companyUserService.selectCompanyUserByUserId(order.getCompanyUserId());
-            Company company = companyService.selectCompanyById(companyUser.getCompanyId());
-            order.setCompanyUserName(companyUser.getNickName());
-            order.setCompanyName(company.getCompanyName());
+            if (companyUser != null) {
+                Company company = companyService.selectCompanyById(companyUser.getCompanyId());
+                order.setCompanyUserName(companyUser.getNickName());
+                order.setCompanyName(company.getCompanyName());
+            }
         } else if (order.getCompanyId() != null) {
             Company company = companyService.selectCompanyById(order.getCompanyId());
-            order.setCompanyName(company.getCompanyName());
+            if (company != null) {
+                order.setCompanyName(company.getCompanyName());
+            }
         }
 
         if (order.getOrderType() != null && order.getOrderType() == 3) {

+ 12 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java

@@ -35,6 +35,7 @@ import com.fs.qw.param.*;
 import com.fs.qw.service.*;
 import com.fs.qw.vo.QwExternalContactVO;
 import com.fs.qw.vo.QwFsUserVO;
+import com.fs.qw.vo.QwRepeatRecordListVO;
 import com.fs.qw.vo.QwUserDelLossLogVO;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
@@ -945,6 +946,7 @@ public class QwExternalContactController extends BaseController
     public R getRepeat(RepeatParam param){
         return  qwExternalContactService.getRepeat(param);
     }
+
     /**
      * 重粉看课记录查询
      */
@@ -957,4 +959,14 @@ public class QwExternalContactController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 同主体下外部联系人全部销售记录(含当前)
+     */
+    @GetMapping("/getRepeatRecordList")
+    public TableDataInfo getRepeatRecordList(RepeatRecordListParam param) {
+        startPage();
+        List<QwRepeatRecordListVO> list = qwExternalContactService.selectRepeatRecordList(param);
+        return getDataTable(list);
+    }
+
 }

+ 1 - 1
fs-live-app/src/main/java/com/fs/live/task/Task.java

@@ -433,7 +433,7 @@ public class Task {
                 List<Long> userIds = onlineUser.stream().map(LiveWatchUser::getUserId).collect(Collectors.toList());
                 // 4.保存用户领取记录
                 saveUserRewardRecord(openRewardLive, userIds,config.getScoreAmount());
-                // 5.更新用户积分(芳华币
+                // 5.更新用户积分(积分
                 fsUserService.increaseIntegral(userIds,config.getScoreAmount());
                 // 6.发送websocket事件消息 通知用户自动领取成功
                 userIds.forEach(userId -> webSocketServer.sendIntegralMessage(openRewardLive.getLiveId(),userId,config.getScoreAmount()));

+ 1 - 1
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -869,7 +869,7 @@ public class WebSocketServer {
         sendMsgVo.setUserId(userId);
         sendMsgVo.setUserType(0L);
         sendMsgVo.setCmd("Integral");
-        sendMsgVo.setMsg("恭喜你成功获得观看奖励:" + scoreAmount + "芳华币");
+        sendMsgVo.setMsg("恭喜你成功获得观看奖励:" + scoreAmount + "积分");
         sendMsgVo.setData(String.valueOf(scoreAmount));
 
         if(Objects.isNull( session)) return;

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
fs-service/src/main/java/com/fs/company/service/impl/GeneralCustomerEntryServiceImpl.java


+ 1 - 1
fs-service/src/main/java/com/fs/course/domain/FsCourseAnswerReward.java

@@ -24,7 +24,7 @@ public class FsCourseAnswerReward {
     private List<RewardProduct> products;
 
     /**
-     * 本次获得的芳华币数量
+     * 本次获得的积分数量
      */
     private Integer availableCoins;
 

+ 5 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCourseVideo.java

@@ -142,6 +142,11 @@ public class FsUserCourseVideo extends BaseEntity
     /** 课程介绍图片URL */
     private String courseIntroImg;
 
+    /**
+     * 课程优惠券ID
+     */
+    private Long courseCouponId;
+
     @TableField(exist = false)
     private Integer showProduct; //1不展示疗法,0展示疗法
 

+ 2 - 2
fs-service/src/main/java/com/fs/course/domain/LuckyBagCollectRecord.java

@@ -60,8 +60,8 @@ public class LuckyBagCollectRecord extends BaseEntity{
     @Excel(name = "公司名称")
     private String companyName;
 
-    /** 芳华币数量 */
-    @Excel(name = "芳华币数量")
+    /** 积分数量 */
+    @Excel(name = "积分数量")
     private BigDecimal coinAmount;
 
     /** 发放时间 */

+ 2 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -465,7 +465,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
             todayTotalIntegral=0;
         }
         if (todayTotalIntegral>=config.getIntegralByOneDay()){
-            return R.error("当天芳华币已达限额");
+            return R.error("当天积分已达限额");
         }
         int rate = (int)((double)param.getDuration() / video.getDuration() * 100);
         if (rate>=90){
@@ -493,7 +493,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
 //            integralLogs.setBusinessId(video.getVideoId().toString());
 //            integralLogs.setCreateTime(new Date());
 //            fsUserIntegralLogsMapper.insertFsUserIntegralLogs(integralLogs);
-//            return R.ok("恭喜您获得"+config.getIntegralCourse()+"芳华币");
+//            return R.ok("恭喜您获得"+config.getIntegralCourse()+"积分");
         }
         return R.error("观看进度不满百分之九十");
     }

+ 5 - 0
fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoQVO.java

@@ -113,4 +113,9 @@ public class FsUserCourseVideoQVO extends BaseEntity {
 
     // 是否上架 0:上架,1:下架
     private Integer isOnPut;
+
+    /**
+     * 课程优惠券ID
+     */
+    private Long courseCouponId;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsCourseCouponMapper.java

@@ -3,6 +3,7 @@ package com.fs.his.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsCourseCoupon;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * 课程优惠券Mapper接口
@@ -58,4 +59,7 @@ public interface FsCourseCouponMapper extends BaseMapper<FsCourseCoupon>{
      * @return 结果
      */
     int deleteFsCourseCouponByIds(Long[] ids);
+
+    @Select("SELECT id,title FROM fs_course_coupon WHERE `status` = 1")
+    List<FsCourseCoupon> selectFsCourseCouponOptions();
 }

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

@@ -58,4 +58,6 @@ public interface IFsCourseCouponService extends IService<FsCourseCoupon>{
      * @return 结果
      */
     int deleteFsCourseCouponById(Long id);
+
+    List<FsCourseCoupon> selectFsCourseCouponOptions();
 }

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsCourseCouponServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.his.service.impl;
 
+import java.util.Collections;
 import java.util.List;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -92,4 +93,9 @@ public class FsCourseCouponServiceImpl extends ServiceImpl<FsCourseCouponMapper,
     {
         return baseMapper.deleteFsCourseCouponById(id);
     }
+
+    @Override
+    public List<FsCourseCoupon> selectFsCourseCouponOptions() {
+        return baseMapper.selectFsCourseCouponOptions();
+    }
 }

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

@@ -188,13 +188,13 @@ public class FsUserInvitedServiceImpl extends ServiceImpl<FsUserInvitedMapper, F
 //            }
 //        }
         //2.添加奖励
-        //2.1被邀请人获得2000芳华币
+        //2.1被邀请人获得2000积分
         FsUserAddIntegralTemplateParam invitedParam = new FsUserAddIntegralTemplateParam();
         invitedParam.setLogType(FsUserIntegralLogTypeEnum.TYPE_19.getValue());
         invitedParam.setUserId(invitedUserId);
         invitedParam.setBusinessId(userId.toString());
         R invitedR = integralLogsService.addIntegralTemplate(invitedParam);
-        //2.2邀请人A获得1000芳华币
+        //2.2邀请人A获得1000积分
         FsUserAddIntegralTemplateParam param = new FsUserAddIntegralTemplateParam();
         param.setUserId(userId);
         param.setLogType(FsUserIntegralLogTypeEnum.TYPE_18.getValue());

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

@@ -27,7 +27,7 @@ public class GetFsIntegralCartDetailsVo {
     @ApiModelProperty("所有商品所需积分之和")
     private Long goodsIntegralTotal;
 
-    @ApiModelProperty("用户的芳华币总数")
+    @ApiModelProperty("用户的积分总数")
     private BigDecimal userIntegral;
 
     @ApiModelProperty("商品信息")

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

@@ -56,7 +56,7 @@ public class GetFsIntegralCartListVo {
     @ApiModelProperty("购买的商品数量")
     private Integer cartNum;
 
-    @ApiModelProperty("用户的芳华币总数")
+    @ApiModelProperty("用户的积分总数")
     private BigDecimal userIntegral;
 
     @ApiModelProperty("是否选中:1是,0否")

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreAfterSalesScrm.java

@@ -146,6 +146,7 @@ public class FsStoreAfterSalesScrm extends BaseEntity
     /** 退款原因字典二级 ID */
     private Long reasonId2;
 
+
     /** 售后一级原因(文字,与 reason_id1 对应名称快照) */
     private String reasonLevel1Text;
 
@@ -180,4 +181,10 @@ public class FsStoreAfterSalesScrm extends BaseEntity
     @TableField(exist = false)
     private String bankTransactionId;
 
+    /**
+    * 订单类型
+    */
+    @TableField(exist = false)
+    private Integer orderType;
+
 }

+ 4 - 2
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -53,7 +53,7 @@ public interface FsStoreOrderScrmMapper
      * @return 订单集合
      */
     public List<FsStoreOrderScrm> selectFsStoreOrderList(FsStoreOrderScrm fsStoreOrder);
-    
+
         /**
          * 查询待发放购物积分的订单列表
          */
@@ -479,7 +479,9 @@ public interface FsStoreOrderScrmMapper
     List<FsPromotionOrderVO> selectFsPromotionOrderListVO(@Param("maps")FsStoreOrderParam param);
 
     @Select({"<script> " +
-            "select o.id,o.order_code,o.item_json,o.pay_price,o.status,o.is_package,o.package_json,o.delivery_id,o.finish_time,o.company_id,o.company_user_id,o.live_id  from fs_store_order_scrm o  " +
+            "select o.id,o.order_code,o.item_json,o.pay_price,o.status,o.is_package,o.package_json,o.delivery_id,o.finish_time,o.company_id," +
+            "o.company_user_id,o.live_id,o.order_type " +
+            "from fs_store_order_scrm o  " +
             "where o.is_del=0 and o.is_sys_del=0 " +
             "<if test = 'maps.status != null and maps.status != \"\"     '> " +
             "and o.status =#{maps.status} " +

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsMyStoreOrderListQueryVO.java

@@ -49,5 +49,7 @@ public class FsMyStoreOrderListQueryVO implements Serializable
 
     private Long liveId;
 
+    private Long orderType;
+
 
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreAfterSalesQueryVO.java

@@ -89,6 +89,8 @@ public class FsStoreAfterSalesQueryVO implements Serializable
 
     private Long liveId;
 
+    private Long orderType;
+
 
     List<FsStoreAfterSalesItemScrm> items;
 

+ 2 - 2
fs-service/src/main/java/com/fs/live/domain/LiveUserRedRecord.java

@@ -30,8 +30,8 @@ public class LiveUserRedRecord extends BaseEntity{
     @Excel(name = "中奖用户ID")
     private Long userId;
 
-    /** 芳华币数量 */
-    @Excel(name = "芳华币数量")
+    /** 积分数量 */
+    @Excel(name = "积分数量")
     private Long integral;
 
 

+ 22 - 22
fs-service/src/main/java/com/fs/live/service/impl/LiveRedConfServiceImpl.java

@@ -131,7 +131,7 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
             double score = localDateTime.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli();
             redisCache.redisTemplate.opsForZSet().add(cacheKey, String.valueOf(liveRedConf.getRedId()), score);
             redisCache.redisTemplate.expire(cacheKey, 30, TimeUnit.MINUTES);
-            
+
             // 将红包配置缓存到 Redis(用于高并发查询)
             String redConfCacheKey = REDPACKET_CONF_CACHE_KEY + liveRedConf.getRedId();
             redisCache.setCacheObject(redConfCacheKey, JSONUtil.toJsonStr(liveRedConf), liveRedConf.getDuration().intValue() + 5, TimeUnit.MINUTES);
@@ -243,7 +243,7 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
 //                * 4. 异步更新数据库
         String redisKey = String.format(LiveKeysConstant.LIVE_HOME_PAGE_CONFIG_RED, red.getLiveId(), red.getRedId());
         String userIdStr = String.valueOf(red.getUserId());
-        
+
         // 1. 使用 Redis HSETNX 原子操作保证幂等性(每个用户只能领取一次)
         // 先尝试在 Redis 中标记用户已领取(原子操作,保证高并发安全)
         LiveUserRedRecord record = new LiveUserRedRecord();
@@ -251,7 +251,7 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
         record.setLiveId(red.getLiveId());
         record.setUserId(red.getUserId());
         record.setCreateTime(new Date());
-        
+
         // 使用 HSETNX 原子操作:如果字段不存在则设置,返回 true;如果已存在则返回 false
         Boolean claimed = redisCache.hashPutIfAbsent(redisKey, userIdStr, "claimed");
         if (Boolean.FALSE.equals(claimed)) {
@@ -261,13 +261,13 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
         } else {
             redisCache.expire(redisKey, 24, TimeUnit.HOURS);
         }
-        
+
         try {
             // 2. 从 Redis 读取红包配置(优先从缓存读取,提高响应速度)
             String redConfCacheKey = REDPACKET_CONF_CACHE_KEY + red.getRedId();
             Object confCache = redisCache.getCacheObject(redConfCacheKey);
             LiveRedConf conf = null;
-            
+
             if (confCache != null) {
                 try {
                     conf = JSONUtil.toBean(confCache.toString(), LiveRedConf.class);
@@ -276,7 +276,7 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                     log.warn("从 Redis 缓存解析红包配置失败,从数据库读取,redId: {}", red.getRedId(), e);
                 }
             }
-            
+
             // 如果 Redis 中没有配置,从数据库读取并缓存
             if (conf == null) {
                 conf = baseMapper.selectLiveRedConfByRedId(red.getRedId());
@@ -286,14 +286,14 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                     log.debug("从数据库读取红包配置并缓存到 Redis,redId: {}", red.getRedId());
                 }
             }
-            
+
             // 验证红包状态
             if (conf == null || conf.getRedStatus() != 1) {
                 // 回滚:删除 Redis 中的标记
                 redisCache.hashDelete(redisKey, userIdStr);
                 return R.error("手慢了,红包已结束~");
             }
-            
+
             // 3. 使用 Redis 原子操作减少剩余数量
             if (getRemaining(red.getRedId()) <= 0 || !decreaseRemainingLotsIfPossible(red.getRedId())) {
                 // 回滚:删除 Redis 中的标记
@@ -307,7 +307,7 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                 redisCache.deleteObject(redConfCacheKey);
                 return R.error("手慢了,红包已被抢完~");
             }
-            
+
             // 计算积分(平均分)
             Long integral = calculateIntegralAverage(conf);
             if (0L == integral) {
@@ -315,9 +315,9 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                 redisCache.hashDelete(redisKey, userIdStr);
                 return R.error("手慢了,红包被抢完了~");
             }
-            
+
             record.setIntegral(integral);
-            
+
             // 4. 更新用户积分(同步操作,保证数据一致性)
             BigDecimal balanceAmount = BigDecimal.valueOf(integral);
             int updateResult = fsUserScrmMapper.incrIntegral(red.getUserId(), balanceAmount);
@@ -330,22 +330,22 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                 log.error("更新用户余额失败,userId: {}, balance: {}", red.getUserId(), balanceAmount);
                 return R.error("更新用户余额失败");
             }
-            
+
             // 5. 更新 Redis 缓存中的记录(包含完整信息)
             record.setCreateTime(new Date());
             redisCache.hashPut(redisKey, userIdStr, JSONUtil.toJsonStr(record));
-            
+
             // 6. 异步更新数据库(提高响应速度,不阻塞用户)
             // 查询用户当前余额(用于积分日志)
             com.fs.hisStore.domain.FsUserScrm user = fsUserScrmMapper.selectFsUserById(red.getUserId());
             Long currentIntegral = user.getIntegral() != null ? user.getIntegral() : 0L;
-            
+
 
             final LiveUserRedRecord finalRecord = record;
             final LiveRedConf finalConf = conf;
             final Long finalIntegral = integral;
             final Long finalCurrentIntegral = currentIntegral;
-            
+
         try {
             // 插入红包记录
             userRedRecordMapper.insertLiveUserRedRecord(finalRecord);
@@ -368,11 +368,11 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
             log.error("异步更新数据库失败,userId: {}, redId: {}, integral: {}", red.getUserId(), red.getRedId(), finalIntegral, e);
         }
 
-            
 
-            
-            return R.ok("恭喜您成功抢到" + integral + "芳华币");
-            
+
+
+            return R.ok("恭喜您成功抢到" + integral + "积分");
+
         } catch (Exception e) {
             // 发生异常,回滚 Redis 标记
             redisCache.hashDelete(redisKey, userIdStr);
@@ -434,7 +434,7 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                 liveUserRedRecords = hashEntries.values().stream()
                         .map(value -> JSONUtil.toBean(JSONUtil.parseObj(value), LiveUserRedRecord.class))
                         .collect(Collectors.toList());
-                
+
                 // 过滤掉已经存在于数据库中的记录(避免重复增加积分)
                 List<LiveUserRedRecord> newRecords = new ArrayList<>();
                 for (LiveUserRedRecord liveUserRedRecord : liveUserRedRecords) {
@@ -443,13 +443,13 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                     queryRecord.setUserId(liveUserRedRecord.getUserId());
                     queryRecord.setRedId(liveUserRedRecord.getRedId());
                     List<LiveUserRedRecord> existingRecords = userRedRecordMapper.selectLiveUserRedRecordList(queryRecord);
-                    
+
                     // 如果不存在,则添加到新记录列表
                     if (existingRecords == null || existingRecords.isEmpty()) {
                         newRecords.add(liveUserRedRecord);
                     }
                 }
-                
+
                 // 只插入新记录(这些记录是从 Redis 同步过来的,但还没有插入数据库)
                 // 注意:积分增加逻辑已移除,现在只能通过 claimRedPacket 方法领取红包并增加积分
                 if (CollUtil.isNotEmpty(newRecords)) {

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

@@ -675,4 +675,9 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "and remark_mobiles LIKE concat('%',#{phone},'%') " +
             "limit 1")
     QwExternalContact queryQwUserIdIsAddContact(@Param("qwUserId") Long qwUserId, @Param("phone") String phone, @Param("addWay") int addWay);
+
+    /**
+     * 同主体下指定外部联系人的全部跟进记录
+     */
+    List<QwRepeatRecordListVO> selectRepeatRecordList(RepeatRecordListParam param);
 }

+ 26 - 0
fs-service/src/main/java/com/fs/qw/param/RepeatRecordListParam.java

@@ -0,0 +1,26 @@
+package com.fs.qw.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 重粉跟进记录列表查询参数
+ */
+@Data
+public class RepeatRecordListParam {
+
+    /** 企微主体id(必填) */
+    @NotBlank(message = "企微主体id不能为空")
+    private String corpId;
+
+    /** 外部联系人ID(必填) */
+    @NotBlank(message = "外部联系人id不能为空")
+    private String externalUserId;
+
+    /** 企微销售id(可选) */
+    private String qwUserId;
+
+    /** 企微销售昵称(可选,模糊) */
+    private String qwUserName;
+}

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

@@ -253,6 +253,11 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
     void updateQwExternalContactStatusById(QwExternalContact qwExternalContact);
 
     R getRepeat(RepeatParam param);
+
+    /**
+     * 同主体下指定外部联系人的全部跟进记录(分页由调用方 startPage)
+     */
+    List<QwRepeatRecordListVO> selectRepeatRecordList(RepeatRecordListParam param);
     List<QwExternalContactVO> selectQwExternalContactListVONewSys(QwExternalContactParam qwExternalContact);
     /**
      * 根据qw_user_id+crop_id+external_user_id查询外部联系人信息

+ 1 - 1
fs-service/src/main/java/com/fs/qw/service/impl/LuckyBagServiceImpl.java

@@ -135,7 +135,7 @@ public class LuckyBagServiceImpl implements ILuckyBagService
 
         FsUserIntegralLogs fsUserIntegralLogs = new FsUserIntegralLogs();
         fsUserIntegralLogs.setUserId(userId);
-        fsUserIntegralLogs.setLogType(30); // 福袋获取获得芳华币
+        fsUserIntegralLogs.setLogType(30); // 福袋获取获得积分
         fsUserIntegralLogs.setIntegral(coinAmount);
         fsUserIntegralLogs.setPhone(user.getPhone());
         fsUserIntegralLogs.setBalance(balance);

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -6034,6 +6034,11 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return qwExternalContactMapper.selectQwExternalContactByExternalUserIdSidebar(param);
     }
 
+    @Override
+    public List<QwRepeatRecordListVO> selectRepeatRecordList(RepeatRecordListParam param) {
+        return qwExternalContactMapper.selectRepeatRecordList(param);
+    }
+
     @Override
     public R getRepeat(RepeatParam param) {
         List<QwExternalContact> list = qwExternalContactMapper.selectList(new QueryWrapper<QwExternalContact>().eq("external_user_id", param.getExternalUserId()));

+ 33 - 0
fs-service/src/main/java/com/fs/qw/vo/QwRepeatRecordListVO.java

@@ -0,0 +1,33 @@
+package com.fs.qw.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 外部联系人跟进记录列表
+ */
+@Data
+public class QwRepeatRecordListVO {
+
+    private String corpId;
+
+    private String externalUserId;
+
+    /** 企微客户昵称 */
+    private String externalUserName;
+
+    private String qwUserId;
+
+    private String qwUserName;
+
+    /** 企微部门名称 */
+    private String deptName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date registerTime;
+}

+ 5 - 0
fs-service/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml

@@ -40,6 +40,7 @@
         <result property="projectId"    column="project_id"    />
         <result property="isFirst"    column="is_first"    />
         <result property="courseIntroImg"    column="course_intro_img"    />
+        <result property="courseCouponId"    column="course_coupon_id"    />
     </resultMap>
 
     <sql id="selectFsUserCourseVideoVo">
@@ -118,6 +119,7 @@
             <if test="jobId != null">job_id,</if>
             <if test="vid != null">vid,</if>
             <if test="courseIntroImg != null">course_intro_img,</if>
+            <if test="courseCouponId != null">course_coupon_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="fileId != null">#{fileId},</if>
@@ -163,6 +165,7 @@
             <if test="jobId != null">#{jobId},</if>
             <if test="vid != null">#{vid},</if>
             <if test="courseIntroImg != null">#{courseIntroImg},</if>
+            <if test="courseCouponId != null">#{courseCouponId},</if>
         </trim>
     </insert>
     <insert id="insertBatchFsUserCourseVideo" parameterType="FsUserCourseVideo" useGeneratedKeys="true" keyProperty="videoId">
@@ -259,6 +262,8 @@
             <if test="vid != null">vid = #{vid},</if>
             <if test="courseIntroImg != null">course_intro_img = #{courseIntroImg},</if>
             <if test="courseIntroImg == null">course_intro_img = null,</if>
+            <if test="courseCouponId != null">course_coupon_id = #{courseCouponId},</if>
+            <if test="courseCouponId == null">course_coupon_id = null,</if>
         </trim>
         where video_id = #{videoId}
     </update>

+ 6 - 2
fs-service/src/main/resources/mapper/hisStore/FsStoreAfterSalesScrmMapper.xml

@@ -37,7 +37,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectFsStoreAfterSalesVo">
-        select id, order_code, refund_amount, service_type, reasons, explains, explain_img, shipper_code, delivery_sn, delivery_name, status, sales_status ,order_status, create_time, is_del, user_id, consignee, phone_number, address,company_id,company_user_id,is_package,package_json,reason_id1,reason_id2,reason_level1_text,reason_level2_text,audit_remark,audit_reason_name from fs_store_after_sales_scrm
+        select id, order_code, refund_amount, service_type, reasons, explains, explain_img, shipper_code, delivery_sn, delivery_name, status, sales_status
+               ,order_status, create_time, is_del, user_id, consignee, phone_number, address,company_id,company_user_id,is_package,package_json,reason_id1
+             ,reason_id2,reason_level1_text,reason_level2_text,audit_remark,audit_reason_name
+        from fs_store_after_sales_scrm
     </sql>
 
     <select id="selectFsStoreAfterSalesList" parameterType="FsStoreAfterSalesScrm" resultMap="FsStoreAfterSalesResult">
@@ -99,7 +102,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         a1.reason_level2_text,
         a1.audit_remark,
         a1.audit_reason_name,
-        a2.live_id as liveId
+        a2.live_id as liveId,
+        a2.order_type
         from fs_store_after_sales_scrm a1
         left join fs_store_order_scrm a2
         on a1.order_code = a2.order_code

+ 25 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -829,4 +829,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         and fs_user_id is not null and company_user_id is not null and qw_user_id is not null
         limit 1
     </select>
+
+    <select id="selectRepeatRecordList" resultType="com.fs.qw.vo.QwRepeatRecordListVO">
+        select ec.corp_id as corpId,
+               ec.external_user_id as externalUserId,
+               ec.name as externalUserName,
+               qu.qw_user_id as qwUserId,
+               qu.qw_user_name as qwUserName,
+               qd.dept_name as deptName,
+               ec.create_time as createTime,
+               ec.register_time as registerTime
+        from qw_external_contact ec
+        left join qw_user qu on ec.user_id = qu.qw_user_id and qu.corp_id = ec.corp_id
+        left join qw_dept qd on qd.dept_id = qu.department and qd.corp_id = qu.corp_id
+        <where>
+            ec.corp_id = #{corpId}
+            and ec.external_user_id = #{externalUserId}
+            <if test="qwUserId != null and qwUserId != ''">
+                and ec.user_id = #{qwUserId}
+            </if>
+            <if test="qwUserName != null and qwUserName != ''">
+                and qu.qw_user_name like concat('%', #{qwUserName}, '%')
+            </if>
+        </where>
+        order by ec.create_time desc
+    </select>
 </mapper>

+ 4 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/StoreAfterSalesScrmController.java

@@ -103,6 +103,10 @@ public class StoreAfterSalesScrmController extends AppBaseController {
     @ApiOperation(value = "获取售后详情", notes = "获取售后详情")
     public R getAfterSalesDetails(@RequestParam("salesId") Long id) {
         FsStoreAfterSalesScrm sales=storeAfterSalesService.selectFsStoreAfterSalesById(id);
+
+        FsStoreOrderScrm fsStoreOrderScrm = orderService.selectFsStoreOrderByOrderCode(sales.getOrderCode());
+        sales.setOrderType(fsStoreOrderScrm.getOrderType());
+
         FsStoreAfterSalesItemScrm map=new FsStoreAfterSalesItemScrm();
         map.setStoreAfterSalesId(id);
         List<FsStoreAfterSalesItemScrm>  items=salesItemService.selectFsStoreAfterSalesItemList(map);

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.