wuxw
2024-01-02 2cb9b0101d76b774963e9bb40c2b45ee247332ea
优化完成工作单功能
7个文件已修改
1个文件已添加
371 ■■■■■ 已修改文件
java110-bean/src/main/java/com/java110/dto/workCycle/WorkCycleDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/dto/workTask/WorkTaskDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/po/workTask/WorkTaskPo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-db/src/main/resources/mapper/oa/WorkCycleV1ServiceDaoImplMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-db/src/main/resources/mapper/oa/WorkTaskV1ServiceDaoImplMapper.xml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-job/src/main/java/com/java110/job/task/oa/CycleWorkTaskGeneratorTemplate.java 284 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-oa/src/main/java/com/java110/oa/cmd/work/SaveWorkPoolCmd.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-oa/src/main/java/com/java110/oa/cmd/work/UpdateWorkPoolCmd.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/dto/workCycle/WorkCycleDto.java
@@ -31,6 +31,8 @@
    private String staffId;
    private String periodDay;
    private String curTime;
    private Date createTime;
@@ -157,4 +159,12 @@
    public void setHours(String hours) {
        this.hours = hours;
    }
    public String getCurTime() {
        return curTime;
    }
    public void setCurTime(String curTime) {
        this.curTime = curTime;
    }
}
java110-bean/src/main/java/com/java110/dto/workTask/WorkTaskDto.java
@@ -41,6 +41,11 @@
    private String taskTimeout;
    private String taskInsTime;
    private String orgStaffId;
    private String orgStaffName;
@@ -203,4 +208,28 @@
    public void setTaskTimeout(String taskTimeout) {
        this.taskTimeout = taskTimeout;
    }
    public String getTaskInsTime() {
        return taskInsTime;
    }
    public void setTaskInsTime(String taskInsTime) {
        this.taskInsTime = taskInsTime;
    }
    public String getOrgStaffId() {
        return orgStaffId;
    }
    public void setOrgStaffId(String orgStaffId) {
        this.orgStaffId = orgStaffId;
    }
    public String getOrgStaffName() {
        return orgStaffName;
    }
    public void setOrgStaffName(String orgStaffName) {
        this.orgStaffName = orgStaffName;
    }
}
java110-bean/src/main/java/com/java110/po/workTask/WorkTaskPo.java
@@ -43,6 +43,10 @@
    private String taskTimeout;
    private String orgStaffId;
    private String orgStaffName;
    public String getStaffName() {
        return staffName;
    }
@@ -138,4 +142,20 @@
    public void setTaskTimeout(String taskTimeout) {
        this.taskTimeout = taskTimeout;
    }
    public String getOrgStaffId() {
        return orgStaffId;
    }
    public void setOrgStaffId(String orgStaffId) {
        this.orgStaffId = orgStaffId;
    }
    public String getOrgStaffName() {
        return orgStaffName;
    }
    public void setOrgStaffName(String orgStaffName) {
        this.orgStaffName = orgStaffName;
    }
}
java110-db/src/main/resources/mapper/oa/WorkCycleV1ServiceDaoImplMapper.xml
@@ -24,7 +24,12 @@
        staffName,t.period_month,t.period_month periodMonth,t.community_id,t.community_id
        communityId,t.staff_id,t.staff_id staffId,t.period_day,t.period_day periodDay,t.create_time createTime
        from work_cycle t
        where 1 =1
        left join work_pool wp on t.work_id = wp.work_id and wp.status_cd = '0'
        where 1=1
        <if test="curTime != null and curTime != ''">
        and wp.start_time &lt; #{curTime}
        and wp.end_time &gt; #{curTime}
        </if>
        <if test="workCycle !=null and workCycle != ''">
            and t.work_cycle= #{workCycle}
        </if>
