瀏覽代碼

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

yys 1 周之前
父節點
當前提交
c107afb038
共有 18 個文件被更改,包括 368 次插入36 次删除
  1. 12 0
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java
  2. 10 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  3. 40 0
      fs-company-app/src/main/java/com/fs/app/controller/app/ImController.java
  4. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  5. 80 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  6. 3 0
      fs-service/src/main/java/com/fs/company/vo/CompanyVO.java
  7. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java
  8. 3 3
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  9. 6 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  10. 3 1
      fs-service/src/main/java/com/fs/im/service/OpenIMService.java
  11. 64 2
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  12. 1 1
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  13. 22 22
      fs-service/src/main/java/com/fs/live/service/impl/LiveRedConfServiceImpl.java
  14. 13 0
      fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml
  15. 1 2
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  16. 40 0
      fs-user-app/src/main/java/com/fs/app/controller/app/ImController.java
  17. 52 3
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveGiftController.java
  18. 14 0
      fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

+ 12 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java

@@ -354,4 +354,16 @@ public class FsCompanyController extends BaseController {
         if (value.isEmpty())return true;
         return false;
     }
+
+    /**
+     * 公司分账配置
+     */
+    @PreAuthorize("@ss.hasPermi('company:company:changeMerchant')")
+    @Log(title = "红包商户配置", businessType = BusinessType.UPDATE)
+    @PostMapping("/changeMerchant")
+    public R changeMerchant(@RequestBody CompanyVO companyVO)
+    {
+        return companyService.changeMerchant(companyVO);
+    }
+
 }

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

@@ -41,6 +41,7 @@ import com.fs.his.service.IFsStoreOrderDfService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.service.impl.FsDfAccountServiceImpl;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsStoreOrderListAndStatisticsVo;
 import com.fs.his.vo.FsStoreOrderListVO;
 import com.fs.hisStore.config.FsErpConfig;
