소스 검색

app的积分商品购物车/还有IM的加好友

三七 2 주 전
부모
커밋
e376441c48
22개의 변경된 파일639개의 추가작업 그리고 26개의 파일을 삭제
  1. 2 0
      fs-service/src/main/java/com/fs/course/param/FsUserVideoListUParam.java
  2. 9 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  3. 146 4
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  4. 12 0
      fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java
  5. 11 0
      fs-service/src/main/java/com/fs/his/domain/FsUser.java
  6. 4 4
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralGoodsMapper.java
  7. 18 0
      fs-service/src/main/java/com/fs/his/param/CreateOrderFromCartParm.java
  8. 3 0
      fs-service/src/main/java/com/fs/his/service/IFsIntegralCartService.java
  9. 128 13
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralCartServiceImpl.java
  10. 50 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralGoodsVo.java
  11. 3 0
      fs-service/src/main/java/com/fs/his/vo/GetCartGoodsDetailsVo.java
  12. 7 0
      fs-service/src/main/java/com/fs/his/vo/GetFsIntegralCartListVo.java
  13. 10 0
      fs-service/src/main/java/com/fs/im/service/OpenIMService.java
  14. 71 0
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  15. 3 3
      fs-service/src/main/resources/mapper/his/FsIntegralCartMapper.xml
  16. 7 0
      fs-service/src/main/resources/mapper/his/FsIntegralGoodsMapper.xml
  17. 10 0
      fs-service/src/main/resources/mapper/his/FsIntegralOrderMapper.xml
  18. 1 1
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  19. 77 1
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  20. 11 0
      fs-user-app/src/main/java/com/fs/app/controller/FsIntegralCartController.java
  21. 31 0
      fs-user-app/src/main/java/com/fs/app/param/Pagination.java
  22. 25 0
      fs-user-app/src/main/java/com/fs/app/param/UserRequestParam.java

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsUserVideoListUParam.java

@@ -12,4 +12,6 @@ public class FsUserVideoListUParam extends BaseParam implements Serializable {
 
     Long videoId;
 
+    String keyword;
+
 }

+ 9 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.domain.LuckyBagCollectRecord;
 import com.fs.course.param.*;
 import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
 import com.fs.course.param.newfs.FsUserCourseVideoLinkParam;
@@ -274,4 +275,12 @@ public interface IFsUserCourseVideoService extends IService<FsUserCourseVideo> {
     ResponseResult<FsUserCourseVideoLinkDetailsVO> getXiaoShouYiCourseVideoDetails(FsUserCourseVideoLinkParam param);
 
     R registerQwFsUserFinish(FsUserCourseVideoAddKfUParam param);
+
+
+    /**
+     * 创建app福袋
+     * @param param
+     * @return
+     */
+    R createAppFd(LuckyBagCollectRecord param);
 }

+ 146 - 4
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -71,10 +72,7 @@ import com.fs.qw.domain.*;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
-import com.fs.qw.mapper.QwExternalContactMapper;
-import com.fs.qw.mapper.QwGroupChatMapper;
-import com.fs.qw.mapper.QwGroupChatUserMapper;
-import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.mapper.*;
 import com.fs.qw.param.FsUserCourseRedPageParam;
 import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwExternalContactService;
@@ -132,6 +130,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     @Value("${isNewWxMerchant}")
     private Boolean isNewWxMerchant;
 
+    @Autowired
+    private LuckyBagMapper luckyBagMapper;
+
+    @Autowired
+    private LuckyBagCollectRecordMapper luckyBagCollectRecordMapper;
     @Autowired
     private OpenIMService openIMService;
     @Autowired
@@ -4770,5 +4773,144 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
 
         return R.ok();
     }
