| package com.doumee.service.business.impl; | 
|   | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import com.doumee.core.model.LoginUserInfo; | 
| import com.doumee.core.model.PageData; | 
| import com.doumee.core.model.PageWrap; | 
| import com.doumee.core.utils.Constants; | 
| import com.doumee.core.utils.DateUtil; | 
| import com.doumee.core.utils.Utils; | 
| import com.doumee.core.utils.Week; | 
| import com.doumee.core.utils.redis.RedisUtil; | 
| import com.doumee.dao.business.YwLinePointMapper; | 
| import com.doumee.dao.business.YwPatrolSchemeMapper; | 
| import com.doumee.dao.business.YwPatrolTaskMapper; | 
| import com.doumee.dao.business.YwPatrolTaskRecordMapper; | 
| import com.doumee.dao.business.model.*; | 
| import com.doumee.dao.system.model.SystemUser; | 
| import com.doumee.service.business.YwPatrolSchemeService; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
| import com.github.yulichang.wrapper.MPJLambdaWrapper; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.data.redis.core.RedisTemplate; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.util.CollectionUtils; | 
|   | 
| import java.util.*; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * 运维巡检计划信息表Service实现 | 
|  * @author 江蹄蹄 | 
|  * @date 2024/11/19 16:07 | 
|  */ | 
| @Service | 
| public class YwPatrolSchemeServiceImpl implements YwPatrolSchemeService { | 
|   | 
|     @Autowired | 
|     private YwPatrolSchemeMapper ywPatrolSchemeMapper; | 
|     @Autowired | 
|     private YwPatrolTaskMapper ywPatrolTaskMapper; | 
|     @Autowired | 
|     private YwLinePointMapper ywLinePointMapper; | 
|     @Autowired | 
|     private YwPatrolTaskRecordMapper ywPatrolTaskRecordMapper; | 
|     @Autowired | 
|     private RedisTemplate<String, Object> redisTemplate; | 
|   | 
|     @Override | 
|     public Integer create(YwPatrolScheme ywPatrolScheme) { | 
|         if(Objects.isNull(ywPatrolScheme) | 
|         || StringUtils.isBlank(ywPatrolScheme.getTitle()) | 
|                 ||Objects.isNull(ywPatrolScheme.getLineId()) | 
|                 ||StringUtils.isBlank(ywPatrolScheme.getUserIds()) | 
|                 ||Objects.isNull(ywPatrolScheme.getStartDate()) | 
|                 ||Objects.isNull(ywPatrolScheme.getEndDate()) | 
|                 ||Objects.isNull(ywPatrolScheme.getCircleType()) | 
|                 ||StringUtils.isBlank(ywPatrolScheme.getStartTime()) | 
|                 ||StringUtils.isBlank(ywPatrolScheme.getEndTime()) | 
|                 || (!Constants.equalsInteger(ywPatrolScheme.getCircleType(),Constants.ZERO) &&StringUtils.isBlank(ywPatrolScheme.getCircleDays())) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         LoginUserInfo loginUserInfo = ywPatrolScheme.getLoginUserInfo(); | 
|         ywPatrolScheme.setCreateDate(new Date()); | 
|         ywPatrolScheme.setCreator(loginUserInfo.getId()); | 
|         ywPatrolScheme.setIsdeleted(Constants.ZERO); | 
|         ywPatrolScheme.setStatus(Constants.ZERO); | 
|         ywPatrolScheme.setCode(this.getNextCode()); | 
|         ywPatrolSchemeMapper.insert(ywPatrolScheme); | 
|   | 
|         this.createThreeDaysData(ywPatrolScheme); | 
|         return ywPatrolScheme.getId(); | 
|     } | 
|   | 
|     public synchronized String  getNextCode(){ | 
|         String prefix =  "P"; | 
|         Integer countNum  = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.PATROL_SCHEME_CODE_KEY,Integer.class); | 
|         countNum = Constants.formatIntegerNum(countNum)+1; | 
|         //更新缓存 | 
|         RedisUtil.addObject(redisTemplate,Constants.RedisKeys.PATROL_SCHEME_CODE_KEY,countNum); | 
|         String nextIndex =Integer.toString( countNum ); | 
|         return prefix + StringUtils.leftPad(nextIndex,4,"0"); | 
|     } | 
|   | 
|   | 
|   | 
|     public void createThreeDaysData(YwPatrolScheme ywPatrolScheme){ | 
|         //循环生成三天内的数据 | 
|         for (int i = 0; i < 3; i++) { | 
|             Date schemeDate = DateUtil.getXDayAfterDate(new Date(),i); | 
|             this.createTask(schemeDate,ywPatrolScheme); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 根据日期生成任务 | 
|      * @param schemeDate | 
|      * @param ywPatrolScheme | 
|      */ | 
|     public void createTask(Date schemeDate,YwPatrolScheme ywPatrolScheme){ | 
|         if(ywPatrolScheme.getStartDate().getTime() > schemeDate.getTime() | 
|             || ywPatrolScheme.getEndDate().getTime() < schemeDate.getTime() ){ | 
|             return; | 
|         } | 
|         if(Constants.equalsInteger(ywPatrolScheme.getCircleType(),Constants.ONE)){ | 
|             //每周根据日期生成 根据日期获取是周几 | 
|             Week week = DateUtil.getWeek(schemeDate); | 
|             if(Objects.isNull(week)){ | 
|                 return; | 
|             } | 
|             List<String> weeks = Arrays.asList(ywPatrolScheme.getCircleDays().split(",")); | 
|             String weekStr = weeks.stream().filter(i->Constants.equalsInteger(Integer.valueOf(i),week.getNumber())).findFirst().get(); | 
|             if(StringUtils.isBlank(weekStr)){ | 
|                 return; | 
|             } | 
|         }else{ | 
|             //每月根据日期生成 根据日期获取是哪天 | 
|             List<String> days = Arrays.asList(ywPatrolScheme.getCircleDays().split(",")); | 
|             String dayStr = DateUtil.getFomartDate(schemeDate,"dd"); | 
|             if(Objects.isNull(days.stream().filter(i->StringUtils.equals(i,dayStr)).findFirst().get())){ | 
|                 return; | 
|             }; | 
|         } | 
|         String schemeDateStr = DateUtil.getDate(schemeDate,"yyyy-MM-dd"); | 
|         //查询当天是否生成过数据 | 
|         if(ywPatrolTaskMapper.selectCount(new QueryWrapper<YwPatrolTask>().lambda().eq(YwPatrolTask::getSchemeId,ywPatrolScheme.getId()).like(YwPatrolTask::getStartDate,schemeDateStr))>Constants.ZERO){ | 
|             return; | 
|         }; | 
|         YwPatrolTask ywPatrolTaskForCodeSn = ywPatrolTaskMapper.selectOne(new MPJLambdaWrapper<YwPatrolTask>() | 
|                 .select(" ifnull( max(replace(code,'"+ywPatrolScheme.getCode()+"-','')),0) AS codeSn ") | 
|                 .eq(YwPatrolTask::getSchemeId,ywPatrolScheme.getId()) | 
|                 .orderByDesc( YwPatrolTask::getId) | 
|                 .last(" limit 1 ") | 
|         ); | 
|         Integer codeSn = ywPatrolTaskForCodeSn.getCodeSn(); | 
|   | 
|         List<YwLinePoint> ywLinePointList = ywLinePointMapper.selectList(new QueryWrapper<YwLinePoint>().lambda() | 
|                 .eq(YwLinePoint::getLineId,ywPatrolScheme.getLineId()) | 
|                 .eq(YwLinePoint::getIsdeleted,Constants.ZERO) | 
|                 .orderByAsc(YwLinePoint::getSortnum)); | 
|         if(CollectionUtils.isEmpty(ywLinePointList)){ | 
|             return; | 
|         } | 
|         codeSn = codeSn + 1; | 
|         String nextCode = StringUtils.leftPad(codeSn.toString(),3,"0"); | 
|         YwPatrolTask ywPatrolTask = new YwPatrolTask(); | 
|         ywPatrolTask.setCreateDate(new Date()); | 
|         ywPatrolTask.setCreator(ywPatrolScheme.getCreator()); | 
|         ywPatrolTask.setIsdeleted(Constants.ZERO); | 
|         ywPatrolTask.setStatus(Constants.patrolTaskStatus.waitStart); | 
|         ywPatrolTask.setSchemeId(ywPatrolScheme.getId());  | 
|         ywPatrolTask.setCircleType(ywPatrolScheme.getCircleType()); | 
|         ywPatrolTask.setStartDate(DateUtil.getDateFromString(schemeDateStr +" "+ ywPatrolScheme.getStartTime() +":00")); | 
|         ywPatrolTask.setEndDate(DateUtil.getDateFromString(schemeDateStr +" "+ ywPatrolScheme.getEndTime() +":00")); | 
|         ywPatrolTask.setDealUserId(ywPatrolScheme.getDealUserId());  | 
|         ywPatrolTask.setCode(ywPatrolScheme.getCode() + "-" + nextCode); | 
|         ywPatrolTaskMapper.insert(ywPatrolTask); | 
|          | 
|         List<YwPatrolTaskRecord> ywPatrolTaskRecordList = new ArrayList<>(); | 
|         for (int i = 0; i < ywLinePointList.size(); i++) { | 
|             YwLinePoint ywLinePoint = ywLinePointList.get(i); | 
|             //生成任务数据 | 
|             YwPatrolTaskRecord ywPatrolTaskRecord = new YwPatrolTaskRecord(); | 
|             ywPatrolTaskRecord.setCreateDate(new Date()); | 
|             ywPatrolTaskRecord.setCreator(ywPatrolScheme.getCreator()); | 
|             ywPatrolTaskRecord.setIsdeleted(Constants.ZERO); | 
|             ywPatrolTaskRecord.setStatus(Constants.ZERO); | 
|             ywPatrolTaskRecord.setSchemeId(ywPatrolScheme.getId()); | 
|             ywPatrolTaskRecord.setPointId(ywLinePoint.getPointId()); | 
|             ywPatrolTaskRecord.setTaskId(ywPatrolTask.getId()); | 
|             ywPatrolTaskRecord.setDealUserId(ywPatrolScheme.getDealUserId()); | 
|             ywPatrolTaskRecord.setSortnum(i+1); | 
|             ywPatrolTaskRecordList.add(ywPatrolTaskRecord); | 
|         } | 
|         ywPatrolTaskRecordMapper.insert(ywPatrolTaskRecordList); | 
|     } | 
|   | 
|   | 
|   | 
|     @Override | 
|     public void deleteById(Integer id, LoginUserInfo user) { | 
|         ywPatrolSchemeMapper.deleteById(id); | 
|     } | 
|   | 
|     @Override | 
|     public void delete(YwPatrolScheme ywPatrolScheme) { | 
|         UpdateWrapper<YwPatrolScheme> deleteWrapper = new UpdateWrapper<>(ywPatrolScheme); | 
|         ywPatrolSchemeMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) { | 
|         if (CollectionUtils.isEmpty(ids)) { | 
|             return; | 
|         } | 
|         ywPatrolSchemeMapper.deleteBatchIds(ids); | 
|     } | 
|   | 
|     @Override | 
|     public void updateById(YwPatrolScheme ywPatrolScheme) { | 
|         if(Objects.isNull(ywPatrolScheme) | 
|                 || Objects.isNull(ywPatrolScheme.getId()) | 
|                 || StringUtils.isBlank(ywPatrolScheme.getTitle()) | 
|                 ||Objects.isNull(ywPatrolScheme.getLineId()) | 
|                 ||StringUtils.isBlank(ywPatrolScheme.getUserIds()) | 
|                 ||Objects.isNull(ywPatrolScheme.getStartDate()) | 
|                 ||Objects.isNull(ywPatrolScheme.getEndDate()) | 
|                 ||Objects.isNull(ywPatrolScheme.getCircleType()) | 
|                 ||StringUtils.isBlank(ywPatrolScheme.getStartTime()) | 
|                 ||StringUtils.isBlank(ywPatrolScheme.getEndTime()) | 
|                 || (!Constants.equalsInteger(ywPatrolScheme.getCircleType(),Constants.ZERO) &&StringUtils.isBlank(ywPatrolScheme.getCircleDays())) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         LoginUserInfo loginUserInfo = ywPatrolScheme.getLoginUserInfo(); | 
|         ywPatrolScheme.setEditDate(new Date()); | 
|         ywPatrolScheme.setEditor(loginUserInfo.getId()); | 
|         ywPatrolSchemeMapper.updateById(ywPatrolScheme); | 
|     } | 
|   | 
|     @Override | 
|     public void updateStatus(YwPatrolScheme ywPatrolScheme) { | 
|         if(Objects.isNull(ywPatrolScheme) | 
|                 || Objects.isNull(ywPatrolScheme.getId()) | 
|                 || Objects.isNull(ywPatrolScheme.getStatus()) | 
|                 || !(Constants.equalsInteger(ywPatrolScheme.getStatus(),Constants.ZERO) || Constants.equalsInteger(ywPatrolScheme.getStatus(),Constants.ONE )) | 
|         ){ | 
|             throw new BusinessException(ResponseStatus.BAD_REQUEST); | 
|         } | 
|         LoginUserInfo loginUserInfo = ywPatrolScheme.getLoginUserInfo(); | 
|         ywPatrolScheme.setEditDate(new Date()); | 
|         ywPatrolScheme.setEditor(loginUserInfo.getId()); | 
|         ywPatrolSchemeMapper.updateById(ywPatrolScheme); | 
|         if(Constants.equalsInteger(ywPatrolScheme.getStatus(),Constants.ZERO)){ | 
|             this.createThreeDaysData(ywPatrolScheme); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public void updateByIdInBatch(List<YwPatrolScheme> ywPatrolSchemes) { | 
|         if (CollectionUtils.isEmpty(ywPatrolSchemes)) { | 
|             return; | 
|         } | 
|         for (YwPatrolScheme ywPatrolScheme: ywPatrolSchemes) { | 
|             this.updateById(ywPatrolScheme); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public YwPatrolScheme findById(Integer id) { | 
|         return ywPatrolSchemeMapper.selectById(id); | 
|     } | 
|   | 
|     @Override | 
|     public YwPatrolScheme findOne(YwPatrolScheme ywPatrolScheme) { | 
|         QueryWrapper<YwPatrolScheme> wrapper = new QueryWrapper<>(ywPatrolScheme); | 
|         return ywPatrolSchemeMapper.selectOne(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<YwPatrolScheme> findList(YwPatrolScheme ywPatrolScheme) { | 
|         QueryWrapper<YwPatrolScheme> wrapper = new QueryWrapper<>(ywPatrolScheme); | 
|         return ywPatrolSchemeMapper.selectList(wrapper); | 
|     } | 
|    | 
|     @Override | 
|     public PageData<YwPatrolScheme> findPage(PageWrap<YwPatrolScheme> pageWrap) { | 
|         IPage<YwPatrolScheme> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); | 
|         MPJLambdaWrapper<YwPatrolScheme> queryWrapper = new MPJLambdaWrapper<YwPatrolScheme>(); | 
|         Utils.MP.blankToNull(pageWrap.getModel()); | 
|         YwPatrolScheme model = pageWrap.getModel(); | 
|         queryWrapper.selectAll(YwPatrolScheme.class) | 
|                 .select(" t2.realName as createUserName ") | 
|                 .select(" t1.realName as userName ") | 
|                 .leftJoin(SystemUser.class,SystemUser::getId,YwPatrolScheme::getUserIds) | 
|                 .leftJoin(" system_user t2 on t.creator =  t2.id  ") | 
|                 .eq(YwPatrolScheme::getIsdeleted,Constants.ZERO) | 
|                 .like(StringUtils.isNotBlank(model.getTitle()),YwPatrolScheme::getTitle,model.getTitle()) | 
|                 //查询有时段交集的数据 | 
|                 .apply(Objects.nonNull(model.getStartDate())&&Objects.nonNull(model.getEndDate()), | 
|                         " t.START_DATE <= '"+Utils.Date.getStart(pageWrap.getModel().getEndDate())+"' and t.END_DATE >= '"+Utils.Date.getStart(pageWrap.getModel().getStartDate())+"' " | 
|                 ) | 
| //                .ge(Objects.nonNull(model.getStartDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getStartDate())) | 
| //                .le(Objects.nonNull(model.getEndDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getEndDate())) | 
|                 .orderByDesc(YwPatrolScheme::getCreateDate) | 
|         ; | 
|         IPage<YwPatrolScheme> iPage = ywPatrolSchemeMapper.selectJoinPage(page,YwPatrolScheme.class,queryWrapper); | 
|         for (YwPatrolScheme ywPatrolScheme:iPage.getRecords()) { | 
|             this.getSchemeStatus(ywPatrolScheme); | 
|         } | 
|         return PageData.from(iPage); | 
|     } | 
|   | 
|     //获取状态 | 
|     public void getSchemeStatus(YwPatrolScheme ywPatrolScheme){ | 
|         List<YwPatrolTask> ywPatrolTaskList = ywPatrolTaskMapper.selectList(new QueryWrapper<YwPatrolTask>().lambda() | 
|                 .eq(YwPatrolTask::getSchemeId,ywPatrolScheme.getId()) | 
|                 .eq(YwPatrolTask::getIsdeleted,Constants.ZERO) | 
|                 .ne(YwPatrolTask::getStatus,Constants.FOUR) | 
|         ); | 
|   | 
|         if(CollectionUtils.isEmpty(ywPatrolTaskList)){ | 
|             ywPatrolScheme.setSchemeStatus(Constants.ZERO); | 
|             ywPatrolScheme.setTimeOutTaskNum(Constants.ZERO); | 
|             return; | 
|         } | 
|         //过滤数据是否存在进行中的 | 
|         if(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ONE)).collect(Collectors.toList()).size()>Constants.ZERO){ | 
|             ywPatrolScheme.setSchemeStatus(Constants.ONE); | 
|             ywPatrolScheme.setTimeOutTaskNum(ywPatrolTaskList.stream().filter(i->i.getEndDate().getTime()>System.currentTimeMillis()) | 
|                     .collect(Collectors.toList()).size()); | 
|             return; | 
|         } | 
|   | 
|         //过滤数据是不是全部未开始 | 
|         if(Constants.equalsInteger(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.ZERO)).collect(Collectors.toList()).size(),ywPatrolTaskList.size())){ | 
|             ywPatrolScheme.setSchemeStatus(Constants.ZERO); | 
|             ywPatrolScheme.setTimeOutTaskNum(ywPatrolTaskList.stream().filter(i->i.getEndDate().getTime()>System.currentTimeMillis()) | 
|                     .collect(Collectors.toList()).size()); | 
|             return; | 
|         } | 
|         //过滤数据是不是全部已完成 | 
|         if(Constants.equalsInteger(ywPatrolTaskList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.THREE)).collect(Collectors.toList()).size() | 
|                 ,ywPatrolTaskList.size())){ | 
|             ywPatrolScheme.setSchemeStatus(Constants.TWO); | 
|             return; | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|     @Override | 
|     public long count(YwPatrolScheme ywPatrolScheme) { | 
|         QueryWrapper<YwPatrolScheme> wrapper = new QueryWrapper<>(ywPatrolScheme); | 
|         return ywPatrolSchemeMapper.selectCount(wrapper); | 
|     } | 
|   | 
|   | 
|   | 
|   | 
| } |