소스 검색

Merge remote-tracking branch 'origin/master'

zyp 4 주 전
부모
커밋
6e209a6249
29개의 변경된 파일733개의 추가작업 그리고 57개의 파일을 삭제
  1. 23 1
      fs-admin/src/main/java/com/fs/store/controller/FsUserController.java
  2. 18 0
      fs-admin/src/main/java/com/fs/task/SendRedPacketTask.java
  3. 4 2
      fs-company-app/src/main/java/com/fs/app/controller/StoreOrderController.java
  4. 22 0
      fs-company/src/main/java/com/fs/users/controller/FsUserController.java
  5. 33 0
      fs-service-system/src/main/java/com/fs/company/domain/CompanyUserUser.java
  6. 62 0
      fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserUserMapper.java
  7. 1 1
      fs-service-system/src/main/java/com/fs/course/config/CourseConfig.java
  8. 5 0
      fs-service-system/src/main/java/com/fs/course/service/IFsCourseRedPacketLogService.java
  9. 166 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseRedPacketLogServiceImpl.java
  10. 2 2
      fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  11. 123 6
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  12. 1 0
      fs-service-system/src/main/java/com/fs/store/config/StoreConfig.java
  13. 4 0
      fs-service-system/src/main/java/com/fs/store/domain/FsStoreCart.java
  14. 2 0
      fs-service-system/src/main/java/com/fs/store/dto/FsStoreCartDTO.java
  15. 2 1
      fs-service-system/src/main/java/com/fs/store/mapper/FsDoctorArticleMapper.java
  16. 13 11
      fs-service-system/src/main/java/com/fs/store/mapper/FsStoreCartMapper.java
  17. 3 0
      fs-service-system/src/main/java/com/fs/store/param/FsStoreCartParam.java
  18. 2 0
      fs-service-system/src/main/java/com/fs/store/param/FsStoreConfirmOrderParam.java
  19. 2 0
      fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderMoneyByProductParam.java
  20. 2 2
      fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java
  21. 7 1
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java
  22. 139 27
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  23. 1 0
      fs-service-system/src/main/java/com/fs/store/vo/FsStoreCartQueryVO.java
  24. 2 0
      fs-service-system/src/main/java/com/fs/store/vo/FsStoreCartVO.java
  25. 68 0
      fs-service-system/src/main/resources/mapper/company/CompanyUserUserMapper.xml
  26. 1 0
      fs-service-system/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml
  27. 2 0
      fs-service-system/src/main/resources/mapper/crm/CrmCustomerMapper.xml
  28. 19 1
      fs-service-system/src/main/resources/mapper/store/FsStoreCartMapper.xml
  29. 4 2
      fs-user-app/src/main/java/com/fs/app/controller/CompanyOrderController.java

+ 23 - 1
fs-admin/src/main/java/com/fs/store/controller/FsUserController.java

@@ -12,7 +12,6 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.dto.UserProjectDTO;
-import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.store.domain.FsUser;
 import com.fs.store.param.h5.FsUserPageListParam;
@@ -221,4 +220,27 @@ public class FsUserController extends BaseController
         Boolean r = userCompanyUserService.batchUpdateUserProjectStatus(ids, 1);
         return ResponseResult.ok(r);
     }
+
+    @PreAuthorize("@ss.hasPermi('store:user:blacklist')")
+    @GetMapping("/blacklist")
+    @ApiOperation("黑名单")
+    public R blacklist(FsUserPageListParam param) {
+        PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
+        for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOPageInfo.getList()) {
+            fsUserPageListVO.setPhone(ParseUtils.parsePhone(fsUserPageListVO.getPhone()));
+        }
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("rows", fsUserPageListVOPageInfo.getList());
+        map.put("total", fsUserPageListVOPageInfo.getTotal());
+        return R.ok(map);
+    }
+
+    @PreAuthorize("@ss.hasPermi('store:user:enabledBlackUsers')")
+    @PostMapping("/enabledBlackUsers")
+    @ApiOperation("批量启用会员")
+    public ResponseResult<Boolean> enabledBlackUsers(@RequestBody List<UserProjectDTO> ids) {
+        log.debug("批量启用会员 ids: {}", JSON.toJSONString(ids));
+        Boolean r = userCompanyUserService.batchUpdateUserProjectStatus(ids, 1);
+        return ResponseResult.ok(r);
+    }
 }

+ 18 - 0
fs-admin/src/main/java/com/fs/task/SendRedPacketTask.java

@@ -0,0 +1,18 @@
+package com.fs.task;
+
+import com.fs.course.service.IFsCourseRedPacketLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service("sendRedPacketTask")
+public class SendRedPacketTask {
+    @Autowired
+    private IFsCourseRedPacketLogService redPacketLogService;
+
+    public void sendRedPacket(){
+        redPacketLogService.sendRedPacketBf();
+    }
+
+}

+ 4 - 2
fs-company-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -181,6 +181,7 @@ public class StoreOrderController extends AppBaseController
     @ApiOperation("制单")
     @GetMapping("/createSalesOrder")
     public R createSalesOrder(@RequestParam("cateIds")String cateIds,
+                              @RequestParam(value = "giftCateIds",required = false)String giftCateIds,
                               @RequestParam(value = "orderType",required = false)Integer orderType,
                               @RequestParam(value = "orderMedium",required = false)Integer orderMedium,
                               HttpServletRequest request){
@@ -191,7 +192,7 @@ public class StoreOrderController extends AppBaseController
         if(!companyUser.getStatus().equals("0")){
             return R.error("用户已禁用");
         }
-        return fsStoreOrderService.createSalesOrder(companyUser,cateIds,orderType,orderMedium);
+        return fsStoreOrderService.createSalesOrder(companyUser,cateIds,giftCateIds,orderType,orderMedium);
     }
 
     @ApiOperation("改价")
@@ -207,7 +208,8 @@ public class StoreOrderController extends AppBaseController
     @ApiOperation("获取订单")
     @GetMapping("/getSalesOrder")
     public R getSalesOrder(@RequestParam("createOrderKey")String createOrderKey, HttpServletRequest request){
-        return fsStoreOrderService.getSalesOrder(createOrderKey);
+        String userId = getUserId();
+        return fsStoreOrderService.getSalesOrder(createOrderKey,Long.parseLong(userId));
     }
 
     @ApiOperation("关联客户")

+ 22 - 0
fs-company/src/main/java/com/fs/users/controller/FsUserController.java

@@ -156,4 +156,26 @@ public class FsUserController extends BaseController
         Boolean r = userCompanyUserService.batchUpdateUserProjectStatus(ids, 1);
         return ResponseResult.ok(r);
     }
