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.transaction.annotation.Transactional; 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 redisTemplate; @Override @Transactional(rollbackFor = {Exception.class,BusinessException.class}) 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()) || (!Constants.equalsInteger(ywPatrolScheme.getCircleType(),Constants.ZERO) &&StringUtils.isBlank(ywPatrolScheme.getCircleDays())) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } if(StringUtils.isBlank(ywPatrolScheme.getStartTime())){ ywPatrolScheme.setStartTime("00:00:00"); } if(StringUtils.isBlank(ywPatrolScheme.getEndTime())){ ywPatrolScheme.setEndTime("23:59:59"); } 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( DateUtil.StringToDate( DateUtil.getDate(new Date(),"yyyy-MM-dd"),"yyyy-MM-dd"),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 weeks = Arrays.asList(ywPatrolScheme.getCircleDays().split(",")); if(weeks.stream().filter(i->Constants.equalsInteger(Integer.valueOf(i),week.getNumber())).collect(Collectors.toList()).size()<=Constants.ZERO){ return; } }else if(Constants.equalsInteger(ywPatrolScheme.getCircleType(),Constants.TWO)){ //每月根据日期生成 根据日期获取是哪天 List days = Arrays.asList(ywPatrolScheme.getCircleDays().split(",")); Integer dayStr = Integer.valueOf(DateUtil.getFomartDate(schemeDate,"dd")); if(days.stream().filter(i->i.equals(dayStr.toString())).collect(Collectors.toList()).size()<=Constants.ZERO){ return; } } String schemeDateStr = DateUtil.getDate(schemeDate,"yyyy-MM-dd"); //查询当天是否生成过数据 if(ywPatrolTaskMapper.selectCount(new QueryWrapper().lambda().eq(YwPatrolTask::getSchemeId,ywPatrolScheme.getId()).like(YwPatrolTask::getStartDate,schemeDateStr))>Constants.ZERO){ return; }; YwPatrolTask ywPatrolTaskForCodeSn = ywPatrolTaskMapper.selectOne(new MPJLambdaWrapper() .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 ywLinePointList = ywLinePointMapper.selectList(new QueryWrapper().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 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 deleteWrapper = new UpdateWrapper<>(ywPatrolScheme); ywPatrolSchemeMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List 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 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 wrapper = new QueryWrapper<>(ywPatrolScheme); return ywPatrolSchemeMapper.selectOne(wrapper); } @Override public List findList(YwPatrolScheme ywPatrolScheme) { QueryWrapper wrapper = new QueryWrapper<>(ywPatrolScheme); return ywPatrolSchemeMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper(); 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 <= '"+pageWrap.getModel().getEndDate()+"' or t.END_DATE >= '"+pageWrap.getModel().getStartDate()+"' " )*/ .ge( model.getStartDate()!=null,YwPatrolScheme::getStartDate, Utils.Date.getStart(pageWrap.getModel().getStartDate())) .le(Objects.nonNull(model.getEndDate()),YwPatrolScheme::getStartDate, Utils.Date.getStart(pageWrap.getModel().getEndDate())) .ge(Objects.nonNull(model.getStartDateSec()),YwPatrolScheme::getEndDate, Utils.Date.getStart(pageWrap.getModel().getStartDateSec())) .le(Objects.nonNull(model.getEndDateSec()),YwPatrolScheme::getEndDate, Utils.Date.getStart(pageWrap.getModel().getEndDateSec())) .orderByDesc(YwPatrolScheme::getCreateDate) ; IPage 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 ywPatrolTaskList = ywPatrolTaskMapper.selectList(new QueryWrapper().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 wrapper = new QueryWrapper<>(ywPatrolScheme); return ywPatrolSchemeMapper.selectCount(wrapper); } }