package com.java110.job.task.inspection; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.community.CommunityDto; import com.java110.dto.inspection.InspectionPlanDto; import com.java110.dto.inspection.InspectionPlanStaffDto; import com.java110.dto.inspection.InspectionRoutePointRelDto; import com.java110.dto.inspection.InspectionTaskDto; import com.java110.dto.classes.ScheduleClassesStaffDto; import com.java110.dto.task.TaskDto; import com.java110.intf.community.*; import com.java110.intf.store.IScheduleClassesStaffV1InnerServiceSMO; import com.java110.job.quartz.TaskSystemQuartz; import com.java110.po.inspection.InspectionTaskDetailPo; import com.java110.po.inspection.InspectionTaskPo; import com.java110.utils.util.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; @Component public class GeneratorInspectionTaskTemplate extends TaskSystemQuartz { @Autowired private IInspectionPlanInnerServiceSMO inspectionPlanInnerServiceSMOImpl; @Autowired private IInspectionPlanStaffInnerServiceSMO inspectionPlanStaffInnerServiceSMOImpl; @Autowired private IInspectionRoutePointRelInnerServiceSMO inspectionRoutePointRelInnerServiceSMOImpl; @Autowired private IInspectionTaskInnerServiceSMO inspectionTaskInnerServiceSMOImpl; @Autowired private IInspectionTaskDetailInnerServiceSMO inspectionTaskDetailInnerServiceSMOImpl; @Autowired private IScheduleClassesStaffV1InnerServiceSMO scheduleClassesStaffV1InnerServiceSMOImpl; @Override protected void process(TaskDto taskDto) throws Exception { logger.debug("开始执行巡检任务生成" + taskDto.toString()); // 获取小区 List communityDtos = getAllCommunity(); for (CommunityDto communityDto : communityDtos) { try { generatorTask(taskDto, communityDto); } catch (Exception e) { logger.error("推送消息失败", e); } } } /** * 巡检任务 * * @param taskDto * @param communityDto */ private void generatorTask(TaskDto taskDto, CommunityDto communityDto) { InspectionPlanDto inspectionPlanDto = new InspectionPlanDto(); inspectionPlanDto.setCommunityId(communityDto.getCommunityId()); inspectionPlanDto.setState(InspectionPlanDto.STATE_RUN); inspectionPlanDto.setCurTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); List inspectionPlanDtos = inspectionPlanInnerServiceSMOImpl.queryInspectionPlans(inspectionPlanDto); for (InspectionPlanDto tmpInspectionPlanDto : inspectionPlanDtos) { dealInspectionPlan(tmpInspectionPlanDto, taskDto, communityDto); } } /** * 处理巡检计划 * * @param tmpInspectionPlanDto * @param taskDto * @param communityDto */ private void dealInspectionPlan(InspectionPlanDto tmpInspectionPlanDto, TaskDto taskDto, CommunityDto communityDto) { InspectionPlanStaffDto inspectionPlanStaffDto = new InspectionPlanStaffDto(); inspectionPlanStaffDto.setCommunityId(tmpInspectionPlanDto.getCommunityId()); inspectionPlanStaffDto.setInspectionPlanId(tmpInspectionPlanDto.getInspectionPlanId()); List inspectionPlanStaffDtos = inspectionPlanStaffInnerServiceSMOImpl.queryInspectionPlanStaffs(inspectionPlanStaffDto); List inspectionTaskPos = new ArrayList<>(); List inspectionTaskDetailPos = new ArrayList<>(); for (InspectionPlanStaffDto tmpInspectionPlanStaffDto : inspectionPlanStaffDtos) { generatorStaffTask(tmpInspectionPlanDto, taskDto, communityDto, tmpInspectionPlanStaffDto, inspectionTaskPos, inspectionTaskDetailPos); } if (inspectionTaskPos.size() < 1) { return; } if (inspectionTaskDetailPos.size() < 1) { return; } inspectionTaskInnerServiceSMOImpl.saveInspectionTask(inspectionTaskPos); inspectionTaskInnerServiceSMOImpl.saveInspectionTaskDetail(inspectionTaskDetailPos); } private void generatorStaffTask(InspectionPlanDto tmpInspectionPlanDto, TaskDto taskDto, CommunityDto communityDto, InspectionPlanStaffDto tmpInspectionPlanStaffDto, List inspectionTaskPos, List inspectionTaskDetailPos) { //巡检方式 String inspectionPlanPeriod = tmpInspectionPlanDto.getInspectionPlanPeriod(); boolean hasCondition = false; switch (inspectionPlanPeriod) { case InspectionPlanDto.INSPECTION_PLAN_PERIOD_DAY: hasCondition = hasGeneratorTaskConditionByDay(tmpInspectionPlanDto, taskDto, communityDto, tmpInspectionPlanStaffDto, inspectionTaskPos, inspectionTaskDetailPos); break; case InspectionPlanDto.INSPECTION_PLAN_PERIOD_WEEK: hasCondition = hasGeneratorTaskConditionByWeek(tmpInspectionPlanDto, taskDto, communityDto, tmpInspectionPlanStaffDto, inspectionTaskPos, inspectionTaskDetailPos); break; } if (!hasCondition) { return; } String nowTime = DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B) + " "; InspectionTaskPo inspectionTaskPo = new InspectionTaskPo(); inspectionTaskPo.setInspectionPlanId(tmpInspectionPlanDto.getInspectionPlanId()); inspectionTaskPo.setCommunityId(tmpInspectionPlanDto.getCommunityId()); inspectionTaskPo.setIpStaffId(tmpInspectionPlanStaffDto.getIpStaffId()); inspectionTaskPo.setPlanInsTime(nowTime + tmpInspectionPlanStaffDto.getStartTime()); inspectionTaskPo.setPlanEndTime(nowTime + tmpInspectionPlanStaffDto.getEndTime()); inspectionTaskPo.setPlanUserId(tmpInspectionPlanStaffDto.getStaffId()); inspectionTaskPo.setPlanUserName(tmpInspectionPlanStaffDto.getStaffName()); inspectionTaskPo.setSignType(tmpInspectionPlanDto.getSignType()); inspectionTaskPo.setTaskId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_taskId)); inspectionTaskPo.setOriginalPlanUserId(tmpInspectionPlanStaffDto.getStaffId()); inspectionTaskPo.setOriginalPlanUserName(tmpInspectionPlanStaffDto.getStaffName()); inspectionTaskPo.setTaskType("1000"); InspectionRoutePointRelDto inspectionRoutePointRelDto = new InspectionRoutePointRelDto(); inspectionRoutePointRelDto.setCommunityId(tmpInspectionPlanDto.getCommunityId()); inspectionRoutePointRelDto.setInspectionRouteId(tmpInspectionPlanDto.getInspectionRouteId()); List inspectionRoutePointRelDtos = inspectionRoutePointRelInnerServiceSMOImpl.queryInspectionRoutePointRels(inspectionRoutePointRelDto); if (inspectionRoutePointRelDtos == null || inspectionRoutePointRelDtos.size() < 1) { return;//巡检点为空时不生成 巡检任务 } InspectionTaskDetailPo inspectionTaskDetailPo = null; for (InspectionRoutePointRelDto tmpInspectionRoutePointRelDto : inspectionRoutePointRelDtos) { inspectionTaskDetailPo = new InspectionTaskDetailPo(); inspectionTaskDetailPo.setCommunityId(tmpInspectionPlanDto.getCommunityId()); inspectionTaskDetailPo.setInspectionId(tmpInspectionRoutePointRelDto.getInspectionId()); inspectionTaskDetailPo.setInspectionName(tmpInspectionRoutePointRelDto.getInspectionName()); inspectionTaskDetailPo.setTaskId(inspectionTaskPo.getTaskId()); inspectionTaskDetailPo.setPointStartTime(tmpInspectionRoutePointRelDto.getPointStartTime()); inspectionTaskDetailPo.setPointEndTime(tmpInspectionRoutePointRelDto.getPointEndTime()); inspectionTaskDetailPo.setSortNumber(tmpInspectionRoutePointRelDto.getSortNumber()); inspectionTaskDetailPo.setTaskDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_taskDetailId)); inspectionTaskDetailPos.add(inspectionTaskDetailPo); } inspectionTaskPos.add(inspectionTaskPo); } /** * 每日 * * @param tmpInspectionPlanDto * @param taskDto * @param communityDto */ private boolean hasGeneratorTaskConditionByDay(InspectionPlanDto tmpInspectionPlanDto, TaskDto taskDto, CommunityDto communityDto, InspectionPlanStaffDto tmpInspectionPlanStaffDto, List inspectionTaskPos, List inspectionTaskDetailPos) { // 检查 今日是否 需要 生成巡检任务 String[] months = tmpInspectionPlanDto.getInspectionMonth().split(","); Calendar today = Calendar.getInstance(); int month = today.get(Calendar.MONTH) + 1; if (!Arrays.asList(months).contains(month + "")) { return false; } String[] days = tmpInspectionPlanDto.getInspectionDay().split(","); int day = today.get(Calendar.DAY_OF_MONTH); if (!Arrays.asList(days).contains(day + "")) { return false; } //当前时间是否 到了 巡检任务前30分钟 int beforeTime = Integer.parseInt(tmpInspectionPlanDto.getBeforeTime()); String planTime = DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B) + " " + tmpInspectionPlanDto.getStartTime(); Calendar calendar = Calendar.getInstance(); calendar.setTime(DateUtil.getDateFromStringA(planTime)); calendar.add(Calendar.MINUTE, beforeTime * (-1)); if (DateUtil.getCurrentDate().before(calendar.getTime())) { // 还没到生成任务时间 return false; } // 判断 员工是否上班 ScheduleClassesStaffDto scheduleClassesStaffDto = new ScheduleClassesStaffDto(); scheduleClassesStaffDto.setStaffId(tmpInspectionPlanStaffDto.getStaffId()); scheduleClassesStaffDto.setToday(DateUtil.getDateFromStringA(planTime)); scheduleClassesStaffDto = scheduleClassesStaffV1InnerServiceSMOImpl.staffIsWork(scheduleClassesStaffDto); if (!scheduleClassesStaffDto.isWork()) {//根据排班员工 休息 return false; } InspectionTaskDto inspectionTaskDto = new InspectionTaskDto(); inspectionTaskDto.setCommunityId(tmpInspectionPlanDto.getCommunityId()); //inspectionTaskDto.setInspectionPlanId(tmpInspectionPlanDto.getInspectionPlanId()); //这里修改为用原始 巡检人查 以防 做了 转单 inspectionTaskDto.setInspectionPlanId(tmpInspectionPlanDto.getInspectionPlanId()); inspectionTaskDto.setOriginalPlanUserId(tmpInspectionPlanStaffDto.getStaffId()); inspectionTaskDto.setPlanInsTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B)); //目前逻辑修改 一个巡检 计划 对于一个员工只能生成一次巡检任务,所以 传 员工 巡检计划ID 时间即可 List inspectionTaskDtos = inspectionTaskInnerServiceSMOImpl.queryInspectionTasks(inspectionTaskDto); if (inspectionTaskDtos != null && inspectionTaskDtos.size() > 0) { // 已经生成过 return false; } return true; } /** * 每周 * * @param tmpInspectionPlanDto * @param taskDto * @param communityDto */ private boolean hasGeneratorTaskConditionByWeek(InspectionPlanDto tmpInspectionPlanDto, TaskDto taskDto, CommunityDto communityDto, InspectionPlanStaffDto tmpInspectionPlanStaffDto, List inspectionTaskPos, List inspectionTaskDetailPos) { // 检查 今日是否 需要 生成巡检任务 String[] workday = tmpInspectionPlanDto.getInspectionWorkday().split(","); Calendar today = Calendar.getInstance(); int day = today.get(Calendar.DAY_OF_WEEK); //一周第一天是否为星期天 boolean isFirstSunday = (today.getFirstDayOfWeek() == Calendar.SUNDAY); //获取周几 //若一周第一天为星期天,则-1 if (isFirstSunday) { day = day - 1; if (day == 0) { day = 7; } } if (!Arrays.asList(workday).contains(day + "")) { return false; } //当前时间是否 到了 巡检任务前30分钟 int beforeTime = Integer.parseInt(tmpInspectionPlanDto.getBeforeTime()); String planTime = DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B) + " " + tmpInspectionPlanDto.getStartTime() + ":00"; Calendar calendar = Calendar.getInstance(); calendar.setTime(DateUtil.getDateFromStringA(planTime)); calendar.add(Calendar.MINUTE, beforeTime * (-1)); if (DateUtil.getCurrentDate().before(calendar.getTime())) { // 还没到生成任务时间 return false; } ScheduleClassesStaffDto scheduleClassesStaffDto = new ScheduleClassesStaffDto(); scheduleClassesStaffDto.setStaffId(tmpInspectionPlanStaffDto.getStaffId()); scheduleClassesStaffDto.setToday(DateUtil.getDateFromStringA(planTime)); scheduleClassesStaffDto = scheduleClassesStaffV1InnerServiceSMOImpl.staffIsWork(scheduleClassesStaffDto); if (!scheduleClassesStaffDto.isWork()) {//根据排班员工 休息 return false; } InspectionTaskDto inspectionTaskDto = new InspectionTaskDto(); inspectionTaskDto.setCommunityId(tmpInspectionPlanDto.getCommunityId()); //inspectionTaskDto.setInspectionPlanId(tmpInspectionPlanDto.getInspectionPlanId()); //这里修改为用原始 巡检人查 以防 做了 转单 inspectionTaskDto.setInspectionPlanId(tmpInspectionPlanDto.getInspectionPlanId()); inspectionTaskDto.setOriginalPlanUserId(tmpInspectionPlanStaffDto.getStaffId()); inspectionTaskDto.setPlanInsTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B)); //目前逻辑修改 一个巡检 计划 对于一个员工只能生成一次巡检任务,所以 传 员工 巡检计划ID 时间即可 List inspectionTaskDtos = inspectionTaskInnerServiceSMOImpl.queryInspectionTasks(inspectionTaskDto); if (inspectionTaskDtos != null && inspectionTaskDtos.size() > 0) { // 已经生成过 return false; } return true; } }