ArrangeDutyAndOndutyServiceImpl.java 92 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119
  1. package cn.com.lzt.projarrangedetail.service.impl;
  2. import java.io.Serializable;
  3. import java.math.BigDecimal;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Map.Entry;
  10. import javax.validation.Validator;
  11. import org.jeecgframework.core.common.model.json.AjaxJson;
  12. import org.jeecgframework.core.common.service.impl.CommonServiceImpl;
  13. import org.jeecgframework.core.constant.Globals;
  14. import org.jeecgframework.core.util.JeecgDataAutorUtils;
  15. import org.jeecgframework.core.util.MyBeanUtils;
  16. import org.jeecgframework.core.util.StringUtil;
  17. import org.jeecgframework.web.system.pojo.base.DictEntity;
  18. import org.jeecgframework.web.system.service.SystemService;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import cn.com.lzt.arrangeduty.dto.ArrangeDutyDto;
  23. import cn.com.lzt.arrangeduty.service.ArrangeDutyServiceI;
  24. import cn.com.lzt.arrangedutyoperate.dto.ArrangeDutyOperateDto;
  25. import cn.com.lzt.arrangedutyoperate.entity.ArrangeDutyOperateEntity;
  26. import cn.com.lzt.arrangedutyoperate.service.ArrangeDutyOperateServiceI;
  27. import cn.com.lzt.calendar.dto.CalendarAscDto;
  28. import cn.com.lzt.calendar.service.CalendarServiceI;
  29. import cn.com.lzt.ondutyoperate.entity.OnDutyOperateEntity;
  30. import cn.com.lzt.ondutyoperate.service.OnDutyOperateServiceI;
  31. import cn.com.lzt.projarrangedetail.dao.ProjArrangeDetailAndUserMiniDao;
  32. import cn.com.lzt.projarrangedetail.dao.UserAndShiftMiniDao;
  33. import cn.com.lzt.projarrangedetail.dao.UserArrangeCalendarMiniDao;
  34. import cn.com.lzt.projarrangedetail.dto.ProjArrangeDetailAndUserDto;
  35. import cn.com.lzt.projarrangedetail.entity.ProjarrangeDetailEntity;
  36. import cn.com.lzt.projarrangedetail.projectarrangecommonmethod.ProjectArrangeCommonMethod;
  37. import cn.com.lzt.projarrangedetail.service.ArrangeDutyAndOndutyServiceI;
  38. import cn.com.lzt.projarrangedetail.service.ProjarrangeDetailServiceI;
  39. import cn.com.lzt.projarrangegeneral.entity.ProjArrangeGeneralEntity;
  40. import cn.com.lzt.projarrangegeneral.service.ProjArrangeGeneralServiceI;
  41. import cn.com.lzt.userarrangedetail.dto.UserArrangeDetailDto;
  42. import cn.com.lzt.userarrangedetail.entity.UserArrangeDetailEntity;
  43. import cn.com.lzt.userarrangedetail.entity.UserArrangeDetailHistoryEntity;
  44. import cn.com.lzt.userarrangedetail.service.UserArrangeDetailServiceI;
  45. @Service("arrangeDutyAndOndutyServiceI")
  46. @Transactional
  47. public class ArrangeDutyAndOndutyServiceImpl extends CommonServiceImpl implements ArrangeDutyAndOndutyServiceI {
  48. @Autowired
  49. ProjArrangeDetailAndUserMiniDao projArrangeDetailAndUserMiniDao;
  50. @Autowired
  51. UserArrangeCalendarMiniDao userArrangeCalendarMiniDao;
  52. // 验证轮流值班是否可行
  53. @Autowired
  54. UserAndShiftMiniDao userAndShiftMiniDao;
  55. //日历表
  56. @Autowired
  57. private CalendarServiceI calendarService;
  58. //员工排班详情表
  59. @Autowired
  60. private UserArrangeDetailServiceI userArrangeDetailService;
  61. //班次表
  62. @Autowired
  63. private ArrangeDutyServiceI arrangeDutyService;
  64. //项目排班总览表
  65. @Autowired
  66. private ProjArrangeGeneralServiceI projArrangeGeneralService;
  67. //项目排班详细表
  68. @Autowired
  69. private ProjarrangeDetailServiceI projarrangeDetailServiceI;
  70. //排班操作表
  71. @Autowired
  72. private ArrangeDutyOperateServiceI arrangeDutyOperateService;
  73. //排班操作表
  74. @Autowired
  75. private OnDutyOperateServiceI onDutyOperateServiceI;
  76. @Autowired
  77. private SystemService systemService;
  78. @Autowired
  79. private Validator validator;
  80. //项目排班自己总结公共方法;
  81. //ProjectArrangeCommonMethod commonMethod;
  82. @Override
  83. public void delete(ProjarrangeDetailEntity entity) throws Exception {
  84. // TODO Auto-generated method stub
  85. }
  86. @Override
  87. public Serializable save(ProjarrangeDetailEntity entity) throws Exception {
  88. // TODO Auto-generated method stub
  89. return null;
  90. }
  91. @Override
  92. public void saveOrUpdate(ProjarrangeDetailEntity entity) throws Exception {
  93. // TODO Auto-generated method stub
  94. }
  95. @Override
  96. public ProjarrangeDetailEntity getDayAndTimeFO(ProjarrangeDetailEntity projarrangeDetailEntity, Map<String, Object> myMap) throws Exception {
  97. //根据月度查询日历id
  98. CalendarAscDto calendarAscDto=new CalendarAscDto();
  99. calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0]));
  100. calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1]));
  101. List<CalendarAscDto> calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto);
  102. //所有班次信息
  103. List<String> shiftList=new ArrayList<String>();
  104. for(Map.Entry<String, Object> m :myMap.entrySet()){
  105. shiftList.add(m.getValue().toString());
  106. }
  107. //根据班次id查询班次信息
  108. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  109. arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList);
  110. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  111. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  112. //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班
  113. BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日
  114. BigDecimal workingDays=BigDecimal.ZERO;//正常工作日
  115. BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长
  116. BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长
  117. BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数
  118. //计算正常工作日时长
  119. for (int i = 0; i < calendarAscDtoList.size(); i++) {
  120. if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日
  121. statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1"));
  122. }
  123. }
  124. for (Map.Entry<String, Object> m :myMap.entrySet()) {
  125. // System.out.println(m.getKey()+"\t"+m.getValue());
  126. for (int n = 0; n < calendarAscDtoList.size(); n++) {
  127. if(m.getKey().equals(calendarAscDtoList.get(n).getId())){
  128. for (int b = 0; b < arrangeDutyDtoList.size(); b++) {
  129. if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){
  130. if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日
  131. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  132. countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  133. }
  134. }else{
  135. if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_zhiban)){
  136. ondutyDays=ondutyDays.add(new BigDecimal("1"));
  137. }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H)
  138. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h)
  139. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  140. workingDays=workingDays.add(new BigDecimal("1"));
  141. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  142. timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  143. }
  144. }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_jiaban)){
  145. if(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours()!=null){
  146. timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours());
  147. }
  148. }
  149. }
  150. break;
  151. }
  152. }
  153. break;
  154. }
  155. }
  156. }
  157. timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8")));
  158. projarrangeDetailEntity.setWorkingDays(workingDays);
  159. projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours);
  160. projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours);
  161. projarrangeDetailEntity.setOndutyDays(ondutyDays);
  162. return projarrangeDetailEntity;
  163. }
  164. @Override
  165. public ProjarrangeDetailEntity getDayAndTimeFO4ProjAllUsers(ProjarrangeDetailEntity projarrangeDetailEntity, Map<String, Object> myMap) throws Exception {
  166. //根据月度查询日历id
  167. CalendarAscDto calendarAscDto = new CalendarAscDto();
  168. calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0]));
  169. calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1]));
  170. List<CalendarAscDto> calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto);
  171. //所有班次信息
  172. List<String> shiftList = new ArrayList<String>();
  173. for(Map.Entry<String, Object> m : myMap.entrySet()){
  174. shiftList.add(m.getValue().toString());
  175. }
  176. //根据班次id查询班次信息
  177. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  178. arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList);
  179. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  180. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  181. //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班
  182. BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日
  183. BigDecimal workingDays=BigDecimal.ZERO;//正常工作日
  184. BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长
  185. BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长
  186. BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数
  187. //计算正常工作日时长
  188. for (int i = 0; i < calendarAscDtoList.size(); i++) {
  189. if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日
  190. statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1"));
  191. }
  192. }
  193. for (Map.Entry<String, Object> m :myMap.entrySet()) {
  194. // System.out.println(m.getKey()+"\t"+m.getValue());
  195. for (int n = 0; n < calendarAscDtoList.size(); n++) {
  196. if(m.getKey().equals(calendarAscDtoList.get(n).getId())){
  197. for (int b = 0; b < arrangeDutyDtoList.size(); b++) {
  198. if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){
  199. if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日
  200. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  201. countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  202. }
  203. }else{
  204. if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_zhiban)){
  205. ondutyDays=ondutyDays.add(new BigDecimal("1"));
  206. }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H)
  207. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h)
  208. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  209. workingDays=workingDays.add(new BigDecimal("1"));
  210. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  211. timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  212. }
  213. }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_jiaban)){
  214. if(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours()!=null){
  215. timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getTimeOutOvertimeHours());
  216. }
  217. }
  218. }
  219. break;
  220. }
  221. }
  222. break;
  223. }
  224. }
  225. }
  226. timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8")));
  227. projarrangeDetailEntity.setWorkingDays(workingDays);
  228. projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours);
  229. projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours);
  230. projarrangeDetailEntity.setOndutyDays(ondutyDays);
  231. return projarrangeDetailEntity;
  232. }
  233. @Override
  234. public ProjarrangeDetailEntity getDayAndTimeTT(
  235. ProjarrangeDetailEntity projarrangeDetailEntity,
  236. Map<String, Object> myMap) throws Exception {
  237. //根据月度查询日历id
  238. CalendarAscDto calendarAscDto=new CalendarAscDto();
  239. calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0]));
  240. calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1]));
  241. List<CalendarAscDto> calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto);
  242. //所有班次信息
  243. List<String> shiftList=new ArrayList<String>();
  244. for(Map.Entry<String, Object> m :myMap.entrySet()){
  245. shiftList.add(m.getValue().toString());
  246. }
  247. //根据班次id查询班次信息
  248. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  249. arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList);
  250. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  251. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  252. //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班
  253. BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日
  254. BigDecimal workingDays=BigDecimal.ZERO;//正常工作日
  255. BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长
  256. BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长
  257. BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数
  258. //计算正常工作日时长
  259. for (int i = 0; i < calendarAscDtoList.size(); i++) {
  260. if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日
  261. statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1"));
  262. }
  263. }
  264. for (Map.Entry<String, Object> m :myMap.entrySet()) {
  265. // System.out.println(m.getKey()+"\t"+m.getValue());
  266. for (int n = 0; n < calendarAscDtoList.size(); n++) {
  267. if(m.getKey().equals(calendarAscDtoList.get(n).getId())){
  268. for (int b = 0; b < arrangeDutyDtoList.size(); b++) {
  269. if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){
  270. if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日
  271. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  272. countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  273. workingDays=workingDays.add(new BigDecimal("1"));
  274. }
  275. }else{
  276. if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H)
  277. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h)
  278. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  279. workingDays=workingDays.add(new BigDecimal("1"));
  280. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  281. timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  282. }
  283. }
  284. }
  285. break;
  286. }
  287. }
  288. break;
  289. }
  290. }
  291. }
  292. timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8")));
  293. projarrangeDetailEntity.setWorkingDays(workingDays);
  294. projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours);
  295. projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours);
  296. projarrangeDetailEntity.setOndutyDays(ondutyDays);
  297. return projarrangeDetailEntity;
  298. }
  299. /**
  300. * 两班倒计算时间
  301. * */
  302. @Override
  303. public ProjarrangeDetailEntity getDayAndTime2ban(
  304. ProjarrangeDetailEntity projarrangeDetailEntity,
  305. Map<String, Object> myMap) throws Exception {
  306. //根据月度查询日历id
  307. CalendarAscDto calendarAscDto=new CalendarAscDto();
  308. calendarAscDto.setYear(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[0]));
  309. calendarAscDto.setMonth(Integer.parseInt(projarrangeDetailEntity.getYearmonth().split("-")[1]));
  310. List<CalendarAscDto> calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto);
  311. //所有班次信息
  312. List<String> shiftList=new ArrayList<String>();
  313. for(Map.Entry<String, Object> m :myMap.entrySet()){
  314. shiftList.add(m.getValue().toString());
  315. }
  316. //根据班次id查询班次信息
  317. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  318. arrangeDutyDto.getArrangeDutyIdList().addAll(shiftList);
  319. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  320. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  321. //根据所有班次类型判断是休息还是上班,日班,夜班,加班,值班
  322. BigDecimal statutoryWorkingDays=BigDecimal.ZERO;//法定工作日
  323. BigDecimal workingDays=BigDecimal.ZERO;//正常工作日
  324. BigDecimal timeOutOvertimeHours=BigDecimal.ZERO;//超时加班时长
  325. BigDecimal countryOvertimeHours=BigDecimal.ZERO;//国定加班时长
  326. BigDecimal ondutyDays=BigDecimal.ZERO;//值班天数
  327. //计算正常工作日时长
  328. for (int i = 0; i < calendarAscDtoList.size(); i++) {
  329. if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){//工作日
  330. statutoryWorkingDays=statutoryWorkingDays.add(new BigDecimal("1"));
  331. }
  332. }
  333. for (Map.Entry<String, Object> m :myMap.entrySet()) {
  334. // System.out.println(m.getKey()+"\t"+m.getValue());
  335. for (int n = 0; n < calendarAscDtoList.size(); n++) {
  336. if(m.getKey().equals(calendarAscDtoList.get(n).getId())){
  337. for (int b = 0; b < arrangeDutyDtoList.size(); b++) {
  338. if(m.getValue().equals(arrangeDutyDtoList.get(b).getId().toString())){
  339. if(calendarAscDtoList.get(n).getDtype().equals(Globals.dtype_2)){//节假日
  340. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  341. countryOvertimeHours=countryOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  342. workingDays=workingDays.add(new BigDecimal("1"));
  343. }
  344. }else{
  345. if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_zhiban)){
  346. ondutyDays = ondutyDays.add(new BigDecimal("1"));
  347. }else if(arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_CHANGBAN8H)
  348. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_riban11h)
  349. ||arrangeDutyDtoList.get(b).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  350. workingDays=workingDays.add(new BigDecimal("1"));
  351. if(arrangeDutyDtoList.get(b).getDatumWorkhours()!=null){
  352. timeOutOvertimeHours=timeOutOvertimeHours.add(arrangeDutyDtoList.get(b).getDatumWorkhours());
  353. }
  354. }
  355. }
  356. break;
  357. }
  358. }
  359. break;
  360. }
  361. }
  362. }
  363. timeOutOvertimeHours=timeOutOvertimeHours.subtract(statutoryWorkingDays.multiply(new BigDecimal("8")));
  364. projarrangeDetailEntity.setWorkingDays(workingDays);
  365. projarrangeDetailEntity.setTimeOutOvertimeHours(timeOutOvertimeHours);
  366. projarrangeDetailEntity.setCountryOvertimeHours(countryOvertimeHours);
  367. projarrangeDetailEntity.setOndutyDays(ondutyDays);
  368. return projarrangeDetailEntity;
  369. }
  370. @Override
  371. public AjaxJson saveProjarrangeDetail(ProjarrangeDetailEntity projarrangeDetailEntity,
  372. Map<String, Object> myMap,String arrangeDutyStatus) throws Exception {
  373. return saveProjarrangeDetail(projarrangeDetailEntity, myMap, arrangeDutyStatus,true);
  374. }
  375. @Override
  376. public AjaxJson saveProjarrangeDetail(ProjarrangeDetailEntity projarrangeDetailEntity,
  377. Map<String, Object> myMap,String arrangeDutyStatus,boolean backupUserArrangeDetail) throws Exception {
  378. String message = null;
  379. AjaxJson j = new AjaxJson();
  380. message = "";
  381. if (StringUtil.isNotEmpty(projarrangeDetailEntity.getId())) {
  382. ProjarrangeDetailEntity t = this.get(ProjarrangeDetailEntity.class, projarrangeDetailEntity.getId());
  383. if(t!=null){//数据存在,需要编辑
  384. try {
  385. MyBeanUtils.copyBeanNotNull2Bean(projarrangeDetailEntity, t);
  386. //编辑项目排班详细表数据
  387. this.saveOrUpdate(t);
  388. for (Entry<String,Object> entryParam : myMap.entrySet()) {
  389. //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue());
  390. List<UserArrangeDetailEntity> userArrangeDetailEntityList = new ArrayList<UserArrangeDetailEntity>();
  391. StringBuffer hql = new StringBuffer(" from UserArrangeDetailEntity t where 1=1 ");
  392. hql.append(" and t.calendarid =? and t.projarrangeDetailid=? ");
  393. userArrangeDetailEntityList = this.userArrangeDetailService.findHql(hql.toString(),
  394. entryParam.getKey(),projarrangeDetailEntity.getId());
  395. UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity();
  396. if(userArrangeDetailEntityList.size()!=0){
  397. userArrangeDetailEntity.setId(userArrangeDetailEntityList.get(0).getId());
  398. }
  399. userArrangeDetailEntity.setCalendarid(entryParam.getKey());
  400. userArrangeDetailEntity.setShiftid(entryParam.getValue().toString());
  401. userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntity.getId());
  402. saveUserArrangeDetail(userArrangeDetailEntity,backupUserArrangeDetail);
  403. }
  404. systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO);
  405. message = "项目排班详细更新成功";
  406. } catch (Exception e) {
  407. e.printStackTrace();
  408. message = "项目排班详细更新失败";
  409. j.setSuccess(false);
  410. }
  411. }else{//数据不存在,需要重新添加数据
  412. projarrangeDetailEntity.setId("");
  413. //项目排班总揽表保存新增/更新的行数据
  414. //1.先判断是否是第一次保存本项目本月度,如果不是则新增项目排班总揽表
  415. //2.项目排班总揽表id获取,然后进行下面的保存;
  416. ProjArrangeGeneralEntity projArrangeGeneralEntity=new ProjArrangeGeneralEntity();
  417. if(projarrangeDetailEntity.getProjarrangeGeneralid()==null){
  418. StringBuffer hql = new StringBuffer(" from ProjArrangeGeneralEntity t where 1=1 ");
  419. hql.append(" and t.yearmonth =? and t.belongUnitid=? ");
  420. List<ProjArrangeGeneralEntity> projArrangeGeneralEntityList = projArrangeGeneralService.findHql(hql.toString()
  421. , projarrangeDetailEntity.getYearmonth(),projarrangeDetailEntity.getPid());
  422. if(projArrangeGeneralEntityList.size()==0){
  423. projArrangeGeneralEntity.setYearmonth(projarrangeDetailEntity.getYearmonth());
  424. projArrangeGeneralEntity.setBelongUnitid(projarrangeDetailEntity.getPid());
  425. projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus);
  426. //排班审核表保存
  427. j=saveProjArrangeGeneral(projArrangeGeneralEntity);
  428. //项目排班总览表id
  429. projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntity.getId());
  430. }else{
  431. //项目排班总览表id
  432. projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntityList.get(0).getId());
  433. }
  434. }
  435. /*if(arrangeDutyStatus.equals(Globals.ARRANGESTATUS_1)){//上报
  436. TSUser tSUser=ResourceUtil.getSessionUser();
  437. projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus);
  438. projArrangeGeneralEntity.setReporterId(tSUser.getId());
  439. }*/
  440. try{
  441. //项目排班详细表保存
  442. projarrangeDetailServiceI.save(projarrangeDetailEntity);
  443. List<UserArrangeDetailEntity> userArrangeDetailEntityList=new ArrayList<UserArrangeDetailEntity>();
  444. for (Entry<String,Object> entryParam : myMap.entrySet()) {
  445. //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue());
  446. UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity();
  447. userArrangeDetailEntity.setCalendarid(entryParam.getKey());
  448. userArrangeDetailEntity.setShiftid(entryParam.getValue().toString());
  449. userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntity.getId());
  450. userArrangeDetailEntityList.add(userArrangeDetailEntity);
  451. //员工排班详情表保存
  452. // saveUserArrangeDetail(userArrangeDetailEntity);
  453. }
  454. if(userArrangeDetailEntityList.size()>0){
  455. //员工排班详情表保存
  456. batchSave(userArrangeDetailEntityList);
  457. }
  458. systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  459. message = "项目排班详细添加成功";
  460. }catch(Exception e){
  461. e.printStackTrace();
  462. message = "项目排班详细添加失败";
  463. j.setSuccess(false);
  464. }
  465. }
  466. } else {//数据不存在,需要重新添加数据
  467. //项目排班总揽表保存新增/更新的行数据
  468. //1.先判断是否是第一次保存本项目本月度,如果不是则新增项目排班总揽表
  469. //2.项目排班总揽表id获取,然后进行下面的保存;
  470. ProjArrangeGeneralEntity projArrangeGeneralEntity=new ProjArrangeGeneralEntity();
  471. if(projarrangeDetailEntity.getProjarrangeGeneralid()==null||projarrangeDetailEntity.getProjarrangeGeneralid().length()==0){
  472. StringBuffer hql = new StringBuffer(" from ProjArrangeGeneralEntity t where 1=1 ");
  473. hql.append(" and t.yearmonth =? and t.belongUnitid=? ");
  474. List<ProjArrangeGeneralEntity> projArrangeGeneralEntityList = projArrangeGeneralService.findHql(hql.toString()
  475. , projarrangeDetailEntity.getYearmonth(),projarrangeDetailEntity.getPid());
  476. if(projArrangeGeneralEntityList.size()==0){
  477. projArrangeGeneralEntity.setYearmonth(projarrangeDetailEntity.getYearmonth());
  478. projArrangeGeneralEntity.setBelongUnitid(projarrangeDetailEntity.getPid());
  479. projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus);
  480. //排班审核表保存
  481. j=saveProjArrangeGeneral(projArrangeGeneralEntity);
  482. //项目排班详细表保存新增/更新的行数据
  483. projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntity.getId());
  484. }else{
  485. projarrangeDetailEntity.setProjarrangeGeneralid(projArrangeGeneralEntityList.get(0).getId());
  486. }
  487. }
  488. /*if(arrangeDutyStatus.equals(Globals.ARRANGESTATUS_1)){//上报
  489. TSUser tSUser=ResourceUtil.getSessionUser();
  490. projArrangeGeneralEntity.setArrangeDutyStatus(arrangeDutyStatus);
  491. projArrangeGeneralEntity.setReporterId(tSUser.getId());
  492. }*/
  493. try{
  494. //项目排班详细表保存
  495. projarrangeDetailServiceI.save(projarrangeDetailEntity);
  496. List<UserArrangeDetailEntity> userArrangeDetailEntityList=new ArrayList<UserArrangeDetailEntity>();
  497. for (Entry<String,Object> entryParam : myMap.entrySet()) {
  498. //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue());
  499. UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity();
  500. userArrangeDetailEntity.setCalendarid(entryParam.getKey());
  501. userArrangeDetailEntity.setShiftid(entryParam.getValue().toString());
  502. userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntity.getId());
  503. userArrangeDetailEntityList.add(userArrangeDetailEntity);
  504. //员工排班详情表保存
  505. // saveUserArrangeDetail(userArrangeDetailEntity);
  506. }
  507. if(userArrangeDetailEntityList.size()>0){
  508. //员工排班详情表保存
  509. batchSave(userArrangeDetailEntityList);
  510. }
  511. systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  512. message = "项目排班详细添加成功";
  513. }catch(Exception e){
  514. e.printStackTrace();
  515. message = "项目排班详细添加失败";
  516. j.setSuccess(false);
  517. }
  518. }
  519. j.setMsg(message);
  520. return j;
  521. }
  522. @Override
  523. public AjaxJson saveUserArrangeDetail(UserArrangeDetailEntity userArrangeDetailEntity) throws Exception {
  524. return saveUserArrangeDetail(userArrangeDetailEntity, true);
  525. }
  526. private AjaxJson saveUserArrangeDetail(UserArrangeDetailEntity userArrangeDetailEntity,boolean backupUserArrangeDetail) throws Exception {
  527. String message = null;
  528. AjaxJson j = new AjaxJson();
  529. message = "";
  530. if (StringUtil.isNotEmpty(userArrangeDetailEntity.getId())) {
  531. UserArrangeDetailEntity t = userArrangeDetailService.get(UserArrangeDetailEntity.class, userArrangeDetailEntity.getId());
  532. try {
  533. if(backupUserArrangeDetail) {
  534. //保存上次排班,供恢复使用
  535. UserArrangeDetailHistoryEntity ht = new UserArrangeDetailHistoryEntity();
  536. MyBeanUtils.copyBean2Bean(ht, t);
  537. saveOrUpdate(ht);
  538. }
  539. MyBeanUtils.copyBeanNotNull2Bean(userArrangeDetailEntity, t);
  540. userArrangeDetailService.saveOrUpdate(t);
  541. systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO);
  542. message = "员工排班详情更新成功";
  543. } catch (Exception e) {
  544. e.printStackTrace();
  545. message = "员工排班详情更新失败";
  546. j.setSuccess(false);
  547. }
  548. } else {
  549. try{
  550. //wagestrategy.setDeleteFlag(Globals.Delete_Normal.toString());
  551. //wagestrategy.setStatus(Globals.Enabled_Status.toString());
  552. userArrangeDetailService.save(userArrangeDetailEntity);
  553. systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  554. message = "员工排班详情添加成功";
  555. }catch(Exception e){
  556. e.printStackTrace();
  557. message = "员工排班详情添加失败";
  558. j.setSuccess(false);
  559. }
  560. }
  561. j.setMsg(message);
  562. return j;
  563. }
  564. @Override
  565. public AjaxJson saveProjArrangeGeneral(ProjArrangeGeneralEntity projArrangeGeneralEntity) throws Exception {
  566. String message = null;
  567. AjaxJson j = new AjaxJson();
  568. message = "";
  569. if (StringUtil.isNotEmpty(projArrangeGeneralEntity.getId())) {
  570. ProjArrangeGeneralEntity t = projArrangeGeneralService.get(ProjArrangeGeneralEntity.class, projArrangeGeneralEntity.getId());
  571. try {
  572. MyBeanUtils.copyBeanNotNull2Bean(projArrangeGeneralEntity, t);
  573. projArrangeGeneralService.saveOrUpdate(t);
  574. systemService.addLog(message, Globals.Log_Type_UPDATE, Globals.Log_Leavel_INFO);
  575. message = "项目排班总揽更新成功";
  576. } catch (Exception e) {
  577. e.printStackTrace();
  578. message = "项目排班总揽更新失败";
  579. j.setSuccess(false);
  580. }
  581. } else {
  582. try{
  583. projArrangeGeneralService.save(projArrangeGeneralEntity);
  584. systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  585. message = "项目排班总揽添加成功";
  586. }catch(Exception e){
  587. e.printStackTrace();
  588. message = "项目排班总揽添加失败";
  589. j.setSuccess(false);
  590. }
  591. }
  592. j.setMsg(message);
  593. return j;
  594. }
  595. /**
  596. * 一、三班两运转和四班两运转(班次只能选两个且班次类型只能分别是日班11h和夜班11.5;人员无限制)
  597. * 1.上个月无工作情况;
  598. * 1.1直接按照规律排班;
  599. * 2.上个月有工作情况;
  600. * 2.1先判断上个月整体运转方式是否相同;
  601. * 2.1.1上个月整体运转方式相同按照上个月循环排班;
  602. * 2.1.2上个月整体运转方式不相同,拿出所有的上个月上夜班的人数;
  603. * 2.1.2.1上个月上夜班的人数如果等于0,则所有人员随机排,即不按照上个月的工作排班;
  604. * 2.1.2.2上个月上夜班的人数如果小于倍数分之一(1/3或者1/4)且不等于0,则把夜班人数的集合添加至倍数分之一(1/3或者1/4),其他则随机排;
  605. * 2.1.2.3上个月上夜班的人数如果等于倍数分之一(1/3或者1/4),则其他则随机排;
  606. * 2.1.2.4上个月上夜班的人数如果大于倍数分之一(1/3或者1/4),则无法排班;
  607. *
  608. * 二、做五休二和其他(班次和人员无限制)
  609. * 1.根据选择的出勤时间随机排班;
  610. *
  611. * 0排班
  612. * 1,2不排班
  613. */
  614. @Override
  615. public AjaxJson saveMonthArrangeDutyOperate(String arrangeDutyOperateId,String yearmonth,String pid,String arrangeDutyStatus) throws Exception {
  616. AjaxJson j = new AjaxJson();
  617. Map<String, Object> failMap=new HashMap<String, Object>();
  618. //根据月度查出日期id==
  619. CalendarAscDto calendarAscDto=new CalendarAscDto();
  620. calendarAscDto.setYear(Integer.parseInt(yearmonth.split("-")[0]));
  621. calendarAscDto.setMonth(Integer.parseInt(yearmonth.split("-")[1]));
  622. List<CalendarAscDto> calendarAscDtoList=projarrangeDetailServiceI.getCalendar(calendarAscDto);
  623. //根据月度查出日期id==
  624. //根据月度排班操作页面的添加和编辑操作排班--
  625. // if(arrangeDutyOperateId!=null&&arrangeDutyOperateId.length()>0){
  626. //获取排班操作表数据
  627. // List<ArrangeDutyOperateDto> arrangeDutyOperateDtoList = projarrangeDetailServiceI.getArrangeDutyOperateData(arrangeDutyOperateId);
  628. List<String> arrangeDutyOperateIdList=getArrangeDutyIdListByPidMonth(pid,yearmonth);
  629. if(arrangeDutyOperateId!=null&&arrangeDutyOperateId.length()>0){
  630. arrangeDutyOperateIdList.addAll(ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateId));
  631. }
  632. ArrangeDutyOperateDto arrangeDutyOperateDto=new ArrangeDutyOperateDto();
  633. arrangeDutyOperateDto.setArrangeDutyOperateIdList(arrangeDutyOperateIdList);
  634. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  635. List<ArrangeDutyOperateDto> arrangeDutyOperateDtoList = arrangeDutyOperateService.getArrangeDutyOperateDtoByListId(arrangeDutyOperateDto, authSql);
  636. for (int i = 0; i < arrangeDutyOperateDtoList.size(); i++) {
  637. List<String> userIdList = ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateDtoList.get(i).getUserid());
  638. List<String> shiftIdList = ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateDtoList.get(i).getShiftid());
  639. arrangeDutyOperateDtoList.get(i).setUserIdList(userIdList);
  640. arrangeDutyOperateDtoList.get(i).setShiftIdList(shiftIdList);
  641. if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.f2t_wujiabanfei)
  642. ||arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.f2t_jijiabanfei)){
  643. //做五休二(计加班费)//做五休二(无加班费)
  644. j=saveMonthArrangeDutyOperateF2T(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus);
  645. }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.other_wujiabanfei)
  646. ||arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.other_jijiabanfei)){
  647. //其他(计加班费)//其他(无加班费)
  648. j=saveMonthArrangeDutyOperateOther(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus);
  649. }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.t2o_jijiabanfei)){
  650. //三班两运转-做二休一(计加班费)
  651. j=saveMonthArrangeDutyOperateT2O(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus);
  652. // if(j.getMsg().equals("false")){
  653. // //获取用户名称
  654. // List<DictEntity> baseUserList=systemService.queryDict("t_s_base_user", "id", "realname");
  655. // String realname="";
  656. // for (int k = 0; k < userIdList.size(); k++) {
  657. // for (int l = 0; l < baseUserList.size(); l++) {
  658. // if(userIdList.get(k).equals(baseUserList.get(l).getTypecode())){
  659. // if(realname.length()!=0){
  660. // realname+=","+baseUserList.get(l).getTypename();
  661. // }else{
  662. // realname=baseUserList.get(l).getTypename();
  663. // }
  664. // }
  665. // }
  666. // }
  667. // realname+="因上个月最后一天夜班人数超过人数的三分之一,无法使用三班两运转排班";
  668. // if(failMap.size()==0){
  669. // failMap.put("failData", realname);
  670. // }else{
  671. // failMap.put("failData", failMap.get("failData")+";"+realname);
  672. // }
  673. // }
  674. }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.o2o_wujiabanfei)){
  675. //四班两运转A-做一休一(无加班费)
  676. j=saveMonthArrangeDutyOperateO2OWU(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus);
  677. if(j.getMsg().equals("false")){
  678. //获取用户名称
  679. List<DictEntity> baseUserList=systemService.queryDict("t_s_base_user", "id", "realname");
  680. String realname="";
  681. for (int k = 0; k < userIdList.size(); k++) {
  682. for (int l = 0; l < baseUserList.size(); l++) {
  683. if(userIdList.get(k).equals(baseUserList.get(l).getTypecode())){
  684. if(realname.length()!=0){
  685. realname+=","+baseUserList.get(l).getTypename();
  686. }else{
  687. realname=baseUserList.get(l).getTypename();
  688. }
  689. }
  690. }
  691. }
  692. realname+="因上个月最后一天夜班人数超过人数的四分之一,无法使用四班两运转A排班";
  693. if(failMap.size()==0){
  694. failMap.put("failData", realname);
  695. }else{
  696. failMap.put("failData", failMap.get("failData")+";"+realname);
  697. }
  698. }
  699. }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.t2t_wujiabanfei)){
  700. //四班两运转B-做二休二(无加班费)
  701. j=saveMonthArrangeDutyOperateT2TWU(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus);
  702. if(j.getMsg().equals("false")){
  703. //获取用户名称
  704. List<DictEntity> baseUserList=systemService.queryDict("t_s_base_user", "id", "realname");
  705. String realname="";
  706. for (int k = 0; k < userIdList.size(); k++) {
  707. for (int l = 0; l < baseUserList.size(); l++) {
  708. if(userIdList.get(k).equals(baseUserList.get(l).getTypecode())){
  709. if(realname.length()!=0){
  710. realname+=","+baseUserList.get(l).getTypename();
  711. }else{
  712. realname=baseUserList.get(l).getTypename();
  713. }
  714. }
  715. }
  716. }
  717. realname+="因上个月最后一天夜班人数超过人数的四分之一,无法使用四班两运转B排班";
  718. if(failMap.size()==0){
  719. failMap.put("failData", realname);
  720. }else{
  721. failMap.put("failData", failMap.get("failData")+";"+realname);
  722. }
  723. }
  724. }else if(arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.bandao_2)
  725. ||arrangeDutyOperateDtoList.get(i).getRunway().equals(Globals.bandao_2_jijiabanfei)){
  726. //2班倒
  727. saveMonthArrangeDutyOperate2BANDAO(arrangeDutyOperateDtoList.get(i),calendarAscDtoList,yearmonth,pid,arrangeDutyStatus);
  728. }
  729. }
  730. // }
  731. if(failMap.size()!=0){
  732. j.setSuccess(false);
  733. j.setMsg(failMap.get("failData").toString());
  734. }
  735. return j;
  736. }
  737. @Override
  738. public AjaxJson saveMonthArrangeDutyOperateF2T(ArrangeDutyOperateDto arrangeDutyOperateDto,List<CalendarAscDto> calendarAscDtoList
  739. ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception {
  740. AjaxJson j = new AjaxJson();
  741. //把班次id放入班次list中查询班次信息===================
  742. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  743. arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList());
  744. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  745. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  746. List<String> shiftTypeNameList=new ArrayList<String>();
  747. for (int i = 0; i < arrangeDutyDtoList.size(); i++) {
  748. if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){
  749. shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType());
  750. }
  751. }
  752. //把班次id放入班次list中查询班次信息====================
  753. //出勤时间
  754. String[] attendanceCycle=ProjectArrangeCommonMethod.getAttendanceCycleNumner(arrangeDutyOperateDto.getAttendanceCycle()).split(",");
  755. //员工id
  756. ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto();
  757. projArrangeDetailAndUserDto.setUserIdList(arrangeDutyOperateDto.getUserIdList());
  758. projArrangeDetailAndUserDto.setYearmonth(yearmonth);
  759. if(pid!=null&&pid.length()!=0){
  760. if(pid.indexOf(",")!=-1){
  761. projArrangeDetailAndUserDto.setPid(pid.split(",")[0]);
  762. }else{
  763. projArrangeDetailAndUserDto.setPid(pid);
  764. }
  765. }
  766. authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  767. //根据员工userid获取人员和人事信息;
  768. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql);
  769. int x;//记录每天,一天一班次
  770. //循环班次人员
  771. for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) {
  772. x=0;
  773. Map<String, Object> myMap=new HashMap<String, Object>();
  774. //循环班次
  775. for (int n = 0; n < arrangeDutyDtoList.size(); n++) {
  776. //循环日期
  777. for (int i = x; i < calendarAscDtoList.size(); i++) {
  778. //循环出勤时间
  779. for (int k = 0; k < attendanceCycle.length; k++) {
  780. if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)){
  781. if(calendarAscDtoList.get(i).getIfedit().equals(Globals.ifedit_0)){
  782. if(calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){
  783. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  784. break;
  785. }
  786. }else{
  787. if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){
  788. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  789. break;
  790. }
  791. }
  792. }
  793. /*
  794. if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)&&calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){
  795. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  796. break;
  797. }*/
  798. }
  799. //如果这一天没有匹配出勤时间则为休息8e31bf3fb6e6473e9f89dcdb958b145b
  800. if(!myMap.containsKey(calendarAscDtoList.get(i).getId())){
  801. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyService.getDUTYTYPE_xiuxiId());
  802. --n;
  803. }
  804. x=i+1;
  805. break;
  806. }
  807. if(x!=calendarAscDtoList.size()){
  808. if(n== arrangeDutyDtoList.size()-1){
  809. n=-1;
  810. }
  811. }else{
  812. break;
  813. }
  814. }
  815. //System.out.println(myMap);
  816. ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity();
  817. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid());
  818. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  819. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId());
  820. projarrangeDetailEntity.setYearmonth(yearmonth);
  821. projarrangeDetailEntity.setPid(pid);
  822. projarrangeDetailEntity=this.getDayAndTimeFO(projarrangeDetailEntity,myMap);
  823. //调用员工排班上报保存总方法
  824. j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus);
  825. }
  826. return j;
  827. }
  828. @Override
  829. public AjaxJson saveMonthArrangeDutyOperateOther(ArrangeDutyOperateDto arrangeDutyOperateDto,List<CalendarAscDto> calendarAscDtoList
  830. ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception {
  831. AjaxJson j = new AjaxJson();
  832. //选择的班次
  833. //把班次id放入班次list中查询班次信息===================
  834. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  835. arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList());
  836. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  837. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  838. List<String> shiftTypeNameList=new ArrayList<String>();
  839. for (int i = 0; i < arrangeDutyDtoList.size(); i++) {
  840. if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){
  841. shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType());
  842. }
  843. }
  844. //把班次id放入班次list中查询班次信息====================
  845. //出勤时间
  846. String[] attendanceCycle=ProjectArrangeCommonMethod.getAttendanceCycleNumner(arrangeDutyOperateDto.getAttendanceCycle()).split(",");
  847. //员工id
  848. ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto();
  849. projArrangeDetailAndUserDto.setUserIdList(arrangeDutyOperateDto.getUserIdList());
  850. projArrangeDetailAndUserDto.setYearmonth(yearmonth);
  851. if(pid!=null&&pid.length()!=0){
  852. projArrangeDetailAndUserDto.setPid(pid.split(",")[0]);
  853. }
  854. authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  855. //根据员工userid获取人员和人事信息;
  856. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql);
  857. int x;//记录每天,一天一班次
  858. //循环班次人员
  859. for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) {
  860. x=0;
  861. Map<String, Object> myMap=new HashMap<String, Object>();
  862. //循环班次
  863. for (int n = 0; n < arrangeDutyDtoList.size(); n++) {
  864. //循环日期
  865. for (int i = x; i < calendarAscDtoList.size(); i++) {
  866. //循环出勤时间
  867. for (int k = 0; k < attendanceCycle.length; k++) {
  868. if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)){
  869. if(calendarAscDtoList.get(i).getIfedit().equals(Globals.ifedit_0)){
  870. if(calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){
  871. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  872. break;
  873. }
  874. }else{
  875. if(calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_0)){
  876. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  877. break;
  878. }
  879. }
  880. }
  881. /*if(!calendarAscDtoList.get(i).getDtype().equals(Globals.dtype_2)&&calendarAscDtoList.get(i).getWeek().equals(attendanceCycle[k])){
  882. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  883. break;
  884. }*/
  885. }
  886. //如果这一天没有匹配出勤时间则为休息8e31bf3fb6e6473e9f89dcdb958b145b
  887. if(!myMap.containsKey(calendarAscDtoList.get(i).getId())){
  888. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyService.getDUTYTYPE_xiuxiId());
  889. --n;
  890. }
  891. x=i+1;
  892. break;
  893. }
  894. if(x!=calendarAscDtoList.size()){
  895. if(n== arrangeDutyDtoList.size()-1){
  896. n=-1;
  897. }
  898. }else{
  899. break;
  900. }
  901. }
  902. //System.out.println(myMap);
  903. ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity();
  904. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid());
  905. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  906. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId());
  907. projarrangeDetailEntity.setYearmonth(yearmonth);
  908. projarrangeDetailEntity.setPid(pid);
  909. projarrangeDetailEntity=this.getDayAndTimeFO(projarrangeDetailEntity,myMap);
  910. //调用员工排班上报保存总方法
  911. j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus);
  912. }
  913. return j;
  914. }
  915. @Override
  916. public AjaxJson saveMonthArrangeDutyOperateT2O(ArrangeDutyOperateDto arrangeDutyOperateDto,List<CalendarAscDto> calendarAscDtoList
  917. ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception {
  918. AjaxJson j = new AjaxJson();
  919. /**********算法变更 2018-12-21 by dgq *********
  920. 如果3个人,月度首日排班按照日、夜、休,如果6个人按照日、日、夜、夜、休、休
  921. 此排班顺序不考虑上月排班情况,排班后,用户可以在界面手动调整(原系统不可以编辑三班两运转、四班两运转)
  922. **********************/
  923. //有顺序的userid数组,按照界面员工排序分解字符串
  924. String[] userids = arrangeDutyOperateDto.getUserid().split(",");
  925. if(userids.length%3 > 0) {
  926. j.setSuccess(false);
  927. j.setMsg("三班两运转设置的员工人数必须是3的整数倍,请重新设置月度排班");
  928. return j;
  929. }
  930. //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中======================
  931. List<String> projArrangeDetailAndUserDtoListGroupIds1=new ArrayList<String>();//第一天上日班的人
  932. List<String> projArrangeDetailAndUserDtoListGroupIds2=new ArrayList<String>();//第一天夜班的人
  933. List<String> projArrangeDetailAndUserDtoListGroupIds3=new ArrayList<String>();//第一天休息的人
  934. //如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休
  935. //最后一天上夜班,则月初第一天休息
  936. //最后一天日班的,月初第一天夜班
  937. //最后一天休息的,月初第一天上日班
  938. if(userids!=null){
  939. for (int i = 0; i < userids.length; i++) {
  940. if(i<userids.length/3){
  941. projArrangeDetailAndUserDtoListGroupIds1.add(userids[i]);
  942. }else if(i>=userids.length/3&&i<userids.length/3*2){
  943. projArrangeDetailAndUserDtoListGroupIds2.add(userids[i]);
  944. }else{
  945. projArrangeDetailAndUserDtoListGroupIds3.add(userids[i]);
  946. }
  947. }
  948. }
  949. //把班次id放入班次list中查询班次信息===================
  950. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  951. arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList());
  952. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  953. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  954. List<String> shiftTypeNameList=new ArrayList<String>();
  955. //设置的班次所属的所有班次类型 by dgq
  956. for (int i = 0; i < arrangeDutyDtoList.size(); i++) {
  957. if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){
  958. shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType());
  959. }
  960. }
  961. //把班次id放入班次list中查询班次信息====================
  962. //根据员工userid获取人员和项目排班详细表数据;-----------------------
  963. ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto();
  964. projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList());
  965. projArrangeDetailAndUserDto.setYearmonth(yearmonth);
  966. if(pid!=null&&pid.length()!=0){
  967. projArrangeDetailAndUserDto.setPid(pid.split(",")[0]);
  968. }
  969. authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  970. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql);
  971. //根据员工userid获取人员和项目排班详细表数据;-----------------------
  972. //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中======================
  973. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup1=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天上夜班的人
  974. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup2=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天上普通班的人
  975. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup3=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天休息的人
  976. for (ProjArrangeDetailAndUserDto dto: projArrangeDetailAndUserDtoList) {
  977. if(projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())){
  978. projArrangeDetailAndUserDtoListGroup1.add(dto);
  979. }else if(projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())){
  980. projArrangeDetailAndUserDtoListGroup2.add(dto);
  981. }else if(projArrangeDetailAndUserDtoListGroupIds3.contains(dto.getUserid())){
  982. projArrangeDetailAndUserDtoListGroup3.add(dto);
  983. }
  984. }
  985. //此处与原设置员工顺序无对应关系,此顺序可能需要调整为:白班、夜班、休息 by dgq
  986. List<List<ProjArrangeDetailAndUserDto>> listList=new ArrayList<List<ProjArrangeDetailAndUserDto>>();
  987. listList.add(projArrangeDetailAndUserDtoListGroup1);
  988. listList.add(projArrangeDetailAndUserDtoListGroup2);
  989. listList.add(projArrangeDetailAndUserDtoListGroup3);
  990. //使用二维数组生成排班模型
  991. int[][] arr = new int[3][calendarAscDtoList.size()];
  992. int data; //数值
  993. //循环赋值,获取排班模板
  994. for(int row = 0;row < arr.length;row++){
  995. for(int col = 0;col <arr[row].length;col++){
  996. data = row + col + 1;
  997. arr[row][col] = data %3+1;
  998. }
  999. }
  1000. // 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1
  1001. // 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2
  1002. // 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
  1003. String xiuxiID = arrangeDutyService.getDUTYTYPE_xiuxiId();
  1004. int rowx;//二维数组1
  1005. int colx;//二维数组2
  1006. int x;//记录每天,一天一班次
  1007. int xx;//若等于1退出数组双循环
  1008. int a=0;//定义班次变量
  1009. for (int k = 0; k < listList.size(); k++) {
  1010. projArrangeDetailAndUserDtoList.clear();
  1011. projArrangeDetailAndUserDtoList=listList.get(k);
  1012. for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) {
  1013. rowx=k;
  1014. if(!shiftTypeNameList.contains(Globals.DUTYTYPE_yeban115)){
  1015. a=k;
  1016. if(a>=arrangeDutyDtoList.size()){
  1017. a=0;
  1018. }
  1019. }
  1020. x=0;
  1021. Map<String, Object> myMap=new HashMap<String, Object>();
  1022. colx=0;
  1023. //循环班次
  1024. for (int n = a; n < arrangeDutyDtoList.size(); n++) {
  1025. //循环日期
  1026. for (int i = x; i < calendarAscDtoList.size();) {
  1027. xx=0;
  1028. for(int row = rowx;row < arr.length;row++){
  1029. for(int col = colx;col <arr[row].length;col++){
  1030. if(shiftTypeNameList.contains(Globals.DUTYTYPE_yeban115)){
  1031. if(arr[row][col]==1){//休息
  1032. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1033. --n;
  1034. colx=col+1;
  1035. xx=1;
  1036. break;
  1037. }else if(arr[row][col]==2){//除了夜班,随便排班
  1038. if(!arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1039. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1040. colx++;
  1041. xx=1;
  1042. break;
  1043. }else{
  1044. --i;
  1045. xx=1;
  1046. break;
  1047. }
  1048. }else if(arr[row][col]==3){//夜班
  1049. if(arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1050. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1051. colx++;
  1052. xx=1;
  1053. break;
  1054. }else{
  1055. --i;
  1056. xx=1;
  1057. break;
  1058. }
  1059. }
  1060. }else{
  1061. if(arr[row][col]==1){//休息
  1062. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1063. --n;
  1064. colx=col+1;
  1065. xx=1;
  1066. break;
  1067. }else if(arr[row][col]==2||arr[row][col]==3){//除了夜班,随便排班
  1068. if(!arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1069. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1070. colx++;
  1071. xx=1;
  1072. break;
  1073. }else{
  1074. --i;
  1075. xx=1;
  1076. break;
  1077. }
  1078. }
  1079. }
  1080. }
  1081. if(xx==1){
  1082. break;
  1083. }
  1084. }
  1085. x=i+1;
  1086. break;
  1087. }
  1088. if(x!=calendarAscDtoList.size()){
  1089. if(n== arrangeDutyDtoList.size()-1){
  1090. n=-1;
  1091. }
  1092. }else{
  1093. break;
  1094. }
  1095. }
  1096. //System.out.println(myMap);
  1097. ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity();
  1098. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid());
  1099. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  1100. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId());
  1101. projarrangeDetailEntity.setYearmonth(yearmonth);
  1102. projarrangeDetailEntity.setPid(pid);
  1103. projarrangeDetailEntity=this.getDayAndTimeTT(projarrangeDetailEntity,myMap);
  1104. //调用员工排班上报保存总方法
  1105. j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus);
  1106. }
  1107. }
  1108. return j;
  1109. }
  1110. @Override
  1111. public AjaxJson saveMonthArrangeDutyOperateO2OWU(ArrangeDutyOperateDto arrangeDutyOperateDto,List<CalendarAscDto> calendarAscDtoList
  1112. ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception {
  1113. AjaxJson j = new AjaxJson();
  1114. /**********算法变更 2018-12-21 by dgq *********
  1115. 如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休
  1116. 此排班顺序不考虑上月排班情况,排班后,用户可以在界面手动调整(原系统不可以编辑三班两运转、四班两运转)
  1117. **********************/
  1118. //有顺序的userid数组,按照界面员工排序分解字符串
  1119. String[] userids = arrangeDutyOperateDto.getUserid().split(",");
  1120. if(userids.length%4 > 0) {
  1121. j.setSuccess(false);
  1122. j.setMsg("四班两运转设置的员工人数必须是4的整数倍,请重新设置月度排班");
  1123. return j;
  1124. }
  1125. //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中======================
  1126. List<String> projArrangeDetailAndUserDtoListGroupIds1=new ArrayList<String>();//第一天上日班的人 //暂定为上个月最后一天上夜班班的人
  1127. List<String> projArrangeDetailAndUserDtoListGroupIds2=new ArrayList<String>();//第一天休息的人 第二天夜班 //暂定为上个月最后一天休息的人,倒数第二天夜班 或者最后一天休息的人
  1128. List<String> projArrangeDetailAndUserDtoListGroupIds3=new ArrayList<String>();//第一天上夜班的人 //暂定为上个月最后一天上普通班的人
  1129. List<String> projArrangeDetailAndUserDtoListGroupIds4=new ArrayList<String>();//第一天休息的人 第二天日班 //暂定为上个月最后一天休息的人
  1130. //如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休
  1131. //最后一天上夜班,则月初第一天休息
  1132. //最后一天休息的,且倒数第二天夜班夜班的,月初第一天休息
  1133. //最后一天日班的,月初第一天夜班
  1134. //最后两天休息的,月初第一天上日班
  1135. if(userids!=null){
  1136. for (int i = 0; i < userids.length; i++) {
  1137. if(i<userids.length/4){
  1138. projArrangeDetailAndUserDtoListGroupIds1.add(userids[i]);
  1139. }else if(i>=userids.length/4&&i<userids.length/2){
  1140. projArrangeDetailAndUserDtoListGroupIds3.add(userids[i]);
  1141. }else if(i>=userids.length/2&&i<userids.length/4*3){
  1142. projArrangeDetailAndUserDtoListGroupIds4.add(userids[i]);
  1143. }else{
  1144. projArrangeDetailAndUserDtoListGroupIds2.add(userids[i]);
  1145. }
  1146. }
  1147. }
  1148. //把班次id放入班次list中查询班次信息===================
  1149. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  1150. arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList());
  1151. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1152. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  1153. List<String> shiftTypeNameList=new ArrayList<String>();
  1154. for (int i = 0; i < arrangeDutyDtoList.size(); i++) {
  1155. if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){
  1156. shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType());
  1157. }
  1158. }
  1159. //把班次id放入班次list中查询班次信息====================
  1160. //根据员工userid获取人员和项目排班详细表数据;-----------------------
  1161. ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto();
  1162. projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList());
  1163. projArrangeDetailAndUserDto.setYearmonth(yearmonth);
  1164. if(pid!=null&&pid.length()!=0){
  1165. projArrangeDetailAndUserDto.setPid(pid.split(",")[0]);
  1166. }
  1167. authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1168. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql);
  1169. //根据员工userid获取人员和项目排班详细表数据;-----------------------
  1170. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup1=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天上夜班班的人
  1171. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup2=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天休息的人,倒数第二天夜班 或者最后一天休息的人
  1172. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup3=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天上普通班的人
  1173. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup4=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天休息的人
  1174. for (ProjArrangeDetailAndUserDto dto: projArrangeDetailAndUserDtoList) {
  1175. if(projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())){
  1176. projArrangeDetailAndUserDtoListGroup1.add(dto);
  1177. }else if(projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())){
  1178. projArrangeDetailAndUserDtoListGroup2.add(dto);
  1179. }else if(projArrangeDetailAndUserDtoListGroupIds3.contains(dto.getUserid())){
  1180. projArrangeDetailAndUserDtoListGroup3.add(dto);
  1181. }else if(projArrangeDetailAndUserDtoListGroupIds4.contains(dto.getUserid())){
  1182. projArrangeDetailAndUserDtoListGroup4.add(dto);
  1183. }
  1184. }
  1185. List<List<ProjArrangeDetailAndUserDto>> listList = new ArrayList<List<ProjArrangeDetailAndUserDto>>();
  1186. listList.add(projArrangeDetailAndUserDtoListGroup1);//矩阵row 1
  1187. listList.add(projArrangeDetailAndUserDtoListGroup2);//矩阵row 2
  1188. listList.add(projArrangeDetailAndUserDtoListGroup3);//矩阵row 3
  1189. listList.add(projArrangeDetailAndUserDtoListGroup4);//矩阵row 4
  1190. //使用二维数组生成排班模型
  1191. int[][] arr = new int[4][calendarAscDtoList.size()];
  1192. int data; //数值
  1193. //循环赋值
  1194. for(int row = 0;row < arr.length;row++){
  1195. for(int col = 0;col <arr[row].length;col++){
  1196. data = row + col + 1;
  1197. if(data %4+1==3){
  1198. arr[row][col] = 1;
  1199. }else if(data %4+1==4){
  1200. arr[row][col] = 3;
  1201. }else{
  1202. arr[row][col] = data %4+1;
  1203. }
  1204. }
  1205. }
  1206. // 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3
  1207. // 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1
  1208. // 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2
  1209. // 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1
  1210. String xiuxiID = arrangeDutyService.getDUTYTYPE_xiuxiId();
  1211. int rowx;//二维数组1
  1212. int colx;//二维数组2
  1213. //int workingDays;//工作日
  1214. //BigDecimal timeOutOvertimeHours;//超时加班
  1215. //BigDecimal countryOvertimeHours;//国定加班
  1216. int x;//记录每天,一天一班次
  1217. int xx;//若等于1退出数组双循环
  1218. int a=0;//记录班次
  1219. for (int k = 0; k < listList.size(); k++) {
  1220. projArrangeDetailAndUserDtoList.clear();
  1221. projArrangeDetailAndUserDtoList=listList.get(k);
  1222. for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) {
  1223. rowx=k;
  1224. x=0;
  1225. Map<String, Object> myMap=new HashMap<String, Object>();
  1226. colx=0;
  1227. //循环班次
  1228. for (int n = a; n < arrangeDutyDtoList.size(); n++) {
  1229. //循环日期
  1230. for (int i = x; i < calendarAscDtoList.size();) {
  1231. xx=0;
  1232. for(int row = rowx;row < arr.length;row++){
  1233. for(int col = colx;col <arr[row].length;col++){
  1234. if(arr[row][col]==1){//休息
  1235. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1236. --n;
  1237. colx=col+1;
  1238. xx=1;
  1239. break;
  1240. }else if(arr[row][col]==2){//除了夜班,随便排班
  1241. if(!arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1242. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1243. colx++;
  1244. xx=1;
  1245. break;
  1246. }else{
  1247. --i;
  1248. xx=1;
  1249. break;
  1250. }
  1251. }else if(arr[row][col]==3){//夜班
  1252. if(arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1253. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1254. colx++;
  1255. xx=1;
  1256. break;
  1257. }else{
  1258. --i;
  1259. xx=1;
  1260. break;
  1261. }
  1262. }
  1263. }
  1264. if(xx==1){
  1265. break;
  1266. }
  1267. }
  1268. x=i+1;
  1269. break;
  1270. }
  1271. if(x!=calendarAscDtoList.size()){
  1272. if(n== arrangeDutyDtoList.size()-1){
  1273. n=-1;
  1274. }
  1275. }else{
  1276. break;
  1277. }
  1278. }
  1279. //System.out.println(myMap);
  1280. ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity();
  1281. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid());
  1282. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  1283. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId());
  1284. projarrangeDetailEntity.setYearmonth(yearmonth);
  1285. projarrangeDetailEntity.setPid(pid);
  1286. projarrangeDetailEntity=this.getDayAndTimeTT(projarrangeDetailEntity,myMap);
  1287. //调用员工排班上报保存总方法
  1288. j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus);
  1289. }
  1290. }
  1291. return j;
  1292. }
  1293. @Override
  1294. public AjaxJson saveMonthArrangeDutyOperateT2TWU(ArrangeDutyOperateDto arrangeDutyOperateDto,List<CalendarAscDto> calendarAscDtoList
  1295. ,String yearmonth,String pid,String arrangeDutyStatus) throws Exception {
  1296. AjaxJson j = new AjaxJson();
  1297. /**********算法变更 2018-12-21 by dgq *********
  1298. 如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休
  1299. 此排班顺序不考虑上月排班情况,排班后,用户可以在界面手动调整(原系统不可以编辑三班两运转、四班两运转)
  1300. **********************/
  1301. //有顺序的userid数组,按照界面员工排序分解字符串
  1302. String[] userids = arrangeDutyOperateDto.getUserid().split(",");
  1303. if(userids.length%4 > 0) {
  1304. j.setSuccess(false);
  1305. j.setMsg("四班两运转设置的员工人数必须是4的整数倍,请重新设置月度排班");
  1306. return j;
  1307. }
  1308. //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中======================
  1309. List<String> projArrangeDetailAndUserDtoListGroupIds1=new ArrayList<String>();//第一天上日班的人 //暂定为上个月最后一天上夜班班的人
  1310. List<String> projArrangeDetailAndUserDtoListGroupIds2=new ArrayList<String>();//第一天休息的人 //暂定为上个月最后一天休息的人,倒数第二天夜班 或者最后一天休息的人
  1311. List<String> projArrangeDetailAndUserDtoListGroupIds3=new ArrayList<String>();//第一天上夜班的人 //暂定为上个月最后一天上普通班的人
  1312. List<String> projArrangeDetailAndUserDtoListGroupIds4=new ArrayList<String>();//第一天休息的人 //暂定为上个月最后一天休息的人
  1313. //如果4个人,月度首日排班按照日、夜、休、休,如果8个人按照日、日、夜、夜、休、休、休、休
  1314. //最后一天上夜班,则月初第一天休息
  1315. //最后一天休息的,且倒数第二天夜班夜班的,月初第一天休息
  1316. //最后一天日班的,月初第一天夜班
  1317. //最后两天休息的,月初第一天上日班
  1318. if(userids!=null){
  1319. for (int i = 0; i < userids.length; i++) {
  1320. if(i<userids.length/4){
  1321. projArrangeDetailAndUserDtoListGroupIds1.add(userids[i]);
  1322. }else if(i>=userids.length/4&&i<userids.length/2){
  1323. projArrangeDetailAndUserDtoListGroupIds2.add(userids[i]);
  1324. }else if(i>=userids.length/2&&i<userids.length/4*3){
  1325. projArrangeDetailAndUserDtoListGroupIds3.add(userids[i]);
  1326. }else{
  1327. projArrangeDetailAndUserDtoListGroupIds4.add(userids[i]);
  1328. }
  1329. }
  1330. }
  1331. //把班次id放入班次list中查询班次信息===================
  1332. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  1333. arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList());
  1334. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1335. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  1336. List<String> shiftTypeNameList=new ArrayList<String>();
  1337. for (int i = 0; i < arrangeDutyDtoList.size(); i++) {
  1338. if(!shiftTypeNameList.contains(arrangeDutyDtoList.get(i).getDutyType())){
  1339. shiftTypeNameList.add(arrangeDutyDtoList.get(i).getDutyType());
  1340. }
  1341. }
  1342. //把班次id放入班次list中查询班次信息====================
  1343. //根据员工userid获取人员和项目排班详细表数据;-----------------------
  1344. ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto=new ProjArrangeDetailAndUserDto();
  1345. projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList());
  1346. projArrangeDetailAndUserDto.setYearmonth(yearmonth);
  1347. if(pid!=null&&pid.length()!=0){
  1348. projArrangeDetailAndUserDto.setPid(pid.split(",")[0]);
  1349. }
  1350. authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1351. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoList = projarrangeDetailServiceI.getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql);
  1352. //根据员工userid获取人员和项目排班详细表数据;-----------------------
  1353. //把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中======================
  1354. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup1=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天上夜班的人
  1355. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup2=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后两天休息的人
  1356. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup3=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天上普通班的人
  1357. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup4=new ArrayList<ProjArrangeDetailAndUserDto>();//暂定为上个月最后一天休息的人
  1358. for (ProjArrangeDetailAndUserDto dto: projArrangeDetailAndUserDtoList) {
  1359. if(projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())){
  1360. projArrangeDetailAndUserDtoListGroup1.add(dto);
  1361. }else if(projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())){
  1362. projArrangeDetailAndUserDtoListGroup2.add(dto);
  1363. }else if(projArrangeDetailAndUserDtoListGroupIds3.contains(dto.getUserid())){
  1364. projArrangeDetailAndUserDtoListGroup3.add(dto);
  1365. }else if(projArrangeDetailAndUserDtoListGroupIds4.contains(dto.getUserid())){
  1366. projArrangeDetailAndUserDtoListGroup4.add(dto);
  1367. }
  1368. }
  1369. //按顺序排班
  1370. List<List<ProjArrangeDetailAndUserDto>> listList=new ArrayList<List<ProjArrangeDetailAndUserDto>>();
  1371. listList.add(projArrangeDetailAndUserDtoListGroup1);//1
  1372. listList.add(projArrangeDetailAndUserDtoListGroup2);//2
  1373. listList.add(projArrangeDetailAndUserDtoListGroup3);//3
  1374. listList.add(projArrangeDetailAndUserDtoListGroup4);//4
  1375. //使用二维数组生成排班模型
  1376. int[][] arr = new int[4][calendarAscDtoList.size()];
  1377. int data; //数值
  1378. //循环赋值
  1379. for(int row = 0;row < arr.length;row++){
  1380. for(int col = 0;col <arr[row].length;col++){
  1381. data = row + col + 1;
  1382. if(data %4+1!=4){
  1383. arr[row][col] = data %4+1;
  1384. }else{
  1385. arr[row][col] = 1;
  1386. }
  1387. }
  1388. }
  1389. String xiuxiID = arrangeDutyService.getDUTYTYPE_xiuxiId();
  1390. // 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3
  1391. // 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1
  1392. // 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1
  1393. // 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 2
  1394. int rowx;//二维数组1
  1395. int colx;//二维数组2
  1396. int x;//记录每天,一天一班次
  1397. int xx;//若等于1退出数组双循环
  1398. int a=0;//定义班次变量
  1399. for (int k = 0; k < listList.size(); k++) {
  1400. projArrangeDetailAndUserDtoList.clear();
  1401. projArrangeDetailAndUserDtoList=listList.get(k);
  1402. for (int m = 0; m < projArrangeDetailAndUserDtoList.size(); m++) {
  1403. rowx=k;
  1404. if(!shiftTypeNameList.contains(Globals.DUTYTYPE_yeban115)){
  1405. a=k;
  1406. if(a>=arrangeDutyDtoList.size()){
  1407. a=0;
  1408. }
  1409. }
  1410. x=0;
  1411. Map<String, Object> myMap=new HashMap<String, Object>();
  1412. colx=0;
  1413. //循环班次
  1414. for (int n = a; n < arrangeDutyDtoList.size(); n++) {
  1415. //循环日期
  1416. for (int i = x; i < calendarAscDtoList.size();) {
  1417. xx=0;
  1418. for(int row = rowx;row < arr.length;row++){
  1419. for(int col = colx;col <arr[row].length;col++){
  1420. if(shiftTypeNameList.contains(Globals.DUTYTYPE_yeban115)){
  1421. if(arr[row][col]==1){//休息
  1422. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1423. --n;
  1424. colx=col+1;
  1425. xx=1;
  1426. break;
  1427. }else if(arr[row][col]==2){//除了夜班,随便排班
  1428. if(!arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1429. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1430. colx++;
  1431. xx=1;
  1432. break;
  1433. }else{
  1434. --i;
  1435. xx=1;
  1436. break;
  1437. }
  1438. }else if(arr[row][col]==3){//夜班
  1439. if(arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1440. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1441. colx++;
  1442. xx=1;
  1443. break;
  1444. }else{
  1445. --i;
  1446. xx=1;
  1447. break;
  1448. }
  1449. }
  1450. }else{
  1451. if(arr[row][col]==1){//休息
  1452. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1453. --n;
  1454. colx=col+1;
  1455. xx=1;
  1456. break;
  1457. }else if(arr[row][col]==2||arr[row][col]==3){//除了夜班,随便排班
  1458. if(!arrangeDutyDtoList.get(n).getDutyType().equals(Globals.DUTYTYPE_yeban115)){
  1459. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDtoList.get(n).getId());
  1460. colx++;
  1461. xx=1;
  1462. break;
  1463. }else{
  1464. --i;
  1465. xx=1;
  1466. break;
  1467. }
  1468. }
  1469. }
  1470. }
  1471. if(xx==1){
  1472. break;
  1473. }
  1474. }
  1475. x=i+1;
  1476. break;
  1477. }
  1478. if(x!=calendarAscDtoList.size()){
  1479. if(n== arrangeDutyDtoList.size()-1){
  1480. n=-1;
  1481. }
  1482. }else{
  1483. break;
  1484. }
  1485. }
  1486. //System.out.println(myMap);
  1487. ProjarrangeDetailEntity projarrangeDetailEntity=new ProjarrangeDetailEntity();
  1488. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoList.get(m).getUserid());
  1489. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  1490. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoList.get(m).getId());
  1491. projarrangeDetailEntity.setYearmonth(yearmonth);
  1492. projarrangeDetailEntity.setPid(pid);
  1493. projarrangeDetailEntity=this.getDayAndTimeTT(projarrangeDetailEntity,myMap);
  1494. //调用员工排班上报保存总方法
  1495. j=saveProjarrangeDetail(projarrangeDetailEntity,myMap,arrangeDutyStatus);
  1496. }
  1497. }
  1498. return j;
  1499. }
  1500. /**
  1501. * 新增2班倒
  1502. * */
  1503. public AjaxJson saveMonthArrangeDutyOperate2BANDAO(ArrangeDutyOperateDto arrangeDutyOperateDto,List<CalendarAscDto> calendarAscDtoList
  1504. , String yearmonth, String pid, String arrangeDutyStatus) throws Exception {
  1505. AjaxJson j = new AjaxJson();
  1506. /**********
  1507. * 新增2班倒 算法变更 2019-11-11 by dgq ********* 人数为2的倍数,上班顺序:首日,依次为上班、休息、上班、休息....
  1508. * 班次只能为一个
  1509. **********************/
  1510. // 有顺序的userid数组,按照界面员工排序分解字符串
  1511. String[] userids = arrangeDutyOperateDto.getUserid().split(",");
  1512. if (userids.length % 2 > 0) {
  1513. j.setSuccess(false);
  1514. j.setMsg("2班倒设置的员工人数必须是2的整数倍,请重新设置月度排班");
  1515. return j;
  1516. }
  1517. // 把员工上个月的运转方式和最后一天的班次类型添加到需要排班的人员信息中======================
  1518. List<String> projArrangeDetailAndUserDtoListGroupIds1 = new ArrayList<String>();// 第一天上班的人
  1519. List<String> projArrangeDetailAndUserDtoListGroupIds2 = new ArrayList<String>();// 第一天休息的人
  1520. if (userids != null) {
  1521. for (int i = 0; i < userids.length; i++) {
  1522. if (i % 2 == 0) {
  1523. projArrangeDetailAndUserDtoListGroupIds1.add(userids[i]);
  1524. } else {
  1525. projArrangeDetailAndUserDtoListGroupIds2.add(userids[i]);
  1526. }
  1527. }
  1528. }
  1529. // 把班次id放入班次list中查询班次信息===================
  1530. // ArrangeDutyDto arrangeDutyDto = new ArrangeDutyDto();
  1531. // arrangeDutyDto.getArrangeDutyIdList().addAll(arrangeDutyOperateDto.getShiftIdList());
  1532. // String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1533. // List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  1534. // 把班次id放入班次list中查询班次信息====================
  1535. // 根据员工userid获取人员和项目排班详细表数据;-----------------------
  1536. ProjArrangeDetailAndUserDto projArrangeDetailAndUserDto = new ProjArrangeDetailAndUserDto();
  1537. projArrangeDetailAndUserDto.getUserIdList().addAll(arrangeDutyOperateDto.getUserIdList());
  1538. projArrangeDetailAndUserDto.setYearmonth(yearmonth);
  1539. if (pid != null && pid.length() != 0) {
  1540. projArrangeDetailAndUserDto.setPid(pid.split(",")[0]);
  1541. }
  1542. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1543. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoList = projarrangeDetailServiceI
  1544. .getProjArrangeDetailAndUserByUserIdListYearMonth(projArrangeDetailAndUserDto, authSql);
  1545. // end 员工userid获取人员和项目排班详细表数据;-----------------------
  1546. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup1 = new ArrayList<ProjArrangeDetailAndUserDto>();// 暂定为上个月最后一天上夜班的人
  1547. List<ProjArrangeDetailAndUserDto> projArrangeDetailAndUserDtoListGroup2 = new ArrayList<ProjArrangeDetailAndUserDto>();// 暂定为上个月最后两天休息的人
  1548. for (ProjArrangeDetailAndUserDto dto : projArrangeDetailAndUserDtoList) {
  1549. if (projArrangeDetailAndUserDtoListGroupIds1.contains(dto.getUserid())) {
  1550. projArrangeDetailAndUserDtoListGroup1.add(dto);
  1551. } else if (projArrangeDetailAndUserDtoListGroupIds2.contains(dto.getUserid())) {
  1552. projArrangeDetailAndUserDtoListGroup2.add(dto);
  1553. }
  1554. }
  1555. String xiuxiID = arrangeDutyService.getDUTYTYPE_xiuxiId();
  1556. //首日上班的人员排班
  1557. for (int m = 0; m < projArrangeDetailAndUserDtoListGroup1.size(); m++) {
  1558. // 循环日期
  1559. Map<String, Object> myMap = new HashMap<String, Object>();
  1560. for (int i = 0; i < calendarAscDtoList.size();i++) {
  1561. if (i % 2 == 0) {
  1562. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyOperateDto.getShiftIdList().get(0));
  1563. } else {
  1564. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1565. }
  1566. }
  1567. ProjarrangeDetailEntity projarrangeDetailEntity = new ProjarrangeDetailEntity();
  1568. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoListGroup1.get(m).getUserid());
  1569. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  1570. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoListGroup1.get(m).getId());
  1571. projarrangeDetailEntity.setYearmonth(yearmonth);
  1572. projarrangeDetailEntity.setPid(pid);
  1573. projarrangeDetailEntity = this.getDayAndTime2ban(projarrangeDetailEntity, myMap);
  1574. // 调用员工排班上报保存总方法
  1575. j = saveProjarrangeDetail(projarrangeDetailEntity, myMap, arrangeDutyStatus);
  1576. }
  1577. //首日休息的人员排班
  1578. for (int m = 0; m < projArrangeDetailAndUserDtoListGroup2.size(); m++) {
  1579. // 循环日期
  1580. Map<String, Object> myMap = new HashMap<String, Object>();
  1581. for (int i = 0; i < calendarAscDtoList.size();i++) {
  1582. if (i % 2 == 1) {
  1583. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyOperateDto.getShiftIdList().get(0));
  1584. } else {
  1585. myMap.put(calendarAscDtoList.get(i).getId(), xiuxiID);
  1586. }
  1587. }
  1588. ProjarrangeDetailEntity projarrangeDetailEntity = new ProjarrangeDetailEntity();
  1589. projarrangeDetailEntity.setUserid(projArrangeDetailAndUserDtoListGroup2.get(m).getUserid());
  1590. projarrangeDetailEntity.setPjtPostId(arrangeDutyOperateDto.getPjtPostId());
  1591. projarrangeDetailEntity.setId(projArrangeDetailAndUserDtoListGroup2.get(m).getId());
  1592. projarrangeDetailEntity.setYearmonth(yearmonth);
  1593. projarrangeDetailEntity.setPid(pid);
  1594. projarrangeDetailEntity = this.getDayAndTime2ban(projarrangeDetailEntity, myMap);
  1595. // 调用员工排班上报保存总方法
  1596. j = saveProjarrangeDetail(projarrangeDetailEntity, myMap, arrangeDutyStatus);
  1597. }
  1598. return j;
  1599. }
  1600. @Override
  1601. public AjaxJson saveOndutyArrangeDutyOperate(String onDutyOperateId,
  1602. String yearmonth, String pid, String arrangeDutyStatus) throws Exception {
  1603. AjaxJson j = new AjaxJson();
  1604. Map<String, Object> failMap=new HashMap<String, Object>();
  1605. List<String> onDutyOperateIdList=getOnArrangeDutyIdListByPidMonth(pid,yearmonth);
  1606. if(onDutyOperateId!=null&&onDutyOperateId.length()>0){
  1607. onDutyOperateIdList.addAll(ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateId));
  1608. }
  1609. //根据月度排班操作页面的添加和编辑操作值班排班--
  1610. // if(onDutyOperateId!=null&&onDutyOperateId.length()>0){
  1611. //查询值班操作表所有数据,并获得需要值班排班的数据
  1612. StringBuffer hql = new StringBuffer(" FROM OnDutyOperateEntity odoe where odoe.yearmonth=? ");
  1613. List<OnDutyOperateEntity> onDutyOperateEntityListOld = findHql(hql.toString(),yearmonth);
  1614. List<OnDutyOperateEntity> onDutyOperateEntityList=new ArrayList<OnDutyOperateEntity>();
  1615. // List<String> onDutyOperateIdList=ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateId);
  1616. for (int i = 0; i < onDutyOperateEntityListOld.size(); i++) {
  1617. for (int k = 0; k < onDutyOperateIdList.size(); k++) {
  1618. if(onDutyOperateIdList.get(k).equals(onDutyOperateEntityListOld.get(i).getId())){
  1619. onDutyOperateEntityList.add(onDutyOperateEntityListOld.get(i));
  1620. break;
  1621. }
  1622. }
  1623. }
  1624. for (int i = 0; i < onDutyOperateEntityList.size(); i++) {
  1625. j=onDutyOperateServiceI.checkOnDutyOperate(onDutyOperateEntityList.get(i));
  1626. if(j.getMsg().length()>0){
  1627. failMap.put("failData", j.getMsg());
  1628. continue;
  1629. }
  1630. //1出勤时间
  1631. List<String> attendanceCycleList=ProjectArrangeCommonMethod.extractIdListByComma(ProjectArrangeCommonMethod.getAttendanceCycleNumner(onDutyOperateEntityList.get(i).getAttendanceCycle()));
  1632. //1出勤时间
  1633. //2根据月度查出日期id
  1634. CalendarAscDto calendarAscDto=new CalendarAscDto();
  1635. calendarAscDto.setYear(Integer.parseInt(yearmonth.split("-")[0]));
  1636. calendarAscDto.setMonth(Integer.parseInt(yearmonth.split("-")[1]));
  1637. List<CalendarAscDto> calendarAscDtoListOld=projarrangeDetailServiceI.getCalendar(calendarAscDto);
  1638. List<CalendarAscDto> calendarAscDtoList=new ArrayList<CalendarAscDto>();
  1639. //根据所选时间段并去除周一至周五以及国家法定节假日
  1640. //并根据出勤时间获取需要排班的日期id
  1641. for (int r = 0; r < calendarAscDtoListOld.size(); r++) {
  1642. if(calendarAscDtoListOld.get(r).getDay()>=Integer.parseInt(onDutyOperateEntityList.get(i).getArrangeStime().split("-")[2])&&
  1643. calendarAscDtoListOld.get(r).getDay()<=Integer.parseInt(onDutyOperateEntityList.get(i).getArrangeEtime().split("-")[2])){
  1644. if(!calendarAscDtoListOld.get(r).getDtype().equals(Globals.dtype_2)){
  1645. if(attendanceCycleList.contains(calendarAscDtoListOld.get(r).getWeek())){
  1646. calendarAscDtoList.add(calendarAscDtoListOld.get(r));
  1647. }
  1648. }
  1649. }
  1650. }
  1651. //2根据月度查出日期id==
  1652. //3根据用户id获取项目排班详细表数据
  1653. //用户id
  1654. List<String> userIdList = ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateEntityList.get(i).getUserid());
  1655. //查询项目排班详细表数据
  1656. hql = new StringBuffer(" FROM ProjarrangeDetailEntity odoe where odoe.yearmonth=? and odoe.pid=? ");
  1657. List<ProjarrangeDetailEntity> projarrangeDetailEntityListOld = findHql(hql.toString(),yearmonth,pid);
  1658. List<ProjarrangeDetailEntity> projarrangeDetailEntityList=new ArrayList<ProjarrangeDetailEntity>();
  1659. //匹配已经排班的用户
  1660. for (int e = 0; e < projarrangeDetailEntityListOld.size(); e++) {
  1661. for (int k = 0; k < userIdList.size(); k++) {
  1662. if(userIdList.get(k).equals(projarrangeDetailEntityListOld.get(e).getUserid())){
  1663. projarrangeDetailEntityList.add(projarrangeDetailEntityListOld.get(e));
  1664. break;
  1665. }
  1666. }
  1667. }
  1668. //3根据用户id获取项目排班详细表数据
  1669. //4把班次id放入班次list中获取班次信息
  1670. ArrangeDutyDto arrangeDutyDto=new ArrangeDutyDto();
  1671. arrangeDutyDto.getArrangeDutyIdList().addAll(ProjectArrangeCommonMethod.extractIdListByComma(onDutyOperateEntityList.get(i).getShiftid()));
  1672. String authSql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
  1673. List<ArrangeDutyDto> arrangeDutyDtoList = arrangeDutyService.getArrangeDutyByIdList(arrangeDutyDto, authSql);
  1674. arrangeDutyDto=arrangeDutyDtoList.get(0);
  1675. //4把班次id放入班次list中获取班次信息
  1676. //根据员工人数和每日值班人数判断排班方式
  1677. //1.所选人数小于每日值班人数,则提示不能排班
  1678. //2.所选人数等于每日值班人数,继续排班,按照出勤时间排班;
  1679. //3.所选人数大于每日值班人数,继续排班,根据出勤时间进行做一休一排班
  1680. /*if(onDutyOperateEntityList.get(i).getEverydayPeopleNum()>userIdList.size()){
  1681. }*//*else if(onDutyOperateEntityList.get(i).getEverydayPeopleNum().equals(userIdList.size())){
  1682. //所选人数等于每日值班人数
  1683. j=ondutyArrangeOperateOther(projarrangeDetailEntityList,calendarAscDtoList,arrangeDutyDtoList,attendanceCycleList);
  1684. }*//*else*//*{
  1685. }*/
  1686. //所选人数大于每日值班人数
  1687. j=ondutyArrangeOperate(projarrangeDetailEntityList,calendarAscDtoList,arrangeDutyDto,onDutyOperateEntityList.get(i).getEverydayPeopleNum());
  1688. }
  1689. // }
  1690. if(failMap.size()!=0){
  1691. String message="";
  1692. for (Map.Entry<String, Object> m:failMap.entrySet()) {
  1693. if(message.length()==0){
  1694. message=m.getValue().toString();
  1695. }else{
  1696. message+=m.getValue().toString();
  1697. }
  1698. }
  1699. j.setMsg(message);
  1700. j.setSuccess(false);
  1701. }
  1702. return j;
  1703. }
  1704. @Override
  1705. public AjaxJson ondutyArrangeOperate(List<ProjarrangeDetailEntity> projarrangeDetailEntityList,
  1706. List<CalendarAscDto> calendarAscDtoList,ArrangeDutyDto arrangeDutyDto,int everydayPeopleNum) throws Exception {
  1707. AjaxJson j = new AjaxJson();
  1708. Map<String, Object> failMap=new HashMap<String, Object>();
  1709. //1.根据天数循环拼接人数
  1710. //拼接人数
  1711. List<ProjarrangeDetailEntity> projarrangeDetailEntityListAppend=new ArrayList<ProjarrangeDetailEntity>();
  1712. for (int i = 0; i < calendarAscDtoList.size(); i++) {
  1713. for (int k = 0; k < projarrangeDetailEntityList.size(); k++) {
  1714. projarrangeDetailEntityListAppend.add(projarrangeDetailEntityList.get(k));
  1715. }
  1716. }
  1717. //完成人数分组
  1718. List<List<ProjarrangeDetailEntity>> projarrangeDetailEntityListGroup=new ArrayList<List<ProjarrangeDetailEntity>>();
  1719. //分组的部分人数
  1720. List<ProjarrangeDetailEntity> projarrangeDetailEntityListPart1=new ArrayList<ProjarrangeDetailEntity>();
  1721. // Map<String, List<ProjarrangeDetailEntity>> mapList=new HashMap<>();
  1722. for (int i = 0; i < (projarrangeDetailEntityListAppend.size()+everydayPeopleNum-1)/everydayPeopleNum; i++) {
  1723. List<ProjarrangeDetailEntity> projarrangeDetailEntityListPart2=new ArrayList<ProjarrangeDetailEntity>();
  1724. for (int l = i*everydayPeopleNum; l < projarrangeDetailEntityListAppend.size(); l++) {
  1725. if(projarrangeDetailEntityListPart1.size()>everydayPeopleNum-1){
  1726. projarrangeDetailEntityListPart2.addAll(projarrangeDetailEntityListPart1);
  1727. projarrangeDetailEntityListGroup.add(projarrangeDetailEntityListPart2);
  1728. // mapList.put("i", projarrangeDetailEntityListPart1);
  1729. projarrangeDetailEntityListPart1.clear();
  1730. break;
  1731. }else{
  1732. projarrangeDetailEntityListPart1.add(projarrangeDetailEntityListAppend.get(l));
  1733. }
  1734. }
  1735. }
  1736. if(projarrangeDetailEntityListPart1.size()>0){
  1737. projarrangeDetailEntityListGroup.add(projarrangeDetailEntityListPart1);
  1738. }
  1739. for (int i = 0; i < calendarAscDtoList.size(); i++) {
  1740. for (int k = i; k < projarrangeDetailEntityListGroup.size(); k++) {
  1741. Map<String, Object> myMap=new HashMap<String, Object>();
  1742. for (int m = 0; m < projarrangeDetailEntityListGroup.get(k).size(); m++) {
  1743. myMap.put(calendarAscDtoList.get(i).getId(), arrangeDutyDto.getId());
  1744. if(arrangeDutyDto.getDutyType().equals(Globals.DUTYTYPE_zhiban)){
  1745. projarrangeDetailEntityListGroup.get(k).get(m).setOndutyDays(projarrangeDetailEntityListGroup.get(k).get(m).getOndutyDays().add(new BigDecimal("1")));
  1746. }else if(arrangeDutyDto.getDutyType().equals(Globals.DUTYTYPE_jiaban)){
  1747. if(arrangeDutyDto.getTimeOutOvertimeHours()!=null){
  1748. projarrangeDetailEntityListGroup.get(k).get(m).setTimeOutOvertimeHours(projarrangeDetailEntityListGroup.get(k).get(m).getTimeOutOvertimeHours().add(arrangeDutyDto.getTimeOutOvertimeHours()));
  1749. }
  1750. }
  1751. //更新项目排班详细表
  1752. try {
  1753. this.saveOrUpdate(projarrangeDetailEntityListGroup.get(k).get(m));
  1754. } catch (Exception e) {
  1755. // TODO Auto-generated catch block
  1756. e.printStackTrace();
  1757. }
  1758. UserArrangeDetailEntity userArrangeDetailEntity=new UserArrangeDetailEntity();
  1759. for (Entry<String,Object> entryParam : myMap.entrySet()) {
  1760. //System.out.println("key="+entryParam.getKey()+",value="+entryParam.getValue());
  1761. StringBuffer hql = new StringBuffer(" FROM UserArrangeDetailEntity uad where uad.calendarid=? and uad.projarrangeDetailid=? ");
  1762. List<UserArrangeDetailEntity> userArrangeDetailEntityList = findHql(hql.toString(),entryParam.getKey(),projarrangeDetailEntityListGroup.get(k).get(m).getId());
  1763. userArrangeDetailEntity.setId(userArrangeDetailEntityList.get(0).getId());
  1764. userArrangeDetailEntity.setCalendarid(entryParam.getKey());
  1765. userArrangeDetailEntity.setShiftid(entryParam.getValue().toString());
  1766. userArrangeDetailEntity.setProjarrangeDetailid(projarrangeDetailEntityListGroup.get(k).get(m).getId());
  1767. //更新员工排班详情表
  1768. j=saveUserArrangeDetail(userArrangeDetailEntity);
  1769. }
  1770. }
  1771. break;
  1772. }
  1773. }
  1774. return j;
  1775. }
  1776. /*@Override
  1777. public AjaxJson ondutyArrangeDeleteByUserId(String userid,String yearmonth){
  1778. return null;
  1779. }*/
  1780. @Override
  1781. public List<String> getArrangeDutyIdListByPidMonth(String pid,
  1782. String yearmonth) {
  1783. StringBuffer hql = new StringBuffer(" FROM ArrangeDutyOperateEntity where pid=? and yearmonth=? ");
  1784. List<ArrangeDutyOperateEntity> arrangeDutyOperateEntityList = this.findHql(hql.toString(),pid,yearmonth);
  1785. hql = new StringBuffer(" FROM ProjarrangeDetailEntity where pid=? and yearmonth=? ");
  1786. List<ProjarrangeDetailEntity> projarrangeDetailEntityList = this.findHql(hql.toString(),pid,yearmonth);
  1787. List<String> userIdArrangeDutyList=new ArrayList<String>();
  1788. for (int i = 0; i < projarrangeDetailEntityList.size(); i++) {
  1789. userIdArrangeDutyList.add(projarrangeDetailEntityList.get(i).getUserid());
  1790. }
  1791. List<String> arrangeDutyOperateIdList=new ArrayList<String>();
  1792. for (int i = 0; i < arrangeDutyOperateEntityList.size(); i++) {
  1793. List<String> userIdList=ProjectArrangeCommonMethod.extractIdListByComma(arrangeDutyOperateEntityList.get(i).getUserid());
  1794. userIdList.removeAll(userIdArrangeDutyList);
  1795. if(userIdList.size()>0){
  1796. arrangeDutyOperateIdList.add(arrangeDutyOperateEntityList.get(i).getId());
  1797. }
  1798. }
  1799. return arrangeDutyOperateIdList;
  1800. }
  1801. @Override
  1802. public List<String> getOnArrangeDutyIdListByPidMonth(String pid,
  1803. String yearmonth) {
  1804. StringBuffer hql = new StringBuffer(" FROM OnDutyOperateEntity where pid=? and yearmonth=? ");
  1805. List<OnDutyOperateEntity> onDutyOperateEntityList = this.findHql(hql.toString(),pid,yearmonth);
  1806. List<String> onDutyOperateIdList=new ArrayList<String>();
  1807. for (int i = 0; i < onDutyOperateEntityList.size(); i++) {
  1808. if(onDutyOperateServiceI.checkOnDutyOperate(onDutyOperateEntityList.get(i)).isSuccess()==true){
  1809. onDutyOperateIdList.add(onDutyOperateEntityList.get(i).getId());
  1810. }
  1811. }
  1812. return onDutyOperateIdList;
  1813. }
  1814. }