Kaynağa Gözat

1、按营期批量设置红包金额;2、优化列表公司查询

caoliqin 1 ay önce
ebeveyn
işleme
0e2126e776

+ 18 - 3
fs-admin/src/main/java/com/fs/course/controller/FsUserCoursePeriodController.java

@@ -6,6 +6,7 @@ import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.course.domain.FsUserCourseVideoRedPackage;
 import com.fs.course.param.CompanyRedPacketParam;
+import com.fs.course.param.FsBatchPeriodRedPackageParam;
 import com.fs.course.param.PeriodRedPacketParam;
 import com.fs.course.service.IFsUserCoursePeriodDaysService;
 import com.fs.course.service.IFsUserCourseVideoRedPackageService;
@@ -153,11 +154,25 @@ public class FsUserCoursePeriodController extends BaseController {
         return R.ok().put("data", periodRedPacketList);
     }
 
-    @ApiOperation("批量保存设置红包金额(全删全增)")
+    @ApiOperation("按课程批量保存设置红包金额")
     @PostMapping("/batchRedPacket")
     public R batchRedPacketMoney(@RequestBody List<FsUserCourseVideoRedPackage> videoRedPackageList) {
-        int i = fsUserCourseVideoRedPackageService.batchSaveCompanyRedPackage(videoRedPackageList);
-        if (i <= 0) {
+        try {
+            fsUserCourseVideoRedPackageService.batchSaveCompanyRedPackage(videoRedPackageList);
+        } catch (Exception e) {
+            logger.error("按课程批量保存设置红包金额-失败!,营期id:{}", videoRedPackageList.get(0).getPeriodId());
+            return R.error("保存失败!");
+        }
+        return R.ok();
+    }
+
+    @ApiOperation("按营期批量保存设置红包金额")
+    @PostMapping("/batchRedPacket/byPeriod")
+    public R batchRedPacketByPeriod(@RequestBody List<FsBatchPeriodRedPackageParam> periodRedPackageList) {
+        try {
+            fsUserCourseVideoRedPackageService.batchRedPacketByPeriod(periodRedPackageList);
+        } catch (Exception e) {
+            logger.error("按营期批量保存设置红包金额-失败!,入参:{}", periodRedPackageList);
             return R.error("保存失败!");
         }
         return R.ok();

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

@@ -75,5 +75,5 @@ public class FsUserCoursePeriod
     private LocalDate periodEndTime;
 
     @TableField(exist = false)
-    private List<String> companyIdList;
+    private List<Long> companyIdList;
 }

+ 17 - 7
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java

@@ -1,6 +1,8 @@
 package com.fs.course.mapper;
 
 import java.util.List;
+import java.util.Set;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.course.domain.FsUserCoursePeriodDays;
 import org.apache.ibatis.annotations.Param;
@@ -8,14 +10,14 @@ import org.apache.ibatis.annotations.Select;
 
 /**
  * 营期课程Mapper接口
- * 
+ *
  * @author fs
  * @date 2025-04-16
  */
 public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePeriodDays>{
     /**
      * 查询营期课程
-     * 
+     *
      * @param id 营期课程主键
      * @return 营期课程
      */
@@ -23,7 +25,7 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
 
     /**
      * 查询营期课程列表
-     * 
+     *
      * @param fsUserCoursePeriodDays 营期课程
      * @return 营期课程集合
      */
@@ -31,7 +33,7 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
 
     /**
      * 新增营期课程
-     * 
+     *
      * @param fsUserCoursePeriodDays 营期课程
      * @return 结果
      */
@@ -39,7 +41,7 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
 
     /**
      * 修改营期课程
-     * 
+     *
      * @param fsUserCoursePeriodDays 营期课程
      * @return 结果
      */
@@ -47,7 +49,7 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
 
     /**
      * 删除营期课程
-     * 
+     *
      * @param id 营期课程主键
      * @return 结果
      */
@@ -55,9 +57,17 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
 
     /**
      * 批量删除营期课程
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */
     int deleteFsUserCoursePeriodDaysByIds(Long[] ids);
+
+    /**
+     * 根据营期ids获取课程
+     * @param periodIds 营期ids
+     * @return
+     */
+    List<FsUserCoursePeriodDays> selectCourseVideoList(@Param("periodIds") Set<Long> periodIds);
+
 }

+ 8 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCoursePeriodMapper.java

@@ -1,6 +1,7 @@
 package com.fs.course.mapper;
 
 import java.util.List;
+import java.util.Set;
 
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.param.CompanyRedPacketParam;
@@ -96,4 +97,11 @@ public interface FsUserCoursePeriodMapper
 
     List<PeriodRedPacketParam> selectPeriodRedPacket(@Param("periodId")Long periodId, @Param("companyId")Long companyId);
 
+    /**
+     * 根据营期ids批量获取营期数据
+     * @param periodIds 营期ids
+     * @return
+     */
+    List<FsUserCoursePeriod> selectFsUserCoursePeriodsByIds(@Param("periodIds") Set<Long> periodIds);
+
 }

