Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

caoliqin 1 месяц назад
Родитель
Сommit
b64c5c1c16
15 измененных файлов с 208 добавлено и 54 удалено
  1. 4 1
      fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceRoboticController.java
  2. 4 1
      fs-company/src/main/java/com/fs/company/controller/company/CompanyVoiceRoboticController.java
  3. 3 0
      fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRobotic.java
  4. 9 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogCallphoneMapper.java
  5. 9 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticMapper.java
  6. 9 0
      fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticService.java
  7. 15 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java
  8. 9 5
      fs-service/src/main/java/com/fs/company/service/impl/call/node/AiCallTaskNode.java
  9. 13 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseAnswerLogsMapper.java
  10. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  11. 49 20
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java
  12. 28 19
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  13. 7 0
      fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogCallphoneMapper.xml
  14. 15 7
      fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticMapper.xml
  15. 33 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

+ 4 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyVoiceRoboticController.java

@@ -137,7 +137,10 @@ public class CompanyVoiceRoboticController extends BaseController
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
     {
-        return toAjax(companyVoiceRoboticService.deleteCompanyVoiceRoboticByIds(ids));
+        for (Long id : ids) {
+            companyVoiceRoboticService.updateDelFlag(id, 1);
+        }
+        return AjaxResult.success();
     }
     /**
      * 删除机器人外呼任务

+ 4 - 1
fs-company/src/main/java/com/fs/company/controller/company/CompanyVoiceRoboticController.java

@@ -167,7 +167,10 @@ public class CompanyVoiceRoboticController extends BaseController
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
     {
-        return toAjax(companyVoiceRoboticService.deleteCompanyVoiceRoboticByIds(ids));
+        for (Long id : ids) {
+            companyVoiceRoboticService.updateDelFlag(id, 1);
+        }
+        return AjaxResult.success();
     }
     /**
      * 删除机器人外呼任务

+ 3 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyVoiceRobotic.java

@@ -135,4 +135,7 @@ public class CompanyVoiceRobotic {
     private String sceneTypeName;
     private LocalTime availableStartTime;
     private LocalTime availableEndTime;
+
+    /** 删除标志 0正常 1删除 */
+    private Integer delFlag;
 }

+ 9 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticCallLogCallphoneMapper.java

@@ -74,9 +74,10 @@ public interface CompanyVoiceRoboticCallLogCallphoneMapper extends BaseMapper<Co
     /**
      * 根据业务ID查询当天的通话次数
      * @param businessId 业务ID (bes.id)
+     * @param companyId 公司ID
      * @return 当天通话次数,如果没有记录返回0
      */
-    int countTodayCallsByBusinessId(@Param("businessId") Long businessId);
+    int countTodayCallsByBusinessId(@Param("businessId") Long businessId,@Param("companyId") Long companyId);
 
     List<CompanyVoiceRoboticCallLogCallphone> selectCompanyVoiceRoboticCallPhoneLogGroupList(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
 
@@ -84,4 +85,11 @@ public interface CompanyVoiceRoboticCallLogCallphoneMapper extends BaseMapper<Co
 
 
     List<CompanyVoiceRoboticCallLogCallPhoneVO> listByRoboticId(CompanyVoiceRoboticCallLogCallphone companyVoiceRoboticCallLogCallphone);
+
+    /**
+     * 根据业务ID查询公司ID
+     * @param businessId 业务ID (bes.id)
+     * @return 公司ID
+     */
+    Long selectCompanyIdByBusinessId(@Param("businessId") Long businessId);
 }

+ 9 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyVoiceRoboticMapper.java

@@ -64,6 +64,15 @@ public interface CompanyVoiceRoboticMapper extends BaseMapper<CompanyVoiceRoboti
      */
     public int deleteCompanyVoiceRoboticByIds(Long[] ids);
 
+    /**
+     * 更新删除标志(逻辑删除)
+     * 
+     * @param id 机器人外呼任务ID
+     * @param delFlag 删除标志 0正常 1删除
+     * @return 结果
+     */
+    public int updateDelFlag(@Param("id") Long id, @Param("delFlag") Integer delFlag);
+
     List<CompanyVoiceRoboticQwUserListVo> qwUserList();
     List<CompanyVoiceRoboticQwUserListVo> qwUserListCompany(CompanyVoiceRobotic companyVoiceRobotic);
 