java110-db/src/main/resources/mapper/oa/WorkTaskV1ServiceDaoImplMapper.xml
@@ -8,9 +8,9 @@
    <!-- 保存工作单任务信息 add by wuxw 2018-07-03 -->
    <insert id="saveWorkTaskInfo" parameterType="Map">
        insert into work_task(
        staff_name,start_time,state,end_time,community_id,store_id,task_id,work_id,staff_id
        staff_name,start_time,state,end_time,community_id,store_id,task_id,work_id,staff_id,org_staff_id,org_staff_name
        ) values (
        #{staffName},#{startTime},#{state},#{endTime},#{communityId},#{storeId},#{taskId},#{workId},#{staffId}
        #{staffName},#{startTime},#{state},#{endTime},#{communityId},#{storeId},#{taskId},#{workId},#{staffId},#{orgStaffId},#{orgStaffName}
        )
    </insert>
@@ -24,7 +24,7 @@
        td.`name` stateName,
        wp.work_cycle workCycle,wp.create_user_id
        createUserId,wp.create_user_name createUserName,wp.work_name workName,wp.wt_id wtId,wp.create_user_tel createUserTel,
        wt.type_name typeName,t.finish_time finishTime,t.task_timeout taskTimeout
        wt.type_name typeName,t.finish_time finishTime,t.task_timeout taskTimeout,t.org_staff_id orgStaffId,t.org_staff_name orgStaffName
        from work_task t
        left join t_dict td on t.state = td.status_cd and td.table_name = 'work_pool' and td.table_columns = 'state'
        left join work_pool wp on t.work_id = wp.work_id and wp.status_cd = '0'
@@ -46,6 +46,10 @@
        <if test="startTime !=null and startTime != ''">
            and t.start_time= #{startTime}
        </if>
        <if test="taskInsTime !=null and taskInsTime != ''">
            and DATE_FORMAT(t.start_time,'%Y-%m-%d')= #{taskInsTime}
        </if>
        <if test="statusCd !=null and statusCd != ''">
            and t.status_cd= #{statusCd}
        </if>
@@ -76,6 +80,10 @@
        <if test="staffId !=null and staffId != ''">
            and t.staff_id= #{staffId}
        </if>
        <if test="orgStaffId !=null and orgStaffId != ''">
            and t.org_staff_id= #{orgStaffId}
        </if>
        <if test="taskTimeout !=null and taskTimeout != ''">
            and t.task_timeout= #{taskTimeout}
        </if>
@@ -192,6 +200,9 @@
        <if test="staffId !=null and staffId != ''">
            and t.staff_id= #{staffId}
        </if>
        <if test="orgStaffId !=null and orgStaffId != ''">
            and t.org_staff_id= #{orgStaffId}
        </if>
        <if test="taskTimeout !=null and taskTimeout != ''">
            and t.task_timeout= #{taskTimeout}
        </if>
