Browse Source

feat: 新增 SOP 模板红包功能及批量保存视频功能

新增 SOP 模板的红包设置功能,包括红包列表展示、更新红包金额等。
同时,增加了批量保存视频的功能,方便课程视频的管理。
涉及到的改动包括:
- FsUserCourseVideoMapper.java 添加批量插入视频方法
- QwSopTempServiceImpl.java 添加红包相关逻辑
- FsUserCourseVideoController.java 添加批量保存视频接口
- 相关 Domain、VO、Mapper、Service 的修改和新增
吴树波 3 months ago
parent
commit
e976bfa55a
30 changed files with 857 additions and 6 deletions
  1. 6 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoController.java
  2. 105 0
      fs-admin/src/main/java/com/fs/qw/controller/CompanySopRoleController.java
  3. 14 0
      fs-admin/src/main/java/com/fs/qw/controller/QwSopTempController.java
  4. 12 0
      fs-company/src/main/java/com/fs/qw/QwSopController.java
  5. 18 1
      fs-company/src/main/java/com/fs/qw/QwSopTempController.java
  6. 54 0
      fs-service-system/src/main/java/com/fs/ad/积分.java
  7. 13 0
      fs-service-system/src/main/java/com/fs/company/domain/Company.java
  8. 1 0
      fs-service-system/src/main/java/com/fs/course/config/CourseConfig.java
  9. 2 1
      fs-service-system/src/main/java/com/fs/course/domain/FsUserCourseVideo.java
  10. 4 1
      fs-service-system/src/main/java/com/fs/course/domain/FsUserCourseVideoRedPackage.java
  11. 2 0
      fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java
  12. 3 0
      fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java
  13. 13 0
      fs-service-system/src/main/java/com/fs/course/param/BatchVideoSvae.java
  14. 3 0
      fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoRedPackageService.java
  15. 2 0
      fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  16. 11 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoRedPackageServiceImpl.java
  17. 43 3
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  18. 47 0
      fs-service-system/src/main/java/com/fs/sop/domain/CompanySopRole.java
  19. 61 0
      fs-service-system/src/main/java/com/fs/sop/mapper/CompanySopRoleMapper.java
  20. 3 0
      fs-service-system/src/main/java/com/fs/sop/mapper/QwSopTempMapper.java
  21. 65 0
      fs-service-system/src/main/java/com/fs/sop/service/ICompanySopRoleService.java
  22. 5 0
      fs-service-system/src/main/java/com/fs/sop/service/IQwSopTempService.java
  23. 125 0
      fs-service-system/src/main/java/com/fs/sop/service/impl/CompanySopRoleServiceImpl.java
  24. 77 0
      fs-service-system/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  25. 18 0
      fs-service-system/src/main/java/com/fs/sop/vo/QwSopTempRedPackageVo.java
  26. 11 0
      fs-service-system/src/main/java/com/fs/sop/vo/UpdateRedVo.java
  27. 42 0
      fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml
  28. 8 0
      fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoRedPackageMapper.xml
  29. 86 0
      fs-service-system/src/main/resources/mapper/sop/CompanySopRoleMapper.xml
  30. 3 0
      fs-service-system/src/main/resources/mapper/sop/QwSopTempMapper.xml

+ 6 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoController.java

@@ -9,6 +9,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
+import com.fs.course.param.BatchVideoSvae;
 import com.fs.course.param.CourseVideoUpdates;
 import com.fs.course.service.IFsUserCourseVideoService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -125,4 +126,9 @@ public class FsUserCourseVideoController extends BaseController
         fsUserCourseVideoService.updates(vo);
         return R.ok();
     }
+    @PostMapping("/batchSaveVideo")
+    public R batchSaveVideo(@RequestBody BatchVideoSvae vo){
+        fsUserCourseVideoService.batchSaveVideo(vo);
+        return R.ok();
+    }
 }

+ 105 - 0
fs-admin/src/main/java/com/fs/qw/controller/CompanySopRoleController.java