+ 18 - 16
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseVideoRedPackageMapper.java

@@ -71,26 +71,28 @@ public interface FsUserCourseVideoRedPackageMapper
     @Select("select * from fs_user_course_video_red_package where video_id =#{videoId} and company_id = #{companyId}")
     FsUserCourseVideoRedPackage selectRedPacketByCompanyId(@Param("videoId") Long videoId,@Param("companyId") Long companyId);
 
-        int batchSaveFsUserCourseVideoRedPackage(@Param("list") List<FsUserCourseVideoRedPackage> redPackageList);
+    int batchSaveFsUserCourseVideoRedPackage(@Param("list") List<FsUserCourseVideoRedPackage> redPackageList);
 
-        int batchDeleteParams(@Param("list") List<FsUserCourseVideoRedPackage> videoRedPackageList);
+    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);
-        /**
-         * 批量更新红包数据
-         *
-         * @param list 红包数据列表
-         * @return 更新结果
-         */
-        int batchUpdateFsUserCourseVideoRedPackage(@Param("list") List<FsUserCourseVideoRedPackage> list);
+    /**
+     * 批量更新红包数据
+     *
+     * @param list 红包数据列表
+     * @return 更新结果
+     */
+    int batchUpdateFsUserCourseVideoRedPackage(@Param("list") List<FsUserCourseVideoRedPackage> list);
+
+    /**
+     * 批量查询匹配的红包数据
+     *
+     * @param list 红包数据列表
+     * @return 匹配的红包数据列表
+     */
+    List<FsUserCourseVideoRedPackage> selectByParamsList(@Param("list") List<FsUserCourseVideoRedPackage> list);
 
-        /**
-         * 批量查询匹配的红包数据
-         *
-         * @param list 红包数据列表
-         * @return 匹配的红包数据列表
-         */
-        List<FsUserCourseVideoRedPackage> selectByParamsList(@Param("list") List<FsUserCourseVideoRedPackage> list);
+    int updateRedPackageByParams(FsUserCourseVideoRedPackage videoRedPackage);
 }

+ 20 - 0
fs-service-system/src/main/java/com/fs/course/param/FsBatchPeriodRedPackageParam.java

@@ -0,0 +1,20 @@
+package com.fs.course.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 按照营期批量设置红包入参
+ */
+@Data
+public class FsBatchPeriodRedPackageParam implements Serializable {
+
+    @ApiModelProperty(value = "红包金额")
+    private BigDecimal redPacketMoney;
+
+    @ApiModelProperty(value = "营期id")
+    private Long periodId;
+
+}

+ 9 - 2
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoRedPackageService.java

@@ -1,6 +1,7 @@
 package com.fs.course.service;
 
 import com.fs.course.domain.FsUserCourseVideoRedPackage;
+import com.fs.course.param.FsBatchPeriodRedPackageParam;
 
 import java.util.List;
 
@@ -77,11 +78,17 @@ public interface IFsUserCourseVideoRedPackageService
     /**
      *  批量保存公司设置红包金额
      * @param fsUserCourseVideoRedPackageList
-     * @return
      */
-    int batchSaveCompanyRedPackage(List<FsUserCourseVideoRedPackage> fsUserCourseVideoRedPackageList);
+    void batchSaveCompanyRedPackage(List<FsUserCourseVideoRedPackage> fsUserCourseVideoRedPackageList);
 
     List<FsUserCourseVideoRedPackage> listByCompanyIdAndVideoIds(Long companyId, List<Long> videoIdList);
 
     List<FsUserCourseVideoRedPackage> listByRuleIds(List<Long> ids);
+
+    /**
+     * 按照营期批量设置红包
+     * @param periodRedPackageList
+     */
+    void batchRedPacketByPeriod(List<FsBatchPeriodRedPackageParam> periodRedPackageList);
+
 }

+ 90 - 13
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoRedPackageServiceImpl.java

@@ -1,15 +1,24 @@
 package com.fs.course.service.impl;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.HashSet;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import com.fs.course.domain.FsUserCoursePeriod;
+import com.fs.course.domain.FsUserCoursePeriodDays;
+import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
+import com.fs.course.mapper.FsUserCoursePeriodMapper;
+import com.fs.course.param.FsBatchPeriodRedPackageParam;
+import com.google.common.collect.Lists;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsUserCourseVideoRedPackageMapper;
 import com.fs.course.domain.FsUserCourseVideoRedPackage;
 import com.fs.course.service.IFsUserCourseVideoRedPackageService;
