package cn.com.lzt.projarrangedetail.service.impl; import java.io.Serializable; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.validation.Validator; import org.jeecgframework.core.common.model.json.AjaxJson; import org.jeecgframework.core.common.service.impl.CommonServiceImpl; import org.jeecgframework.core.constant.Globals; import org.jeecgframework.core.util.JeecgDataAutorUtils; import org.jeecgframework.core.util.MyBeanUtils; import org.jeecgframework.core.util.StringUtil; import org.jeecgframework.web.system.pojo.base.DictEntity; import org.jeecgframework.web.system.service.SystemService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.com.lzt.arrangeduty.dto.ArrangeDutyDto; import cn.com.lzt.arrangeduty.service.ArrangeDutyServiceI; import cn.com.lzt.arrangedutyoperate.dto.ArrangeDutyOperateDto; import cn.com.lzt.arrangedutyoperate.entity.ArrangeDutyOperateEntity; import cn.com.lzt.arrangedutyoperate.service.ArrangeDutyOperateServiceI; import cn.com.lzt.calendar.dto.CalendarAscDto; import cn.com.lzt.calendar.service.CalendarServiceI; import cn.com.lzt.ondutyoperate.entity.OnDutyOperateEntity; import cn.com.lzt.ondutyoperate.service.OnDutyOperateServiceI; import cn.com.lzt.projarrangedetail.dao.ProjArrangeDetailAndUserMiniDao; import cn.com.lzt.projarrangedetail.dao.UserAndShiftMiniDao; import cn.com.lzt.projarrangedetail.dao.UserArrangeCalendarMiniDao; import cn.com.lzt.projarrangedetail.dto.ProjArrangeDetailAndUserDto; import cn.com.lzt.projarrangedetail.entity.ProjarrangeDetailEntity; import cn.com.lzt.projarrangedetail.projectarrangecommonmethod.ProjectArrangeCommonMethod; import cn.com.lzt.projarrangedetail.service.ArrangeDutyAndOndutyServiceI; import cn.com.lzt.projarrangedetail.service.ProjarrangeDetailServiceI; import cn.com.lzt.projarrangegeneral.entity.ProjArrangeGeneralEntity; import cn.com.lzt.projarrangegeneral.service.ProjArrangeGeneralServiceI; import cn.com.lzt.userarrangedetail.dto.UserArrangeDetailDto; import cn.com.lzt.userarrangedetail.entity.UserArrangeDetailEntity; import cn.com.lzt.userarrangedetail.entity.UserArrangeDetailHistoryEntity; import cn.com.lzt.userarrangedetail.service.UserArrangeDetailServiceI; @Service("arrangeDutyAndOndutyServiceI") @Transactional public class ArrangeDutyAndOndutyServiceImpl extends CommonServiceImpl implements ArrangeDutyAndOndutyServiceI { @Autowired ProjArrangeDetailAndUserMiniDao projArrangeDetailAndUserMiniDao; @Autowired UserArrangeCalendarMiniDao userArrangeCalendarMiniDao; // 验证轮流值班是否可行 @Autowired UserAndShiftMiniDao userAndShiftMiniDao; //日历表 @Autowired private CalendarServiceI calendarService; //员工排班详情表 @Autowired private UserArrangeDetailServiceI userArrangeDetailService; //班次表 @Autowired private ArrangeDutyServiceI arrangeDutyService; //项目排班总览表 @Autowired private ProjArrangeGeneralServiceI projArrangeGeneralService; //项目排班详细表 @Autowired private ProjarrangeDetailServiceI projarrangeDetailServiceI; //排班操作表 @Autowired private ArrangeDutyOperateServiceI arrangeDutyOperateService; //排班操作表 @Autowired private OnDutyOperateServiceI onDutyOperateServiceI; @Autowired private SystemService systemService; @Autowired private Validator validator; //项目排班自己总结公共方法; //ProjectArrangeCommonMethod commonMethod; @Override public void delete(ProjarrangeDetailEntity entity) throws Exception { // TODO Auto-generated method stub } @Override public Serializable save(ProjarrangeDetailEntity entity) throws Exception { // TODO Auto-generated method stub return null; } @Override public void saveOrUpdate(ProjarrangeDetailEntity entity) throws Exception { // TODO Auto-generated method stub } @Override public ProjarrangeDetailEntity getDayAndTimeFO(ProjarrangeDetailEntity projarrangeDetailEntity, Map myMap) throws Exception { //根据月度查询日历id CalendarAscDto calendarAscDto=new CalendarAscDto(); calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0])); calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1])); List calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto); //所有班次信息 List shiftList=new ArrayList(); for(Map.Entry m :myMap.entrySet()){ shiftList.add(m.getValue().toString()); } //根据班次id查询班次信息 ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班 BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日 BigDecimal workingDays=BigDecimal.ZERO;//正常工作日 BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长 BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长 BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数 //计算正常工作日时长 for (int i = 0; i < calendarAscDtoList.size(); i++) { if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日 statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1")); } } for (Map.Entry m :myMap.entrySet()) { // System.out.println(m.getKey()+"\t"+m.getValue()); for (int n = 0; n < calendarAscDtoList.size(); n++) { if(m.getKey().equals(calendarAscDtoList.get(n).getId())){ for (int b = 0; b < arrangeDutyDtoList.size(); b++) { if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){ if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日 if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); } }else{ if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_zhiban)){ ondutyDays=ondutyDays.add(new BigDecimal("1")); }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){ workingDays=workingDays.add(new BigDecimal("1")); if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); } }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_jiaban)){ if(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours()!=null){ timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours()); } } } break; } } break; } } } timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8"))); projarrangeDetailEntity.setWorkingDays(workingDays); projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours); projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours); projarrangeDetailEntity.setOndutyDays(ondutyDays); return projarrangeDetailEntity; } @Override public ProjarrangeDetailEntity getDayAndTimeFO4ProjAllUsers(ProjarrangeDetailEntity projarrangeDetailEntity, Map myMap) throws Exception { //根据月度查询日历id CalendarAscDto calendarAscDto = new CalendarAscDto(); calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0])); calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1])); List calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto); //所有班次信息 List shiftList = new ArrayList(); for(Map.Entry m : myMap.entrySet()){ shiftList.add(m.getValue().toString()); } //根据班次id查询班次信息 ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班 BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日 BigDecimal workingDays=BigDecimal.ZERO;//正常工作日 BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长 BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长 BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数 //计算正常工作日时长 for (int i = 0; i < calendarAscDtoList.size(); i++) { if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日 statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1")); } } for (Map.Entry m :myMap.entrySet()) { // System.out.println(m.getKey()+"\t"+m.getValue()); for (int n = 0; n < calendarAscDtoList.size(); n++) { if(m.getKey().equals(calendarAscDtoList.get(n).getId())){ for (int b = 0; b < arrangeDutyDtoList.size(); b++) { if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){ if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日 if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); } }else{ if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_zhiban)){ ondutyDays=ondutyDays.add(new BigDecimal("1")); }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){ workingDays=workingDays.add(new BigDecimal("1")); if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); } }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_jiaban)){ if(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours()!=null){ timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours()); } } } break; } } break; } } } timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8"))); projarrangeDetailEntity.setWorkingDays(workingDays); projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours); projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours); projarrangeDetailEntity.setOndutyDays(ondutyDays); return projarrangeDetailEntity; } @Override public ProjarrangeDetailEntity getDayAndTimeTT( ProjarrangeDetailEntity projarrangeDetailEntity, Map myMap) throws Exception { //根据月度查询日历id CalendarAscDto calendarAscDto=new CalendarAscDto(); calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0])); calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1])); List calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto); //所有班次信息 List shiftList=new ArrayList(); for(Map.Entry m :myMap.entrySet()){ shiftList.add(m.getValue().toString()); } //根据班次id查询班次信息 ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班 BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日 BigDecimal workingDays=BigDecimal.ZERO;//正常工作日 BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长 BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长 BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数 //计算正常工作日时长 for (int i = 0; i < calendarAscDtoList.size(); i++) { if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日 statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1")); } } for (Map.Entry m :myMap.entrySet()) { // System.out.println(m.getKey()+"\t"+m.getValue()); for (int n = 0; n < calendarAscDtoList.size(); n++) { if(m.getKey().equals(calendarAscDtoList.get(n).getId())){ for (int b = 0; b < arrangeDutyDtoList.size(); b++) { if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){ if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日 if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); workingDays=workingDays.add(new BigDecimal("1")); } }else{ if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){ workingDays=workingDays.add(new BigDecimal("1")); if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); } } } break; } } break; } } } timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8"))); projarrangeDetailEntity.setWorkingDays(workingDays); projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours); projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours); projarrangeDetailEntity.setOndutyDays(ondutyDays); return projarrangeDetailEntity; } /** * 两班倒计算时间 * */ @Override public ProjarrangeDetailEntity getDayAndTime2ban( ProjarrangeDetailEntity projarrangeDetailEntity, Map myMap) throws Exception { //根据月度查询日历id CalendarAscDto calendarAscDto=new CalendarAscDto(); calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0])); calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1])); List calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto); //所有班次信息 List shiftList=new ArrayList(); for(Map.Entry m :myMap.entrySet()){ shiftList.add(m.getValue().toString()); } //根据班次id查询班次信息 ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班 BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日 BigDecimal workingDays=BigDecimal.ZERO;//正常工作日 BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长 BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长 BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数 //计算正常工作日时长 for (int i = 0; i < calendarAscDtoList.size(); i++) { if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日 statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1")); } } for (Map.Entry m :myMap.entrySet()) { // System.out.println(m.getKey()+"\t"+m.getValue()); for (int n = 0; n < calendarAscDtoList.size(); n++) { if(m.getKey().equals(calendarAscDtoList.get(n).getId())){ for (int b = 0; b < arrangeDutyDtoList.size(); b++) { if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){ if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日 if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); workingDays=workingDays.add(new BigDecimal("1")); } }else{ if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_zhiban)){ ondutyDays = ondutyDays.add(new BigDecimal("1")); }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h) ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){ workingDays=workingDays.add(new BigDecimal("1")); if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){ timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours()); } } } break; } } break; } } } timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8"))); projarrangeDetailEntity.setWorkingDays(workingDays); projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours); projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours); projarrangeDetailEntity.setOndutyDays(ondutyDays); return projarrangeDetailEntity; } @Override public AjaxJson saveProjarrangeDetail(ProjarrangeDetailEntity projarrangeDetailEntity, Map myMap,String arrangeDutyStatus) throws Exception { return saveProjarrangeDetail(projarrangeDetailEntity, myMap, arrangeDutyStatus,true); } @Override public AjaxJson saveProjarrangeDetail(ProjarrangeDetailEntity projarrangeDetailEntity, Map myMap,String arrangeDutyStatus,boolean backupUserArrangeDetail) throws Exception { String message = null; AjaxJson j = new AjaxJson(); message = ""; if (StringUtil.isNotEmpty(projarrangeDetailEntity.getId())) { ProjarrangeDetailEntity t = this.get(ProjarrangeDetailEntity.class, projarrangeDetailEntity.getId()); if(t!=null){//数据存在,需要编辑 try { MyBeanUtils.copyBeanNotNull2Bean(projarrangeDetailEntity, t); //编辑项目排班详细表数据 this.saveOrUpdate(t); for (Entry entryParam : myMap.entrySet()) { //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue()); List userArrangeDetailEntityList = new ArrayList(); StringBuffer hql = new StringBuffer(" from UserArrangeDetailEntity t where 1=1 "); hql.append(" and t.calendarid =? and t.projarrangeDetailid=? "); userArrangeDetailEntityList = this.userArrangeDetailService.findHql(hql.toString(), entryParam.getKey(),projarrangeDetailEntity.getId()); UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity(); if(userArrangeDetailEntityList.size()!=0){ userArrangeDetailEntity.setId(userArrangeDetailEntityList.get(0).getId()); } userArrangeDetailEntity.setCalendarid(entryParam.getKey()); userArrangeDetailEntity.setShiftid(entryParam.getValue().toString()); userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntity.getId()); saveUserArrangeDetail(userArrangeDetailEntity,backupUserArrangeDetail); } systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); message = "项目排班详细更新成功"; } catch (Exception e) { e.printStackTrace(); message = "项目排班详细更新失败"; j.setSuccess(false); } }else{//数据不存在,需要重新添加数据 projarrangeDetailEntity.setId(""); //项目排班总揽表保存新增/更新的行数据 //1.先判断是否是第一次保存本项目本月度,如果不是则新增项目排班总揽表 //2.项目排班总揽表id获取,然后进行下面的保存; ProjArrangeGeneralEntity projArrangeGeneralEntity=new ProjArrangeGeneralEntity(); if(projarrangeDetailEntity.getProjarrangeGeneralid()==null){ StringBuffer hql = new StringBuffer(" from ProjArrangeGeneralEntity t where 1=1 "); hql.append(" and t.yearmonth =? and t.belongUnitid=? "); List projArrangeGeneralEntityList = projArrangeGeneralService.findHql(hql.toString() , projarrangeDetailEntity.getYearmonth(),projarrangeDetailEntity.getPid()); if(projArrangeGeneralEntityList.size()==0){ projArrangeGeneralEntity.setYearmonth(projarrangeDetailEntity.getYearmonth()); projArrangeGeneralEntity.setBelongUnitid(projarrangeDetailEntity.getPid()); projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus); //排班审核表保存 j=saveProjArrangeGeneral(projArrangeGeneralEntity); //项目排班总览表id projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntity.getId()); }else{ //项目排班总览表id projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntityList.get(0).getId()); } } /*if(arrangeDutyStatus.equals(Globals.ARRANGESTATUS_1)){//上报 TSUser tSUser=ResourceUtil.getSessionUser(); projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus); projArrangeGeneralEntity.setReporterId(tSUser.getId()); }*/ try{ //项目排班详细表保存 projarrangeDetailServiceI.save(projarrangeDetailEntity); List userArrangeDetailEntityList=new ArrayList(); for (Entry entryParam : myMap.entrySet()) { //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue()); UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity(); userArrangeDetailEntity.setCalendarid(entryParam.getKey()); userArrangeDetailEntity.setShiftid(entryParam.getValue().toString()); userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntity.getId()); userArrangeDetailEntityList.add(userArrangeDetailEntity); //员工排班详情表保存 // saveUserArrangeDetail(userArrangeDetailEntity); } if(userArrangeDetailEntityList.size()>0){ //员工排班详情表保存 batchSave(userArrangeDetailEntityList); } systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); message = "项目排班详细添加成功"; }catch(Exception e){ e.printStackTrace(); message = "项目排班详细添加失败"; j.setSuccess(false); } } } else {//数据不存在,需要重新添加数据 //项目排班总揽表保存新增/更新的行数据 //1.先判断是否是第一次保存本项目本月度,如果不是则新增项目排班总揽表 //2.项目排班总揽表id获取,然后进行下面的保存; ProjArrangeGeneralEntity projArrangeGeneralEntity=new ProjArrangeGeneralEntity(); if(projarrangeDetailEntity.getProjarrangeGeneralid()==null||projarrangeDetailEntity.getProjarrangeGeneralid().length()==0){ StringBuffer hql = new StringBuffer(" from ProjArrangeGeneralEntity t where 1=1 "); hql.append(" and t.yearmonth =? and t.belongUnitid=? "); List projArrangeGeneralEntityList = projArrangeGeneralService.findHql(hql.toString() , projarrangeDetailEntity.getYearmonth(),projarrangeDetailEntity.getPid()); if(projArrangeGeneralEntityList.size()==0){ projArrangeGeneralEntity.setYearmonth(projarrangeDetailEntity.getYearmonth()); projArrangeGeneralEntity.setBelongUnitid(projarrangeDetailEntity.getPid()); projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus); //排班审核表保存 j=saveProjArrangeGeneral(projArrangeGeneralEntity); //项目排班详细表保存新增/更新的行数据 projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntity.getId()); }else{ projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntityList.get(0).getId()); } } /*if(arrangeDutyStatus.equals(Globals.ARRANGESTATUS_1)){//上报 TSUser tSUser=ResourceUtil.getSessionUser(); projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus); projArrangeGeneralEntity.setReporterId(tSUser.getId()); }*/ try{ //项目排班详细表保存 projarrangeDetailServiceI.save(projarrangeDetailEntity); List userArrangeDetailEntityList=new ArrayList(); for (Entry entryParam : myMap.entrySet()) { //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue()); UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity(); userArrangeDetailEntity.setCalendarid(entryParam.getKey()); userArrangeDetailEntity.setShiftid(entryParam.getValue().toString()); userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntity.getId()); userArrangeDetailEntityList.add(userArrangeDetailEntity); //员工排班详情表保存 // saveUserArrangeDetail(userArrangeDetailEntity); } if(userArrangeDetailEntityList.size()>0){ //员工排班详情表保存 batchSave(userArrangeDetailEntityList); } systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); message = "项目排班详细添加成功"; }catch(Exception e){ e.printStackTrace(); message = "项目排班详细添加失败"; j.setSuccess(false); } } j.setMsg(message); return j; } @Override public AjaxJson saveUserArrangeDetail(UserArrangeDetailEntity userArrangeDetailEntity) throws Exception { return saveUserArrangeDetail(userArrangeDetailEntity, true); } private AjaxJson saveUserArrangeDetail(UserArrangeDetailEntity userArrangeDetailEntity,boolean backupUserArrangeDetail) throws Exception { String message = null; AjaxJson j = new AjaxJson(); message = ""; if (StringUtil.isNotEmpty(userArrangeDetailEntity.getId())) { UserArrangeDetailEntity t = userArrangeDetailService.get(UserArrangeDetailEntity.class, userArrangeDetailEntity.getId()); try { if(backupUserArrangeDetail) { //保存上次排班,供恢复使用 UserArrangeDetailHistoryEntity ht = new UserArrangeDetailHistoryEntity(); MyBeanUtils.copyBean2Bean(ht, t); saveOrUpdate(ht); } MyBeanUtils.copyBeanNotNull2Bean(userArrangeDetailEntity, t); userArrangeDetailService.saveOrUpdate(t); systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); message = "员工排班详情更新成功"; } catch (Exception e) { e.printStackTrace(); message = "员工排班详情更新失败"; j.setSuccess(false); } } else { try{ //wagestrategy.setDeleteFlag(Globals.Delete_Normal.toString()); //wagestrategy.setStatus(Globals.Enabled_Status.toString()); userArrangeDetailService.save(userArrangeDetailEntity); systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); message = "员工排班详情添加成功"; }catch(Exception e){ e.printStackTrace(); message = "员工排班详情添加失败"; j.setSuccess(false); } } j.setMsg(message); return j; } @Override public AjaxJson saveProjArrangeGeneral(ProjArrangeGeneralEntity projArrangeGeneralEntity) throws Exception { String message = null; AjaxJson j = new AjaxJson(); message = ""; if (StringUtil.isNotEmpty(projArrangeGeneralEntity.getId())) { ProjArrangeGeneralEntity t = projArrangeGeneralService.get(ProjArrangeGeneralEntity.class, projArrangeGeneralEntity.getId()); try { MyBeanUtils.copyBeanNotNull2Bean(projArrangeGeneralEntity, t); projArrangeGeneralService.saveOrUpdate(t); systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO); message = "项目排班总揽更新成功"; } catch (Exception e) { e.printStackTrace(); message = "项目排班总揽更新失败"; j.setSuccess(false); } } else { try{ projArrangeGeneralService.save(projArrangeGeneralEntity); systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO); message = "项目排班总揽添加成功"; }catch(Exception e){ e.printStackTrace(); message = "项目排班总揽添加失败"; j.setSuccess(false); } } j.setMsg(message); return j; } /** * 一、三班两运转和四班两运转(班次只能选两个且班次类型只能分别是日班11h和夜班11.5;人员无限制) * 1.上个月无工作情况; * 1.1直接按照规律排班; * 2.上个月有工作情况; * 2.1先判断上个月整体运转方式是否相同; * 2.1.1上个月整体运转方式相同按照上个月循环排班; * 2.1.2上个月整体运转方式不相同,拿出所有的上个月上夜班的人数; * 2.1.2.1上个月上夜班的人数如果等于0,则所有人员随机排,即不按照上个月的工作排班; * 2.1.2.2上个月上夜班的人数如果小于倍数分之一(1/3或者1/4)且不等于0,则把夜班人数的集合添加至倍数分之一(1/3或者1/4),其他则随机排; * 2.1.2.3上个月上夜班的人数如果等于倍数分之一(1/3或者1/4),则其他则随机排; * 2.1.2.4上个月上夜班的人数如果大于倍数分之一(1/3或者1/4),则无法排班; * * 二、做五休二和其他(班次和人员无限制) * 1.根据选择的出勤时间随机排班; * * 0排班 * 1,2不排班 */ @Override public AjaxJson saveMonthArrangeDutyOperate(String arrangeDutyOperateId,String yearmonth,String pid,String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); Map failMap=new HashMap(); //根据月度查出日期id== CalendarAscDto calendarAscDto=new CalendarAscDto(); calendarAscDto.setYear(Integer.parseInt(yearmonth.split("-")[0])); calendarAscDto.setMonth(Integer.parseInt(yearmonth.split("-")[1])); List calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto); //根据月度查出日期id== //根据月度排班操作页面的添加和编辑操作排班-- // if(arrangeDutyOperateId!=null&&arrangeDutyOperateId.length()>0){ //获取排班操作表数据 // List arrangeDutyOperateDtoList = projarrangeDetailServiceI.getArrangeDutyOperateData(arrangeDutyOperateId); List arrangeDutyOperateIdList=getArrangeDutyIdListByPidMonth(pid,yearmonth); if(arrangeDutyOperateId!=null&&arrangeDutyOperateId.length()>0){ arrangeDutyOperateIdList.addAll(ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateId)); } ArrangeDutyOperateDto arrangeDutyOperateDto=new ArrangeDutyOperateDto(); arrangeDutyOperateDto.setArrangeDutyOperateIdList(arrangeDutyOperateIdList); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyOperateDtoList = arrangeDutyOperateService.getArrangeDutyOperateDtoByListId(arrangeDutyOperateDto, authSql); for (int i = 0; i < arrangeDutyOperateDtoList.size(); i++) { List userIdList = ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateDtoList.get(i).getUserid()); List shiftIdList = ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateDtoList.get(i).getShiftid()); arrangeDutyOperateDtoList.get(i).setUserIdList(userIdList); arrangeDutyOperateDtoList.get(i).setShiftIdList(shiftIdList); if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.f2t_wujiabanfei) ||arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.f2t_jijiabanfei)){ //做五休二(计加班费)//做五休二(无加班费) j=saveMonthArrangeDutyOperateF2T(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus); }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.other_wujiabanfei) ||arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.other_jijiabanfei)){ //其他(计加班费)//其他(无加班费) j=saveMonthArrangeDutyOperateOther(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus); }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.t2o_jijiabanfei)){ //三班两运转-做二休一(计加班费) j=saveMonthArrangeDutyOperateT2O(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus); // if(j.getMsg().equals("false")){ // //获取用户名称 // List baseUserList=systemService.queryDict("t_s_base_user", "id", "realname"); // String realname=""; // for (int k = 0; k < userIdList.size(); k++) { // for (int l = 0; l < baseUserList.size(); l++) { // if(userIdList.get(k).equals(baseUserList.get(l).getTypecode())){ // if(realname.length()!=0){ // realname+=","+baseUserList.get(l).getTypename(); // }else{ // realname=baseUserList.get(l).getTypename(); // } // } // } // } // realname+="因上个月最后一天夜班人数超过人数的三分之一,无法使用三班两运转排班"; // if(failMap.size()==0){ // failMap.put("failData", realname); // }else{ // failMap.put("failData", failMap.get("failData")+";"+realname); // } // } }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.o2o_wujiabanfei)){ //四班两运转A-做一休一(无加班费) j=saveMonthArrangeDutyOperateO2OWU(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus); if(j.getMsg().equals("false")){ //获取用户名称 List baseUserList=systemService.queryDict("t_s_base_user", "id", "realname"); String realname=""; for (int k = 0; k < userIdList.size(); k++) { for (int l = 0; l < baseUserList.size(); l++) { if(userIdList.get(k).equals(baseUserList.get(l).getTypecode())){ if(realname.length()!=0){ realname+=","+baseUserList.get(l).getTypename(); }else{ realname=baseUserList.get(l).getTypename(); } } } } realname+="因上个月最后一天夜班人数超过人数的四分之一,无法使用四班两运转A排班"; if(failMap.size()==0){ failMap.put("failData", realname); }else{ failMap.put("failData", failMap.get("failData")+";"+realname); } } }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.t2t_wujiabanfei)){ //四班两运转B-做二休二(无加班费) j=saveMonthArrangeDutyOperateT2TWU(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus); if(j.getMsg().equals("false")){ //获取用户名称 List baseUserList=systemService.queryDict("t_s_base_user", "id", "realname"); String realname=""; for (int k = 0; k < userIdList.size(); k++) { for (int l = 0; l < baseUserList.size(); l++) { if(userIdList.get(k).equals(baseUserList.get(l).getTypecode())){ if(realname.length()!=0){ realname+=","+baseUserList.get(l).getTypename(); }else{ realname=baseUserList.get(l).getTypename(); } } } } realname+="因上个月最后一天夜班人数超过人数的四分之一,无法使用四班两运转B排班"; if(failMap.size()==0){ failMap.put("failData", realname); }else{ failMap.put("failData", failMap.get("failData")+";"+realname); } } }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.bandao_2) ||arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.bandao_2_jijiabanfei)){ //2班倒 saveMonthArrangeDutyOperate2BANDAO(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus); } } // } if(failMap.size()!=0){ j.setSuccess(false); j.setMsg(failMap.get("failData").toString()); } return j; } @Override public AjaxJson saveMonthArrangeDutyOperateF2T(ArrangeDutyOperateDto arrangeDutyOperateDto,List calendarAscDtoList ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); //把班次id放入班次list中查询班次信息=================== ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList()); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); List shiftTypeNameList=new ArrayList(); for (int i = 0; i < arrangeDutyDtoList.size(); i++) { if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){ shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType()); } } //把班次id放入班次list中查询班次信息==================== //出勤时间 String[] attendanceCycle=ProjectArrangeCommonMethod.getAttendanceCycleNumner(arrangeDutyOperateDto.getAttendanceCycle()).split(","); //员工id ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto(); projArrangeDetailAndUserDto.setUserIdList(arrangeDutyOperateDto.getUserIdList()); projArrangeDetailAndUserDto.setYearmonth(yearmonth); if(pid!=null&&pid.length()!=0){ if(pid.indexOf(",")!=-1){ projArrangeDetailAndUserDto.setPid(pid.split(",")[0]); }else{ projArrangeDetailAndUserDto.setPid(pid); } } authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); //根据员工userid获取人员和人事信息; List projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql); int x;//记录每天,一天一班次 //循环班次人员 for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) { x=0; Map myMap=new HashMap(); //循环班次 for (int n = 0; n < arrangeDutyDtoList.size(); n++) { //循环日期 for (int i = x; i < calendarAscDtoList.size(); i++) { //循环出勤时间 for (int k = 0; k < attendanceCycle.length; k++) { if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)){ if(calendarAscDtoList.get(i).getIfedit().equals(Globals.ifedit_0)){ if(calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId()); break; } }else{ if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId()); break; } } } /* if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)&&calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId()); break; }*/ } //如果这一天没有匹配出勤时间则为休息8e31bf3fb6e6473e9f89dcdb958b145b if(!myMap.containsKey(calendarAscDtoList.get(i).getId())){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyService.getDUTYTYPE_xiuxiId()); --n; } x=i+1; break; } if(x!=calendarAscDtoList.size()){ if(n== arrangeDutyDtoList.size()-1){ n=-1; } }else{ break; } } //System.out.println(myMap); ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity(); projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid()); projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId()); projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId()); projarrangeDetailEntity.setYearmonth(yearmonth); projarrangeDetailEntity.setPid(pid); projarrangeDetailEntity=this.getDayAndTimeFO(projarrangeDetailEntity,myMap); //调用员工排班上报保存总方法 j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus); } return j; } @Override public AjaxJson saveMonthArrangeDutyOperateOther(ArrangeDutyOperateDto arrangeDutyOperateDto,List calendarAscDtoList ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); //选择的班次 //把班次id放入班次list中查询班次信息=================== ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList()); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); List shiftTypeNameList=new ArrayList(); for (int i = 0; i < arrangeDutyDtoList.size(); i++) { if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){ shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType()); } } //把班次id放入班次list中查询班次信息==================== //出勤时间 String[] attendanceCycle=ProjectArrangeCommonMethod.getAttendanceCycleNumner(arrangeDutyOperateDto.getAttendanceCycle()).split(","); //员工id ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto(); projArrangeDetailAndUserDto.setUserIdList(arrangeDutyOperateDto.getUserIdList()); projArrangeDetailAndUserDto.setYearmonth(yearmonth); if(pid!=null&&pid.length()!=0){ projArrangeDetailAndUserDto.setPid(pid.split(",")[0]); } authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); //根据员工userid获取人员和人事信息; List projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql); int x;//记录每天,一天一班次 //循环班次人员 for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) { x=0; Map myMap=new HashMap(); //循环班次 for (int n = 0; n < arrangeDutyDtoList.size(); n++) { //循环日期 for (int i = x; i < calendarAscDtoList.size(); i++) { //循环出勤时间 for (int k = 0; k < attendanceCycle.length; k++) { if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)){ if(calendarAscDtoList.get(i).getIfedit().equals(Globals.ifedit_0)){ if(calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId()); break; } }else{ if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId()); break; } } } /*if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)&&calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId()); break; }*/ } //如果这一天没有匹配出勤时间则为休息8e31bf3fb6e6473e9f89dcdb958b145b if(!myMap.containsKey(calendarAscDtoList.get(i).getId())){ myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyService.getDUTYTYPE_xiuxiId()); --n; } x=i+1; break; } if(x!=calendarAscDtoList.size()){ if(n== arrangeDutyDtoList.size()-1){ n=-1; } }else{ break; } } //System.out.println(myMap); ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity(); projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid()); projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId()); projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId()); projarrangeDetailEntity.setYearmonth(yearmonth); projarrangeDetailEntity.setPid(pid); projarrangeDetailEntity=this.getDayAndTimeFO(projarrangeDetailEntity,myMap); //调用员工排班上报保存总方法 j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus); } return j; } @Override public AjaxJson saveMonthArrangeDutyOperateT2O(ArrangeDutyOperateDto arrangeDutyOperateDto,List calendarAscDtoList ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); /**********算法变更 2018-12-21 by dgq ********* 如果3个人,月度首日排班按照日、夜、休,如果6个人按照日、日、夜、夜、休、休 此排班顺序不考虑上月排班情况,排班后,用户可以在界面手动调整(原系统不可以编辑三班两运转、四班两运转) **********************/ //有顺序的userid数组,按照界面员工排序分解字符串 String[] userids = arrangeDutyOperateDto.getUserid().split(","); if(userids.length%3 > 0) { j.setSuccess(false); j.setMsg("三班两运转设置的员工人数必须是3的整数倍,请重新设置月度排班"); return j; } //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中====================== List projArrangeDetailAndUserDtoListGroupIds1=new ArrayList();//第一天上日班的人 List projArrangeDetailAndUserDtoListGroupIds2=new ArrayList();//第一天夜班的人 List projArrangeDetailAndUserDtoListGroupIds3=new ArrayList();//第一天休息的人 //如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休 //最后一天上夜班,则月初第一天休息 //最后一天日班的,月初第一天夜班 //最后一天休息的,月初第一天上日班 if(userids!=null){ for (int i = 0; i < userids.length; i++) { if(i=userids.length/3&&i arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); List shiftTypeNameList=new ArrayList(); //设置的班次所属的所有班次类型 by dgq for (int i = 0; i < arrangeDutyDtoList.size(); i++) { if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){ shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType()); } } //把班次id放入班次list中查询班次信息==================== //根据员工userid获取人员和项目排班详细表数据;----------------------- ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto(); projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList()); projArrangeDetailAndUserDto.setYearmonth(yearmonth); if(pid!=null&&pid.length()!=0){ projArrangeDetailAndUserDto.setPid(pid.split(",")[0]); } authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql); //根据员工userid获取人员和项目排班详细表数据;----------------------- //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中====================== List projArrangeDetailAndUserDtoListGroup1=new ArrayList();//暂定为上个月最后一天上夜班的人 List projArrangeDetailAndUserDtoListGroup2=new ArrayList();//暂定为上个月最后一天上普通班的人 List projArrangeDetailAndUserDtoListGroup3=new ArrayList();//暂定为上个月最后一天休息的人 for (ProjArrangeDetailAndUserDto dto: projArrangeDetailAndUserDtoList) { if(projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup1.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup2.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds3.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup3.add(dto); } } //此处与原设置员工顺序无对应关系,此顺序可能需要调整为:白班、夜班、休息 by dgq List> listList=new ArrayList>(); listList.add(projArrangeDetailAndUserDtoListGroup1); listList.add(projArrangeDetailAndUserDtoListGroup2); listList.add(projArrangeDetailAndUserDtoListGroup3); //使用二维数组生成排班模型 int[][] arr = new int[3][calendarAscDtoList.size()]; int data; //数值 //循环赋值,获取排班模板 for(int row = 0;row < arr.length;row++){ for(int col = 0;col =arrangeDutyDtoList.size()){ a=0; } } x=0; Map myMap=new HashMap(); colx=0; //循环班次 for (int n = a; n < arrangeDutyDtoList.size(); n++) { //循环日期 for (int i = x; i < calendarAscDtoList.size();) { xx=0; for(int row = rowx;row < arr.length;row++){ for(int col = colx;col calendarAscDtoList ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); /**********算法变更 2018-12-21 by dgq ********* 如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休 此排班顺序不考虑上月排班情况,排班后,用户可以在界面手动调整(原系统不可以编辑三班两运转、四班两运转) **********************/ //有顺序的userid数组,按照界面员工排序分解字符串 String[] userids = arrangeDutyOperateDto.getUserid().split(","); if(userids.length%4 > 0) { j.setSuccess(false); j.setMsg("四班两运转设置的员工人数必须是4的整数倍,请重新设置月度排班"); return j; } //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中====================== List projArrangeDetailAndUserDtoListGroupIds1=new ArrayList();//第一天上日班的人 //暂定为上个月最后一天上夜班班的人 List projArrangeDetailAndUserDtoListGroupIds2=new ArrayList();//第一天休息的人 第二天夜班 //暂定为上个月最后一天休息的人,倒数第二天夜班 或者最后一天休息的人 List projArrangeDetailAndUserDtoListGroupIds3=new ArrayList();//第一天上夜班的人 //暂定为上个月最后一天上普通班的人 List projArrangeDetailAndUserDtoListGroupIds4=new ArrayList();//第一天休息的人 第二天日班 //暂定为上个月最后一天休息的人 //如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休 //最后一天上夜班,则月初第一天休息 //最后一天休息的,且倒数第二天夜班夜班的,月初第一天休息 //最后一天日班的,月初第一天夜班 //最后两天休息的,月初第一天上日班 if(userids!=null){ for (int i = 0; i < userids.length; i++) { if(i=userids.length/4&&i=userids.length/2&&i arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); List shiftTypeNameList=new ArrayList(); for (int i = 0; i < arrangeDutyDtoList.size(); i++) { if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){ shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType()); } } //把班次id放入班次list中查询班次信息==================== //根据员工userid获取人员和项目排班详细表数据;----------------------- ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto(); projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList()); projArrangeDetailAndUserDto.setYearmonth(yearmonth); if(pid!=null&&pid.length()!=0){ projArrangeDetailAndUserDto.setPid(pid.split(",")[0]); } authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql); //根据员工userid获取人员和项目排班详细表数据;----------------------- List projArrangeDetailAndUserDtoListGroup1=new ArrayList();//暂定为上个月最后一天上夜班班的人 List projArrangeDetailAndUserDtoListGroup2=new ArrayList();//暂定为上个月最后一天休息的人,倒数第二天夜班 或者最后一天休息的人 List projArrangeDetailAndUserDtoListGroup3=new ArrayList();//暂定为上个月最后一天上普通班的人 List projArrangeDetailAndUserDtoListGroup4=new ArrayList();//暂定为上个月最后一天休息的人 for (ProjArrangeDetailAndUserDto dto: projArrangeDetailAndUserDtoList) { if(projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup1.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup2.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds3.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup3.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds4.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup4.add(dto); } } List> listList = new ArrayList>(); listList.add(projArrangeDetailAndUserDtoListGroup1);//矩阵row 1 listList.add(projArrangeDetailAndUserDtoListGroup2);//矩阵row 2 listList.add(projArrangeDetailAndUserDtoListGroup3);//矩阵row 3 listList.add(projArrangeDetailAndUserDtoListGroup4);//矩阵row 4 //使用二维数组生成排班模型 int[][] arr = new int[4][calendarAscDtoList.size()]; int data; //数值 //循环赋值 for(int row = 0;row < arr.length;row++){ for(int col = 0;col myMap=new HashMap(); colx=0; //循环班次 for (int n = a; n < arrangeDutyDtoList.size(); n++) { //循环日期 for (int i = x; i < calendarAscDtoList.size();) { xx=0; for(int row = rowx;row < arr.length;row++){ for(int col = colx;col calendarAscDtoList ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); /**********算法变更 2018-12-21 by dgq ********* 如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休 此排班顺序不考虑上月排班情况,排班后,用户可以在界面手动调整(原系统不可以编辑三班两运转、四班两运转) **********************/ //有顺序的userid数组,按照界面员工排序分解字符串 String[] userids = arrangeDutyOperateDto.getUserid().split(","); if(userids.length%4 > 0) { j.setSuccess(false); j.setMsg("四班两运转设置的员工人数必须是4的整数倍,请重新设置月度排班"); return j; } //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中====================== List projArrangeDetailAndUserDtoListGroupIds1=new ArrayList();//第一天上日班的人 //暂定为上个月最后一天上夜班班的人 List projArrangeDetailAndUserDtoListGroupIds2=new ArrayList();//第一天休息的人 //暂定为上个月最后一天休息的人,倒数第二天夜班 或者最后一天休息的人 List projArrangeDetailAndUserDtoListGroupIds3=new ArrayList();//第一天上夜班的人 //暂定为上个月最后一天上普通班的人 List projArrangeDetailAndUserDtoListGroupIds4=new ArrayList();//第一天休息的人 //暂定为上个月最后一天休息的人 //如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休 //最后一天上夜班,则月初第一天休息 //最后一天休息的,且倒数第二天夜班夜班的,月初第一天休息 //最后一天日班的,月初第一天夜班 //最后两天休息的,月初第一天上日班 if(userids!=null){ for (int i = 0; i < userids.length; i++) { if(i=userids.length/4&&i=userids.length/2&&i arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); List shiftTypeNameList=new ArrayList(); for (int i = 0; i < arrangeDutyDtoList.size(); i++) { if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){ shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType()); } } //把班次id放入班次list中查询班次信息==================== //根据员工userid获取人员和项目排班详细表数据;----------------------- ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto(); projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList()); projArrangeDetailAndUserDto.setYearmonth(yearmonth); if(pid!=null&&pid.length()!=0){ projArrangeDetailAndUserDto.setPid(pid.split(",")[0]); } authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql); //根据员工userid获取人员和项目排班详细表数据;----------------------- //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中====================== List projArrangeDetailAndUserDtoListGroup1=new ArrayList();//暂定为上个月最后一天上夜班的人 List projArrangeDetailAndUserDtoListGroup2=new ArrayList();//暂定为上个月最后两天休息的人 List projArrangeDetailAndUserDtoListGroup3=new ArrayList();//暂定为上个月最后一天上普通班的人 List projArrangeDetailAndUserDtoListGroup4=new ArrayList();//暂定为上个月最后一天休息的人 for (ProjArrangeDetailAndUserDto dto: projArrangeDetailAndUserDtoList) { if(projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup1.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup2.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds3.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup3.add(dto); }else if(projArrangeDetailAndUserDtoListGroupIds4.contains(dto.getUserid())){ projArrangeDetailAndUserDtoListGroup4.add(dto); } } //按顺序排班 List> listList=new ArrayList>(); listList.add(projArrangeDetailAndUserDtoListGroup1);//1 listList.add(projArrangeDetailAndUserDtoListGroup2);//2 listList.add(projArrangeDetailAndUserDtoListGroup3);//3 listList.add(projArrangeDetailAndUserDtoListGroup4);//4 //使用二维数组生成排班模型 int[][] arr = new int[4][calendarAscDtoList.size()]; int data; //数值 //循环赋值 for(int row = 0;row < arr.length;row++){ for(int col = 0;col =arrangeDutyDtoList.size()){ a=0; } } x=0; Map myMap=new HashMap(); colx=0; //循环班次 for (int n = a; n < arrangeDutyDtoList.size(); n++) { //循环日期 for (int i = x; i < calendarAscDtoList.size();) { xx=0; for(int row = rowx;row < arr.length;row++){ for(int col = colx;col calendarAscDtoList , String yearmonth, String pid, String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); /********** * 新增2班倒 算法变更 2019-11-11 by dgq ********* 人数为2的倍数,上班顺序:首日,依次为上班、休息、上班、休息.... * 班次只能为一个 **********************/ // 有顺序的userid数组,按照界面员工排序分解字符串 String[] userids = arrangeDutyOperateDto.getUserid().split(","); if (userids.length % 2 > 0) { j.setSuccess(false); j.setMsg("2班倒设置的员工人数必须是2的整数倍,请重新设置月度排班"); return j; } // 把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中====================== List projArrangeDetailAndUserDtoListGroupIds1 = new ArrayList();// 第一天上班的人 List projArrangeDetailAndUserDtoListGroupIds2 = new ArrayList();// 第一天休息的人 if (userids != null) { for (int i = 0; i < userids.length; i++) { if (i % 2 == 0) { projArrangeDetailAndUserDtoListGroupIds1.add(userids[i]); } else { projArrangeDetailAndUserDtoListGroupIds2.add(userids[i]); } } } // 把班次id放入班次list中查询班次信息=================== // ArrangeDutyDto arrangeDutyDto = new ArrangeDutyDto(); // arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList()); // String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); // List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); // 把班次id放入班次list中查询班次信息==================== // 根据员工userid获取人员和项目排班详细表数据;----------------------- ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto = new ProjArrangeDetailAndUserDto(); projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList()); projArrangeDetailAndUserDto.setYearmonth(yearmonth); if (pid != null && pid.length() != 0) { projArrangeDetailAndUserDto.setPid(pid.split(",")[0]); } String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List projArrangeDetailAndUserDtoList = projarrangeDetailServiceI .getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql); // end 员工userid获取人员和项目排班详细表数据;----------------------- List projArrangeDetailAndUserDtoListGroup1 = new ArrayList();// 暂定为上个月最后一天上夜班的人 List projArrangeDetailAndUserDtoListGroup2 = new ArrayList();// 暂定为上个月最后两天休息的人 for (ProjArrangeDetailAndUserDto dto : projArrangeDetailAndUserDtoList) { if (projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())) { projArrangeDetailAndUserDtoListGroup1.add(dto); } else if (projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())) { projArrangeDetailAndUserDtoListGroup2.add(dto); } } String xiuxiID = arrangeDutyService.getDUTYTYPE_xiuxiId(); //首日上班的人员排班 for (int m = 0; m < projArrangeDetailAndUserDtoListGroup1.size(); m++) { // 循环日期 Map myMap = new HashMap(); for (int i = 0; i < calendarAscDtoList.size();i++) { if (i % 2 == 0) { myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyOperateDto.getShiftIdList().get(0)); } else { myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID); } } ProjarrangeDetailEntity projarrangeDetailEntity = new ProjarrangeDetailEntity(); projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoListGroup1.get(m).getUserid()); projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId()); projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoListGroup1.get(m).getId()); projarrangeDetailEntity.setYearmonth(yearmonth); projarrangeDetailEntity.setPid(pid); projarrangeDetailEntity = this.getDayAndTime2ban(projarrangeDetailEntity, myMap); // 调用员工排班上报保存总方法 j = saveProjarrangeDetail(projarrangeDetailEntity, myMap, arrangeDutyStatus); } //首日休息的人员排班 for (int m = 0; m < projArrangeDetailAndUserDtoListGroup2.size(); m++) { // 循环日期 Map myMap = new HashMap(); for (int i = 0; i < calendarAscDtoList.size();i++) { if (i % 2 == 1) { myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyOperateDto.getShiftIdList().get(0)); } else { myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID); } } ProjarrangeDetailEntity projarrangeDetailEntity = new ProjarrangeDetailEntity(); projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoListGroup2.get(m).getUserid()); projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId()); projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoListGroup2.get(m).getId()); projarrangeDetailEntity.setYearmonth(yearmonth); projarrangeDetailEntity.setPid(pid); projarrangeDetailEntity = this.getDayAndTime2ban(projarrangeDetailEntity, myMap); // 调用员工排班上报保存总方法 j = saveProjarrangeDetail(projarrangeDetailEntity, myMap, arrangeDutyStatus); } return j; } @Override public AjaxJson saveOndutyArrangeDutyOperate(String onDutyOperateId, String yearmonth, String pid, String arrangeDutyStatus) throws Exception { AjaxJson j = new AjaxJson(); Map failMap=new HashMap(); List onDutyOperateIdList=getOnArrangeDutyIdListByPidMonth(pid,yearmonth); if(onDutyOperateId!=null&&onDutyOperateId.length()>0){ onDutyOperateIdList.addAll(ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateId)); } //根据月度排班操作页面的添加和编辑操作值班排班-- // if(onDutyOperateId!=null&&onDutyOperateId.length()>0){ //查询值班操作表所有数据,并获得需要值班排班的数据 StringBuffer hql = new StringBuffer(" FROM OnDutyOperateEntity odoe where odoe.yearmonth=? "); List onDutyOperateEntityListOld = findHql(hql.toString(),yearmonth); List onDutyOperateEntityList=new ArrayList(); // List onDutyOperateIdList=ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateId); for (int i = 0; i < onDutyOperateEntityListOld.size(); i++) { for (int k = 0; k < onDutyOperateIdList.size(); k++) { if(onDutyOperateIdList.get(k).equals(onDutyOperateEntityListOld.get(i).getId())){ onDutyOperateEntityList.add(onDutyOperateEntityListOld.get(i)); break; } } } for (int i = 0; i < onDutyOperateEntityList.size(); i++) { j=onDutyOperateServiceI.checkOnDutyOperate(onDutyOperateEntityList.get(i)); if(j.getMsg().length()>0){ failMap.put("failData", j.getMsg()); continue; } //1出勤时间 List attendanceCycleList=ProjectArrangeCommonMethod.extractIdListByComma(ProjectArrangeCommonMethod.getAttendanceCycleNumner(onDutyOperateEntityList.get(i).getAttendanceCycle())); //1出勤时间 //2根据月度查出日期id CalendarAscDto calendarAscDto=new CalendarAscDto(); calendarAscDto.setYear(Integer.parseInt(yearmonth.split("-")[0])); calendarAscDto.setMonth(Integer.parseInt(yearmonth.split("-")[1])); List calendarAscDtoListOld=projarrangeDetailServiceI.getCalendar(calendarAscDto); List calendarAscDtoList=new ArrayList(); //根据所选时间段并去除周一至周五以及国家法定节假日 //并根据出勤时间获取需要排班的日期id for (int r = 0; r < calendarAscDtoListOld.size(); r++) { if(calendarAscDtoListOld.get(r).getDay()>=Integer.parseInt(onDutyOperateEntityList.get(i).getArrangeStime().split("-")[2])&& calendarAscDtoListOld.get(r).getDay()<=Integer.parseInt(onDutyOperateEntityList.get(i).getArrangeEtime().split("-")[2])){ if(!calendarAscDtoListOld.get(r).getDtype().equals(Globals.dtype_2)){ if(attendanceCycleList.contains(calendarAscDtoListOld.get(r).getWeek())){ calendarAscDtoList.add(calendarAscDtoListOld.get(r)); } } } } //2根据月度查出日期id== //3根据用户id获取项目排班详细表数据 //用户id List userIdList = ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateEntityList.get(i).getUserid()); //查询项目排班详细表数据 hql = new StringBuffer(" FROM ProjarrangeDetailEntity odoe where odoe.yearmonth=? and odoe.pid=? "); List projarrangeDetailEntityListOld = findHql(hql.toString(),yearmonth,pid); List projarrangeDetailEntityList=new ArrayList(); //匹配已经排班的用户 for (int e = 0; e < projarrangeDetailEntityListOld.size(); e++) { for (int k = 0; k < userIdList.size(); k++) { if(userIdList.get(k).equals(projarrangeDetailEntityListOld.get(e).getUserid())){ projarrangeDetailEntityList.add(projarrangeDetailEntityListOld.get(e)); break; } } } //3根据用户id获取项目排班详细表数据 //4把班次id放入班次list中获取班次信息 ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto(); arrangeDutyDto.getArrangeDutyIdList().addAll(ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateEntityList.get(i).getShiftid())); String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString(); List arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql); arrangeDutyDto=arrangeDutyDtoList.get(0); //4把班次id放入班次list中获取班次信息 //根据员工人数和每日值班人数判断排班方式 //1.所选人数小于每日值班人数,则提示不能排班 //2.所选人数等于每日值班人数,继续排班,按照出勤时间排班; //3.所选人数大于每日值班人数,继续排班,根据出勤时间进行做一休一排班 /*if(onDutyOperateEntityList.get(i).getEverydayPeopleNum()>userIdList.size()){ }*//*else if(onDutyOperateEntityList.get(i).getEverydayPeopleNum().equals(userIdList.size())){ //所选人数等于每日值班人数 j=ondutyArrangeOperateOther(projarrangeDetailEntityList,calendarAscDtoList,arrangeDutyDtoList,attendanceCycleList); }*//*else*//*{ }*/ //所选人数大于每日值班人数 j=ondutyArrangeOperate(projarrangeDetailEntityList,calendarAscDtoList,arrangeDutyDto,onDutyOperateEntityList.get(i).getEverydayPeopleNum()); } // } if(failMap.size()!=0){ String message=""; for (Map.Entry m:failMap.entrySet()) { if(message.length()==0){ message=m.getValue().toString(); }else{ message+=m.getValue().toString(); } } j.setMsg(message); j.setSuccess(false); } return j; } @Override public AjaxJson ondutyArrangeOperate(List projarrangeDetailEntityList, List calendarAscDtoList,ArrangeDutyDto arrangeDutyDto,int everydayPeopleNum) throws Exception { AjaxJson j = new AjaxJson(); Map failMap=new HashMap(); //1.根据天数循环拼接人数 //拼接人数 List projarrangeDetailEntityListAppend=new ArrayList(); for (int i = 0; i < calendarAscDtoList.size(); i++) { for (int k = 0; k < projarrangeDetailEntityList.size(); k++) { projarrangeDetailEntityListAppend.add(projarrangeDetailEntityList.get(k)); } } //完成人数分组 List> projarrangeDetailEntityListGroup=new ArrayList>(); //分组的部分人数 List projarrangeDetailEntityListPart1=new ArrayList(); // Map> mapList=new HashMap<>(); for (int i = 0; i < (projarrangeDetailEntityListAppend.size()+everydayPeopleNum-1)/everydayPeopleNum; i++) { List projarrangeDetailEntityListPart2=new ArrayList(); for (int l = i*everydayPeopleNum; l < projarrangeDetailEntityListAppend.size(); l++) { if(projarrangeDetailEntityListPart1.size()>everydayPeopleNum-1){ projarrangeDetailEntityListPart2.addAll(projarrangeDetailEntityListPart1); projarrangeDetailEntityListGroup.add(projarrangeDetailEntityListPart2); // mapList.put("i", projarrangeDetailEntityListPart1); projarrangeDetailEntityListPart1.clear(); break; }else{ projarrangeDetailEntityListPart1.add(projarrangeDetailEntityListAppend.get(l)); } } } if(projarrangeDetailEntityListPart1.size()>0){ projarrangeDetailEntityListGroup.add(projarrangeDetailEntityListPart1); } for (int i = 0; i < calendarAscDtoList.size(); i++) { for (int k = i; k < projarrangeDetailEntityListGroup.size(); k++) { Map myMap=new HashMap(); for (int m = 0; m < projarrangeDetailEntityListGroup.get(k).size(); m++) { myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDto.getId()); if(arrangeDutyDto.getDutyType().equals(Globals.DUTYTYPE_zhiban)){ projarrangeDetailEntityListGroup.get(k).get(m).setOndutyDays(projarrangeDetailEntityListGroup.get(k).get(m).getOndutyDays().add(new BigDecimal("1"))); }else if(arrangeDutyDto.getDutyType().equals(Globals.DUTYTYPE_jiaban)){ if(arrangeDutyDto.getTimeOutOvertimeHours()!=null){ projarrangeDetailEntityListGroup.get(k).get(m).setTimeOutOvertimeHours(projarrangeDetailEntityListGroup.get(k).get(m).getTimeOutOvertimeHours().add(arrangeDutyDto.getTimeOutOvertimeHours())); } } //更新项目排班详细表 try { this.saveOrUpdate(projarrangeDetailEntityListGroup.get(k).get(m)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity(); for (Entry entryParam : myMap.entrySet()) { //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue()); StringBuffer hql = new StringBuffer(" FROM UserArrangeDetailEntity uad where uad.calendarid=? and uad.projarrangeDetailid=? "); List userArrangeDetailEntityList = findHql(hql.toString(),entryParam.getKey(),projarrangeDetailEntityListGroup.get(k).get(m).getId()); userArrangeDetailEntity.setId(userArrangeDetailEntityList.get(0).getId()); userArrangeDetailEntity.setCalendarid(entryParam.getKey()); userArrangeDetailEntity.setShiftid(entryParam.getValue().toString()); userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntityListGroup.get(k).get(m).getId()); //更新员工排班详情表 j=saveUserArrangeDetail(userArrangeDetailEntity); } } break; } } return j; } /*@Override public AjaxJson ondutyArrangeDeleteByUserId(String userid,String yearmonth){ return null; }*/ @Override public List getArrangeDutyIdListByPidMonth(String pid, String yearmonth) { StringBuffer hql = new StringBuffer(" FROM ArrangeDutyOperateEntity where pid=? and yearmonth=? "); List arrangeDutyOperateEntityList = this.findHql(hql.toString(),pid,yearmonth); hql = new StringBuffer(" FROM ProjarrangeDetailEntity where pid=? and yearmonth=? "); List projarrangeDetailEntityList = this.findHql(hql.toString(),pid,yearmonth); List userIdArrangeDutyList=new ArrayList(); for (int i = 0; i < projarrangeDetailEntityList.size(); i++) { userIdArrangeDutyList.add(projarrangeDetailEntityList.get(i).getUserid()); } List arrangeDutyOperateIdList=new ArrayList(); for (int i = 0; i < arrangeDutyOperateEntityList.size(); i++) { List userIdList=ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateEntityList.get(i).getUserid()); userIdList.removeAll(userIdArrangeDutyList); if(userIdList.size()>0){ arrangeDutyOperateIdList.add(arrangeDutyOperateEntityList.get(i).getId()); } } return arrangeDutyOperateIdList; } @Override public List getOnArrangeDutyIdListByPidMonth(String pid, String yearmonth) { StringBuffer hql = new StringBuffer(" FROM OnDutyOperateEntity where pid=? and yearmonth=? "); List onDutyOperateEntityList = this.findHql(hql.toString(),pid,yearmonth); List onDutyOperateIdList=new ArrayList(); for (int i = 0; i < onDutyOperateEntityList.size(); i++) { if(onDutyOperateServiceI.checkOnDutyOperate(onDutyOperateEntityList.get(i)).isSuccess()==true){ onDutyOperateIdList.add(onDutyOperateEntityList.get(i).getId()); } } return onDutyOperateIdList; } }