+
+    @Override
+    public R createAppFd(LuckyBagCollectRecord param) {
+
+        try {
+            CompanyUser companyUser = companyUserMapper.selectCompanyUserByCompanyUserId(param.getCompanyUserId());
+            if (companyUser==null||companyUser.getCompanyId()==null||companyUser.getUserId()==null){
+                return R.error("员工不存在!");
+            }
+
+            Company company = companyMapper.selectCompanyById(param.getCompanyId());
+            if (company == null ) {
+                return  R.error().put("msg","企业不存在,请联系管理员");
+            }
+            String course = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSON.parseObject(course, CourseConfig.class);
+            LocalDateTime sendDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+            LocalDateTime expireDateTime = sendDateTime.plusDays(config.getVideoLinkExpireDate() - 1);
+            expireDateTime = expireDateTime.toLocalDate().atTime(23, 59, 59);
+            Date updateTime = Date.from(expireDateTime.atZone(ZoneId.systemDefault()).toInstant());
+
+            Map<String,Object> business = addLuckyBagCollectRecord(param.getLuckyBagId(),param.getUserId(),updateTime,String.valueOf(param.getCompanyUserId()),String.valueOf(param.getCompanyId()));
+            String json = configService.selectConfigByKey("luckyBag.config");
+            Map<String, Object> luckyBagConfig = JSON.parseObject(json, Map.class);
+            business.put("img",luckyBagConfig.get("miniprogramPicUrl"));
+            return R.ok().put("data",business);
+        }catch (Exception e){
+            e.printStackTrace();
+            return R.error("发放福袋失败!");
+        }
+    }
+
+
+    private Map<String,Object> addLuckyBagCollectRecord(Long luckyBagId,
+                                                        Long userId,
+                                                        Date sendTime,
+                                                        String companyUserId,
+                                                        String companyId) {
+        try {
+
+            if (StringUtils.isEmpty(companyId) || StringUtils.isEmpty(companyUserId)) {
+                log.warn("公司ID或用户ID为空 [companyId:{}, companyUserId:{}]", companyId, companyUserId);
+                return null;
+            }
+
+            // 验证福袋ID
+            if (luckyBagId == null) {
+                log.warn("福袋ID为空");
+                return null;
+            }
+
+            // 查询福袋信息
+            LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(luckyBagId);
+            if (luckyBag == null) {
+                log.warn("未找到对应的福袋信息 [luckyBagId:{}]", luckyBagId);
+                return null;
+            }
+
+            // 检查福袋状态
+            if (luckyBag.getDataStatus() != null && luckyBag.getDataStatus().equals(0)) {
+                log.warn("福袋被禁用 [luckyBagId:{}]", luckyBagId);
+                return null;
+            }
+
+            // 查询公司信息
+            Company company = companyMapper.selectCompanyById(Long.valueOf(companyId));
+            if (company == null) {
+                log.warn("未找到对应的公司信息 [companyId:{}]", companyId);
+                return null;
+            }
+
+            LuckyBagCollectRecord luckyBagCollectRecord = buildLuckyBagRecord(luckyBagId,userId,sendTime,
+                    companyUserId, companyId, company, luckyBag);
+
+            // 插入记录并返回ID
+            int result = luckyBagCollectRecordMapper.insertLuckyBagCollectRecord(luckyBagCollectRecord);
+            if (result <= 0) {
+                log.warn("福袋记录插入失败 [luckyBagId:{}]", luckyBagId);
+                return null;
+            }
+
+            // 返回新增记录的ID
+            Long recordId = luckyBagCollectRecord.getId();
+            if (recordId == null) {
+                log.warn("福袋记录插入成功但未返回ID [luckyBagId:{}]", luckyBagId);
+                return null;
+            }
+
+            log.info("福袋记录添加成功 [recordId:{}, luckyBagId:{}]", recordId, luckyBagId);
+            Map<String,Object> map = new HashMap<>();
+            map.put("recordId",recordId);
+            map.put("luckyBag",luckyBag);
+            return map;
+
+        } catch (NumberFormatException e) {
+            log.error("ID转换失败 [companyId:{}, companyUserId:{}]", companyId, companyUserId, e);
+            return null;
+        } catch (Exception e) {
+            log.error("ID:" + (luckyBagId != null ? luckyBagId : "unknown") + "-添加福袋记录失败", e);
+            return null;
+        }
+    }
+
+    /**
+     * 构建福袋记录对象
+     */
+    private LuckyBagCollectRecord buildLuckyBagRecord(Long luckyBagId,
+                                                      Long userId,
+                                                      Date sendTime,
+                                                      String companyUserId,
+                                                      String companyId,
+                                                      Company company,
+                                                      LuckyBag luckyBag) {
+        LuckyBagCollectRecord record = new LuckyBagCollectRecord();
+        record.setLuckyBagId(luckyBagId);
+        record.setExpiryTime(sendTime);
+        record.setCollectType("0");
+        record.setSendTime(new Date());
+        record.setCompanyId(Long.valueOf(companyId));
+        record.setUserId(userId);
+        if (ObjectUtil.isNotEmpty(userId)){
+            FsUser fsUser = fsUserMapper.selectFsUserByUserId(userId);
+            record.setUserName(ObjectUtil.isNotEmpty(fsUser)?fsUser.getNickName():null);
+        }
+        record.setCompanyName(company.getCompanyName());
+        record.setCompanyUserId(Long.valueOf(companyUserId));
+
+        record.setRewardType(2L);
+
+        // 设置币种金额
+        if (luckyBag.getRewardType() != null && luckyBag.getRewardType().equals("1")) {
+            record.setCoinAmount(luckyBag.getAmount());
+        }
+
+        return record;
+    }
+
+
+
 }
 