+import org.springframework.test.annotation.Rollback;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -24,6 +33,15 @@ public class FsUserCourseVideoRedPackageServiceImpl implements IFsUserCourseVide
     @Autowired
     private FsUserCourseVideoRedPackageMapper fsUserCourseVideoRedPackageMapper;
 
+    @Autowired
+    private SqlSessionFactory sqlSessionFactory;
+
+    @Autowired
+    private FsUserCoursePeriodDaysMapper userCoursePeriodDaysMapper;
+
+    @Autowired
+    private FsUserCoursePeriodMapper userCoursePeriodMapper;
+
     /**
      * 查询课程公司红包
      *
@@ -108,12 +126,11 @@ public class FsUserCourseVideoRedPackageServiceImpl implements IFsUserCourseVide
 
     @Override
     @Transactional
-    public int batchSaveCompanyRedPackage(List<FsUserCourseVideoRedPackage> fsUserCourseVideoRedPackageList) {
+    public void batchSaveCompanyRedPackage(List<FsUserCourseVideoRedPackage> fsUserCourseVideoRedPackageList) {
         if (fsUserCourseVideoRedPackageList == null || fsUserCourseVideoRedPackageList.isEmpty()) {
-            return 0;
+            return;
         }
 
-        // 一次性查询所有匹配的数据
         List<FsUserCourseVideoRedPackage> existingData = fsUserCourseVideoRedPackageMapper
                 .selectByParamsList(fsUserCourseVideoRedPackageList);
 
@@ -124,7 +141,7 @@ public class FsUserCourseVideoRedPackageServiceImpl implements IFsUserCourseVide
             existingKeys.add(key);
         }
 
-        // 分离需要更新和需要新增的数据
+        //需要修改和新增的数据
         List<FsUserCourseVideoRedPackage> updateList = new ArrayList<>();
         List<FsUserCourseVideoRedPackage> insertList = new ArrayList<>();
 
@@ -140,14 +157,13 @@ public class FsUserCourseVideoRedPackageServiceImpl implements IFsUserCourseVide
             }
         }
 
-        int result = 0;
         if (!updateList.isEmpty()) {
-            result += fsUserCourseVideoRedPackageMapper.batchUpdateFsUserCourseVideoRedPackage(updateList);
+//            result += fsUserCourseVideoRedPackageMapper.batchUpdateFsUserCourseVideoRedPackage(updateList);
+            this.batchUpdateRedPackage(updateList);
         }
         if (!insertList.isEmpty()) {
-            result += fsUserCourseVideoRedPackageMapper.batchSaveFsUserCourseVideoRedPackage(insertList);
+            fsUserCourseVideoRedPackageMapper.batchSaveFsUserCourseVideoRedPackage(insertList);
         }
-        return result;
     }
 
     private String generateKey(Long periodId, Long videoId, Long companyId) {
@@ -163,4 +179,65 @@ public class FsUserCourseVideoRedPackageServiceImpl implements IFsUserCourseVide
     public List<FsUserCourseVideoRedPackage> listByRuleIds(List<Long> ids) {
         return fsUserCourseVideoRedPackageMapper.listByRuleIds(ids);
     }
+
+    private void batchUpdateRedPackage(List<FsUserCourseVideoRedPackage> list) {
+        // 分批次处理(避免一次性提交太多)
+        List<List<FsUserCourseVideoRedPackage>> batches = Lists.partition(list, 500);
+        batches.forEach(batch -> {
+            SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
+            try {
+                FsUserCourseVideoRedPackageMapper mapper = sqlSession.getMapper(FsUserCourseVideoRedPackageMapper.class);
+                batch.forEach(mapper::updateRedPackageByParams);
+                sqlSession.commit();
+            } finally {
+                sqlSession.close();
+            }
+        });
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchRedPacketByPeriod(List<FsBatchPeriodRedPackageParam> periodRedPackageList) {
+        // 1、提取所有传入的营期id
+        Set<Long> periodIds = periodRedPackageList.stream()
+                .map(FsBatchPeriodRedPackageParam::getPeriodId)
+                .collect(Collectors.toSet());
+
+        // 2、查询传入的营期信息,主要作用是获取营期的公司ids
+        List<FsUserCoursePeriod> fsUserCoursePeriods = userCoursePeriodMapper.selectFsUserCoursePeriodsByIds(periodIds);
+        Map<Long, FsUserCoursePeriod> periodMap = fsUserCoursePeriods.stream()
+                .collect(Collectors.toMap(FsUserCoursePeriod::getPeriodId, Function.identity()));
+
+        // 3、批量查询营期课程信息
+        List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = userCoursePeriodDaysMapper.selectCourseVideoList(periodIds);
+        Map<Long, List<FsUserCoursePeriodDays>> fsUserCoursePeriodDaysMap = fsUserCoursePeriodDays.stream()
+                .collect(Collectors.groupingBy(FsUserCoursePeriodDays::getPeriodId));
+
+        // 4、组装数据
+        List<FsUserCourseVideoRedPackage> fsRedPackageList = new ArrayList<>();
+        periodRedPackageList.forEach(v -> {
+            Long periodId = v.getPeriodId();
+            String[] companyIds = periodMap.get(periodId).getCompanyId().split(",");
+
+            List<FsUserCoursePeriodDays> periodVideos = fsUserCoursePeriodDaysMap.getOrDefault(periodId, Collections.emptyList());
+
+            // 将营期id、视频id、公司id组装成一条数据
+            for (String companyId : companyIds) {
+                periodVideos.forEach(c -> {
+                    FsUserCourseVideoRedPackage fsUserCourseVideoRedPackage = new FsUserCourseVideoRedPackage();
+                    fsUserCourseVideoRedPackage.setCompanyId(Long.parseLong(companyId));
+                    fsUserCourseVideoRedPackage.setVideoId(c.getVideoId());
+                    fsUserCourseVideoRedPackage.setRedPacketMoney(v.getRedPacketMoney());
+                    fsUserCourseVideoRedPackage.setPeriodId(periodId);
+                    fsUserCourseVideoRedPackage.setDataType(2);
+                    fsRedPackageList.add(fsUserCourseVideoRedPackage);
+                });
+            }
+        });
+
+        // 5、 新增或修改
+        this.batchSaveCompanyRedPackage(fsRedPackageList);
+    }
+
+
 }

+ 13 - 5
fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodDaysMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fs.course.mapper.FsUserCoursePeriodDaysMapper">
-    
+
     <resultMap type="FsUserCoursePeriodDays" id="FsUserCoursePeriodDaysResult">
         <result property="id"    column="id"    />
         <result property="periodId"    column="period_id"    />
@@ -35,12 +35,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="videoId != null "> and video_id = #{videoId}</if>
         </where>
     </select>
-    
+
     <select id="selectFsUserCoursePeriodDaysById" parameterType="Long" resultMap="FsUserCoursePeriodDaysResult">
         <include refid="selectFsUserCoursePeriodDaysVo"/>
         where id = #{id}
     </select>
-        
+
     <insert id="insertFsUserCoursePeriodDays" parameterType="FsUserCoursePeriodDays" useGeneratedKeys="true" keyProperty="id">
         insert into fs_user_course_period_days
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -100,9 +100,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteFsUserCoursePeriodDaysByIds" parameterType="String">
-        delete from fs_user_course_period_days where id in 
+        delete from fs_user_course_period_days where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
-</mapper>
+
+    <select id="selectCourseVideoList" resultType="FsUserCoursePeriodDays">
+       select * from fs_user_course_period_days where period_id in
+        <foreach collection="periodIds" item="item" open="(" separator="," close=")">
+           #{item}
+        </foreach>
+
+    </select>
+</mapper>

+ 9 - 2
fs-service-system/src/main/resources/mapper/course/FsUserCoursePeriodMapper.xml

@@ -68,8 +68,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     #{companyId}
                 </foreach>
             </if>
-            <if test="periodStartingTime != null "> and period_starting_time = #{periodStartingTime}</if>
-            <if test="periodEndTime != null "> and period_end_time = #{periodEndTime}</if>
+            <if test="periodStartingTime != null "> and period_starting_time &gt;= #{periodStartingTime}</if>
+            <if test="periodEndTime != null "> and period_end_time &lt;= #{periodEndTime}</if>
         </where>
         group by fs_user_course_period.period_id
         order by create_time desc
@@ -204,4 +204,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             )
     </select>
 
+    <select id="selectFsUserCoursePeriodsByIds" resultType="FsUserCoursePeriod">
+        select * from fs_user_course_period
+        where period_id in
+        <foreach collection="periodIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 12 - 1
fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoRedPackageMapper.xml

@@ -102,7 +102,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
-    <!-- 批量更新红包数据 -->
+    <!-- 批量更新红包数据(暂弃) -->
     <update id="batchUpdateFsUserCourseVideoRedPackage">
         <foreach collection="list" item="item" separator=";">
             update fs_user_course_video_red_package
@@ -125,4 +125,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
         )
     </select>
+
+    <!-- 按条件更新红包金额 -->
+    <update id="updateRedPackageByParams" parameterType="FsUserCourseVideoRedPackage">
+        update fs_user_course_video_red_package
+        set red_packet_money = #{redPacketMoney}
+        where period_id = #{periodId}
+        and video_id = #{videoId}
+        and company_id = #{companyId}
+        and data_type = 2
+    </update>
+
 </mapper>