+
+    @PreAuthorize("@ss.hasPermi('users:user:blacklist')")
+    @GetMapping("/blacklist")
+    @ApiOperation("黑名单")
+    public R blacklist(FsUserPageListParam param) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setUserId(loginUser.getUser().getUserId());
+        PageInfo<FsUserPageListVO> fsUserPageListVOPageInfo = fsUserService.selectFsUserPageList(param);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("rows", fsUserPageListVOPageInfo.getList());
+        map.put("total", fsUserPageListVOPageInfo.getTotal());
+        return R.ok(map);
+    }
+
+    @PreAuthorize("@ss.hasPermi('users:user:enabledBlackUsers')")
+    @PostMapping("/enabledBlackUsers")
+    @ApiOperation("批量启用会员")
+    public ResponseResult<Boolean> enabledBlackUsers(@RequestBody List<UserProjectDTO> ids) {
+        log.debug("批量启用会员 ids: {}", JSON.toJSONString(ids));
+        Boolean r = userCompanyUserService.batchUpdateUserProjectStatus(ids, 1);
+        return ResponseResult.ok(r);
+    }
 }

+ 33 - 0
fs-service-system/src/main/java/com/fs/company/domain/CompanyUserUser.java

@@ -0,0 +1,33 @@
+package com.fs.company.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * companyUserUser对象 company_user_user
+ *
+ * @author fs
+ * @date 2023-12-19
+ */
+@Data
+public class CompanyUserUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 公司id */
+    @Excel(name = "公司id")
+    private Long companyId;
+
+    /** 公司用户id */
+    @Excel(name = "公司用户id")
+    private Long companyUserId;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long userId;
+
+}

+ 62 - 0
fs-service-system/src/main/java/com/fs/company/mapper/CompanyUserUserMapper.java

