java110
2023-05-31 dd9759eaa3dabd3d55943fc0c741fd5018d2d76e
service-store/src/main/java/com/java110/store/cmd/scheduleClasses/StaffMonthScheduleClassesCmd.java
@@ -20,16 +20,12 @@
import com.java110.core.context.ICmdDataFlowContext;
import com.java110.core.event.cmd.Cmd;
import com.java110.core.event.cmd.CmdEvent;
import com.java110.dto.scheduleClasses.ScheduleClassesDto;
import com.java110.dto.scheduleClassesDay.ScheduleClassesDayDto;
import com.java110.dto.scheduleClassesStaff.ScheduleClassesStaffDto;
import com.java110.dto.scheduleClasses.ScheduleClassesStaffDto;
import com.java110.intf.store.IScheduleClassesDayV1InnerServiceSMO;
import com.java110.intf.store.IScheduleClassesStaffV1InnerServiceSMO;
import com.java110.intf.store.IScheduleClassesV1InnerServiceSMO;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.utils.util.DateUtil;
import com.java110.vo.ResultVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +34,6 @@
import org.springframework.http.ResponseEntity;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@@ -79,196 +74,33 @@
        ScheduleClassesStaffDto scheduleClassesStaffDto = new ScheduleClassesStaffDto();
        scheduleClassesStaffDto.setStaffId(reqJson.getString("staffId"));
        scheduleClassesStaffDto.setStaffNameLike(reqJson.getString("staffNameLike"));
        scheduleClassesStaffDto.setScheduleId(reqJson.getString("scheduleId"));
        scheduleClassesStaffDto.setPage(reqJson.getIntValue("page"));
        scheduleClassesStaffDto.setRow(reqJson.getIntValue("row"));
        scheduleClassesStaffDto.setStoreId(storeId);
        scheduleClassesStaffDto.setOrgId(reqJson.getString("orgId"));
        int count = scheduleClassesStaffV1InnerServiceSMOImpl.queryScheduleClassesStaffsCount(scheduleClassesStaffDto);
        List<ScheduleClassesStaffDto> scheduleClassesStaffDtos = null;
        List<ScheduleClassesStaffDto> tmpScheduleClassesStaffDtos =  new ArrayList<>();
        ScheduleClassesStaffDto tmpScheduleClassesStaffDto = null;
        if (count > 0) {
            scheduleClassesStaffDtos = scheduleClassesStaffV1InnerServiceSMOImpl.queryScheduleClassesStaffs(scheduleClassesStaffDto);
            for (ScheduleClassesStaffDto tmpScheduleClassesStaffDto : scheduleClassesStaffDtos) {
                computeStaffCurMonthWorkday(tmpScheduleClassesStaffDto, reqJson);
            for (ScheduleClassesStaffDto scheduleClassesStaffDto1 : scheduleClassesStaffDtos) {
                scheduleClassesStaffDto1.setCurDate(reqJson.getString("curDate"));
                tmpScheduleClassesStaffDto = scheduleClassesStaffV1InnerServiceSMOImpl.computeStaffCurMonthWorkday(scheduleClassesStaffDto1);
                tmpScheduleClassesStaffDtos.add(tmpScheduleClassesStaffDto);
            }
        } else {
            scheduleClassesStaffDtos = new ArrayList<>();
        }
        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reqJson.getInteger("row")), count, scheduleClassesStaffDtos);
        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reqJson.getInteger("row")), count, tmpScheduleClassesStaffDtos);
        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
        cmdDataFlowContext.setResponseEntity(responseEntity);
    }
    /**
     * 计算 员工 排班情况
     *
     * @param scheduleClassesStaffDto
     * @param reqJson
     */
    private void computeStaffCurMonthWorkday(ScheduleClassesStaffDto scheduleClassesStaffDto, JSONObject reqJson) {
        ScheduleClassesDto scheduleClassesDto = new ScheduleClassesDto();
        scheduleClassesDto.setScheduleId(scheduleClassesStaffDto.getScheduleId());
        List<ScheduleClassesDto> scheduleClassesDtos = scheduleClassesV1InnerServiceSMOImpl.queryScheduleClassess(scheduleClassesDto);
        //这里 如果没有员工排班 那么就认为 员工一直在上班
        if (scheduleClassesDtos == null || scheduleClassesDtos.size() < 1) {
            return;
        }
        ScheduleClassesDayDto scheduleClassesDayDto = new ScheduleClassesDayDto();
        scheduleClassesDayDto.setScheduleId(scheduleClassesDtos.get(0).getScheduleId());
        List<ScheduleClassesDayDto> scheduleClassesDayDtos = scheduleClassesDayV1InnerServiceSMOImpl.queryScheduleClassesDays(scheduleClassesDayDto);
        //设置问题 ,这里默认反馈在线
        if (scheduleClassesDayDtos == null || scheduleClassesDayDtos.size() < 1) {
            return;
        }
        String curMonth = reqJson.getString("curDate");
        String curMonthDay = curMonth + "-01";
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(DateUtil.getDateFromStringB(curMonthDay));
        int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        if (ScheduleClassesDto.SCHEDULE_TYPE_DAY.equals(scheduleClassesDtos.get(0).getScheduleType())) {
            doDay(scheduleClassesStaffDto, scheduleClassesDtos.get(0), scheduleClassesDayDtos, curMonth, maxDay);
        } else if (ScheduleClassesDto.SCHEDULE_TYPE_WEEK.equals(scheduleClassesDtos.get(0).getScheduleType())) {
            doWeek(scheduleClassesStaffDto, scheduleClassesDtos.get(0), scheduleClassesDayDtos, curMonth, maxDay);
        } else if (ScheduleClassesDto.SCHEDULE_TYPE_MONTH.equals(scheduleClassesDtos.get(0).getScheduleType())) {
            doMonth(scheduleClassesStaffDto, scheduleClassesDtos.get(0), scheduleClassesDayDtos, curMonth, maxDay);
        }
    }
    private void doDay(ScheduleClassesStaffDto scheduleClassesStaffDto,
                       ScheduleClassesDto scheduleClassesDto,
                       List<ScheduleClassesDayDto> scheduleClassesDayDtos,
                       String curMonth, int maxDay) {
        List<ScheduleClassesDayDto> days = new ArrayList<>();
        ScheduleClassesDayDto scDay = null;
        ScheduleClassesDayDto tmpScheduleClassesDayDto = null;
        int curDay = 1;
        for (int day = 1; day <= maxDay; day++) {
            scDay = new ScheduleClassesDayDto();
            String today = curMonth + "-"+day;
            int scheduleCycle = Integer.parseInt(scheduleClassesDto.getScheduleCycle());
            int allDay = DateUtil.daysBetween(scheduleClassesDto.getComputeTime(), today)+1;
            curDay = allDay % scheduleCycle;
            if (curDay == 0 && day == 1) {
                curDay = 1;
            }
            if (curDay == 0 && day > 1) {
                curDay = scheduleCycle;
            }
            scDay.setDay(day+"");
            //计算 排班
            for(ScheduleClassesDayDto scheduleClassesDayDto1 : scheduleClassesDayDtos){
                if((curDay+"").equals(scheduleClassesDayDto1.getDay())){
                    tmpScheduleClassesDayDto = scheduleClassesDayDto1;
                }
            }
            if(tmpScheduleClassesDayDto != null ){
                scDay.setWorkday(tmpScheduleClassesDayDto.getWorkday());
                scDay.setTimes(tmpScheduleClassesDayDto.getTimes());
            }
            days.add(scDay);
        }
        scheduleClassesStaffDto.setDays(days);
    }
    private void doWeek(ScheduleClassesStaffDto scheduleClassesStaffDto,
                       ScheduleClassesDto scheduleClassesDto,
                       List<ScheduleClassesDayDto> scheduleClassesDayDtos,
                       String curMonth, int maxDay) {
        List<ScheduleClassesDayDto> days = new ArrayList<>();
        ScheduleClassesDayDto scDay = null;
        ScheduleClassesDayDto tmpScheduleClassesDayDto = null;
        int curDay = 1;
        for (int day = 1; day <= maxDay; day++) {
            scDay = new ScheduleClassesDayDto();
            Calendar today = Calendar.getInstance();
            today.setTime(DateUtil.getDateFromStringB(curMonth + "-"+day));
            int week = today.get(Calendar.WEEK_OF_MONTH);
            curDay = today.get(Calendar.DAY_OF_WEEK);
            //一周第一天是否为星期天
            boolean isFirstSunday = (today.getFirstDayOfWeek() == Calendar.SUNDAY);
            //获取周几
            //若一周第一天为星期天,则-1
            if (isFirstSunday) {
                curDay = curDay - 1;
                if (curDay == 0) {
                    curDay = 7;
                }
            }
            scDay.setDay(day+"");
            //计算 排班
            for(ScheduleClassesDayDto scheduleClassesDayDto1 : scheduleClassesDayDtos){
                if((curDay+"").equals(scheduleClassesDayDto1.getDay()) && (week+"").equals(scheduleClassesDayDto1.getWeekFlag())){
                    tmpScheduleClassesDayDto = scheduleClassesDayDto1;
                }
            }
            if(tmpScheduleClassesDayDto == null){ // 没有设置周
                for(ScheduleClassesDayDto scheduleClassesDayDto1 : scheduleClassesDayDtos){
                    if((curDay+"").equals(scheduleClassesDayDto1.getDay())){
                        tmpScheduleClassesDayDto = scheduleClassesDayDto1;
                    }
                }
            }
            if(tmpScheduleClassesDayDto != null ){
                scDay.setWorkday(tmpScheduleClassesDayDto.getWorkday());
                scDay.setTimes(tmpScheduleClassesDayDto.getTimes());
            }
            days.add(scDay);
        }
        scheduleClassesStaffDto.setDays(days);
    }
    private void doMonth(ScheduleClassesStaffDto scheduleClassesStaffDto,
                        ScheduleClassesDto scheduleClassesDto,
                        List<ScheduleClassesDayDto> scheduleClassesDayDtos,
                        String curMonth, int maxDay) {
        List<ScheduleClassesDayDto> days = new ArrayList<>();
        ScheduleClassesDayDto scDay = null;
        ScheduleClassesDayDto tmpScheduleClassesDayDto = null;
        int curDay = 1;
        for (int day = 1; day <= maxDay; day++) {
            scDay = new ScheduleClassesDayDto();
            curDay = day;
            scDay.setDay(day+"");
            //计算 排班
            for(ScheduleClassesDayDto scheduleClassesDayDto1 : scheduleClassesDayDtos){
                if((curDay+"").equals(scheduleClassesDayDto1.getDay())){
                    tmpScheduleClassesDayDto = scheduleClassesDayDto1;
                }
            }
            if(tmpScheduleClassesDayDto != null ){
                scDay.setWorkday(tmpScheduleClassesDayDto.getWorkday());
                scDay.setTimes(tmpScheduleClassesDayDto.getTimes());
            }
            days.add(scDay);
        }
        scheduleClassesStaffDto.setDays(days);
    }