@@ -0,0 +1,105 @@
+package com.fs.qw.controller;
+
+import java.util.List;
+
+import com.fs.company.domain.Company;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.sop.domain.CompanySopRole;
+import com.fs.sop.service.ICompanySopRoleService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 公司SOP权限Controller
+ * 
+ * @author fs
+ * @date 2025-04-22
+ */
+@RestController
+@RequestMapping("/sop/companySopRole")
+public class CompanySopRoleController extends BaseController
+{
+    @Autowired
+    private ICompanySopRoleService companySopRoleService;
+
+    /**
+     * 查询公司SOP权限列表
+     */
+    @PreAuthorize("@ss.hasPermi('sop:companySopRole:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(CompanySopRole companySopRole)
+    {
+        startPage();
+        List<Company> list = companySopRoleService.selectCompanySopRoleList(companySopRole);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出公司SOP权限列表
+     */
+    @PreAuthorize("@ss.hasPermi('sop:companySopRole:export')")
+    @Log(title = "公司SOP权限", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CompanySopRole companySopRole)
+    {
+        List<Company> list = companySopRoleService.selectCompanySopRoleList(companySopRole);
+        ExcelUtil<Company> util = new ExcelUtil<Company>(Company.class);
+        return util.exportExcel(list, "公司SOP权限数据");
+    }
+
+    /**
+     * 获取公司SOP权限详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('sop:companySopRole:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(companySopRoleService.selectCompanySopRoleById(id));
+    }
+
+    /**
+     * 新增公司SOP权限
+     */
+    @PreAuthorize("@ss.hasPermi('sop:companySopRole:add')")
+    @Log(title = "公司SOP权限", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CompanySopRole companySopRole)
+    {
+        return toAjax(companySopRoleService.insertCompanySopRole(companySopRole));
+    }
+
+    /**
+     * 修改公司SOP权限
+     */
+    @PreAuthorize("@ss.hasPermi('sop:companySopRole:edit')")
+    @Log(title = "公司SOP权限", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CompanySopRole companySopRole)
+    {
+        return toAjax(companySopRoleService.updateCompanySopRole(companySopRole));
+    }
+
+    /**
+     * 删除公司SOP权限
+     */
+    @PreAuthorize("@ss.hasPermi('sop:companySopRole:remove')")
+    @Log(title = "公司SOP权限", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(companySopRoleService.deleteCompanySopRoleByIds(ids));
+    }
+}

+ 14 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwSopTempController.java

@@ -14,6 +14,7 @@ import com.fs.sop.domain.QwSopTemp;
 import com.fs.sop.domain.QwSopTempDay;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.service.IQwSopTempService;
+import com.fs.sop.vo.UpdateRedVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -173,4 +174,17 @@ public class QwSopTempController extends BaseController
     public AjaxResult dayList(String id){
         return AjaxResult.success(qwSopTempService.dayList(id));
     }
+
+
+    @GetMapping("/redList")
+    public AjaxResult redList(String id){
+        return AjaxResult.success(qwSopTempService.redList(id));
+    }
+
+
+    @PostMapping("/updateRedPackage")
+    public AjaxResult updateRedPackage(@RequestBody UpdateRedVo data){
+        qwSopTempService.updateRedPackage(data.getList());
+        return AjaxResult.success();
+    }
 }

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

@@ -20,6 +20,7 @@ import com.fs.qw.vo.QwOptionsVO;
 import com.fs.sop.domain.QwSop;
 import com.fs.sop.params.QwSopAutoTime;
 import com.fs.sop.params.QwSopEditQwUserParam;
+import com.fs.sop.service.ICompanySopRoleService;
 import com.fs.sop.service.IQwSopService;
 import com.fs.sop.vo.SopVoiceListVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +45,8 @@ public class QwSopController extends BaseController
 {
     @Autowired
     private IQwSopService qwSopService;
+    @Autowired
+    private ICompanySopRoleService companySopRoleService;
 
     @Autowired
     private IQwUserService qwUserService;
@@ -239,4 +242,13 @@ public class QwSopController extends BaseController
         List<SopVoiceListVo> list = qwSopService.getSopVoiceList(id);
         return getDataTable(list);
     }
+    /**
+    * 服务器图片地址 转 企业微信地址
+    */
+    @GetMapping(value = "/getRoles")
+    public R getRoles() {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long companyId = loginUser.getCompany().getCompanyId();
+        return R.ok().put("data", companySopRoleService.getRolesByCompanyId(companyId));
+    }
 }

+ 18 - 1
fs-company/src/main/java/com/fs/qw/QwSopTempController.java

@@ -3,6 +3,7 @@ package com.fs.qw;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
@@ -14,6 +15,8 @@ import com.fs.sop.domain.QwSopTemp;
 import com.fs.sop.domain.QwSopTempDay;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.service.IQwSopTempService;
+import com.fs.sop.vo.QwSopTempRedPackageVo;
+import com.fs.sop.vo.UpdateRedVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -132,7 +135,11 @@ public class QwSopTempController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         qwSopTemp.setCompanyId(loginUser.getCompany().getCompanyId());
         qwSopTemp.setCreateBy(loginUser.getUser().getUserId().toString());
-        return toAjax(qwSopTempService.addNew(qwSopTemp));
+        int i = qwSopTempService.addNew(qwSopTemp);
+        if(qwSopTemp.getSendType() == 5){
+            qwSopTempService.createSopTempRules(qwSopTemp);
+        }
+        return toAjax(i);
     }
     @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
     @Log(title = "sop模板", businessType = BusinessType.UPDATE)
@@ -176,4 +183,14 @@ public class QwSopTempController extends BaseController
     public AjaxResult dayList(String id){
         return AjaxResult.success(qwSopTempService.dayList(id));
     }
+
+    @GetMapping("/redList")
+    public AjaxResult redList(String id){
+        return AjaxResult.success(qwSopTempService.redList(id));
+    }
+    @PostMapping("/updateRedPackage")
+    public AjaxResult updateRedPackage(@RequestBody UpdateRedVo data){
+        qwSopTempService.updateRedPackage(data.getList());
+        return AjaxResult.success();
+    }
 }

+ 54 - 0
fs-service-system/src/main/java/com/fs/ad/积分.java