+ 9 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyVoiceRoboticService.java

@@ -72,6 +72,15 @@ public interface ICompanyVoiceRoboticService extends IService<CompanyVoiceRoboti
      */
     public int deleteCompanyVoiceRoboticById(Long id);
 
+    /**
+     * 更新删除标志(逻辑删除)
+     * 
+     * @param id 机器人外呼任务ID
+     * @param delFlag 删除标志 0正常 1删除
+     * @return 结果
+     */
+    public int updateDelFlag(Long id, Integer delFlag);
+
     List<CompanyVoiceRoboticQwUserListVo> qwUserList();
     List<CompanyVoiceRoboticQwUserListVo> qwUserListCompany(CompanyVoiceRobotic companyVoiceRobotic);
 

+ 15 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyVoiceRoboticServiceImpl.java

@@ -763,6 +763,18 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
         return companyVoiceRoboticMapper.deleteCompanyVoiceRoboticById(id);
     }
 
+    /**
+     * 更新删除标志(逻辑删除)
+     *
+     * @param id 机器人外呼任务ID
+     * @param delFlag 删除标志 0正常 1删除
+     * @return 结果
+     */
+    @Override
+    public int updateDelFlag(Long id, Integer delFlag) {
+        return companyVoiceRoboticMapper.updateDelFlag(id, delFlag);
+    }
+
     @Override
     public List<CompanyVoiceRoboticQwUserListVo> qwUserList() {
         return companyVoiceRoboticMapper.qwUserList();
@@ -1127,6 +1139,9 @@ public class CompanyVoiceRoboticServiceImpl extends ServiceImpl<CompanyVoiceRobo
         if (robotic.getCompanyAiWorkflowId() == null) {
             throw new RuntimeException("任务未配置工作流: " + id);
         }
+        if(robotic.getDelFlag() == 1){
+            throw new RuntimeException("启动失败,当前任务已删除: " + id);
+        }
         robotic.setTaskStatus(1);
         updateById(robotic);
         // 根据任务加微方式决定是否直接分配微信 平均时 直接分配用户 场景任务不做分配

+ 9 - 5
fs-service/src/main/java/com/fs/company/service/impl/call/node/AiCallTaskNode.java

@@ -336,11 +336,15 @@ public class AiCallTaskNode extends AbstractWorkflowNode {
             //转换数据
             CidPhoneConfig config =JSONObject.parseObject(json,CidPhoneConfig.class);
             if(config.getEnablePhoneLimitConfig() != null && config.getEnablePhoneLimitConfig()){//开启了拨打限制按钮
-                //获取当前外呼业务电话拨打信息
-               int num = companyVoiceRoboticCallLogCallphoneMapper.countTodayCallsByBusinessId(businessId);
-               if(num >= config.getNumberCalls()){
-                   return true;
-               }
+                //获取销售公司
+                Long companyId = companyVoiceRoboticCallLogCallphoneMapper.selectCompanyIdByBusinessId(businessId);
+                if(companyId != null){
+                    //获取当前外呼业务电话拨打信息
+                    int num = companyVoiceRoboticCallLogCallphoneMapper.countTodayCallsByBusinessId(businessId,companyId);
+                    if(num >= config.getNumberCalls()){
+                        return true;
+                    }
+                }
             }
         }
         return false;

+ 13 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseAnswerLogsMapper.java

@@ -118,6 +118,19 @@ public interface FsCourseAnswerLogsMapper
             "</script>"})
     FsCourseAnswerLogs selectRightLogByCourseVideo(@Param("videoId") Long videoId,@Param("userId") Long userId,@Param("qwUserId") String qwUserId);
 