+ 12 - 0
fs-service/src/main/java/com/fs/his/domain/FsIntegralOrder.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -130,4 +131,15 @@ public class FsIntegralOrder
     private Integer deliveryStatus;
     @TableField(exist = false)
     private String deliveryType;
+
+    private String extendOrderId;
+    @ApiModelProperty("购物车中的商品信息(多个)")
+    private String itemCartJson;
+    @ApiModelProperty("购物车中的商品对应积分(多个)")
+    private String integralByCart;
+    @ApiModelProperty("购物车中对应的商品编码(多个)")
+    private String barCodeCart;
+    @ApiModelProperty("商品对应的数量(多个)")
+    private String quantityCart;
+
 }

+ 11 - 0
fs-service/src/main/java/com/fs/his/domain/FsUser.java

@@ -251,6 +251,17 @@ public class FsUser extends BaseEntity
 //    @TableField(exist = false)
 //    private String keywords;
 
+
+    // 可提现积分
+    private Long withdrawIntegral;
+
+    // 可提现佣金
+    private BigDecimal mayWithdraw;
+    // 累计佣金
+    private BigDecimal totalCommission;
+    // 已提现佣金
+    private BigDecimal withdrawFinish;
+
     public String getNickname() {
         return nickname;
     }

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

@@ -2,10 +2,7 @@ package com.fs.his.mapper;
 
 import com.fs.his.domain.FsIntegralGoods;
 import com.fs.his.param.FsIntegralGoodsListUParam;
-import com.fs.his.vo.FsGoodsVO;
-import com.fs.his.vo.FsIntegralGoodsChooseVO;
-import com.fs.his.vo.FsIntegralGoodsListUVO;
-import com.fs.his.vo.FsIntegralGoodsListVO;
+import com.fs.his.vo.*;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -13,6 +10,7 @@ import org.apache.ibatis.annotations.Update;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 积分商品Mapper接口
@@ -121,4 +119,6 @@ public interface FsIntegralGoodsMapper
      * 根据id集合查询积分商品列表
      */
     List<FsGoodsVO> getFsGoodsVOListByIds(@Param("goodsIds") List<Long> goodsIds);
+
+    List<FsIntegralGoodsVo> selectAllByGoodsIds(@Param("goodsIds") Set<Long> goodsIds);
 }

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

@@ -0,0 +1,18 @@
+package com.fs.his.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class CreateOrderFromCartParm {
+    @NotNull(message = "收货地址ID不能为空")
+    @ApiModelProperty("收货地址ID")
+    private Long addressId;
+
+    @NotNull(message = "积分商品ID不能为空")
+    @ApiModelProperty("积分商品ID")
+    private List<Long> goodsId;
+}

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

@@ -1,8 +1,10 @@
 package com.fs.his.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsIntegralCart;
 import com.fs.his.param.AddGoodsIntoCartParam;
+import com.fs.his.param.CreateOrderFromCartParm;
 import com.fs.his.param.GetFsIntegralCartDetailsParm;
 import com.fs.his.param.GetFsIntegralCartListParam;
 import com.fs.his.vo.FsIntegralCartVO;
@@ -60,4 +62,5 @@ public interface IFsIntegralCartService extends IService<FsIntegralCart> {
 
     Boolean addGoodsIntoCart(AddGoodsIntoCartParam param, Long userId);
 
+    R createOrderFromCart(CreateOrderFromCartParm param, Long aLong);
 }

+ 128 - 13
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralCartServiceImpl.java

@@ -1,29 +1,28 @@
 package com.fs.his.service.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
-import com.fs.his.domain.FsIntegralCart;
-import com.fs.his.domain.FsIntegralGoods;
-import com.fs.his.domain.FsUser;
-import com.fs.his.domain.FsUserAddress;
-import com.fs.his.mapper.FsIntegralCartMapper;
-import com.fs.his.mapper.FsIntegralGoodsMapper;
-import com.fs.his.mapper.FsUserAddressMapper;
-import com.fs.his.mapper.FsUserMapper;
+import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.spring.SpringUtils;
+import com.fs.core.utils.OrderCodeUtils;
+import com.fs.his.domain.*;
+import com.fs.his.mapper.*;
 import com.fs.his.param.AddGoodsIntoCartParam;
+import com.fs.his.param.CreateOrderFromCartParm;
 import com.fs.his.param.GetFsIntegralCartDetailsParm;
 import com.fs.his.param.GetFsIntegralCartListParam;
 import com.fs.his.service.IFsIntegralCartService;