@@ -0,0 +1,54 @@
+package com.fs.ad;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+public class 积分 {
+    public static void main(String[] args) {
+        int jf=0;
+
+        for (int i=1; i<=2000; i++) {
+            try {
+                System.out.println("等待 10 秒...");
+               Thread.sleep(10000); // 10000 毫秒 = 10 秒
+                System.out.println("等待结束");
+            } catch (Exception e) {
+                System.out.println("线程被中断。");
+            }
+            try {
+                CloseableHttpClient httpClient = HttpClients.createDefault();
+                HttpPost httpPost = new HttpPost("https://userapp.his.cdwjyyh.com//app/integral/addIntegral");
+
+                httpPost.addHeader("AppToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI0MDQ5MCIsImlhdCI6MTcyOTc2MDExNCwiZXhwIjoxNzYxMjk2MTE0fQ.qTuf4tF7cYh_lHw0L-ydlnFbUGh-0BxLs6ztrpsuO3nvCj49zjsnhFIciVJRqZFP2TZkMrpVmflnIG1O5ZbKXA");
+                httpPost.addHeader("Accept-Encoding", "gzip, compress, br, deflate");
+                httpPost.addHeader("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.50(0x1800323a) NetType/4G Language/zh_CN");
+                httpPost.addHeader("Referer", "https://servicewechat.com/wxc3f0a952b7bc2b94/109/page-frame.html");
+
+                String json = "{\"type\":\"2\"}";
+                StringEntity entity = new StringEntity(json);
+                httpPost.setEntity(entity);
+                httpPost.setHeader("Content-type", "application/json");
+
+                HttpResponse response = httpClient.execute(httpPost);
+
+                if (response.getStatusLine().getStatusCode() == 200) {
+                    String responseBody = EntityUtils.toString(response.getEntity());
+                    System.out.println(responseBody);
+                    jf+=5;
+                    System.out.println("预计获得积分:"+jf);
+                } else {
+                    System.out.println("Request failed");
+                }
+
+                httpClient.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/company/domain/Company.java

@@ -2,6 +2,9 @@ package com.fs.company.domain;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
@@ -85,6 +88,8 @@ public class Company extends BaseEntity
     private String omsCode;
 
     private BigDecimal redPackageMoney;
+    @TableField(exist = false)
+    private List<String> rules;
 
     /** 会员是否默认黑名单,1-是;0-否(用于销售分享成为会员的操作) */
     private Integer fsUserIsDefaultBlack;
@@ -301,4 +306,12 @@ public class Company extends BaseEntity
     public void setFsUserIsDefaultBlack(Integer fsUserIsDefaultBlack) {
         this.fsUserIsDefaultBlack = fsUserIsDefaultBlack;
     }
+
+    public List<String> getRules() {
+        return rules;
+    }
+
+    public void setRules(List<String> rules) {
+        this.rules = rules;
+    }
 }

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

@@ -22,5 +22,6 @@ public class CourseConfig implements Serializable {
     private Integer rewardType; // 奖励类型 1红包 2积分
     private Integer redPacketMode;//红包模式 1总公司 2销售公司
     private BigDecimal moneyPri;//充值手续费百分比
+    private BigDecimal redPackageMoney;//充值手续费百分比
 
 }

+ 2 - 1
fs-service-system/src/main/java/com/fs/course/domain/FsUserCourseVideo.java

@@ -5,6 +5,7 @@ import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.time.LocalTime;
 
 /**
@@ -76,7 +77,7 @@ public class FsUserCourseVideo extends BaseEntity
     private String lineThree; //线路三 华为云obs
     private Integer uploadType;
 
-    private String redPacketMoney;
+    private BigDecimal redPacketMoney;
     private Long fileSize;//文件大小  字节
     private String fileKey;//文件key 对用存储桶
     private String round;//轮次

+ 4 - 1
fs-service-system/src/main/java/com/fs/course/domain/FsUserCourseVideoRedPackage.java

@@ -34,7 +34,10 @@ public class FsUserCourseVideoRedPackage extends BaseEntity
     @Excel(name = "营期id")
     private Long periodId;
 
-    @Excel(name = "类型,1-以前的数据;2-新的数据")
+    @Excel(name = "SOP规则ID")
+    private Long ruleId;
+
+    @Excel(name = "类型,1-课程;2-营期;3-sop模板")
     private Integer dataType;
 
 }

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

@@ -168,4 +168,6 @@ public interface FsUserCourseVideoMapper
     List<FsUserCourseVideoPageListVO> selectFsUserCourseVideoPageList(UserCourseVideoPageParam param);
 
     void updates(CourseVideoUpdates vo);
+
+    void insertBatchFsUserCourseVideo(@Param("collect") List<FsUserCourseVideo> collect);
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java

@@ -75,6 +75,9 @@ public interface FsUserCourseVideoRedPackageMapper
 
         int batchDeleteParams(@Param("list") List<FsUserCourseVideoRedPackage> videoRedPackageList);
 
+    List<FsUserCourseVideoRedPackage> listByCompanyIdAndVideoIds(@Param("companyId") Long companyId, @Param("videoIdList") List<Long> videoIdList);
+
+    List<FsUserCourseVideoRedPackage> listByRuleIds(@Param("ids") List<Long> ids);
         /**
          * 批量更新红包数据
          *

+ 13 - 0
fs-service-system/src/main/java/com/fs/course/param/BatchVideoSvae.java

@@ -0,0 +1,13 @@
+package com.fs.course.param;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.util.List;
+
+@Data
+public class BatchVideoSvae {
+    private Long courseId;
+    private List<Long> ids;
+}

+ 3 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoRedPackageService.java

@@ -81,4 +81,7 @@ public interface IFsUserCourseVideoRedPackageService
      */
     int batchSaveCompanyRedPackage(List<FsUserCourseVideoRedPackage> fsUserCourseVideoRedPackageList);
 
+    List<FsUserCourseVideoRedPackage> listByCompanyIdAndVideoIds(Long companyId, List<Long> videoIdList);
+
+    List<FsUserCourseVideoRedPackage> listByRuleIds(List<Long> ids);
 }

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

@@ -145,4 +145,6 @@ public interface IFsUserCourseVideoService
     R updateWatchDurationWx(FsUserCourseVideoUParam param);
 
     void updates(CourseVideoUpdates vo);
+
+    void batchSaveVideo(BatchVideoSvae vo);
 }

+ 11 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoRedPackageServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Set;
@@ -152,4 +153,14 @@ public class FsUserCourseVideoRedPackageServiceImpl implements IFsUserCourseVide
     private String generateKey(Long periodId, Long videoId, Long companyId) {
         return periodId + "_" + videoId + "_" + companyId;
     }
+
+    @Override
+    public List<FsUserCourseVideoRedPackage> listByCompanyIdAndVideoIds(Long companyId, List<Long> videoIdList) {
+        return fsUserCourseVideoRedPackageMapper.listByCompanyIdAndVideoIds(companyId, videoIdList);
+    }
+
+    @Override
+    public List<FsUserCourseVideoRedPackage> listByRuleIds(List<Long> ids) {
+        return fsUserCourseVideoRedPackageMapper.listByRuleIds(ids);
+    }
 }