@@ -645,7 +646,12 @@ public class FsStoreOrderScrmController extends BaseController {
     @GetMapping(value = "/{id}")
     public R getInfo(@PathVariable("id") Long id) {
         FsStoreOrderScrm order = fsStoreOrderService.selectFsStoreOrderById(id);
-        order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
+        // 电话号码解密
+        String phone=order.getUserPhone();
+        if(StringUtils.isNotBlank(phone) && phone.endsWith("==")){ // 加密手机号,解密
+            phone= PhoneUtil.decryptPhone( phone);
+        }
+        order.setUserPhone(ParseUtils.parsePhone(phone));
         order.setUserAddress(ParseUtils.parseAddress(order.getUserAddress()));
         FsUser user = userService.selectFsUserById(order.getUserId());
         if (user != null) {
@@ -687,6 +693,9 @@ public class FsStoreOrderScrmController extends BaseController {
     {
         FsStoreOrderScrm order = fsStoreOrderService.selectFsStoreOrderById(id);
         String userPhone = order.getUserPhone();
+        if(StringUtils.isNotBlank(userPhone) && userPhone.endsWith("==")){ // 加密手机号,解密
+            userPhone= PhoneUtil.decryptPhone( userPhone);
+        }
         return R.ok().put("userPhone",userPhone);
     }
 

+ 40 - 0
fs-company-app/src/main/java/com/fs/app/controller/app/ImController.java

@@ -0,0 +1,40 @@
+package com.fs.app.controller.app;
+
+import com.fs.common.core.domain.R;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+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.RestController;
+
+/**
+ * @description: im 相关接口
+ * @author: Xgb
+ * @createDate: 2026/4/3
+ * @version: 1.0
+ */
+@Api("im 相关接口")
+@RestController
+@RequestMapping(value = "/app/im")
+@Slf4j
+public class ImController {
+
+    @Autowired
+    private OpenIMService openIMService;
+    /**
+     * @Description: 查询用户信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/4/3 15:45
+     */
+    @GetMapping("/getUserInfo")
+    public R getUserInfo(String id) {
+        OpenImResponseDTO responseDTO = openIMService.getUserInfo(id);
+        return R.ok().put("data",responseDTO);
+    }
+
+}

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -203,4 +203,6 @@ public interface ICompanyService
     R checkMchTransferStatusByBatchID(String batchId, Long companyId, String appId);
 
     void deleteRedPacketLogBatch();
+
+    R changeMerchant(CompanyVO companyVO);
 }

+ 80 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -10,6 +10,7 @@ import java.util.stream.Collectors;
 
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
@@ -64,12 +65,12 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionTemplate;
-
 import static com.fs.company.service.impl.CompanyMiniappServiceImpl.GET_MINI_APP_STR;
 
 /**
@@ -82,9 +83,13 @@ import static com.fs.company.service.impl.CompanyMiniappServiceImpl.GET_MINI_APP
 public class CompanyServiceImpl implements ICompanyService
 {
     Logger logger= LoggerFactory.getLogger(getClass());;
+
+    private static final String REDIS_KEY_PREFIX = "red_packet_config:";
     @Autowired
     private CompanyMapper companyMapper;
     @Autowired
+    private CompanyConfigMapper companyConfigMapper;
+    @Autowired
     private ICompanyMiniappService companyMiniappService;
     @Autowired
     private CompanyDeptMapper deptMapper;
@@ -122,6 +127,9 @@ public class CompanyServiceImpl implements ICompanyService
 
     @Autowired
     private RedisCache redisCache;
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
 
     @Autowired
     private RedissonClient redissonClient;
@@ -398,6 +406,70 @@ public class CompanyServiceImpl implements ICompanyService
         }
     }
 
+    @Override
+    public R changeMerchant(CompanyVO companyVO) {
+        // 长春张磊的不允许换 自用交易写死
+        if("20".equals(companyVO.getCompanyId().toString())){
+            return R.error("该公司不允许换商户!");
+        }
+
+        CompanyConfig companyConfig =companyConfigMapper.selectCompanyConfigByKey(companyVO.getCompanyId(),"redPacket:config");
+
+        String updateKey=REDIS_KEY_PREFIX + companyVO.getCompanyId();
+        // 小艾的商户
+        if("1103448555".equals(companyVO.getRedPacketMerchant())){
+            String redisKey = REDIS_KEY_PREFIX + 20;
+            String json = redisTemplate.opsForValue().get(redisKey);
+            if(json!=null){
+                RedPacketConfig config = JSONUtil.toBean(json, RedPacketConfig.class);
+                String url = config.getNotifyUrl();
+                url=url.substring(0,url.lastIndexOf("/")+1)+companyVO.getCompanyId();
+                config.setNotifyUrl(url);
+                redisTemplate.opsForValue().set(updateKey,JSONUtil.toJsonStr(config));
+
+                if(companyConfig!=null){
+                    // 更新数据库
+                    CompanyConfig updateConfig= new CompanyConfig();
+                    updateConfig.setCompanyId(companyVO.getCompanyId());
+                    updateConfig.setConfigId(companyConfig.getConfigId());
+                    updateConfig.setConfigValue(JSONUtil.toJsonStr(config));
+                    companyConfigMapper.updateCompanyConfig(updateConfig);
+                }else {
+                    CompanyConfig save=new CompanyConfig();
+                    save.setCompanyId(companyVO.getCompanyId());
+                    save.setConfigKey("redPacket:config");
+                    save.setConfigValue(JSONUtil.toJsonStr(config));
+                    save.setConfigType("N");
+                    companyConfigMapper.insertCompanyConfig( save);
+                }
+            }
+        }else if("1700010711".equals(companyVO.getRedPacketMerchant())){
+            if(redisCache.getCacheObject(updateKey) != null){
+                redisCache.deleteObject(updateKey);
+                if(companyConfig!=null){
+                    // 更新数据库
+                    CompanyConfig updateConfig= new CompanyConfig();
+                    updateConfig.setCompanyId(companyVO.getCompanyId());
+                    updateConfig.setConfigId(companyConfig.getConfigId());
+                    updateConfig.setConfigValue("");
+                    companyConfigMapper.updateCompanyConfig(updateConfig);
+                }else {
+                    CompanyConfig save=new CompanyConfig();
+                    save.setCompanyId(companyVO.getCompanyId());
+                    save.setConfigKey("redPacket:config");
+                    save.setConfigValue("");
+                    save.setConfigType("N");
+                    companyConfigMapper.insertCompanyConfig( save);
+                }
+            }
+
+        }else {
+            return R.error("该商户不存在");
+        }
+
+        return R.ok();
+    }
+
 
     public static void main(String[] args) {
         LocalDateTime threeMonthsAgo = LocalDateTime.now().minusMonths(3);
@@ -1009,6 +1081,13 @@ public class CompanyServiceImpl implements ICompanyService
                 companyVO.setRedPackageMoney(new BigDecimal(redPackageMoney));
 
             }
+            // 返回红包商户
+            String redisKey = REDIS_KEY_PREFIX + companyVO.getCompanyId();
+            String jsonStr = redisTemplate.opsForValue().get(redisKey);
+            if(jsonStr != null && !jsonStr.isEmpty()){
+                RedPacketConfig  config = JSONUtil.toBean(jsonStr, RedPacketConfig.class);
+                companyVO.setRedPacketMerchant(config.getMchId());
+            }
         });
         return companyVOList;
     }

+ 3 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyVO.java

@@ -107,4 +107,7 @@ public class CompanyVO implements Serializable
 
     // 控制休息提示是否打开要暂停  0-关闭 1-打开 null-默认打开
     private Integer isOpenRestReminder;
+
+    // 红包商户号
+    private String redPacketMerchant;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java

@@ -125,4 +125,6 @@ public interface FsUserCompanyUserMapper extends BaseMapper<FsUserCompanyUser>{
     List<CompanyRedPacketStatisticsVO> selectSalesUserCount(CompanyStatisticsParam param);
 
     List<CompanyRedPacketStatisticsVO> selectSalesNewUserCount(CompanyStatisticsParam param);
+
+    int updateFriendStatus(FsUserCompanyUser update);
 }

+ 3 - 3
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -149,7 +149,7 @@ public interface FsStoreProductScrmMapper
             " <if test='maps.precautions != null and maps.precautions != \"\"'>" +
             "     AND p.precautions LIKE CONCAT('%', #{maps.precautions}, '%')" +
             " </if>"+
-            " order by p.product_id desc "+
+            " order by p.sort  "+
             "</script>"})
     List<FsStoreProductListVO> selectFsStoreProductListVO(@Param("maps") FsStoreProductScrm fsStoreProduct);
 
@@ -176,7 +176,7 @@ public interface FsStoreProductScrmMapper
             "<if test = 'maps.isShow != null    '> " +
             "and p.is_show =#{maps.isShow} " +
             "</if>" +
-            " order by p.product_id desc "+
+            " order by p.sort "+
             "</script>"})
     List<FsStoreProductListVO> selectFsStoreProductBarCodeListVO(@Param("maps") FsStoreProductScrm fsStoreProduct);
 
@@ -232,7 +232,7 @@ public interface FsStoreProductScrmMapper
             "</if>" +
 
             "<if test = 'maps.newOrder != null and maps.newOrder==\"desc\" '> " +
-            "and p.is_new =1 order by p.create_time desc  " +
+            "and p.is_new =1  order by p.sort desc  " +
             "</if>" +
             "</script>"})
     List<FsStoreProductListQueryVO> selectFsStoreProductListQuery(@Param("maps")FsStoreProductQueryParam param);

+ 6 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -1027,6 +1027,12 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductListQuery(FsStoreProductQueryParam param) {
+        //  设置默认排序
+        if(StringUtils.isBlank(param.getDefaultOrder()) && StringUtils.isBlank(param.getNewOrder())
+         && StringUtils.isBlank(param.getPriceOrder()) && StringUtils.isBlank(param.getSalesOrder())){
+            param.setDefaultOrder("desc");
+        }
+
         boolean stores = medicalMallConfig.isStores();
         param.setIsStores(stores?1:0);
         // 蒙一堂特殊产品展示

+ 3 - 1
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -46,7 +46,7 @@ public interface OpenIMService {
      * @param friendUserID 待删除的好友
      * @return
      */
-    OpenImResponseDTO deleteUserInfo(String ownerUserID,String friendUserID);
+    R deleteUserInfo(String ownerUserID,String friendUserID);
 
     OpenImResponseDTO sendPackageUtil(String sendID, String recvID, Integer contentType, String payloadData,String packageName,String packageId);
 
@@ -114,4 +114,6 @@ public interface OpenIMService {
 
 
     void sendSystemMsgAsync(String userId, String text, String title);
+
+    OpenImResponseDTO getUserInfo(String id);
 }

+ 64 - 2
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -477,10 +478,11 @@ public class OpenIMServiceImpl implements OpenIMService {
     }
 
     @Override
-    public OpenImResponseDTO deleteUserInfo(String ownerUserID,String friendUserID) {
+    public R deleteUserInfo(String ownerUserID,String friendUserID) {
         OpenImResponseDTO responseDTO = null;
         String adminToken = getAdminToken();
         //删除好友
+
         Map<String, Object> bodyMap = new HashMap<>();
         bodyMap.put("ownerUserID", ownerUserID);
         bodyMap.put("friendUserID", friendUserID);
@@ -492,6 +494,18 @@ public class OpenIMServiceImpl implements OpenIMService {
                 .execute()
                 .body();
 
+        // 反过来再删除一次,确保双向好友关系都解除
+        Map<String, Object> bodyMap2 = new HashMap<>();
+        bodyMap2.put("ownerUserID", friendUserID);
+        bodyMap2.put("friendUserID", ownerUserID);
+        String jsonBody2 = JSONUtil.toJsonStr(bodyMap2);
+        String result2 = HttpRequest.post(IMConfig.URL+"/friend/delete_friend")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .body(jsonBody2)
+                .execute()
+                .body();
+
       /*  //增加黑名单
         Map<String, Object> bodyMap1 = new HashMap<>();
         bodyMap1.put("ownerUserID", ownerUserID);
@@ -504,7 +518,36 @@ public class OpenIMServiceImpl implements OpenIMService {
                 .execute()
                 .body();*/
         responseDTO= JSONUtil.toBean(result1,OpenImResponseDTO.class);
-        return responseDTO;
+        if(responseDTO.getErrCode()==0){
+            // 如果 有销售关系 需要解除看课记录关系
+            if((ownerUserID.startsWith("U") && friendUserID.startsWith("C")) ||
+                    (ownerUserID.startsWith("C") && friendUserID.startsWith("U")) ){
+                Long companyUserId;
+                Long userId;
+                String remark;
+                if(ownerUserID.startsWith("C")){
+                    companyUserId=Long.parseLong(ownerUserID.replace("C",""));
+                    userId=Long.parseLong(friendUserID.replace("U",""));
+                    remark="销售解除用户好友关系";
+                }else {
+                    companyUserId=Long.parseLong(friendUserID.replace("C",""));
+                    userId=Long.parseLong(ownerUserID.replace("U",""));
+                    remark="用户解除销售好友关系";
+                }
+
+                FsUserCompanyUser update=new FsUserCompanyUser();
+                update.setStatus(2);
+                update.setUserId(userId);
+                update.setCompanyUserId(companyUserId);
+                update.setRemark(remark);
+                fsUserCompanyUserMapper.updateFriendStatus(update);
+
+            }
+        }else {
+            log.error("删除好友失败:{}",responseDTO.getErrMsg());
+            return R.error(responseDTO.getErrMsg());
+        }
+        return R.ok();
     }
 
     @Data
@@ -1916,4 +1959,23 @@ public class OpenIMServiceImpl implements OpenIMService {
             log.error("异步发送系统消息失败:userId={}, error={}", userId, e.getMessage(), e);
         }
     }
+
+    @Override
+    public OpenImResponseDTO getUserInfo(String id) {
+        // 是数字的话默认用户
+        if(id.matches("\\d+")){
+            id = "U"+id;
+        }
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("userIDs", Collections.singletonList(id));
+            String body = HttpRequest.post(IMConfig.URL+"/user/get_users_info")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+    }
 }

+ 1 - 1
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -4603,7 +4603,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         liveOrder.setStatus(OrderInfoEnum.STATUS_0.getValue());
         liveOrder.setPayType("1");
         liveOrder.setTotalPrice(payPrice);
-        liveOrder.setPayMoney(payPrice);
+        liveOrder.setPayMoney(payPrice.subtract(liveOrder.getDiscountMoney()));
         liveOrder.setPayPrice(payPrice.subtract(liveOrder.getDiscountMoney()));
         try {
             if (baseMapper.insertLiveOrder(liveOrder) > 0) {

+ 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)) {

+ 13 - 0
fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml

@@ -272,4 +272,17 @@
         </if>
         group by ucu.company_user_id
     </select>
+
+    <update id="updateFriendStatus">
+        update fs_user_company_user
+        <set>
+            <if test="status != null">
+                status = #{status},
+            </if>
+            <if test="remark != null">
+                remark = #{remark},
+            </if>
+        </set>
+        where user_id = #{userId} and company_user_id = #{companyUserId}
+    </update>
 </mapper>

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

@@ -1115,8 +1115,7 @@ public class AppLoginController extends AppBaseController{
     public R deleteUserInfo(@RequestBody HashMap<String,String> map){
         String ownerUserID = map.get("ownerUserID");
         String friendUserID =map.get("friendUserID");
-        OpenImResponseDTO openImResponseDTO = openIMService.deleteUserInfo(ownerUserID, friendUserID);
-        return R.ok().put("data",openImResponseDTO);
+        return  openIMService.deleteUserInfo(ownerUserID, friendUserID);
     }
 
 }

+ 40 - 0
fs-user-app/src/main/java/com/fs/app/controller/app/ImController.java

@@ -0,0 +1,40 @@
+package com.fs.app.controller.app;
+
+import com.fs.common.core.domain.R;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+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.RestController;
+
+/**
+ * @description: im 相关接口
+ * @author: Xgb
+ * @createDate: 2026/4/3
+ * @version: 1.0
+ */
+@Api("im 相关接口")
+@RestController
+@RequestMapping(value = "/app/im")
+@Slf4j
+public class ImController {
+
+    @Autowired
+    private OpenIMService openIMService;
+    /**
+     * @Description: 查询用户信息
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2026/4/3 15:45
+     */
+    @GetMapping("/getUserInfo")
+    public R getUserInfo(String id) {
+        OpenImResponseDTO responseDTO = openIMService.getUserInfo(id);
+        return R.ok().put("data",responseDTO);
+    }
+
+}

+ 52 - 3
fs-user-app/src/main/java/com/fs/app/controller/live/LiveGiftController.java

@@ -1,13 +1,62 @@
 package com.fs.app.controller.live;
 
+import com.fs.app.annotation.Login;
+import com.fs.app.controller.AppBaseController;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.his.domain.FsUser;
+import com.fs.his.service.IFsUserService;
+import com.fs.live.domain.LiveGift;
+import com.fs.live.domain.LiveUserGift;
+import com.fs.live.service.ILiveGiftService;
+import com.fs.live.service.ILiveUserGiftService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
+import java.util.List;
+
 @RestController
 @RequestMapping("/app/live/liveGift")
-public class LiveGiftController {
+public class LiveGiftController extends AppBaseController {
+
+    @Autowired
+    private ILiveUserGiftService liveUserGiftService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IFsUserService fsUserService;
 
     /**
-     * 送礼物
-     * */
+     *给直播间送礼物
+     */
+    @Login
+    @PostMapping("/send")
+    @Transactional
+    public String send(@RequestBody LiveUserGift liveUserGift) {
+        liveUserGift.setUserId(Long.parseLong(getUserId()));
+        long giftValue;
+        List<LiveGift> liveGifts = redisCache.getCacheList("liveGift");
+        LiveGift liveGift = liveGifts.stream().filter(gift ->
+                        gift.getGiftId().equals(liveUserGift.getGiftId()))
+                .findFirst().orElse(null);
+        if (liveGift == null) {
+            return "礼物信息不存在";
+        }else{
+            giftValue = liveGift.getPrice().longValue() * liveUserGift.getCn();
+        }
+        FsUser user=fsUserService.selectFsUserById(liveUserGift.getUserId());
+        if (user.getIntegral().longValue() < giftValue) {
+            return "账户余额不足";
+        }
+        Long integral=BigDecimal.valueOf(user.getIntegral()).subtract(BigDecimal.valueOf(giftValue)).longValue();
+        user.setIntegral(integral);
+        fsUserService.updateFsUser(user);
+        return liveUserGiftService.save(liveUserGift)?"赠送礼物成功":"赠送礼物失败";
+    }
 }

+ 14 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -1,11 +1,13 @@
 package com.fs.app.controller.store;
 
 
+import cn.hutool.json.JSONUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.controller.AppBaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.param.BaseQueryParam;
 import com.fs.common.utils.StringUtils;
+import com.fs.course.config.AppConfig;
 import com.fs.erp.service.IErpGoodsService;
 import com.fs.hisStore.domain.*;
 import com.fs.hisStore.param.*;
@@ -19,6 +21,8 @@ import com.fs.hisStore.domain.FsStoreOrderItemScrm;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.HashMap;
+
+import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -65,6 +69,9 @@ public class ProductScrmController extends AppBaseController {
 
     @Autowired
     private IFsStoreOrderItemScrmService orderItemService;
+
+    @Autowired
+    private ISysConfigService configService;
     /**
      * 获取用户信息
      * @param storeId
@@ -102,6 +109,13 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取商品列表")
     @GetMapping("/getProducts")
     public R getProducts(FsStoreProductQueryParam param, HttpServletRequest request){
+        String sourcetype=request.getHeader("sourcetype");
+        if("APP".equals(sourcetype)){
+            // 获取当前appid
+            String appJson = configService.selectConfigByKey("app.config");
+            AppConfig app = JSONUtil.toBean(appJson, AppConfig.class);
+            param.setAppId(app.getAppId());
+        }
         PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setIsDisplay(1);
         List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductListQuery(param);