-import com.fs.his.vo.FsIntegralCartVO;
-import com.fs.his.vo.GetCartGoodsDetailsVo;
-import com.fs.his.vo.GetFsIntegralCartDetailsVo;
-import com.fs.his.vo.GetFsIntegralCartListVo;
+import com.fs.his.service.IFsUserIntegralLogsService;
+import com.fs.his.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
@@ -34,6 +33,8 @@ import javax.annotation.Resource;
 import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -44,12 +45,24 @@ public class FsIntegralCartServiceImpl extends ServiceImpl<FsIntegralCartMapper,
     @Resource
     private FsUserMapper userMapper;
 
+    @Autowired
+    private FsUserMapper fsUserMapper;
+
     @Autowired
     private FsUserAddressMapper fsUserAddressMapper;
 
     @Autowired
     private FsIntegralGoodsMapper fsIntegralGoodsMapper;
 
+    @Autowired
+    private FsIntegralCartMapper fsIntegralCartMapper;
+
+    @Autowired
+    private FsIntegralOrderMapper fsIntegralOrderMapper;
+
+    @Autowired
+    IFsUserIntegralLogsService integralLogsService;
+
     /**
      * 添加或修改购物车
      *
@@ -165,7 +178,7 @@ public class FsIntegralCartServiceImpl extends ServiceImpl<FsIntegralCartMapper,
         for (GetFsIntegralCartListVo listVo : cartListVoList) {
             GetCartGoodsDetailsVo cartListVo = new GetCartGoodsDetailsVo();
             BeanUtils.copyProperties(listVo, cartListVo);
-            cartListVo.setGoodsIntegralTotal(listVo.getGoodsIntegral() * listVo.getQuantity());
+            cartListVo.setGoodsIntegralTotal(listVo.getGoodsIntegral() * listVo.getCartNum());
             goodsDetailsVos.add(cartListVo);
         }
         if (ObjectUtils.isNotEmpty(param.getAddressId())) {
@@ -230,4 +243,106 @@ public class FsIntegralCartServiceImpl extends ServiceImpl<FsIntegralCartMapper,
             }
         }
     }
+
+    @Override
+    public R createOrderFromCart(CreateOrderFromCartParm param, Long userId) {
+        RedissonClient redissonClient = SpringUtils.getBean(RedissonClient.class);
+        String lockKey = "fsIntegralCartOrderCreate:" + userId;
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            // 尝试获取锁,最多等待3秒,持有锁时间最多30秒
+            boolean isLocked = lock.tryLock(3, 10, TimeUnit.SECONDS);
+            if (!isLocked) {
+                return R.error("系统繁忙,请稍后再试");
+            }
+            FsUser user = fsUserMapper.selectFsUserByUserId(userId);
+            FsUserAddress address = fsUserAddressMapper.selectFsUserAddressByAddressId(param.getAddressId());
+            List<FsIntegralGoodsVo> fsIntegralGoods = fsIntegralGoodsMapper.selectAllByGoodsIds(new HashSet<>(param.getGoodsId()));
+            List<FsIntegralCart> existingCart = fsIntegralCartMapper.selectList(Wrappers.<FsIntegralCart>lambdaQuery().eq(FsIntegralCart::getUserId, userId).in(FsIntegralCart::getGoodsId, param.getGoodsId()));
+            Map<Long, Integer> collect = existingCart.stream().collect(Collectors.groupingBy(FsIntegralCart::getGoodsId, Collectors.summingInt(FsIntegralCart::getCartNum)));
+            StringBuilder quantity = new StringBuilder();
+            for (FsIntegralGoodsVo fsIntegralGood : fsIntegralGoods) {
+                Integer integer = collect.get(fsIntegralGood.getGoodsId());
+                if (fsIntegralGood.getStock() < integer) {
+                    throw new ServiceException(String.format("%d库存不足,兑换失败", fsIntegralGood.getGoodsName()));
+                }
+                if (fsIntegralGood.getStatus() != 1) {
+                    this.remove(Wrappers.<FsIntegralCart>lambdaQuery().eq(FsIntegralCart::getUserId, userId).eq(FsIntegralCart::getGoodsId, fsIntegralGood.getGoodsId()));
+                    log.info("清除下架商品,userId:{}, goodsId:{}", userId, fsIntegralGood.getGoodsId());
+                    throw new ServiceException(String.format("商品[名称:%d]已下架,兑换失败", fsIntegralGood.getGoodsName()));
+                }
+                fsIntegralGood.setIntegralByNum(integer * fsIntegralGood.getIntegral());
+                fsIntegralGood.setQuantity(integer);
+                if (quantity.length() > 0) {
+                    quantity.append(",");
+                }
+                quantity.append(ObjectUtils.isNotEmpty(integer) ? integer : "0");
+            }
+            // 商品总的积分
+            Long goodsIntegral = fsIntegralGoods.stream().filter(n -> ObjectUtils.isNotEmpty(n.getIntegralByNum())).mapToLong(FsIntegralGoodsVo::getIntegralByNum).sum();
+            if (user.getIntegral() < goodsIntegral) {
+                throw new ServiceException("用户积分不足,兑换失败");
+            }
+            String barCode = fsIntegralGoods.stream().map(FsIntegralGoodsVo::getBarCode).collect(Collectors.joining(","));
+            String Integral = fsIntegralGoods.stream().map(m -> m.getIntegral().toString()).collect(Collectors.joining(","));
+//            String orderSn = OrderCodeUtils.getOrderSn();
+            String orderSn = "6666666666666666666666";
+            if (StringUtils.isEmpty(orderSn)) {
+                throw new ServiceException("订单生成失败,请重试");
+            }
+            FsIntegralOrder order = new FsIntegralOrder();
+            order.setOrderCode(orderSn);
+            order.setUserId(user.getUserId());
+            order.setStatus(1);
+            order.setBarCodeCart(barCode);
+            order.setIntegral(goodsIntegral.toString());
+            order.setIntegralByCart(Integral);
+            order.setItemJson(ObjectUtils.isNotEmpty(fsIntegralGoods) ? JSONUtil.toJsonStr(fsIntegralGoods) : null);
+            order.setItemCartJson(ObjectUtils.isNotEmpty(fsIntegralGoods) ? JSONUtil.toJsonStr(fsIntegralGoods) : null);
+            order.setUserName(address.getRealName());
+            order.setUserAddress(address.getProvince() + address.getCity() + address.getDistrict() + address.getDetail());
+            order.setUserPhone(address.getPhone());
+            order.setCreateTime(new Date());
+            order.setQuantityCart(quantity.toString());
+            if (fsIntegralOrderMapper.insertFsIntegralOrder(order) > 0) {
+                //写入日志
+                FsUser userMap = new FsUser();
+                userMap.setUserId(user.getUserId());
+                // 可消费积分
+                long consumer = user.getIntegral() - user.getWithdrawIntegral();
+                if (consumer < goodsIntegral) {
+                    // 扣除完可消费积分后,剩余的积分
+                    long extra = goodsIntegral - consumer;
+                    // 可提现积分扣除 剩余积分
+                    Long withdrawIntegral = user.getWithdrawIntegral() - extra;
+                    userMap.setIntegral(withdrawIntegral);
+                    userMap.setWithdrawIntegral(withdrawIntegral);
+                } else {
+                    userMap.setIntegral(user.getIntegral() - goodsIntegral);
+                }
+                fsUserMapper.updateFsUser(userMap);
+                FsUserIntegralLogs logs = new FsUserIntegralLogs();
+                logs.setIntegral(-goodsIntegral);
+                logs.setUserId(order.getUserId());
+                logs.setBalance(userMap.getIntegral());
+                logs.setLogType(5);
+                logs.setBusinessId(order.getOrderId().toString());
+                logs.setCreateTime(new Date());
+                logs.setNickName(user.getNickName());
+                logs.setPhone(user.getPhone());
+                integralLogsService.insertFsUserIntegralLogs(logs);
+                //清空购物车对应商品
+                this.remove(Wrappers.<FsIntegralCart>lambdaQuery().eq(FsIntegralCart::getUserId, userId).in(FsIntegralCart::getGoodsId, param.getGoodsId()));
+                return R.ok("兑换成功").put("order", order);
+            } else {
+                return R.error("订单创建失败");
+            }
+        } catch (Exception e) {
+            return R.error(e.getMessage());
+        } finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
 }

+ 50 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralGoodsVo.java

@@ -0,0 +1,50 @@
+package com.fs.his.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class FsIntegralGoodsVo {
+    private Long goodsId;
+
+    @ApiModelProperty("封面图")
+    private String imgUrl;
+
+    @ApiModelProperty("组图")
+    private String images;
+
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    @ApiModelProperty("原价")
+    private BigDecimal otPrice;
+
+    @ApiModelProperty("商品分类")
+    private Long goodsType;
+
+    @ApiModelProperty("状态")
+    private Long status;
+
+    @ApiModelProperty("单个商品积分")
+    private Long integral;
+
+    @ApiModelProperty("排序")
+    private Long sort;
+
+    @ApiModelProperty("库存")
+    private Long stock;
+
+    @ApiModelProperty("详情")
+    private String descs;
+
+    @ApiModelProperty("产品编码")
+    private String barCode;
+
+    @ApiModelProperty("加上数量的商品积分")
+    private Long integralByNum;
+
+    @ApiModelProperty("商品数量")
+    private Integer quantity;
+}

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

@@ -32,6 +32,9 @@ public class GetCartGoodsDetailsVo {
     @ApiModelProperty("商品数量")
     private Integer quantity;
 
+    @ApiModelProperty("购买的商品数量")
+    private Integer cartNum;
+
     @ApiModelProperty("是否选中:1是,0否")
     private Integer isSelected;
 

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

@@ -7,6 +7,10 @@ import java.math.BigDecimal;
 
 @Data
 public class GetFsIntegralCartListVo {
+
+    @ApiModelProperty("主键ID")
+    private Long Id;
+
     @ApiModelProperty("主键ID")
     private Long cartId;
 
@@ -49,6 +53,9 @@ public class GetFsIntegralCartListVo {
     @ApiModelProperty("商品数量")
     private Integer quantity;
 
+    @ApiModelProperty("购买的商品数量")
+    private Integer cartNum;
+
     @ApiModelProperty("用户的芳华币总数")
     private BigDecimal userIntegral;
 

+ 10 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -98,4 +98,14 @@ public interface OpenIMService {
 
     OpenImResponseDTO doctorSendMsgToUser(Long userId,Long doctorId);
 
+    OpenImResponseDTO getFriendList(String userID, int pageNumber, int showNumber,Integer applyType);
+
+    /**
+     * 删除好友并拉黑
+     *
+     * @param ownerUserID 需要删除好友的用户
+     * @param friendUserID 待删除的好友
+     * @return
+     */
+    OpenImResponseDTO deleteUserInfo(String ownerUserID,String friendUserID);
 }