+ 43 - 3
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -3,7 +3,6 @@ package com.fs.course.service.impl;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
@@ -22,6 +21,7 @@ import com.fs.course.param.newfs.FsUserCourseVideoLinkParam;
 import com.fs.course.param.newfs.FsUserCourseVideoUParam;
 import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.service.IFsVideoResourceService;
 import com.fs.course.vo.FsUserCourseVideoListUVO;
 import com.fs.course.vo.FsUserCourseVideoQVO;
 import com.fs.course.vo.FsUserCourseVideoVO;
@@ -51,6 +51,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -58,8 +59,9 @@ import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
 
 /**
@@ -126,6 +128,11 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     @Autowired
     private CompanyUserMapper companyUserMapper;
 
+    @Autowired
+    private IFsVideoResourceService fsVideoResourceService;
+    @Autowired
+    private FsVideoResourceMapper fsVideoResourceMapper;
+
     /**
      * 查询课堂视频
      *
@@ -725,7 +732,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if (redPackage != null) {
             amount = redPackage.getRedPacketMoney();
         } else if (video != null) {
-            amount = new BigDecimal(video.getRedPacketMoney());
+            amount = video.getRedPacketMoney();
         }
 
         // 准备发送红包参数
@@ -1019,6 +1026,39 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         fsUserCourseVideoMapper.updates(vo);
     }
 
+    @Override
+    public void batchSaveVideo(BatchVideoSvae vo) {
+        List<FsVideoResource> videoResourceList = fsVideoResourceMapper.selectBatchIds(vo.getIds());
+        FsUserCourseVideo param = new FsUserCourseVideo();
+        param.setCourseId(vo.getCourseId());
+        List<FsUserCourseVideo> videoList = selectFsUserCourseVideoList(param);
+        AtomicLong i = new AtomicLong(videoList.size() + 1);
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+
+        List<FsUserCourseVideo> collect = videoResourceList.stream().map(e -> {
+            FsUserCourseVideo entity = new FsUserCourseVideo();
+            entity.setTitle(e.getFileName());
+            entity.setVideoUrl(e.getVideoUrl());
+            entity.setThumbnail(e.getThumbnail());
+            entity.setDuration(e.getDuration().longValue());
+            entity.setCourseId(vo.getCourseId());
+            entity.setStatus(3L);
+            entity.setCourseSort(i.getAndIncrement());
+            entity.setFileName(e.getFileName());
+            entity.setQuestionBankId(e.getProjectIds());
+            entity.setLineOne(e.getLine1());
+            entity.setLineTwo(e.getLine2());
+            entity.setLineThree(e.getLine3());
+            entity.setRedPacketMoney(config.getRedPackageMoney());
+            entity.setFileSize(e.getFileSize());
+            entity.setFileKey(e.getFileKey());
+            entity.setIsTranscode(0);
+            return entity;
+        }).collect(Collectors.toList());
+        fsUserCourseVideoMapper.insertBatchFsUserCourseVideo(collect);
+    }
+
     //会员-更新心跳时间
     public void updateHeartbeatWx(FsUserCourseVideoUParam param) {
         String redisKey = "h5wxuser:watch:heartbeat:" + param.getUserId() + ":" + param.getVideoId();

+ 47 - 0
fs-service-system/src/main/java/com/fs/sop/domain/CompanySopRole.java

@@ -0,0 +1,47 @@
+package com.fs.sop.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 公司SOP权限对象 company_sop_role
+ *
+ * @author fs
+ * @date 2025-04-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CompanySopRole extends BaseEntity{
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 销售公司 */
+    @Excel(name = "销售公司")
+    private Long companyId;
+
+    /** 权限名称 */
+    @Excel(name = "权限名称")
+    private String roleName;
+
+    /** 权限值 */
+    @Excel(name = "权限值")
+    private String roleValue;
+
+
+    @TableField(exist = false)
+    private List<String> rules;
+    @TableField(exist = false)
+    private List<Long> companyIds;
+
+
+
+}

