|
|
@@ -67,6 +67,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
import java.time.Duration;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
@@ -1310,6 +1311,31 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
|
|
|
return fsCourseWatchLogMapper.selectQwFsCourseWatchLogStatisticsListVO(param);
|
|
|
}
|
|
|
|
|
|
+ public static Date removeTime(Date date) {
|
|
|
+ if (date == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 双重保障:先格式化成字符串,再解析回来
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ String dateStr = sdf.format(date);
|
|
|
+ Date result = sdf.parse(dateStr);
|
|
|
+
|
|
|
+ // 再用Calendar确保清除
|
|
|
+ Calendar cal = Calendar.getInstance();
|
|
|
+ cal.setTime(result);
|
|
|
+ cal.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
+ cal.set(Calendar.MINUTE, 0);
|
|
|
+ cal.set(Calendar.SECOND, 0);
|
|
|
+ cal.set(Calendar.MILLISECOND, 0);
|
|
|
+
|
|
|
+ return cal.getTime();
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 备用方案
|
|
|
+ return new java.sql.Date(date.getTime());
|
|
|
+ }
|
|
|
+ }
|
|
|
/**
|
|
|
* 根据看课记录id获取所有的外部联系人ids
|
|
|
* @param watchLogIds
|
|
|
@@ -1353,6 +1379,100 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
|
|
|
return R.ok().put("data", data);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R clearUserWatchLog(Long userId, Long projectId) {
|
|
|
+ Date startTime = removeTime(new Date());
|
|
|
+ FsCourseWatchLog fsCourseWatchLog = fsCourseWatchLogMapper.selectByUserIdAndProjectId(userId, projectId, startTime);
|
|
|
+ if (fsCourseWatchLog != null) {
|
|
|
+ int i = fsCourseWatchLogMapper.deleteById(fsCourseWatchLog.getLogId());
|
|
|
+ if (i < 0) {
|
|
|
+ return R.error("清除失败");
|
|
|
+ }else {
|
|
|
+ //备份看课记录
|
|
|
+ WatchLogBak watchLogBak = convertToBackupWithDeleteInfo(fsCourseWatchLog, userId, 1);
|
|
|
+ int j = fsCourseWatchLogMapper.insertBackup(watchLogBak);
|
|
|
+ if (j < 0) {
|
|
|
+ return R.error("备份失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return R.error("没有需要清除的记录");
|
|
|
+ }
|
|
|
+ return R.ok("清除成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ public WatchLogBak convertToBackupWithDeleteInfo(FsCourseWatchLog original, Long deleteBy,
|
|
|
+ Integer deleteMethod) {
|
|
|
+ WatchLogBak backup = convertToBackup(original);
|
|
|
+ if (backup != null) {
|
|
|
+ backup.setDeleteBy(deleteBy);
|
|
|
+ if (deleteMethod != null) {
|
|
|
+ backup.setDeleteMethod(deleteMethod);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return backup;
|
|
|
+ }
|
|
|
+
|
|
|
+ public WatchLogBak convertToBackup(FsCourseWatchLog original) {
|
|
|
+ if (original == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ WatchLogBak backup = new WatchLogBak();
|
|
|
+
|
|
|
+ // 复制原始数据字段
|
|
|
+ backup.setOriginalLogId(original.getLogId());
|
|
|
+ backup.setUserId(original.getUserId());
|
|
|
+ backup.setVideoId(original.getVideoId());
|
|
|
+ backup.setLogType(original.getLogType());
|
|
|
+ backup.setCreateTime(original.getCreateTime());
|
|
|
+ backup.setUpdateTime(original.getUpdateTime());
|
|
|
+ backup.setQwExternalContactId(original.getQwExternalContactId());
|
|
|
+ backup.setDuration(original.getDuration());
|
|
|
+ backup.setQwUserId(original.getQwUserId());
|
|
|
+ backup.setCompanyUserId(original.getCompanyUserId());
|
|
|
+ backup.setCompanyId(original.getCompanyId());
|
|
|
+ backup.setCourseId(original.getCourseId());
|
|
|
+ backup.setSendType(original.getSendType());
|
|
|
+ backup.setRewardType(original.getRewardType());
|
|
|
+ backup.setLastHeartbeatTime(original.getLastHeartbeatTime());
|
|
|
+ backup.setSopId(original.getSopId());
|
|
|
+ backup.setFinishTime(original.getFinishTime());
|
|
|
+ backup.setSendFinishMsg(original.getSendFinishMsg());
|
|
|
+ backup.setCampPeriodTime(original.getCampPeriodTime());
|
|
|
+ backup.setDay(original.getDay());
|
|
|
+ backup.setProject(original.getProject());
|
|
|
+ backup.setCreateBy(original.getCreateBy());
|
|
|
+ backup.setUpdateBy(original.getUpdateBy());
|
|
|
+ backup.setPeriodId(original.getPeriodId());
|
|
|
+ backup.setImMsgSendDetailId(original.getImMsgSendDetailId());
|
|
|
+ backup.setWatchType(original.getWatchType());
|
|
|
+
|
|
|
+ // 设置删除信息(调用时传入)
|
|
|
+ backup.setDeleteTime(new Date());
|
|
|
+
|
|
|
+ // 保存完整的原始数据为JSON
|
|
|
+ backup.setOriginalData(convertToJson(original));
|
|
|
+
|
|
|
+ return backup;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String convertToJson(FsCourseWatchLog original) {
|
|
|
+ try {
|
|
|
+ // 使用 FastJSON 进行序列化,它对复杂对象有更好的处理
|
|
|
+ String jsonString = JSON.toJSONString(original);
|
|
|
+
|
|
|
+ // 验证 JSON 格式是否有效
|
|
|
+ if (isValidJson(jsonString)) {
|
|
|
+ return jsonString;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("转换JSON失败: {}, 原始对象ID: {}", e.getMessage(), original.getLogId());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
private boolean isValidJson(String jsonString) {
|
|
|
try {
|
|
|
JSON.parse(jsonString);
|