service-job/src/main/java/com/java110/job/task/oa/CycleWorkTaskGeneratorTemplate.java
New file
@@ -0,0 +1,284 @@
package com.java110.job.task.oa;
import com.java110.core.factory.GenerateCodeFactory;
import com.java110.dto.classes.ScheduleClassesStaffDto;
import com.java110.dto.community.CommunityDto;
import com.java110.dto.task.TaskDto;
import com.java110.dto.workCycle.WorkCycleDto;
import com.java110.dto.workPool.WorkPoolDto;
import com.java110.dto.workPoolFile.WorkPoolFileDto;
import com.java110.dto.workTask.WorkTaskDto;
import com.java110.intf.oa.IWorkCycleV1InnerServiceSMO;
import com.java110.intf.oa.IWorkPoolFileV1InnerServiceSMO;
import com.java110.intf.oa.IWorkPoolV1InnerServiceSMO;
import com.java110.intf.oa.IWorkTaskV1InnerServiceSMO;
import com.java110.intf.store.IScheduleClassesStaffV1InnerServiceSMO;
import com.java110.job.quartz.TaskSystemQuartz;
import com.java110.po.workPoolFile.WorkPoolFilePo;
import com.java110.po.workTask.WorkTaskPo;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.DateUtil;
import com.java110.utils.util.ListUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Component
public class CycleWorkTaskGeneratorTemplate extends TaskSystemQuartz {
    @Autowired
    private IWorkCycleV1InnerServiceSMO workCycleV1InnerServiceSMOImpl;
    @Autowired
    private IScheduleClassesStaffV1InnerServiceSMO scheduleClassesStaffV1InnerServiceSMOImpl;
    @Autowired
    private IWorkTaskV1InnerServiceSMO workTaskV1InnerServiceSMOImpl;
    @Autowired
    private IWorkPoolV1InnerServiceSMO workPoolV1InnerServiceSMOImpl;
    @Autowired
    private IWorkPoolFileV1InnerServiceSMO workPoolFileV1InnerServiceSMOImpl;
    @Override
    protected void process(TaskDto taskDto) throws Exception {
        logger.debug("开始执行周期性工作单任务生成" + taskDto.toString());
        // 获取小区
        List<CommunityDto> communityDtos = getAllCommunity();
        for (CommunityDto communityDto : communityDtos) {
            try {
                generatorTask(taskDto, communityDto);
            } catch (Exception e) {
                logger.error("推送消息失败", e);
            }
        }
    }
    private void generatorTask(TaskDto taskDto, CommunityDto communityDto) {
        WorkCycleDto workCycleDto = new WorkCycleDto();
        workCycleDto.setCommunityId(communityDto.getCommunityId());
        workCycleDto.setWorkCycle(WorkPoolDto.WORK_CYCLE_CYCLE);
        workCycleDto.setCurTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
        List<WorkCycleDto> workCycleDtos = workCycleV1InnerServiceSMOImpl.queryWorkCycles(workCycleDto);
        if(workCycleDtos == null){
            return ;
        }
        for(WorkCycleDto tmpWorkCycleDto : workCycleDtos){
            try{
                doGeneratorTask(tmpWorkCycleDto,taskDto,communityDto);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    private void doGeneratorTask(WorkCycleDto tmpWorkCycleDto,TaskDto taskDto, CommunityDto communityDto) {
        WorkPoolDto workPoolDto = new WorkPoolDto();
        workPoolDto.setWorkId(tmpWorkCycleDto.getWorkId());
        List<WorkPoolDto>workPoolDtos = workPoolV1InnerServiceSMOImpl.queryWorkPools(workPoolDto);
        if(ListUtil.isNull(workPoolDtos)){
            return;
        }
        Date startTime = DateUtil.getDateFromStringA(workPoolDtos.get(0).getStartTime());
        Calendar startTimeCal = Calendar.getInstance();
        startTimeCal.setTime(startTime);
        Calendar nowCal = Calendar.getInstance();
        nowCal.set(Calendar.HOUR,startTimeCal.get(Calendar.HOUR));
        nowCal.set(Calendar.MINUTE,startTimeCal.get(Calendar.MINUTE));
        nowCal.set(Calendar.SECOND,startTimeCal.get(Calendar.SECOND));
        Date nowTime = nowCal.getTime();
        boolean hasCondition = false;
        switch (tmpWorkCycleDto.getPeriod()) {
            case WorkCycleDto.PERIOD_MONTH_DAY:
                hasCondition = hasGeneratorTaskConditionByDay(tmpWorkCycleDto, taskDto, communityDto,nowTime);
                break;
            case WorkCycleDto.PERIOD_MONTH_WORKDAY:
                hasCondition = hasGeneratorTaskConditionByWeek(tmpWorkCycleDto, taskDto, communityDto,nowTime);
                break;
        }
        if (!hasCondition) {
            return;
        }
        WorkTaskPo workTaskPo = new WorkTaskPo();
        workTaskPo.setWorkId(tmpWorkCycleDto.getWorkId());
        workTaskPo.setState(WorkTaskDto.STATE_WAIT);
        workTaskPo.setTaskId(GenerateCodeFactory.getGeneratorId("11"));
        workTaskPo.setStoreId(tmpWorkCycleDto.getStoreId());
        workTaskPo.setCommunityId(tmpWorkCycleDto.getCommunityId());
        workTaskPo.setStartTime(DateUtil.getFormatTimeStringA(nowTime));
        workTaskPo.setEndTime(DateUtil.getAddHoursStringA(nowTime,Integer.parseInt(tmpWorkCycleDto.getHours())));
        workTaskPo.setStaffId(tmpWorkCycleDto.getStaffId());
        workTaskPo.setStaffName(tmpWorkCycleDto.getStaffName());
        workTaskPo.setOrgStaffId(tmpWorkCycleDto.getStaffId());
        workTaskPo.setOrgStaffName(tmpWorkCycleDto.getStaffName());
        int flag = workTaskV1InnerServiceSMOImpl.saveWorkTask(workTaskPo);
        if (flag < 1) {
            throw new CmdException("保存数据失败");
        }
        WorkPoolFileDto workPoolFileDto = new WorkPoolFileDto();
        workPoolFileDto.setWorkId(tmpWorkCycleDto.getWorkId());
        workPoolFileDto.setFileType(WorkPoolFileDto.FILE_TYPE_START);
        List<WorkPoolFileDto> workPoolFileDtos = workPoolFileV1InnerServiceSMOImpl.queryWorkPoolFiles(workPoolFileDto);
        if(ListUtil.isNull(workPoolFileDtos)){
            return;
        }
        WorkPoolFilePo workPoolFilePo = null;
        for(WorkPoolFileDto tmpWorkPoolFileDto : workPoolFileDtos){
            workPoolFilePo = new WorkPoolFilePo();
            workPoolFilePo.setCommunityId(workTaskPo.getCommunityId());
            workPoolFilePo.setFileType(WorkPoolFileDto.FILE_TYPE_START);
            workPoolFilePo.setFileId(GenerateCodeFactory.getGeneratorId("11"));
            workPoolFilePo.setWorkId(workTaskPo.getWorkId());
            workPoolFilePo.setTaskId(workTaskPo.getTaskId());
            workPoolFilePo.setPathUrl(tmpWorkPoolFileDto.getPathUrl());
            workPoolFilePo.setStoreId(workTaskPo.getStoreId());
            workPoolFileV1InnerServiceSMOImpl.saveWorkPoolFile(workPoolFilePo);
        }
    }
    private boolean hasGeneratorTaskConditionByWeek(WorkCycleDto tmpWorkCycleDto, TaskDto taskDto, CommunityDto communityDto,Date nowTime) {
        // 检查 今日是否 需要 生成巡检任务
        // 检查 今日是否 需要 生成巡检任务
        String[] workday = tmpWorkCycleDto.getPeriodWorkday().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(tmpWorkCycleDto.getBeforeTime());
        String planTime = DateUtil.getFormatTimeStringA(nowTime);
        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(tmpWorkCycleDto.getStaffId());
        scheduleClassesStaffDto.setToday(DateUtil.getDateFromStringA(planTime));
        scheduleClassesStaffDto = scheduleClassesStaffV1InnerServiceSMOImpl.staffIsWork(scheduleClassesStaffDto);
        if(!scheduleClassesStaffDto.isWork()){//根据排班员工 休息
            return false;
        }
        WorkTaskDto workTaskDto = new WorkTaskDto();
        workTaskDto.setCommunityId(tmpWorkCycleDto.getCommunityId());
        workTaskDto.setWorkId(tmpWorkCycleDto.getWorkId());
        workTaskDto.setTaskInsTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B));
        workTaskDto.setOrgStaffId(tmpWorkCycleDto.getStaffId());
        //目前逻辑修改 一个巡检 计划 对于一个员工只能生成一次巡检任务,所以 传 员工 巡检计划ID 时间即可
        List<WorkTaskDto> workTasksDtos = workTaskV1InnerServiceSMOImpl.queryWorkTasks(workTaskDto);
        if (workTasksDtos != null && !workTasksDtos.isEmpty()) { // 已经生成过
            return false;
        }
        return true;
    }
    private boolean hasGeneratorTaskConditionByDay(WorkCycleDto tmpWorkCycleDto, TaskDto taskDto, CommunityDto communityDto,Date nowTime) {
        // 检查 今日是否 需要 生成巡检任务
        String[] months = tmpWorkCycleDto.getPeriodMonth().split(",");
        Calendar today = Calendar.getInstance();
        int month = today.get(Calendar.MONTH) + 1;
        if (!Arrays.asList(months).contains(month + "")) {
            return false;
        }
        String[] days = tmpWorkCycleDto.getPeriodDay().split(",");
        int day = today.get(Calendar.DAY_OF_MONTH);
        if (!Arrays.asList(days).contains(day + "")) {
            return false;
        }
        //当前时间是否 到了 巡检任务前30分钟
        int beforeTime = Integer.parseInt(tmpWorkCycleDto.getBeforeTime());
        String planTime = DateUtil.getFormatTimeStringA(nowTime);
        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(tmpWorkCycleDto.getStaffId());
        scheduleClassesStaffDto.setToday(DateUtil.getDateFromStringA(planTime));
        scheduleClassesStaffDto = scheduleClassesStaffV1InnerServiceSMOImpl.staffIsWork(scheduleClassesStaffDto);
        if (!scheduleClassesStaffDto.isWork()) {//根据排班员工 休息
            return false;
        }
        WorkTaskDto workTaskDto = new WorkTaskDto();
        workTaskDto.setCommunityId(tmpWorkCycleDto.getCommunityId());
        workTaskDto.setWorkId(tmpWorkCycleDto.getWorkId());
        workTaskDto.setTaskInsTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B));
        workTaskDto.setOrgStaffId(tmpWorkCycleDto.getStaffId());
        //目前逻辑修改 一个巡检 计划 对于一个员工只能生成一次巡检任务,所以 传 员工 巡检计划ID 时间即可
        List<WorkTaskDto> workTasksDtos = workTaskV1InnerServiceSMOImpl.queryWorkTasks(workTaskDto);
        if (workTasksDtos != null && !workTasksDtos.isEmpty()) { // 已经生成过
            return false;
        }
        return true;
    }
}
service-oa/src/main/java/com/java110/oa/cmd/work/SaveWorkPoolCmd.java
@@ -210,6 +210,8 @@
            workTaskPo.setEndTime(endTime);
            workTaskPo.setStaffId(staffs.getJSONObject(staffIndex).getString("staffId"));
            workTaskPo.setStaffName(staffs.getJSONObject(staffIndex).getString("staffName"));
            workTaskPo.setOrgStaffId(staffs.getJSONObject(staffIndex).getString("staffId"));
            workTaskPo.setOrgStaffName(staffs.getJSONObject(staffIndex).getString("staffName"));
            int flag = workTaskV1InnerServiceSMOImpl.saveWorkTask(workTaskPo);
            if (flag < 1) {
service-oa/src/main/java/com/java110/oa/cmd/work/UpdateWorkPoolCmd.java
@@ -205,6 +205,8 @@
            workTaskPo.setEndTime(endTime);
            workTaskPo.setStaffId(staffs.getJSONObject(staffIndex).getString("staffId"));
            workTaskPo.setStaffName(staffs.getJSONObject(staffIndex).getString("staffName"));
            workTaskPo.setOrgStaffId(staffs.getJSONObject(staffIndex).getString("staffId"));
            workTaskPo.setOrgStaffName(staffs.getJSONObject(staffIndex).getString("staffName"));
            int flag = workTaskV1InnerServiceSMOImpl.saveWorkTask(workTaskPo);
            if (flag < 1) {