+ 61 - 0
fs-service-system/src/main/java/com/fs/sop/mapper/CompanySopRoleMapper.java

@@ -0,0 +1,61 @@
+package com.fs.sop.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.sop.domain.CompanySopRole;
+
+/**
+ * 公司SOP权限Mapper接口
+ * 
+ * @author fs
+ * @date 2025-04-22
+ */
+public interface CompanySopRoleMapper extends BaseMapper<CompanySopRole>{
+    /**
+     * 查询公司SOP权限
+     * 
+     * @param id 公司SOP权限主键
+     * @return 公司SOP权限
+     */
+    CompanySopRole selectCompanySopRoleById(Long id);
+
+    /**
+     * 查询公司SOP权限列表
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 公司SOP权限集合
+     */
+    List<CompanySopRole> selectCompanySopRoleList(CompanySopRole companySopRole);
+
+    /**
+     * 新增公司SOP权限
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 结果
+     */
+    int insertCompanySopRole(CompanySopRole companySopRole);
+
+    /**
+     * 修改公司SOP权限
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 结果
+     */
+    int updateCompanySopRole(CompanySopRole companySopRole);
+
+    /**
+     * 删除公司SOP权限
+     * 
+     * @param id 公司SOP权限主键
+     * @return 结果
+     */
+    int deleteCompanySopRoleById(Long id);
+
+    /**
+     * 批量删除公司SOP权限
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteCompanySopRoleByIds(Long[] ids);
+}

+ 3 - 0
fs-service-system/src/main/java/com/fs/sop/mapper/QwSopTempMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
 import com.fs.sop.domain.QwSopTemp;
+import com.fs.sop.vo.QwSopTempRedPackageVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -71,4 +72,6 @@ public interface QwSopTempMapper extends BaseMapper<QwSopTemp> {
     List<QwSopTemp> listTemp();
 
     List<QwSopTemp> selectListByIds(@Param("ids") List<String> ids);
+
+    List<QwSopTempRedPackageVo> redList(@Param("id") String id);
 }

+ 65 - 0
fs-service-system/src/main/java/com/fs/sop/service/ICompanySopRoleService.java

@@ -0,0 +1,65 @@
+package com.fs.sop.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.company.domain.Company;
+import com.fs.sop.domain.CompanySopRole;
+
+/**
+ * 公司SOP权限Service接口
+ * 
+ * @author fs
+ * @date 2025-04-22
+ */
+public interface ICompanySopRoleService extends IService<CompanySopRole>{
+    /**
+     * 查询公司SOP权限
+     * 
+     * @param id 公司SOP权限主键
+     * @return 公司SOP权限
+     */
+    CompanySopRole selectCompanySopRoleById(Long id);
+
+    /**
+     * 查询公司SOP权限列表
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 公司SOP权限集合
+     */
+    List<Company> selectCompanySopRoleList(CompanySopRole companySopRole);
+
+    /**
+     * 新增公司SOP权限
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 结果
+     */
+    int insertCompanySopRole(CompanySopRole companySopRole);
+
+    /**
+     * 修改公司SOP权限
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 结果
+     */
+    int updateCompanySopRole(CompanySopRole companySopRole);
+
+    /**
+     * 批量删除公司SOP权限
+     * 
+     * @param ids 需要删除的公司SOP权限主键集合
+     * @return 结果
+     */
+    int deleteCompanySopRoleByIds(Long[] ids);
+
+    /**
+     * 删除公司SOP权限信息
+     * 
+     * @param id 公司SOP权限主键
+     * @return 结果
+     */
+    int deleteCompanySopRoleById(Long id);
+
+
+    List<String> getRolesByCompanyId(Long id);
+}

+ 5 - 0
fs-service-system/src/main/java/com/fs/sop/service/IQwSopTempService.java

@@ -4,6 +4,7 @@ import com.fs.qw.vo.SortDayVo;
 import com.fs.sop.domain.QwSopTemp;
 import com.fs.sop.domain.QwSopTempDay;
 import com.fs.sop.params.QwSopShareTempParam;
+import com.fs.sop.vo.QwSopTempRedPackageVo;
 
 import java.util.List;
 import java.util.Map;
@@ -92,4 +93,8 @@ public interface IQwSopTempService
     List<QwSopTempDay> dayList(String id);
 
     void createSopTempRules(QwSopTemp qwSopTemp);
+
+    List<QwSopTempRedPackageVo> redList(String id);
+
+    void updateRedPackage(List<QwSopTempRedPackageVo> list);
 }

+ 125 - 0
fs-service-system/src/main/java/com/fs/sop/service/impl/CompanySopRoleServiceImpl.java