+ 71 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1781,4 +1781,75 @@ public class OpenIMServiceImpl implements OpenIMService {
         openImMsgDTO.setContent(content);
         return openIMSendMsg(openImMsgDTO);
     }
+
+    @Override
+    public OpenImResponseDTO getFriendList(String userID, int pageNumber, int showNumber,Integer applyType) {
+        String adminToken = getAdminToken();
+        JSONObject jsonObject = new JSONObject();
+        Map<String,Object> map = new HashMap<>();
+        map.put("pageNumber", pageNumber);
+        map.put("showNumber", showNumber);
+        jsonObject.put("userID",userID);
+        jsonObject.put("pagination",map);
+        if (applyType == 1){
+            String body = HttpRequest.post(IMConfig.URL+"/friend/get_friend_list")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+        }else if (applyType == 2){
+            String body = HttpRequest.post(IMConfig.URL+"/friend/get_self_friend_apply_list")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+        }else if (applyType == 3){
+            String body = HttpRequest.post(IMConfig.URL+"/friend/get_friend_apply_list")
+                    .header("operationID", String.valueOf(System.currentTimeMillis()))
+                    .header("token", adminToken)
+                    .body(jsonObject.toString())
+                    .execute()
+                    .body();
+            OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
+            return responseDTO;
+        }
+        return null;
+    }
+
+    @Override
+    public OpenImResponseDTO 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);
+        String jsonBody1 = JSONUtil.toJsonStr(bodyMap);
+        String result1 = HttpRequest.post(IMConfig.URL+"/friend/delete_friend")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .body(jsonBody1)
+                .execute()
+                .body();
+
+        //增加黑名单
+        Map<String, Object> bodyMap1 = new HashMap<>();
+        bodyMap1.put("ownerUserID", ownerUserID);
+        bodyMap1.put("blackUserID", friendUserID);
+        String jsonBody2 = JSONUtil.toJsonStr(bodyMap1);
+        String result2 = HttpRequest.post(IMConfig.URL+"/friend/add_black")
+                .header("operationID", String.valueOf(System.currentTimeMillis()))
+                .header("token", adminToken)
+                .body(jsonBody2)
+                .execute()
+                .body();
+        responseDTO= JSONUtil.toBean(result2,OpenImResponseDTO.class);
+        return responseDTO;
+    }
 }