+
+    @Select({"<script> " +
+            "select * from fs_course_answer_logs where video_id = #{videoId} and user_id = #{userId} and is_right = 1 " +
+            "<if test = 'qwUserId !=null '> " +
+            "and qw_user_id = #{qwUserId} " +
+            "</if>" +
+            "<if test = 'periodId !=null '> " +
+            "and period_id = #{periodId} " +
+            "</if>" +
+            "limit 1 " +
+            "</script>"})
+    FsCourseAnswerLogs selectRightLogByCourseVideoAndPeriodId(@Param("videoId") Long videoId, @Param("userId") Long userId, @Param("qwUserId") String qwUserId, @Param("periodId") Long periodId);
+
     @Select({"<script> " +
             "select * from fs_course_answer_logs where video_id = #{videoId} and user_id = #{userId} and is_right = 1 " +
             "<if test = 'qwUserId !=null '> " +

+ 1 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -513,6 +513,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     FsCourseWatchLog getWatchCourseVideoByFsUser(@Param("userId") Long userId, @Param("videoId") Long videoId, @Param("companyUserId") Long companyUserId);
 
     FsCourseWatchLog getWatchLogByFsUser(@Param("videoId") Long videoId, @Param("fsUserId") Long fsUserId, @Param("companyUserId") Long companyUserId);
+    FsCourseWatchLog getWatchLogByFsUserAndPeriodId(@Param("videoId") Long videoId, @Param("fsUserId") Long fsUserId, @Param("companyUserId") Long companyUserId, @Param("periodId") Long periodId);
 
     List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVONew(FsCourseWatchLogStatisticsListParam param);
 

+ 49 - 20
fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -21,6 +21,7 @@ import com.fs.his.service.IFsStorePaymentService;
 import com.fs.system.service.ISysConfigService;
 import lombok.Getter;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -58,7 +59,8 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
     private FsCourseWatchLogMapper courseWatchLogMapper;
     @Autowired
     private FsUserCourseCategoryMapper courseCategoryMapper;
-
+    @Value("${cloud_host.company_name}")
+    private String signProjectName;
     /**
      * 查询题库
      *
@@ -154,31 +156,58 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         FsCourseAnswerLogs rightLog;
         //判断短链类型
 
-        FsCourseWatchLog log = courseWatchLogMapper.getWatchLogByFsUser(param.getVideoId(), param.getUserId(), param.getCompanyUserId());
-        if (log==null){
-            return R.error("无记录");
-        }
-        if (log.getLogType()!=2){
-            return R.error("未完课");
-        }
-        logId = log.getLogId();
+        if ("泽林文化".equals(signProjectName)){
+            FsCourseWatchLog log = courseWatchLogMapper.getWatchLogByFsUserAndPeriodId(param.getVideoId(), param.getUserId(), param.getCompanyUserId(),param.getPeriodId());
+            if (log==null){
+                return R.error("无记录");
+            }
+            if (log.getLogType()!=2){
+                return R.error("未完课");
+            }
+            logId = log.getLogId();
 
-        rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
-        if (rightLog != null) {
-            if (log.getRewardType() != null) {
-                // 增加判断,去查询红包记录是否已发送成功,如果成功,则返回当前提示,否则返回答题成功(让其可以继续答题,直到红包领取完成)
-                FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
-                if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
-                    return R.error("该课程已答题完成,不可重复答题");
+            rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideoAndPeriodId(param.getVideoId(), param.getUserId(), param.getQwUserId(),param.getPeriodId());
+            if (rightLog != null) {
+                if (log.getRewardType() != null) {
+                    // 增加判断,去查询红包记录是否已发送成功,如果成功,则返回当前提示,否则返回答题成功(让其可以继续答题,直到红包领取完成)
+                    FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
+                    if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
+                        return R.error("该课程已答题完成,不可重复答题");
+                    } else {
+                        return R.ok("答题成功");
+                    }
                 } else {
                     return R.ok("答题成功");
                 }
-            } else {
-                return R.ok("答题成功");
             }
-        }
-        errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),param.getQwUserId(),log.getProject());
+            errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),param.getQwUserId(),log.getProject());
 
+        }else {
+            FsCourseWatchLog log = courseWatchLogMapper.getWatchLogByFsUser(param.getVideoId(), param.getUserId(), param.getCompanyUserId());
+            if (log == null) {
+                return R.error("无记录");
+            }
+            if (log.getLogType() != 2) {
+                return R.error("未完课");
+            }
+            logId = log.getLogId();
+
+            rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
+            if (rightLog != null) {
+                if (log.getRewardType() != null) {
+                    // 增加判断,去查询红包记录是否已发送成功,如果成功,则返回当前提示,否则返回答题成功(让其可以继续答题,直到红包领取完成)
+                    FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(), param.getPeriodId());
+                    if (fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
+                        return R.error("该课程已答题完成,不可重复答题");
+                    } else {
+                        return R.ok("答题成功");
+                    }
+                } else {
+                    return R.ok("答题成功");
+                }
+            }
+            errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId(), log.getProject());
+        }
 
 
         if (errorCount >= config.getAnswerErrorCount()) {

+ 28 - 19
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -879,7 +879,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     public R createOrder(long userId, FsStoreOrderCreateParam param) {
 
         FsUserCompanyUser fsUserCompanyUser = fsUserCompanyUserMapper.selectFsUserCompanyUserByUserId(userId);
-        if (ObjectUtil.isNotEmpty(fsUserCompanyUser)){
+        if (ObjectUtil.isNotEmpty(fsUserCompanyUser) && param.getVideoId()!=null){
             param.setCompanyId(fsUserCompanyUser.getCompanyId());
             param.setCompanyUserId(fsUserCompanyUser.getCompanyUserId());
         }
@@ -924,8 +924,13 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             //组合数据
             FsStoreOrderScrm storeOrder = new FsStoreOrderScrm();
             storeOrder.setStoreHouseCode("CK01");
-            storeOrder.setCompanyId(param.getCompanyId());
-            storeOrder.setCompanyUserId(param.getCompanyUserId());
+            if(param.getCompanyId()!=null){
+                storeOrder.setCompanyId(param.getCompanyId());
+            }
+
+            if(param.getCompanyUserId()!=null){
+                storeOrder.setCompanyUserId(param.getCompanyUserId());
+            }
 
             if ("北京卓美".equals(companyName) && param.getVideoId()!=null){
                 storeOrder.setVideoId(param.getVideoId());
@@ -935,24 +940,28 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             }
             String json = configService.selectConfigByKey("store.config");
             StoreConfig config= JSONUtil.toBean(json, StoreConfig.class);
-            //绑定销售
-            FsUserScrm fsuser= userService.selectFsUserById(userId);
-            if(ObjectUtil.isEmpty(config.getOrderAttribution())
-                    ||!config.getOrderAttribution().equals(1)){
-                if(param.getCompanyUserId()!=null){
-                    if (ObjectUtil.isNotEmpty(fsuser.getCompanyUserId())&&!fsuser.getCompanyUserId().equals(param.getCompanyUserId())){
-                        CompanyUser companyUser=companyUserService.selectCompanyUserById(fsuser.getCompanyUserId());
-                        return R.error(String.format("请联系%s销售进行购买商品!",companyUser.getNickName()));
+
+            //卓美商城正常下单
+            if("北京卓美".equals(companyName) && param.getVideoId()!=null || !"北京卓美".equals(companyName)){
+                //绑定销售
+                FsUserScrm fsuser= userService.selectFsUserById(userId);
+                if(ObjectUtil.isEmpty(config.getOrderAttribution())
+                        ||!config.getOrderAttribution().equals(1)){
+                    if(param.getCompanyUserId()!=null){
+                        if (ObjectUtil.isNotEmpty(fsuser.getCompanyUserId())&&!fsuser.getCompanyUserId().equals(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 {
-                        fsuser.setCompanyUserId(param.getCompanyUserId());
-                        userService.updateFsUser(fsuser);
-                    }
-                    CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
-                    if(companyUser!=null){
-                        storeOrder.setDeptId(companyUser.getDeptId());
+                        storeOrder.setCompanyUserId(fsuser.getCompanyUserId());
                     }
-                }else {
-                    storeOrder.setCompanyUserId(fsuser.getCompanyUserId());
                 }
             }
 

+ 7 - 0
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticCallLogCallphoneMapper.xml

@@ -192,10 +192,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WHERE bes.id = #{businessId}
         AND es.is_generate = 0
         )
+        AND callphone.company_id = #{companyId}
         AND callphone.create_time >= CURDATE()
         AND callphone.create_time &lt; CURDATE() + INTERVAL 1 DAY
     </select>
 
+
+
     <select id="selectCompanyVoiceRoboticCallPhoneLogGroupList" resultType="com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone" parameterType="com.fs.company.domain.CompanyVoiceRoboticCallLogCallphone">
         select
         robotic_id,
@@ -244,5 +247,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     </select>
 
+    <select id="selectCompanyIdByBusinessId" resultType="Long">
+        SELECT company_id FROM company_voice_robotic vr INNER JOIN company_voice_robotic_business rb ON vr.id = rb.robotic_id WHERE rb.id = 20 LIMIT 1
+    </select>
+
 
 </mapper>

+ 15 - 7
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticMapper.xml

@@ -25,6 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="endTime2"    column="end_time2"    />
         <result property="createTime"    column="create_time"    />
         <result property="companyAiWorkflowId"    column="company_ai_workflow_id"    />
+        <result property="delFlag"    column="del_flag"    />
     </resultMap>
 
     <sql id="selectCompanyVoiceRoboticVo">
@@ -34,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectCompanyVoiceRoboticList" parameterType="CompanyVoiceRobotic" resultMap="CompanyVoiceRoboticResult">
         <include refid="selectCompanyVoiceRoboticVo"/>
         <where>  
+            del_flag = 0
             <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="taskName != null  and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
             <if test="taskId != null "> and task_id = #{taskId}</if>
@@ -61,6 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         inner join company_user u on a.create_user = u.user_id
         inner join company_dept d on u.dept_id = d.dept_id
         <where>
+            a.del_flag = 0
             <if test="taskType != null "> and a.task_type = #{taskType} </if>
             <if test="companyId != null"> and a.company_id = #{companyId} </if>
             <if test="name != null  and name != ''"> and a.name like concat('%', #{name}, '%')</if>
@@ -91,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     
     <select id="selectCompanyVoiceRoboticById" parameterType="Long" resultMap="CompanyVoiceRoboticResult">
         <include refid="selectCompanyVoiceRoboticVo"/>
-        where id = #{id}
+        where id = #{id} and del_flag = 0
     </select>
     <select id="qwUserList" resultType="com.fs.company.vo.CompanyVoiceRoboticQwUserListVo">
         select a.id, a.wx_nick_name, a.wx_no, b.nick_name as companyUserName  from company_wx_account a
@@ -182,16 +185,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </update>
 
-    <delete id="deleteCompanyVoiceRoboticById" parameterType="Long">
-        delete from company_voice_robotic where id = #{id}
-    </delete>
+    <update id="deleteCompanyVoiceRoboticById" parameterType="Long">
+        update company_voice_robotic set del_flag = 1 where id = #{id}
+    </update>
 
-    <delete id="deleteCompanyVoiceRoboticByIds" parameterType="String">
-        delete from company_voice_robotic where id in 
+    <update id="deleteCompanyVoiceRoboticByIds" parameterType="String">
+        update company_voice_robotic set del_flag = 1 where id in 
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
-    </delete>
+    </update>
+
+    <update id="updateDelFlag">
+        update company_voice_robotic set del_flag = #{delFlag} where id = #{id}
+    </update>
 
     <update id="finishRobotic" parameterType="java.lang.Long">
         update company_voice_robotic set task_status = 3 where id = #{id} and task_flow = run_task_flow
@@ -219,6 +226,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select * from company_voice_robotic where company_id = #{companyId}
                                               and scene_type = #{sceneType}
                                               and task_status = 1
+                                              and del_flag = 0
                                               order by create_time desc
     </select>
 </mapper>

+ 33 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -634,6 +634,39 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                   AND user_id = #{fsUserId}
                   AND company_user_id = #{companyUserId}  order by log_id desc limit 1
             </select>
+
+    <select id="getWatchLogByFsUserAndPeriodId" resultType="com.fs.course.domain.FsCourseWatchLog">
+        SELECT
+            log_id,
+            user_id,
+            video_id,
+            log_type,
+            create_time,
+            update_time,
+            duration,
+            company_user_id,
+            company_id,
+            course_id,
+            send_type,
+            reward_type,
+            last_heartbeat_time,
+            sop_id,
+            finish_time,
+            send_finish_msg,
+            camp_period_time,
+            period_id
+        FROM
+            fs_course_watch_log
+        WHERE
+            send_type = 1
+          AND video_id = #{videoId}
+          AND user_id = #{fsUserId}
+          AND company_user_id = #{companyUserId}
+        <if test="periodId != null">
+            and period_id = #{periodId}
+        </if>
+        order by log_id desc limit 1
+    </select>
             <select id="selectFsCourseWatchLogStatisticsListVONew"
                     resultType="com.fs.course.vo.FsCourseWatchLogStatisticsListVO">
                 SELECT