@@ -0,0 +1,62 @@
+package com.fs.company.mapper;
+
+import com.fs.company.domain.CompanyUserUser;
+
+import java.util.List;
+
+/**
+ * companyUserUserMapper接口
+ *
+ * @author fs
+ * @date 2023-12-19
+ */
+public interface CompanyUserUserMapper
+{
+    /**
+     * 查询companyUserUser
+     *
+     * @param id companyUserUser主键
+     * @return companyUserUser
+     */
+    public CompanyUserUser selectCompanyUserUserById(Long id);
+
+    /**
+     * 查询companyUserUser列表
+     *
+     * @param companyUserUser companyUserUser
+     * @return companyUserUser集合
+     */
+    public List<CompanyUserUser> selectCompanyUserUserList(CompanyUserUser companyUserUser);
+
+    /**
+     * 新增companyUserUser
+     *
+     * @param companyUserUser companyUserUser
+     * @return 结果
+     */
+    public int insertCompanyUserUser(CompanyUserUser companyUserUser);
+
+    /**
+     * 修改companyUserUser
+     *
+     * @param companyUserUser companyUserUser
+     * @return 结果
+     */
+    public int updateCompanyUserUser(CompanyUserUser companyUserUser);
+
+    /**
+     * 删除companyUserUser
+     *
+     * @param id companyUserUser主键
+     * @return 结果
+     */
+    public int deleteCompanyUserUserById(Long id);
+
+    /**
+     * 批量删除companyUserUser
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCompanyUserUserByIds(Long[] ids);
+}

+ 1 - 1
fs-service-system/src/main/java/com/fs/course/config/CourseConfig.java

@@ -42,7 +42,7 @@ public class CourseConfig implements Serializable {
      * 小程序授权头像昵称,跳转H5服务号授权域名
      */
     private String userCourseAuthDomain;
-
+    private Integer isNegative;//是否为负数 0、不允许,1、允许
     @Data
     public static class DisabledTimeVo{
         @JsonFormat(pattern = "HH:mm")

+ 5 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsCourseRedPacketLogService.java

@@ -95,4 +95,9 @@ public interface IFsCourseRedPacketLogService
      * @return amount
      */
     BigDecimal getSumByCompanyUserIdId(Long companyUserId);
+
+    /**
+     * 补发红包奖励
+     */
+    void sendRedPacketBf();
 }

+ 166 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseRedPacketLogServiceImpl.java

@@ -4,10 +4,27 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyMoneyLogs;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.param.FsCourseRedPacketLogParam;
 import com.fs.course.vo.FsCourseRedPacketLogListPVO;
+import com.fs.his.param.WxSendRedPacketParam;
+import com.fs.store.domain.FsUser;
+import com.fs.store.mapper.FsUserMapper;
+import com.fs.store.service.IFsStorePaymentService;
+import com.fs.system.service.ISysConfigService;
+import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
@@ -23,8 +40,23 @@ import com.fs.course.service.IFsCourseRedPacketLogService;
 @Service
 public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogService
 {
+    private static final Logger logger = LoggerFactory.getLogger(FsCourseRedPacketLogServiceImpl.class);
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private IFsStorePaymentService paymentService;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private FsUserMapper fsUserMapper;
+
     @Autowired
     private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+    @Autowired
+    private FsCourseWatchLogMapper courseWatchLogMapper;
+
+    @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
 
     /**
      * 查询短链课程看课记录
@@ -151,4 +183,138 @@ public class FsCourseRedPacketLogServiceImpl implements IFsCourseRedPacketLogSer
     public BigDecimal getSumByCompanyUserIdId(Long companyUserId) {
         return fsCourseRedPacketLogMapper.getSumByCompanyUserIdId(companyUserId);
     }
+
+    @Override
+    public void sendRedPacketBf() {
+        try {
+            logger.info("【红包发放】开始执行红包发放任务");
+
+            // 初始化查询对象
+            FsCourseRedPacketLog query = new FsCourseRedPacketLog();
+            query.setStatus(2); // 状态2表示待处理红包
+
+            // 获取红包配置
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+            logger.info("【红包发放】当前红包发放模式:{}", config.getRedPacketMode());
+
+            // 获取待处理红包列表
+            List<FsCourseRedPacketLog> pendingPackets = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogList(query);
+            if (pendingPackets == null || pendingPackets.isEmpty()) {
+                logger.info("【红包发放】没有待处理的红包记录");
+                return;
+            }
+
+            logger.info("【红包发放】共发现{}条待处理红包记录", pendingPackets.size());
+
+            // 处理每条红包记录
+            for (FsCourseRedPacketLog redPacket : pendingPackets) {
+                try {
+                    logger.info("【红包处理】开始处理红包记录ID:{},用户ID:{},金额:{}元",
+                            redPacket.getLogId(), redPacket.getUserId(), redPacket.getAmount());
+
+                    processRedPacket(redPacket, config);
+                } catch (Exception e) {
+                    logger.error("【红包处理】处理红包记录ID:{}时发生异常", redPacket.getLogId(), e);
+                    // 即使一条记录失败也继续处理下一条
+                }
+             }
+
+            logger.info("【红包发放】红包发放任务执行完成");
+        } catch (Exception e) {
+            logger.error("【红包发放】红包发放任务执行过程中发生未预期异常", e);
+        }
+    }
+
+    private void processRedPacket(FsCourseRedPacketLog redPacket, CourseConfig config) {
+        // 获取用户信息
+        FsUser user = fsUserMapper.selectFsUserByUserId(redPacket.getUserId());
+        if (user == null || user.getMpOpenId() == null) {
+            logger.error("【红包处理】错误:未找到用户ID:{}或用户缺少openId", redPacket.getUserId());
+            return;
+        }
+
+        logger.info("【红包处理】准备为用户{}发放红包,openId:{}", user.getUserId(), user.getMpOpenId());
+
+        // 准备红包参数
+        WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
+        packetParam.setOpenId(user.getMpOpenId());
+        packetParam.setAmount(redPacket.getAmount());
+        packetParam.setSource(2);
+        packetParam.setAppId(redPacket.getAppId());
+        packetParam.setRedPacketMode(config.getRedPacketMode());
+        packetParam.setCompanyId(redPacket.getCompanyId());
+
+        // 处理企业资金(使用悲观锁)
+        Company company = companyMapper.selectCompanyByIdForUpdate(redPacket.getCompanyId());
+        if (company == null) {
+            logger.error("【红包处理】错误:未找到企业ID:{}", redPacket.getCompanyId());
+            return;
+        }
+
+        BigDecimal remainingBalance = company.getMoney().subtract(redPacket.getAmount());
+        if (remainingBalance.compareTo(BigDecimal.ZERO) < 0) {
+            logger.warn("【红包处理】企业{}余额不足(当前余额:{}元,需要扣除:{}元)",
+                    company.getCompanyId(), company.getMoney(), redPacket.getAmount());
+            return;
+        }
+
+        logger.info("【红包处理】企业{}当前余额:{}元,发放后余额:{}元",
+                company.getCompanyId(), company.getMoney(), remainingBalance);
+
+        // 发送红包
+        R sendRedPacketResult = paymentService.sendRedPacket(packetParam);
+        if (sendRedPacketResult == null) {
+            logger.error("【红包处理】红包接口返回空结果");
+            return;
+        }
+
+        if (!sendRedPacketResult.get("code").equals(200)) {
+            logger.error("【红包处理】红包发放失败,错误码:{},错误信息:{}",
+                    sendRedPacketResult.get("code"), sendRedPacketResult.get("msg"));
+            return;
+        }
+
+        // 处理成功结果
+        logger.info("【红包处理】红包发放成功");
+
+        // 更新红包记录
+        if (sendRedPacketResult.get("isNew").equals(1)) {
+            TransferBillsResult transferBillsResult = (TransferBillsResult)sendRedPacketResult.get("data");
+            redPacket.setResult(JSON.toJSONString(sendRedPacketResult));
+            redPacket.setOutBatchNo(transferBillsResult.getOutBillNo());
+            logger.info("【红包处理】新批次红包,批次号:{}", transferBillsResult.getOutBillNo());
+        } else {
+            redPacket.setOutBatchNo(sendRedPacketResult.get("orderCode").toString());
+            logger.info("【红包处理】已有批次红包,订单号:{}", redPacket.getOutBatchNo());
+        }
+
+        fsCourseRedPacketLogMapper.updateFsCourseRedPacketLog(redPacket);
+
+        // 更新观看记录
+        FsCourseWatchLog watchLog = courseWatchLogMapper.selectFsCourseWatchLogByLogId(redPacket.getLogId());
+        if (watchLog != null) {
+            watchLog.setRewardType(config.getRewardType());
+            courseWatchLogMapper.updateFsCourseWatchLog(watchLog);
+            logger.info("【红包处理】更新观看记录{}的奖励类型为{}", watchLog.getLogId(), config.getRewardType());
+        }
+
+        // 更新企业余额
+        company.setMoney(remainingBalance);
+        companyMapper.updateCompany(company);
+
+        // 记录资金流水
+        CompanyMoneyLogs moneyLog = new CompanyMoneyLogs();
+        moneyLog.setCompanyId(company.getCompanyId());
+        moneyLog.setRemark("扣除红包金额");
+        moneyLog.setMoney(redPacket.getAmount().multiply(new BigDecimal(-1)));
+        moneyLog.setLogsType(15);
+        moneyLog.setBalance(company.getMoney());
+        moneyLog.setCreateTime(new Date());
+        moneyLogsMapper.insertCompanyMoneyLogs(moneyLog);
+
+        logger.info("【红包处理】企业资金流水记录成功,企业ID:{},变动金额:{}元",
+                company.getCompanyId(), moneyLog.getMoney());
+    }
+
 }

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

@@ -881,7 +881,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         if (videoDuration==null){
             FsUserCourseVideo video = courseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
             videoDuration=video.getDuration();
-            redisCache.setCacheObject(videoRedisKey,video.getDuration().toString());
+            redisCache.setCacheObject(videoRedisKey,video.getDuration());
         }
         return videoDuration;
     }
@@ -985,7 +985,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         if (videoDuration==null){
             FsUserCourseVideo video = courseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
             videoDuration=video.getDuration();
-            redisCache.setCacheObject(videoRedisKey,video.getDuration().toString());
+            redisCache.setCacheObject(videoRedisKey,video.getDuration());
         }
         return videoDuration;
     }

+ 123 - 6
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -13,7 +13,11 @@ import com.fs.common.enums.BizResponseEnum;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
@@ -100,6 +104,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private IFsUserService fsUserService;
     @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
     private FsUserCourseStudyLogMapper courseStudyLogMapper;
 
     @Autowired
@@ -133,6 +139,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private FsUserIntegralLogsMapper fsUserIntegralLogsMapper;
     @Autowired
+    private CompanyMoneyLogsMapper moneyLogsMapper;
+    @Autowired
     private FsUserMapper fsUserMapper;
     @Autowired
     private IFsStorePaymentService paymentService;
@@ -858,8 +866,31 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             packetParam.setUser(user);
         }
 
+        if (ObjectUtils.isNotEmpty(config.getIsNegative())&&config.getIsNegative() == 1) {
+            return processRedPacket(config, packetParam, param, amount, log);
+        }
         //2025.7.11 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
+
+            Company company = companyMapper.selectCompanyByIdForUpdate(param.getCompanyId());
+            BigDecimal money = company.getMoney();
+            BigDecimal subtract = money.subtract(amount);
+            if (subtract.compareTo(BigDecimal.ZERO)<0){
+                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                redPacketLog.setCourseId(param.getCourseId());
+                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setUserId(param.getUserId());
+                redPacketLog.setVideoId(param.getVideoId());
+                redPacketLog.setStatus(2);
+                redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
+                redPacketLog.setCompanyUserId(param.getCompanyUserId());
+                redPacketLog.setCreateTime(new Date());
+                redPacketLog.setAmount(amount);
+                redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+                redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+                return R.error("销售公司余额不足");
+            }
             // 发送红包
             R sendRedPacket = paymentService.sendRedPacket(packetParam);
             if (sendRedPacket.get("code").equals(200)) {
@@ -1015,8 +1046,32 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         System.out.println("红包金额"+amount);
         System.out.println("红包商户号"+packetParam);
+
+        if (ObjectUtils.isNotEmpty(config.getIsNegative())&&config.getIsNegative() == 1) {
+            return processRedPacket(config, packetParam, param, amount, log);
+        }
         //2025.7.11 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
+
+            Company company = companyMapper.selectCompanyByIdForUpdate(param.getCompanyId());
+            BigDecimal money = company.getMoney();
+            BigDecimal subtract = money.subtract(amount);
+            if (subtract.compareTo(BigDecimal.ZERO)<0){
+                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                redPacketLog.setCourseId(param.getCourseId());
+                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setUserId(param.getUserId());
+                redPacketLog.setVideoId(param.getVideoId());
+                redPacketLog.setStatus(2);
+                redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
+                redPacketLog.setCompanyUserId(param.getCompanyUserId());
+                redPacketLog.setCreateTime(new Date());
+                redPacketLog.setAmount(amount);
+                redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+                redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+                return R.error("销售公司余额不足");
+            }
             // 发送红包
             R sendRedPacket = paymentService.sendRedPacket(packetParam);
             if (sendRedPacket.get("code").equals(200)) {
@@ -1026,10 +1081,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                     transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
                     redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
                     redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
-                    redPacketLog.setBatchId(transferBillsResult.getTransferBillNo());
                 }else {
                     redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
-                    redPacketLog.setBatchId(sendRedPacket.get("batchId").toString());
                 }
                 // 添加红包记录
                 redPacketLog.setCourseId(param.getCourseId());
@@ -1044,19 +1097,27 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 redPacketLog.setAmount(amount);
                 redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
                 redPacketLog.setPeriodId(param.getPeriodId());
-
                 redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
                 // 更新观看记录的奖励类型
-//            if (param.getLinkType() == null || param.getLinkType() == 0) {
                 log.setRewardType(config.getRewardType());
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
-//            }
+                company.setMoney(subtract);
+                companyMapper.updateCompany(company);
+
+                CompanyMoneyLogs logs=new CompanyMoneyLogs();
+                logs.setCompanyId(company.getCompanyId());
+                logs.setRemark("扣除红包金额");
+                logs.setMoney(amount.multiply(new BigDecimal(-1)));
+                logs.setLogsType(15);
+                logs.setBalance(company.getMoney());
+                logs.setCreateTime(new Date());
+                moneyLogsMapper.insertCompanyMoneyLogs(logs);
+
                 return sendRedPacket;
             } else {
                 return R.error("奖励发送失败,请联系客服");
             }
-
         } else {
             // 发送红包
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
@@ -1083,7 +1144,63 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
 
     }
+    /**
+     * 直接发送奖励
+     *
+     * @param config
+     * @param packetParam
+     * @param param
+     * @param amount
+     * @param log
+     * @return
+     */
+    private R processRedPacket(CourseConfig config, WxSendRedPacketParam packetParam, FsCourseSendRewardUParam param, BigDecimal amount, FsCourseWatchLog log) {
+        R sendRedPacket = paymentService.sendRedPacket(packetParam);
+
+        if (!sendRedPacket.get("code").equals(200)) {
+            return R.error("奖励发送失败,请联系客服");
+        }
+
+        createRedPacketLog(sendRedPacket, param, amount, log);
+        updateWatchLogRewardType(log, config);
+
+        return sendRedPacket;
+    }
+
+    private void createRedPacketLog(R sendRedPacket, FsCourseSendRewardUParam param, BigDecimal amount, FsCourseWatchLog log) {
+        FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+
+        // Set common fields
+        redPacketLog.setCourseId(param.getCourseId());
+        redPacketLog.setCompanyId(param.getCompanyId());
+        redPacketLog.setUserId(param.getUserId());
+        redPacketLog.setVideoId(param.getVideoId());
+        redPacketLog.setStatus(0);
+        redPacketLog.setQwUserId(param.getQwUserId());
+        redPacketLog.setCompanyUserId(param.getCompanyUserId());
+        redPacketLog.setCreateTime(new Date());
+        redPacketLog.setAmount(amount);
+        redPacketLog.setWatchLogId(log != null ? log.getLogId() : null);
+        redPacketLog.setPeriodId(param.getPeriodId());
+        redPacketLog.setAppId(param.getAppId());
+
+        if (sendRedPacket.get("isNew").equals(1)) {
+            TransferBillsResult transferBillsResult = (TransferBillsResult) sendRedPacket.get("data");
+            redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
+            redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+        } else {
+            redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+        }
+
+        redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+    }
 
+    private void updateWatchLogRewardType(FsCourseWatchLog log, CourseConfig config) {
+        if (log != null) {
+            log.setRewardType(config.getRewardType());
+            courseWatchLogMapper.updateFsCourseWatchLog(log);
+        }
+    }
     /**
      * 发放积分奖励
      *

+ 1 - 0
fs-service-system/src/main/java/com/fs/store/config/StoreConfig.java

@@ -23,5 +23,6 @@ public class StoreConfig implements Serializable {
     private String refundAddress;
     private Integer auditSwitch; // 订单审核开关
     private Integer createSalesOrderType; // 订单改价方式 1 商品改价 2总价改价
+    private Integer orderAttribution; // 下单归属 1 多销售 2单销售
 
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsStoreCart.java

@@ -60,5 +60,9 @@ public class FsStoreCart extends BaseEntity
     @Excel(name = "改价(商品单价)")
     private BigDecimal changePrice;
 
+    /** 是否是赠品 */
+    @Excel(name = "是否是赠品 0:否 1:是")
+    private Integer isGift;
+
 
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/dto/FsStoreCartDTO.java

@@ -31,4 +31,6 @@ import java.math.BigDecimal;
 
     private BigDecimal brokerageThree;
 
+    private Integer isGift;
+
 }

+ 2 - 1
fs-service-system/src/main/java/com/fs/store/mapper/FsDoctorArticleMapper.java

@@ -77,7 +77,8 @@ public interface FsDoctorArticleMapper
             "            <if test=\"views != null \"> and ar.views = #{views}</if>\n" +
             "            <if test=\"status != null \"> and ar.status = #{status}</if>\n" +
             "        </where> "+
-            " ORDER BY ar.article_id desc"+
+//            " ORDER BY ar.article_id desc"+
+            " ORDER BY ar.create_time asc"+
             "</script>"})
 
     List<FsDoctorArticleListVO> selectFsDoctorArticleListVO(FsDoctorArticle fsDoctorArticle);