+ 3 - 3
fs-service/src/main/resources/mapper/his/FsIntegralCartMapper.xml

@@ -94,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 and fg.goods_name like concat('%', #{param.goodsName}, '%')
             </if>
             <if test="cartId != null and cartId.size() > 0">
-                and fc.cart_id in
+                and fc.id in
                 <foreach collection="cartId" item="cartId" open="(" close=")" separator=",">#{cartId}</foreach>
             </if>
         </where>
@@ -103,10 +103,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <update id="updateQuantityAtomically">
         UPDATE fs_integral_cart
-        SET quantity = LEAST(quantity + #{addQuantity}, #{maxQuantity}),
+        SET cart_num = LEAST(cart_num + #{addQuantity}, #{maxQuantity}),
             is_selected = 1,
             update_time = NOW()
-        WHERE user_id = #{userId} AND goods_id = #{goodsId} AND quantity <![CDATA[<]]> #{maxQuantity}
+        WHERE user_id = #{userId} AND goods_id = #{goodsId} AND cart_num <![CDATA[<]]> #{maxQuantity}
     </update>
     <delete id="deleteCartByGoodsId">
         delete from fs_integral_cart where goods_id = #{goodsId}

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

@@ -174,4 +174,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{goodsId}
         </foreach>
     </select>
+
+    <select id="selectAllByGoodsIds" resultType="com.fs.his.vo.FsIntegralGoodsVo">
+        select * from fs_integral_goods where goods_id in
+        <foreach item="goodsIds" collection="goodsIds" open="(" separator="," close=")">
+            #{goodsIds}
+        </foreach>
+    </select>
 </mapper>

+ 10 - 0
fs-service/src/main/resources/mapper/his/FsIntegralOrderMapper.xml

@@ -162,6 +162,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwUserId != null">qw_user_id,</if>
             <if test="companyUserId != null">company_user_id,</if>
             <if test="companyId != null">company_id,</if>
+            <if test="extendOrderId != null">extend_order_id,</if>
+            <if test="itemCartJson != null">item_cart_json,</if>
+            <if test="integralByCart != null">integral_by_cart,</if>
+            <if test="barCodeCart != null">bar_code_cart,</if>
+            <if test="quantityCart != null">quantity_cart,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderId != null">#{orderId},</if>
@@ -187,6 +192,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="qwUserId != null">#{qwUserId},</if>
             <if test="companyUserId != null">#{companyUserId},</if>
             <if test="companyId != null">#{companyId},</if>
+            <if test="extendOrderId != null">#{extendOrderId},</if>
+            <if test="itemCartJson != null">#{itemCartJson},</if>
+            <if test="integralByCart != null">#{integralByCart},</if>
+            <if test="barCodeCart != null">#{barCodeCart},</if>
+            <if test="quantityCart != null">#{quantityCart},</if>
          </trim>
     </insert>
 

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

@@ -62,7 +62,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, create_time, update_time,
                last_ip, balance,is_weixin_auth,parent_id,qw_user_id,app_id,company_id,company_user_id,is_promoter,
                now_money,brokerage_price,spread_user_id, spread_time,pay_count, spread_count,user_type,
-               app_open_id,apple_key,history_app
+               app_open_id,apple_key,history_app,birthday,qw_user_id,withdraw_integral,total_commission,withdraw_finish,may_withdraw,app_open_id
         from fs_user
     </sql>
 

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

@@ -3,14 +3,18 @@ package com.fs.app.controller;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.*;
 import com.fs.app.utils.WxUtil;
 import com.fs.common.VerifyCodeUtil;
+import com.fs.common.annotation.Log;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.service.ISmsService;
 import com.fs.common.utils.ServletUtils;
@@ -18,7 +22,10 @@ import com.fs.common.utils.ip.IpUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.domain.LuckyBag;
+import com.fs.course.domain.LuckyBagCollectRecord;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
+import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserNewTask;
@@ -28,6 +35,9 @@ import com.fs.his.service.IFsUserNewTaskService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsUserRegisterParam;
+import com.fs.im.dto.OpenImResponseDTO;
+import com.fs.im.service.OpenIMService;
+import com.fs.qw.service.ILuckyBagService;
 import com.fs.watch.domain.WatchDeviceSetup;
 import com.fs.watch.domain.WatchUser;
 import com.fs.watch.service.WatchUserService;
@@ -67,6 +77,9 @@ public class AppLoginController extends AppBaseController{
     @Autowired
     private WxOpenProperties openProperties;
 
+    @Autowired
+    private OpenIMService openIMService;
+
     @Autowired
     private FsCoursePlaySourceConfigMapper fsCoursePlaySourceConfigMapper;
 
@@ -76,6 +89,12 @@ public class AppLoginController extends AppBaseController{
     @Autowired
     private IFsUserCouponService fsUserCouponService;
 
+    @Autowired
+    private IFsUserCourseVideoService fsUserCourseVideoService;
+
+    @Autowired
+    private ILuckyBagService luckyBagService;
+
     @Autowired
     private ISmsService smsService;
     @ApiOperation("注册app用户")
@@ -419,7 +438,7 @@ public class AppLoginController extends AppBaseController{
 
         userMap.setLoginDevice(param.getLoginDevice());
         userMap.setSource(param.getSource());
-        if (userMap.getNickName().equals("匿名用户**")) {
+        if ("匿名用户**".equals(userMap.getNickName())) {
             userMap.setNickName("苹果用户" + param.getPhone().substring(param.getPhone().length() - 4));
         }
         userMap.setAppleKey(param.getAppleKey());
@@ -1027,4 +1046,61 @@ public class AppLoginController extends AppBaseController{
         // 不存在,追加到末尾
         return currentAppIds + "," + newAppId;
     }
+
+
+    /**
+     * 创建 福袋
+     */
+
+    @RepeatSubmit
+    @PostMapping("/createFdMiniLink")
+    @Log(title = "createFdMiniLink", businessType = BusinessType.INSERT)
+    public R createAppFd(@RequestBody LuckyBagCollectRecord param) {
+
+        if (ObjectUtil.isEmpty(param.getLuckyBagId())){
+            return R.error("福袋id不能为空");
+        }
+        return fsUserCourseVideoService.createAppFd(param);
+    }
+    /**
+     * 查询福袋配置信息
+     *
+     * @param reward
+     * @return
+     */
+    @GetMapping("/luckyBagList")
+    public TableDataInfo list(LuckyBag reward)
+    {
+        reward.setDataStatus("1");
+
+        reward.setCompanyId(String.valueOf(reward.getCompanyId()));
+        startPage();
+        List<LuckyBag> list = luckyBagService.selectLuckyBagList(reward);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 获取好友申请列表
+     *
+     * @param userRequestParam
+     * @return
+     */
+    @PostMapping("/getFriendList")
+    public R getFriendList(@RequestBody UserRequestParam userRequestParam)
+    {
+        return R.ok().put("data",openIMService.getFriendList(userRequestParam.getUserID(),userRequestParam.getPagination().getPageNumber(),userRequestParam.getPagination().getShowNumber(),userRequestParam.getApplyType()));
+    }
+
+
+
+
+    @ApiOperation("删除好友并拉黑")
+    @PostMapping("/deleteFriend")
+    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);
+    }
 }

+ 11 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsIntegralCartController.java

@@ -2,9 +2,11 @@ package com.fs.app.controller;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.app.annotation.Login;
+import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsIntegralCart;
 import com.fs.his.param.AddGoodsIntoCartParam;
+import com.fs.his.param.CreateOrderFromCartParm;
 import com.fs.his.param.GetFsIntegralCartDetailsParm;
 import com.fs.his.param.GetFsIntegralCartListParam;
 import com.fs.his.service.IFsIntegralCartService;
@@ -84,4 +86,13 @@ public class FsIntegralCartController extends AppBaseController {
         return b ? R.ok("删除商品成功") : R.error("删除商品失败");
     }
 
+    @Login
+    @RepeatSubmit
+    @ApiOperation("从购物车生成订单(兑换按钮)")
+    @PostMapping("/createOrderFromCart")
+    public R createOrderFromCart(@RequestBody CreateOrderFromCartParm param) {
+        Long aLong = Long.valueOf(getUserId());
+        return fsIntegralCartService.createOrderFromCart(param, aLong);
+    }
+
 }

+ 31 - 0
fs-user-app/src/main/java/com/fs/app/param/Pagination.java

@@ -0,0 +1,31 @@
+package com.fs.app.param;
+
+import lombok.Data;
+
+@Data
+public class Pagination {
+    private int pageNumber;
+    private int showNumber;
+
+    public Pagination(int pageNumber, int showNumber) {
+        this.pageNumber = pageNumber;
+        this.showNumber = showNumber;
+    }
+
+    // Getters and Setters
+    public int getPageNumber() {
+        return pageNumber;
+    }
+
+    public void setPageNumber(int pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+
+    public int getShowNumber() {
+        return showNumber;
+    }
+
+    public void setShowNumber(int showNumber) {
+        this.showNumber = showNumber;
+    }
+}

+ 25 - 0
fs-user-app/src/main/java/com/fs/app/param/UserRequestParam.java

@@ -0,0 +1,25 @@
+package com.fs.app.param;
+
+import lombok.Data;
+
+@Data
+public class UserRequestParam {
+
+    /**
+     * 会员id
+     */
+    private String userID;
+
+    /**
+     * 好友申请类型
+     */
+    private Integer applyType;
+
+    /**
+     * 请求参数
+     */
+    private Pagination pagination;
+
+}
+
+