@@ -0,0 +1,125 @@
+package com.fs.sop.service.impl;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.common.exception.BaseException;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.PubFun;
+import com.fs.company.domain.Company;
+import com.fs.company.service.ICompanyService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.sop.mapper.CompanySopRoleMapper;
+import com.fs.sop.domain.CompanySopRole;
+import com.fs.sop.service.ICompanySopRoleService;
+
+/**
+ * 公司SOP权限Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-04-22
+ */
+@Service
+@AllArgsConstructor
+public class CompanySopRoleServiceImpl extends ServiceImpl<CompanySopRoleMapper, CompanySopRole> implements ICompanySopRoleService {
+
+    private final ICompanyService companyService;
+
+    /**
+     * 查询公司SOP权限
+     * 
+     * @param id 公司SOP权限主键
+     * @return 公司SOP权限
+     */
+    @Override
+    public CompanySopRole selectCompanySopRoleById(Long id){
+        return baseMapper.selectCompanySopRoleById(id);
+    }
+
+    /**
+     * 查询公司SOP权限列表
+     *
+     * @param companySopRole 公司SOP权限
+     * @return 公司SOP权限
+     */
+    @Override
+    public List<Company> selectCompanySopRoleList(CompanySopRole companySopRole){
+        List<Company> companyList = companyService.selectCompanyList(new Company());
+        List<Long> companyIdList = PubFun.listToNewList(companyList, Company::getCompanyId);
+        companySopRole.setCompanyIds(companyIdList);
+        List<CompanySopRole> roleList = baseMapper.selectCompanySopRoleList(companySopRole);
+        Map<Long, List<String>> collect = roleList.stream().collect(Collectors.groupingBy(CompanySopRole::getCompanyId, Collectors.mapping(CompanySopRole::getRoleValue, Collectors.toList())));
+        companyList.stream().filter(e -> collect.containsKey(e.getCompanyId())).forEach( e -> e.setRules(collect.get(e.getCompanyId())));
+        return companyList;
+    }
+
+    /**
+     * 新增公司SOP权限
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 结果
+     */
+    @Override
+    public int insertCompanySopRole(CompanySopRole companySopRole){
+        return add(companySopRole) ? 1 : 0;
+    }
+
+    /**
+     * 修改公司SOP权限
+     * 
+     * @param companySopRole 公司SOP权限
+     * @return 结果
+     */
+    @Override
+    public int updateCompanySopRole(CompanySopRole companySopRole)
+    {
+        return add(companySopRole) ? 1 : 0;
+    }
+
+    private boolean add(CompanySopRole companySopRole){
+        baseMapper.delete(new QueryWrapper<CompanySopRole>().eq("company_id", companySopRole.getCompanyId()));
+        List<CompanySopRole> collect = companySopRole.getRules().stream().map(e -> {
+            CompanySopRole role = new CompanySopRole();
+            role.setCompanyId(companySopRole.getCompanyId());
+            role.setRoleValue(e);
+            return role;
+        }).collect(Collectors.toList());
+        return super.saveBatch(collect);
+    }
+
+    /**
+     * 批量删除公司SOP权限
+     * 
+     * @param ids 需要删除的公司SOP权限主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanySopRoleByIds(Long[] ids)
+    {
+        return baseMapper.deleteCompanySopRoleByIds(ids);
+    }
+
+    /**
+     * 删除公司SOP权限信息
+     * 
+     * @param id 公司SOP权限主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanySopRoleById(Long id)
+    {
+        return baseMapper.deleteCompanySopRoleById(id);
+    }
+
+    @Override
+    public List<String> getRolesByCompanyId(Long id) {
+        return list(new QueryWrapper<CompanySopRole>().eq("company_id", id)).stream().map(CompanySopRole::getRoleValue).collect(Collectors.toList());
+    }
+}

+ 77 - 0
fs-service-system/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java

@@ -7,10 +7,14 @@ import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.PubFun;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.domain.FsUserCourseVideoRedPackage;
 import com.fs.course.mapper.FsUserCourseMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
+import com.fs.course.service.IFsUserCourseVideoRedPackageService;
+import com.fs.course.vo.FsCourseRedPacketLogListPVO;
 import com.fs.fastGpt.domain.FastGptChatReplaceWords;
 import com.fs.fastGpt.mapper.FastGptChatReplaceWordsMapper;
 import com.fs.qw.vo.QwSopTempSetting2;
@@ -22,12 +26,16 @@ import com.fs.sop.domain.QwSopTempRules;
 import com.fs.sop.mapper.QwSopTempMapper;
 import com.fs.sop.params.QwSopShareTempParam;
 import com.fs.sop.service.*;
+import com.fs.sop.vo.QwSopTempRedPackageVo;
 import com.fs.sop.vo.VoiceVo;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import lombok.AllArgsConstructor;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
@@ -55,6 +63,8 @@ public class QwSopTempServiceImpl implements IQwSopTempService
     private final RocketMQTemplate rocketMQTemplate;
     private final FsUserCourseMapper fsUserCourseMapper;
     private final FsUserCourseVideoMapper fsUserCourseVideoMapper;
+    private final IFsUserCourseVideoRedPackageService fsUserCourseVideoRedPackageService;
+    private final ISysConfigService sysConfigService;
 
     /**
      * 查询sop模板
@@ -258,6 +268,72 @@ public class QwSopTempServiceImpl implements IQwSopTempService
             r.setRulesId(e.getId());
         })).collect(Collectors.toList());
         qwSopTempContentService.saveList(contentList);
+        SysConfig sysConfig = sysConfigService.selectConfigByConfigKey("course.config");
+        CourseConfig courseConfig = JSON.parseObject(sysConfig.getConfigValue(), CourseConfig.class);
+        List<Long> videoIdList = PubFun.listToNewList(ruleList, QwSopTempRules::getVideoId);
+        Map<Long, Optional<BigDecimal>> redMap;
+        if(!videoIdList.isEmpty()){
+            List<FsUserCourseVideoRedPackage> redPackageList = fsUserCourseVideoRedPackageService.listByCompanyIdAndVideoIds(temp.getCompanyId(), videoIdList);
+            redMap = redPackageList.stream().collect(Collectors.groupingBy(FsUserCourseVideoRedPackage::getVideoId, Collectors.mapping(FsUserCourseVideoRedPackage::getRedPacketMoney, Collectors.reducing((e1, e2) -> e1))));
+        }else{
+            redMap = new HashMap<>();
+        }
+
+        List<FsUserCourseVideoRedPackage> redPackage = ruleList.stream().filter(e -> e.getVideoId() != null).map(e -> {
+            FsUserCourseVideoRedPackage red = new FsUserCourseVideoRedPackage();
+            red.setCompanyId(temp.getCompanyId());
+            red.setVideoId(e.getVideoId());
+            red.setRedPacketMoney(redMap.getOrDefault(e.getVideoId(), Optional.of(courseConfig.getRedPackageMoney())).orElse(BigDecimal.ZERO));
+            red.setRuleId(e.getId());
+            red.setDataType(3);
+            return red;
+        }).collect(Collectors.toList());
+        fsUserCourseVideoRedPackageService.batchSaveFsUserCourseVideoRedPackage(redPackage);
+    }
+
+    @Override
+    public List<QwSopTempRedPackageVo> redList(String id) {
+        List<QwSopTempDay> dayList = qwSopTempRulesService.listByTempIdAll(id);
+        if(dayList.isEmpty()){
+            return Collections.emptyList();
+        }
+        List<QwSopTempRules> rules = dayList.stream().flatMap(e -> e.getList().stream()).collect(Collectors.toList());
+        if(rules.isEmpty()){
+            return Collections.emptyList();
+        }
+        List<FsUserCourseVideoRedPackage> redPackageList = fsUserCourseVideoRedPackageService.listByRuleIds(PubFun.listToNewList(rules, QwSopTempRules::getId));
+        Map<Long, FsUserCourseVideoRedPackage> redMap = PubFun.listToMapByGroupObject(redPackageList, FsUserCourseVideoRedPackage::getVideoId);
+        List<FsUserCourseVideo> videoList = fsUserCourseVideoMapper.selectVideoByCourseId(rules.get(0).getCourseId());
+        Map<Long, FsUserCourseVideo> videoMap = PubFun.listToMapByGroupObject(videoList, FsUserCourseVideo::getVideoId);
+        return rules.stream().filter(e -> redMap.containsKey(e.getVideoId()) && videoMap.containsKey(e.getVideoId())).map(e -> {
+            FsUserCourseVideoRedPackage red = redMap.get(e.getVideoId());
+            FsUserCourseVideo video = videoMap.get(e.getVideoId());
+            QwSopTempRedPackageVo vo = new QwSopTempRedPackageVo();
+            vo.setId(red.getId());
+            vo.setRuleId(e.getId());
+            vo.setName(e.getName());
+            vo.setVideoId(e.getVideoId());
+            vo.setVideoName(video.getTitle());
+            vo.setCompanyId(red.getCompanyId());
+            vo.setRedPacketMoney(red.getRedPacketMoney());
+            vo.setDataType(red.getDataType());
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public void updateRedPackage(List<QwSopTempRedPackageVo> list) {
+        fsUserCourseVideoRedPackageService.deleteFsUserCourseVideoRedPackageByIds(list.stream().map(QwSopTempRedPackageVo::getId).toArray(Long[]::new));
+        List<FsUserCourseVideoRedPackage> redPackage = list.stream().map(e -> {
+            FsUserCourseVideoRedPackage red = new FsUserCourseVideoRedPackage();
+            red.setCompanyId(e.getCompanyId());
+            red.setVideoId(e.getVideoId());
+            red.setRedPacketMoney(e.getRedPacketMoney());
+            red.setRuleId(e.getRuleId());
+            red.setDataType(3);
+            return red;
+        }).collect(Collectors.toList());
+        fsUserCourseVideoRedPackageService.batchSaveFsUserCourseVideoRedPackage(redPackage);
     }
 
     @Override
@@ -305,6 +381,7 @@ public class QwSopTempServiceImpl implements IQwSopTempService
         if(!voiceList.isEmpty()){
             rocketMQTemplate.syncSend("voice-generation", JSON.toJSONString(VoiceVo.builder().type(0).id(day.getId().toString()).build()));
         }
+
         return map;
     }
 

+ 18 - 0
fs-service-system/src/main/java/com/fs/sop/vo/QwSopTempRedPackageVo.java

@@ -0,0 +1,18 @@
+package com.fs.sop.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class QwSopTempRedPackageVo {
+    private Long id;
+    private Long ruleId;
+    private String name;
+    private Long videoId;
+    private String videoName;
+    private Long companyId;
+    private BigDecimal redPacketMoney;
+    private Integer dataType;
+
+}

+ 11 - 0
fs-service-system/src/main/java/com/fs/sop/vo/UpdateRedVo.java

@@ -0,0 +1,11 @@
+package com.fs.sop.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class UpdateRedVo {
+    private List<QwSopTempRedPackageVo> list;
+}

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

@@ -128,6 +128,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="lastJoinTime != null">#{lastJoinTime},</if>
          </trim>
     </insert>
+    <insert id="insertBatchFsUserCourseVideo" parameterType="FsUserCourseVideo" useGeneratedKeys="true" keyProperty="videoId">
+        insert into fs_user_course_video
+        (
+        title,
+        video_url,
+        thumbnail,
+        duration,
+        course_id,
+        status,
+        course_sort,
+        file_name,
+        question_bank_id,
+        line_one,
+        line_two,
+        line_three,
+        red_packet_money,
+        file_size,
+        file_key,
+        is_transcode
+        )
+        values
+        <foreach collection="collect" item="item" separator=",">
+            (
+            #{item.title},
+            #{item.videoUrl},
+            #{item.thumbnail},
+            #{item.duration},
+            #{item.courseId},
+            #{item.status},
+            #{item.courseSort},
+            #{item.fileName},
+            #{item.questionBankId},
+            #{item.lineOne},
+            #{item.lineTwo},
+            #{item.lineThree},
+            #{item.redPacketMoney},
+            #{item.fileSize},
+            #{item.fileKey},
+            #{item.isTranscode}
+            )
+        </foreach>
+    </insert>
 
     <update id="updateFsUserCourseVideo" parameterType="FsUserCourseVideo">
         update fs_user_course_video

+ 8 - 0
fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoRedPackageMapper.xml

@@ -28,6 +28,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsUserCourseVideoRedPackageVo"/>
         where id = #{id}
     </select>
+    <select id="listByCompanyIdAndVideoIds" resultType="com.fs.course.domain.FsUserCourseVideoRedPackage">
+        select * from fs_user_course_video_red_package where data_type = 1 and company_id = #{companyId} and video_id in <foreach collection="videoIdList" item="item" open="(" separator="," close=")">#{item}</foreach>
+    </select>
+    <select id="listByRuleIds" resultType="com.fs.course.domain.FsUserCourseVideoRedPackage">
+        select * from fs_user_course_video_red_package where data_type = 3 and rule_id in <foreach collection="ids" item="item" open="(" separator="," close=")">#{item}</foreach>
+    </select>
 
     <insert id="insertFsUserCourseVideoRedPackage" parameterType="FsUserCourseVideoRedPackage" useGeneratedKeys="true" keyProperty="id">
         insert into fs_user_course_video_red_package
@@ -72,6 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="list[0].redPacketMoney != null">red_packet_money,</if>
             <if test="list[0].periodId !=null">period_id,</if>
             <if test="list[0].dataType !=null">data_type,</if>
+            <if test="list[0].ruleId !=null">rule_id,</if>
         </trim>
         VALUES
         <foreach collection="list" item="item" separator=",">
@@ -81,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 <if test="item.redPacketMoney != null">#{item.redPacketMoney},</if>
                 <if test="item.periodId !=null">#{item.periodId},</if>
                 <if test="item.dataType !=null">#{item.dataType},</if>
+                <if test="item.ruleId !=null">#{item.ruleId},</if>
             </trim>
         </foreach>
     </insert>

+ 86 - 0
fs-service-system/src/main/resources/mapper/sop/CompanySopRoleMapper.xml

@@ -0,0 +1,86 @@
+<?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.sop.mapper.CompanySopRoleMapper">
+    
+    <resultMap type="CompanySopRole" id="CompanySopRoleResult">
+        <result property="id"    column="id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="roleName"    column="role_name"    />
+        <result property="roleValue"    column="role_value"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectCompanySopRoleVo">
+        select id, company_id, role_name, role_value, create_time, create_by, update_by, update_time, remark from company_sop_role
+    </sql>
+
+    <select id="selectCompanySopRoleList" parameterType="CompanySopRole" resultMap="CompanySopRoleResult">
+        <include refid="selectCompanySopRoleVo"/>
+        <where>  
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="roleName != null  and roleName != ''"> and role_name like concat('%', #{roleName}, '%')</if>
+            <if test="roleValue != null  and roleValue != ''"> and role_value = #{roleValue}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanySopRoleById" parameterType="Long" resultMap="CompanySopRoleResult">
+        <include refid="selectCompanySopRoleVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCompanySopRole" parameterType="CompanySopRole" useGeneratedKeys="true" keyProperty="id">
+        insert into company_sop_role
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="companyId != null">company_id,</if>
+            <if test="roleName != null">role_name,</if>
+            <if test="roleValue != null">role_value,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="companyId != null">#{companyId},</if>
+            <if test="roleName != null">#{roleName},</if>
+            <if test="roleValue != null">#{roleValue},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanySopRole" parameterType="CompanySopRole">
+        update company_sop_role
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="roleName != null">role_name = #{roleName},</if>
+            <if test="roleValue != null">role_value = #{roleValue},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCompanySopRoleById" parameterType="Long">
+        delete from company_sop_role where id = #{id}
+    </delete>
+
+    <delete id="deleteCompanySopRoleByIds" parameterType="String">
+        delete from company_sop_role where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 3 - 0
fs-service-system/src/main/resources/mapper/sop/QwSopTempMapper.xml

@@ -59,6 +59,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </select>
+    <select id="redList" resultType="com.fs.sop.vo.QwSopTempRedPackageVo">
+        select * from
+    </select>
 
     <insert id="insertQwSopTemp" parameterType="QwSopTemp" useGeneratedKeys="true" keyProperty="id">
         insert into qw_sop_temp