+ 13 - 11
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreCartMapper.java

@@ -66,7 +66,7 @@ public interface FsStoreCartMapper
      */
     public int deleteFsStoreCartByIds(Long[] ids);
 
-    @Select("select c.*,p.product_type,p.product_name,p.image as product_image,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock from fs_store_cart c inner join fs_store_product p on p.product_id=c.product_id inner join fs_store_product_attr_value v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id= #{uid}")
+    @Select("select c.*,p.product_type,p.product_name,p.image as product_image,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock from fs_store_cart c inner join fs_store_product p on p.product_id=c.product_id inner join fs_store_product_attr_value v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.is_gift = 0 and c.user_id= #{uid}")
     List<FsStoreCartVO> selectFsStoreCartListByUid(long uid);
     @Delete({"<script>"+
             "delete from fs_store_cart where id in"+
@@ -75,21 +75,23 @@ public interface FsStoreCartMapper
     int delCart(Long[] ids);
     @Select("select c.*,p.cate_id,p.product_name,p.image as product_image,p.temp_id,p.product_type,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock,v.cost,v.integral,v.weight,v.volume,v.bar_code,v.group_bar_code,v.brokerage,v.brokerage_two,v.brokerage_three from fs_store_cart c left join fs_store_product p on p.product_id=c.product_id left join fs_store_product_attr_value v on v.id=c.product_attr_value_id where find_in_set(c.id,#{ids})")
     List<FsStoreCartQueryVO> selectFsStoreCartListByIds(String ids);
+    @Select("select c.*,p.cate_id,p.product_name,p.image as product_image,p.temp_id,p.product_type,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock,v.cost,v.integral,v.weight,v.volume,v.bar_code,v.group_bar_code,v.brokerage,v.brokerage_two,v.brokerage_three from fs_store_cart c left join fs_store_product p on p.product_id=c.product_id left join fs_store_product_attr_value v on v.id=c.product_attr_value_id where c.is_gift = 1 AND user_id = #{userId}")
+    List<FsStoreCartQueryVO> selectFsStoreGiftCartList(@Param("userId") Long userId);
     @Update("update  fs_store_cart set is_pay=1 where find_in_set(id,#{cartIds})")
     void updateIsPay(String cartIds);
 
 
     @Select("select ifnull(sum(c.cart_num),0) from fs_store_cart c inner join fs_store_product p on p.product_id=c.product_id inner join fs_store_product_attr_value v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id= #{userId}")
     Integer selectFsStoreCartCountByUserId(long userId);
-    @Select({"<script> " +
-            "select ifnull(sum(c.cart_num),0) from fs_store_cart c  " +
-            "where c.is_pay=0 and c.is_del=0 and c.is_buy=0 " +
-            "<if test = 'maps.userId != null     '> " +
-            "and c.user_id =#{maps.userId} " +
-            "</if>" +
-            "<if test = 'maps.productId != null    '> " +
-            "and c.product_id =#{maps.productId} " +
-            "</if>" +
-            "</script>"})
+//    @Select({"<script> " +
+//            "select ifnull(sum(c.cart_num),0) from fs_store_cart c  " +
+//            "where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and c.is_gift = 0" +
+//            "<if test = 'maps.userId != null     '> " +
+//            "and c.user_id =#{maps.userId} " +
+//            "</if>" +
+//            "<if test = 'maps.productId != null    '> " +
+//            "and c.product_id =#{maps.productId} " +
+//            "</if>" +
+//            "</script>"})
     Integer selectFsStoreCartCount(@Param("maps") FsStoreCartCountParam param);
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/store/param/FsStoreCartParam.java

@@ -28,5 +28,8 @@ public class FsStoreCartParam {
     @ApiModelProperty(value = "是否购买")
     private Integer isBuy=0;
 
+    @ApiModelProperty(value = "是否是赠品")
+    private Integer isGift;
+
 
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/param/FsStoreConfirmOrderParam.java

@@ -11,6 +11,8 @@ public class FsStoreConfirmOrderParam {
     @NotBlank(message = "请提交购买的商品")
     @ApiModelProperty(value = "购物车ID 多个,分隔")
     private String cartIds;
+    @ApiModelProperty(value = "赠品购物车ID 多个,分隔")
+    private String giftCartIds;
     @NotBlank(message = "购买类型不能为空")
     @ApiModelProperty(value = "buy cart")
     private String type;

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderMoneyByProductParam.java

@@ -19,4 +19,6 @@ public class FsStoreOrderMoneyByProductParam {
 
     //购物车明细
     private List<FsStoreCartQueryVO> carts;
+
+    private List<FsStoreCartQueryVO> giftCarts;
 }

+ 2 - 2
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -162,9 +162,9 @@ public interface IFsStoreOrderService
 
     R addTuiMoney(FsStoreOrderAddTuiMoneyParam param);
 
-    R createSalesOrder(CompanyUser companyUser, String cateIds,Integer orderType,Integer orderMedium);
+    R createSalesOrder(CompanyUser companyUser, String cateIds,String giftCateIds,Integer orderType,Integer orderMedium);
 
-    R getSalesOrder(String createOrderKey);
+    R getSalesOrder(String createOrderKey,Long userId);
 
     R addUserCart(long userId, String createOrderKey);
 

+ 7 - 1
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java

@@ -171,9 +171,14 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
             cartMap.setIsBuy(0);
             cartMap.setProductId(cartParam.getProductId());
             cartMap.setProductAttrValueId(cartParam.getAttrValueId());
+            if(cartParam.getIsGift()!= null && cartParam.getIsGift()==1){
+                cartMap.setIsGift(1);
+            } else {
+                cartMap.setIsGift(0);
+            }
             List<FsStoreCart> cart = fsStoreCartMapper.selectFsStoreCartList(cartMap);
             FsStoreCart storeCart;
-            if(cart==null||cart.size()==0){
+            if(cart==null || cart.isEmpty()){
                 storeCart = FsStoreCart.builder()
                         .cartNum(cartParam.getCartNum())
                         .productAttrValueId(cartMap.getProductAttrValueId())
@@ -183,6 +188,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                         .isPay(0)
                         .isDel(0)
                         .isBuy(0)
+                        .isGift(cartParam.getIsGift())
                         .build();
                 storeCart.setCreateTime(new Date());
                 checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());

+ 139 - 27
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -22,13 +22,11 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
-import com.fs.company.domain.Company;
-import com.fs.company.domain.CompanyDept;
-import com.fs.company.domain.CompanyMoneyLogs;
-import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.*;
 import com.fs.company.mapper.CompanyDeptMapper;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyMoneyLogsMapper;
+import com.fs.company.mapper.CompanyUserUserMapper;
 import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
@@ -115,7 +113,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 
     @Autowired
     private FsUserAddressMapper userAddressMapper;
-
+    @Autowired
+    private CompanyUserUserMapper companyUserUserMapper;
     @Autowired
     private FsStoreOrderMapper fsStoreOrderMapper;
 
@@ -379,7 +378,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         FsUserAddress address= userAddressMapper.selectFsUserAddressByDefaultAddress(uid);
         List<FsStoreCartQueryVO> carts=cartMapper.selectFsStoreCartListByIds(cartParam.getCartIds());
         for (FsStoreCartQueryVO cart : carts) {
-            if (cart.getChangePrice() != null && BigDecimal.ZERO.compareTo(cart.getChangePrice())<0){
+            if (cart.getChangePrice() != null && BigDecimal.ZERO.compareTo(cart.getChangePrice())<=0){
                 cart.setPrice(cart.getChangePrice());
                 //删除改价
                 FsStoreCart fsStoreCart = new FsStoreCart();
@@ -391,7 +390,25 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         String uuid = IdUtil.randomUUID();
         redisCache.setCacheObject("orderKey:"+uuid, cartParam.getCartIds(), 300, TimeUnit.SECONDS);
         redisCache.setCacheObject("orderCarts:"+uuid, carts, 300, TimeUnit.SECONDS);
-        return R.ok().put("orderKey",uuid).put("address",address).put("carts",carts);
+        List<FsStoreCartQueryVO> giftCarts = new ArrayList<>();
+        if (StringUtils.isNotBlank(cartParam.getGiftCartIds())){
+            giftCarts=cartMapper.selectFsStoreCartListByIds(cartParam.getGiftCartIds());
+            if (giftCarts != null){
+                for (FsStoreCartQueryVO cart : giftCarts) {
+                    if (cart.getChangePrice() != null && BigDecimal.ZERO.compareTo(cart.getChangePrice())<=0){
+                        cart.setPrice(cart.getChangePrice());
+                        //删除改价
+                        FsStoreCart fsStoreCart = new FsStoreCart();
+                        fsStoreCart.setId(cart.getId());
+                        fsStoreCart.setChangePrice(BigDecimal.ZERO);
+                        cartMapper.updateFsStoreCart(fsStoreCart);
+                    }
+                }
+                redisCache.setCacheObject("orderGiftCarts:"+uuid, giftCarts, 300, TimeUnit.SECONDS);
+                redisCache.setCacheObject("orderGiftKey:"+uuid, cartParam.getGiftCartIds(), 300, TimeUnit.SECONDS);
+            }
+        }
+        return R.ok().put("orderKey",uuid).put("address",address).put("carts",carts).put("giftCarts",giftCarts);
 
     }
 
@@ -402,6 +419,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             throw new CustomException("订单已过期",501);
         }
         List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+        List<FsStoreCartQueryVO> giftCarts = redisCache.getCacheObject("orderGiftCarts:" + param.getOrderKey());
+        if (giftCarts != null) {
+            carts.addAll(giftCarts);
+        }
         BigDecimal payPrice=getOrderSumPrice(carts,"truePrice");
         if(StringUtils.isNotEmpty(param.getCreateOrderKey()))
         {
@@ -502,6 +523,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         if(cartIds!=null){
             //获取购物车列表
             List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+            List<FsStoreCartQueryVO> giftCarts = redisCache.getCacheObject("orderGiftCarts:" + param.getOrderKey());
+            if (giftCarts != null){
+                carts.addAll(giftCarts);
+            }
             //获取地址
             FsUserAddress address=userAddressMapper.selectFsUserAddressById(param.getAddressId());
             //生成分布式唯一值
@@ -513,23 +538,42 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             storeOrder.setStoreHouseCode("CK01");
             storeOrder.setCompanyId(param.getCompanyId());
             storeOrder.setCompanyUserId(param.getCompanyUserId());
+
+            String json = configService.selectConfigByKey("store.config");
+            StoreConfig config= JSONUtil.toBean(json,StoreConfig.class);
             //绑定销售
             FsUser fsuser= userService.selectFsUserById(userId);
-            if(param.getCompanyUserId()!=null){
-                if (ObjectUtil.isNotEmpty(fsuser.getCompanyUserId())&&fsuser.getCompanyUserId()!=param.getCompanyUserId()){
-                    CompanyUser companyUser=companyUserService.selectCompanyUserById(fsuser.getCompanyUserId());
-                    return R.error(String.format("请联系%s销售进行购买商品!",companyUser.getNickName()));
-                }else {
-                    fsuser.setCompanyUserId(param.getCompanyUserId());
-                    userService.updateFsUser(fsuser);
-                }
-                CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
-                if(companyUser!=null){
-                    storeOrder.setDeptId(companyUser.getDeptId());
+            if(ObjectUtil.isNotEmpty(config.getOrderAttribution())
+                    &&config.getOrderAttribution().equals(1)){
+                CompanyUserUser map=new CompanyUserUser();
+                map.setCompanyUserId(param.getCompanyUserId());
+                map.setUserId(userId);
+                List<CompanyUserUser> list= companyUserUserMapper.selectCompanyUserUserList(map);
+                if(list==null||list.size()==0){
+                    CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
+                    if(companyUser!=null&&companyUser.getStatus().equals("0")){
+                        map.setCompanyId(companyUser.getCompanyId());
+                        companyUserUserMapper.insertCompanyUserUser(map);
+                    }
                 }
             }else {
-                storeOrder.setCompanyUserId(fsuser.getCompanyUserId());
+                if(param.getCompanyUserId()!=null){
+                    if (ObjectUtil.isNotEmpty(fsuser.getCompanyUserId())&&fsuser.getCompanyUserId()!=param.getCompanyUserId()){
+                        CompanyUser companyUser=companyUserService.selectCompanyUserById(fsuser.getCompanyUserId());
+                        return R.error(String.format("请联系%s销售进行购买商品!",companyUser.getNickName()));
+                    }else {
+                        fsuser.setCompanyUserId(param.getCompanyUserId());
+                        userService.updateFsUser(fsuser);
+                    }
+                    CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
+                    if(companyUser!=null){
+                        storeOrder.setDeptId(companyUser.getDeptId());
+                    }
+                }else {
+                    storeOrder.setCompanyUserId(fsuser.getCompanyUserId());
+                }
             }
+
             storeOrder.setUserId(userId);
             storeOrder.setOrderCode(orderSn);
             storeOrder.setRealName(address.getRealName());
@@ -584,8 +628,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             storeOrder.setShippingType(1);
             storeOrder.setCreateTime(new Date());
 
-            String json=configService.selectConfigByKey("store.config");
-            StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
             if(config.getServiceFee()!=null){
                 storeOrder.setServiceFee(config.getServiceFee());
             }
@@ -687,6 +729,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 else{
                     fsStoreCartDTO.setImage(vo.getProductAttrImage());
                 }
+                fsStoreCartDTO.setIsGift(vo.getIsGift());
 
                 FsStoreOrderItem item=new FsStoreOrderItem();
                 item.setOrderId(storeOrder.getId());
@@ -713,7 +756,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 
             //删除缓存
             redisCache.deleteObject("orderKey:" + param.getOrderKey());
+            redisCache.deleteObject("orderGiftKey:" + param.getOrderKey());
             redisCache.deleteObject("orderCarts:" + param.getOrderKey());
+            redisCache.deleteObject("orderGiftCarts:" + param.getOrderKey());
 
             //添加记录
             orderStatusService.create(storeOrder.getId(), OrderLogEnum.CREATE_ORDER.getValue(),
@@ -743,6 +788,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             if(StringUtils.isNotEmpty(createOrderKey)){
                 redisCache.deleteObject("createOrderKey:"+ createOrderKey);
                 redisCache.deleteObject("orderCarts:" + createOrderKey);
+                redisCache.deleteObject("orderGiftCarts:" + createOrderKey);
                 redisCache.deleteObject("createOrderMoney:" + createOrderKey);
                 //货到付款自定义金额 key改为id存储
                 BigDecimal amount=redisCache.getCacheObject("createOrderAmount:"+createOrderKey);
@@ -1290,6 +1336,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             }
             //删除缓存
             redisCache.deleteObject("orderKey:" + param.getOrderKey());
+            redisCache.deleteObject("orderGiftKey:" + param.getOrderKey());
             //添加记录
             orderStatusService.create(storeOrder.getId(), OrderLogEnum.CREATE_ORDER.getValue(),
                     OrderLogEnum.CREATE_ORDER.getDesc());
@@ -2019,11 +2066,19 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     }
 
     @Override
-    public R createSalesOrder(CompanyUser companyUser, String cateIds,Integer orderType,Integer orderMedium) {
+    public R createSalesOrder(CompanyUser companyUser, String cateIds,String giftCateIds,Integer orderType,Integer orderMedium) {
         List<FsStoreCartQueryVO>  carts=cartMapper.selectFsStoreCartListByIds(cateIds);
+
+
         String uuid = IdUtil.randomUUID();
         redisCache.setCacheObject("createOrderKey:"+uuid, companyUser.getCompanyId()+"-"+companyUser.getUserId(), 24, TimeUnit.HOURS);
         redisCache.setCacheObject("orderCarts:"+uuid, carts, 24, TimeUnit.HOURS);
+        List<FsStoreCartQueryVO>  giftCarts = new ArrayList<>();
+        //赠品
+        if (giftCateIds != null){
+            giftCarts=cartMapper.selectFsStoreCartListByIds(giftCateIds);
+            redisCache.setCacheObject("orderGiftCarts:"+uuid, giftCarts, 24, TimeUnit.HOURS);
+        }
 
         //2025.7.23 倍力优需求 制单添加订单类型,媒体来源(非必填)
         if (orderType != null || orderMedium != null) {
@@ -2038,19 +2093,38 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         for(FsStoreCartQueryVO vo:carts){
             totalMoney=totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
         }
+        if (giftCateIds != null){
+            for(FsStoreCartQueryVO vo:giftCarts){
+                totalMoney=totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
+            }
+        }
+
         redisCache.setCacheObject("createOrderMoney:"+uuid, totalMoney, 24, TimeUnit.HOURS);
-        return R.ok().put("orderKey",uuid).put("carts",carts);
+        return R.ok().put("orderKey",uuid).put("carts",carts).put("giftCarts",giftCarts);
     }
 
     @Override
-    public R getSalesOrder(String createOrderKey) {
+    public R getSalesOrder(String createOrderKey,Long userId) {
         String key=redisCache.getCacheObject("createOrderKey:"+createOrderKey);
         List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + createOrderKey);
+        List<FsStoreCartQueryVO> giftCarts = redisCache.getCacheObject("orderGiftCarts:" + createOrderKey);
         BigDecimal money=redisCache.getCacheObject("createOrderMoney:"+createOrderKey);
         if (StringUtils.isEmpty(key)) {
             throw new CustomException("订单已过期",501);
         }
-        return R.ok().put("carts",carts).put("totalMoney",money);
+        if(giftCarts == null){
+            giftCarts=cartMapper.selectFsStoreGiftCartList(userId);
+            if (giftCarts != null && !giftCarts.isEmpty()){
+                //计算总价
+                for(FsStoreCartQueryVO vo:giftCarts){
+                    money=money.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
+                }
+//                redisCache.setCacheObject("orderGiftCarts:"+createOrderKey, giftCarts, 24, TimeUnit.HOURS);
+//                redisCache.setCacheObject("createOrderMoney:"+createOrderKey, money, 24, TimeUnit.HOURS);
+            }
+        }
+
+        return R.ok().put("carts",carts).put("totalMoney",money).put("giftCarts",giftCarts);
     }
 
     @Override
@@ -2077,11 +2151,32 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             cartMapper.insertFsStoreCart(storeCart);
             ids.add(storeCart.getId());
         }
+        List<FsStoreCartQueryVO> giftCarts = redisCache.getCacheObject("orderGiftCarts:" + createOrderKey);
+        List<Long> giftIds=new ArrayList<>();
+        if(giftCarts != null){
+            for(FsStoreCartQueryVO vo : giftCarts){
+                FsStoreCart storeCart = FsStoreCart.builder()
+                        .cartNum(vo.getCartNum())
+                        .productAttrValueId(vo.getProductAttrValueId())
+                        .productId(vo.getProductId())
+                        .userId(userId)
+                        .isPay(0)
+                        .isDel(0)
+                        .isBuy(1)
+                        .changePrice(vo.getPrice())
+                        .isGift(1)
+                        .build();
+                storeCart.setCreateTime(new Date());
+                cartMapper.insertFsStoreCart(storeCart);
+                giftIds.add(storeCart.getId());
+            }
+        }
+
         //删除REDIS
 //        redisCache.deleteObject("createOrderKey:"+createOrderKey);
 //        redisCache.deleteObject("orderCarts:" + createOrderKey);
         String[] idArr=key.split("-");
-        return R.ok().put("cartIds",ids).put("companyId",idArr[0]).put("companyUserId",idArr[1]);
+        return R.ok().put("cartIds",ids).put("companyId",idArr[0]).put("companyUserId",idArr[1]).put("giftCartIds",giftIds);
 
     }
 
@@ -2784,7 +2879,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         BigDecimal totalMoney= BigDecimal.ZERO;
         //新购物车明细
         for(FsStoreCartQueryVO vo:carts){
-            //单个价格不能为0
             BigDecimal price = vo.getPrice();
             if (price==null || price.compareTo(BigDecimal.ZERO)<0){
                 return R.error("商品单价不能小于0");
@@ -2797,10 +2891,28 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             //计算总价
             totalMoney=totalMoney.add(price.multiply(new BigDecimal(vo.getCartNum().toString())));
         }
+        List<FsStoreCartQueryVO> giftCarts = param.getGiftCarts();
+        if (giftCarts != null && !giftCarts.isEmpty()) {
+            for(FsStoreCartQueryVO vo:giftCarts){
+                BigDecimal price = vo.getPrice();
+                if (price==null || price.compareTo(BigDecimal.ZERO)<0){
+                    return R.error("商品单价不能小于0");
+                }
+                //更新购物车表
+                FsStoreCart storeCart = new FsStoreCart();
+                storeCart.setId(vo.getId());
+                storeCart.setChangePrice(price);
+                cartMapper.updateFsStoreCart(storeCart);
+                //计算总价
+                totalMoney=totalMoney.add(price.multiply(new BigDecimal(vo.getCartNum().toString())));
+            }
+        }
+
 
         redisCache.setCacheObject("createOrderMoney:"+createOrderKey, totalMoney, 24, TimeUnit.HOURS);
         //更新redis的购物车明细
         redisCache.setCacheObject("orderCarts:" + createOrderKey,carts,24, TimeUnit.HOURS);
+        redisCache.setCacheObject("orderGiftCarts:" + createOrderKey,giftCarts,24, TimeUnit.HOURS);
 
         return R.ok();
     }

+ 1 - 0
fs-service-system/src/main/java/com/fs/store/vo/FsStoreCartQueryVO.java

@@ -65,5 +65,6 @@ import java.math.BigDecimal;
 
     private BigDecimal changePrice;
 
+    private Integer isGift;
 
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/vo/FsStoreCartVO.java

@@ -38,4 +38,6 @@ import java.math.BigDecimal;
     private Integer stock;
 
     private Integer productType;
+
+    private Integer isGift;
 }

+ 68 - 0
fs-service-system/src/main/resources/mapper/company/CompanyUserUserMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyUserUserMapper">
+    
+    <resultMap type="CompanyUserUser" id="CompanyUserUserResult">
+        <result property="id"    column="id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="companyUserId"    column="company_user_id"    />
+        <result property="userId"    column="user_id"    />
+    </resultMap>
+
+    <sql id="selectCompanyUserUserVo">
+        select id, company_id, company_user_id, user_id from company_user_user
+    </sql>
+
+    <select id="selectCompanyUserUserList" parameterType="CompanyUserUser" resultMap="CompanyUserUserResult">
+        <include refid="selectCompanyUserUserVo"/>
+        <where>  
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanyUserUserById" parameterType="Long" resultMap="CompanyUserUserResult">
+        <include refid="selectCompanyUserUserVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCompanyUserUser" parameterType="CompanyUserUser">
+        insert into company_user_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="companyUserId != null">company_user_id,</if>
+            <if test="userId != null">user_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
+            <if test="userId != null">#{userId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanyUserUser" parameterType="CompanyUserUser">
+        update company_user_user
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCompanyUserUserById" parameterType="Long">
+        delete from company_user_user where id = #{id}
+    </delete>
+
+    <delete id="deleteCompanyUserUserByIds" parameterType="String">
+        delete from company_user_user where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 1 - 0
fs-service-system/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml

@@ -37,6 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
             <if test="companyId != null "> and company_id = #{companyId}</if>
             <if test="amount != null "> and amount = #{amount}</if>
+            <if test="status != null "> and `status` = #{status}</if>
             <if test="qwUserId != null  and qwUserId != ''"> and qw_user_id = #{qwUserId}</if>
         </where>
     </select>

+ 2 - 0
fs-service-system/src/main/resources/mapper/crm/CrmCustomerMapper.xml

@@ -368,6 +368,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
         </if>
         <if test="maps.tags != null and  maps.tags != ''">
+            and
             <foreach collection="maps.tags.split(',')" item="tag" open="(" separator="OR" close=")">
                 find_in_set(#{tag},c.tags)
             </foreach>
@@ -438,6 +439,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
         </if>
         <if test="maps.tags != null and  maps.tags != ''">
+            and
             <foreach collection="maps.tags.split(',')" item="tag" open="(" separator="OR" close=")">
                 find_in_set(#{tag},c.tags)
             </foreach>

+ 19 - 1
fs-service-system/src/main/resources/mapper/store/FsStoreCartMapper.xml

@@ -17,11 +17,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isDel"    column="is_del"    />
         <result property="isBuy"    column="is_buy"    />
         <result property="changePrice"    column="change_price"    />
+        <result property="isGift"    column="is_gift"    />
     </resultMap>
 
     <sql id="selectFsStoreCartVo">
         select id, user_id, type, product_id, product_attr_value_id, cart_num, create_time, update_time, is_pay, is_del,
-               is_buy,change_price from fs_store_cart
+               is_buy,change_price,is_gift from fs_store_cart
     </sql>
 
     <select id="selectFsStoreCartList" parameterType="FsStoreCart" resultMap="FsStoreCartResult">
@@ -36,6 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null "> and is_del = #{isDel}</if>
             <if test="isBuy != null "> and is_buy = #{isBuy}</if>
             <if test="changePrice != null "> and change_price = #{changePrice}</if>
+            <if test="isGift != null "> and is_gift = #{isGift}</if>
         </where>
     </select>
 
@@ -43,6 +45,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsStoreCartVo"/>
         where id = #{id}
     </select>
+    <select id="selectFsStoreCartCount" resultType="java.lang.Integer">
+        select ifnull(sum(c.cart_num),0)
+        from fs_store_cart c
+            inner join fs_store_product p on p.product_id=c.product_id
+            inner join fs_store_product_attr_value v on v.id=c.product_attr_value_id
+        where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and c.is_gift = 0 and p.is_show=1 and p.is_del=0
+        <if test = 'maps.userId != null     '>
+         and c.user_id =#{maps.userId}
+        </if>
+        <if test = 'maps.productId != null    '>
+        and c.product_id =#{maps.productId}
+        </if>
+    </select>
 
     <insert id="insertFsStoreCart" parameterType="FsStoreCart" useGeneratedKeys="true" keyProperty="id">
         insert into fs_store_cart
@@ -58,6 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null">is_del,</if>
             <if test="isBuy != null">is_buy,</if>
             <if test="changePrice != null">change_price,</if>
+            <if test="isGift != null">is_gift,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -71,6 +87,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null">#{isDel},</if>
             <if test="isBuy != null">#{isBuy},</if>
             <if test="changePrice != null">#{changePrice},</if>
+            <if test="isGift != null">#{isGift},</if>
          </trim>
     </insert>
 
@@ -88,6 +105,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isDel != null">is_del = #{isDel},</if>
             <if test="isBuy != null">is_buy = #{isBuy},</if>
             <if test="changePrice != null">change_price = #{changePrice},</if>
+            <if test="isGift != null">is_gift = #{isGift},</if>
         </trim>
         where id = #{id}
     </update>

+ 4 - 2
fs-user-app/src/main/java/com/fs/app/controller/CompanyOrderController.java

@@ -64,6 +64,7 @@ public class CompanyOrderController extends  AppBaseController {
     @GetMapping("/createSalesOrder")
     public R createSalesOrder(@RequestParam("token")String token,
                               @RequestParam("cateIds")String cateIds,
+                              @RequestParam(value = "giftCateIds",required = false)String giftCateIds,
                               @RequestParam(value = "orderType",required = false)Integer orderType,
                               @RequestParam(value = "orderMedium",required = false)Integer orderMedium,
                               HttpServletRequest request){
@@ -78,7 +79,7 @@ public class CompanyOrderController extends  AppBaseController {
         if(!companyUser.getStatus().equals("0")){
             return R.error("用户已禁用");
         }
-        return orderService.createSalesOrder(companyUser,cateIds,orderType,orderMedium);
+        return orderService.createSalesOrder(companyUser,cateIds,giftCateIds,orderType,orderMedium);
     }
 
     @ApiOperation("改价")
@@ -113,7 +114,8 @@ public class CompanyOrderController extends  AppBaseController {
     @ApiOperation("获取订单")
     @GetMapping("/getSalesOrder")
     public R getSalesOrder(@RequestParam("createOrderKey")String createOrderKey, HttpServletRequest request){
-        return orderService.getSalesOrder(createOrderKey);
+        String userId = getUserId();
+        return orderService.getSalesOrder(createOrderKey,Long.valueOf(userId));
     }
     @Login
     @ApiOperation("添加用户购物车")