AttendanceTempTransactionalServiceImpl.java 119 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682
  1. package cn.com.lzt.attendancetemp.service.impl;
  2. import cn.com.lzt.arrangeduty.entity.ArrangeDutyEntity;
  3. import cn.com.lzt.arrangeduty.service.ArrangeDutyServiceI;
  4. import cn.com.lzt.attendancetemp.dao.AttendanceTempDao;
  5. import cn.com.lzt.attendancetemp.entity.AttendanceTempEntity;
  6. import cn.com.lzt.attendancetemp.service.AttendanceTempServiceI;
  7. import cn.com.lzt.attendancetemp.service.AttendanceTempTransactionalServiceI;
  8. import cn.com.lzt.attendancewarnmsg.dao.AttendanceWarnMsgMinidao;
  9. import cn.com.lzt.attendancewarnmsg.dto.AttendanceWarnMsgDto;
  10. import cn.com.lzt.attendancewarnmsg.dto.ProjectAbnormalDetailDto;
  11. import cn.com.lzt.attendancewarnmsg.entity.AttendanceWarnMsgEntity;
  12. import cn.com.lzt.attendancewarnmsg.service.AttendanceWarnMsgServiceI;
  13. import cn.com.lzt.attendancewarnmsgdetail.entity.AttendanceWarnMsgDetailEntity;
  14. import cn.com.lzt.calendar.entity.CalendarEntity;
  15. import cn.com.lzt.calendar.service.CalendarServiceI;
  16. import cn.com.lzt.common.push.JPushProcessor;
  17. import cn.com.lzt.dingattendanceinfo.entity.DingAttendanceinfoEntity;
  18. import cn.com.lzt.dingattendanceinfo.service.DingAttendanceinfoServiceI;
  19. import cn.com.lzt.holiday.entity.HolidayEntity;
  20. import cn.com.lzt.overtimerecord.entity.OvertimeRecordEntity;
  21. import cn.com.lzt.personnelbasearchivesmanage.entity.PersonnelBaseArchivesManageEntity;
  22. import cn.com.lzt.personnelbasearchivesmanage.service.PersonnelBaseArchivesManageServiceI;
  23. import cn.com.lzt.projarrangedetail.entity.ProjarrangeDetailEntity;
  24. import cn.com.lzt.projarrangedetail.service.ProjarrangeDetailServiceI;
  25. import cn.com.lzt.userarrangedetail.entity.UserArrangeDetailEntity;
  26. import cn.com.lzt.userarrangedetail.service.UserArrangeDetailServiceI;
  27. import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery;
  28. import org.jeecgframework.core.common.service.CommonService;
  29. import org.jeecgframework.core.constant.Globals;
  30. import org.jeecgframework.core.util.DataUtils;
  31. import org.jeecgframework.core.util.ListUtils;
  32. import org.jeecgframework.core.util.StringUtil;
  33. import org.jeecgframework.core.util.oConvertUtils;
  34. import org.jeecgframework.tag.vo.datatable.SortDirection;
  35. import org.jeecgframework.web.system.pojo.base.TSDepart;
  36. import org.jeecgframework.web.system.pojo.base.TSUser;
  37. import org.jeecgframework.web.system.pojo.base.TSUserOrg;
  38. import org.jeecgframework.web.system.service.DepartServiceI;
  39. import org.jeecgframework.web.system.service.SystemService;
  40. import org.jeecgframework.web.system.service.UserService;
  41. import org.jeecgframework.workflow.common.WorkFlowGlobals;
  42. import org.springframework.beans.factory.annotation.Autowired;
  43. import org.springframework.stereotype.Service;
  44. import org.springframework.transaction.annotation.Propagation;
  45. import org.springframework.transaction.annotation.Transactional;
  46. import javax.annotation.Resource;
  47. import java.text.ParseException;
  48. import java.text.SimpleDateFormat;
  49. import java.util.*;
  50. @Service("AttendanceTempTransactionalServiceI")
  51. @Transactional(propagation = Propagation.REQUIRES_NEW)
  52. public class AttendanceTempTransactionalServiceImpl implements AttendanceTempTransactionalServiceI {
  53. @Autowired
  54. private UserService userService;
  55. @Autowired
  56. private DingAttendanceinfoServiceI dingAttendanceinfoService;
  57. @Autowired
  58. private SystemService systemService;
  59. @Autowired
  60. private CalendarServiceI calendarService;
  61. @Autowired
  62. private AttendanceTempServiceI attendanceTempService;
  63. @Autowired
  64. private ProjarrangeDetailServiceI projarrangeDetailService;
  65. @Autowired
  66. private UserArrangeDetailServiceI userArrangeDetailService;
  67. @Autowired
  68. private ArrangeDutyServiceI arrangeDutyService;
  69. @Autowired
  70. private PersonnelBaseArchivesManageServiceI personnelBaseArchivesManageService;
  71. @Autowired
  72. private DepartServiceI departService;
  73. @Autowired
  74. private AttendanceWarnMsgServiceI attendanceWarnMsgService;
  75. @Autowired
  76. private CommonService commonService;
  77. @Autowired
  78. AttendanceWarnMsgMinidao attendanceWarnMsgMinidao;
  79. @Autowired
  80. private JPushProcessor pushProcessor;
  81. @Resource
  82. AttendanceTempDao attendanceTempDao;
  83. /**
  84. * 根据用户将每天的实时查看数据初始化
  85. *
  86. */
  87. @SuppressWarnings("deprecation")
  88. @Override
  89. public void attendanceTempInit(Date date) {
  90. // 检索所有用户
  91. String userHql = "from TSUser where deleteFlag <> 1";
  92. List<TSUser> userList = userService.findHql(userHql);
  93. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  94. //String nowDateString = df.format(new Date()) + " 00:00:00";
  95. // 获取当前日期
  96. Date nowDate = new Date();
  97. if(null != date) {
  98. nowDate = date;
  99. }
  100. String nowDateString = dfYMD.format(nowDate);
  101. try {
  102. nowDate = dfYMD.parse(nowDateString);
  103. } catch (ParseException e1) {
  104. e1.printStackTrace();
  105. }
  106. Map<String, PersonnelBaseArchivesManageEntity> map_userid2Personnel = new HashMap<>();
  107. String personnelByUserIdHql = "from PersonnelBaseArchivesManageEntity where POSITION_STATUS = '1' or POSITION_STATUS = '2'";
  108. List<PersonnelBaseArchivesManageEntity> personnelBaseArchivesManageEntitys = personnelBaseArchivesManageService.findHql(personnelByUserIdHql);
  109. for(PersonnelBaseArchivesManageEntity p : personnelBaseArchivesManageEntitys) {
  110. map_userid2Personnel.put(p.getUserid(), p);
  111. }
  112. String attendanceTempByUserIdAndDateHql = "from AttendanceTempEntity where attendanceDate = ?";
  113. List<AttendanceTempEntity> attendanceTempEntitys = attendanceTempService.findHql(attendanceTempByUserIdAndDateHql, nowDate);
  114. Map<String, AttendanceTempEntity> map_user2AttendanceTemp = new HashMap<>();
  115. for(AttendanceTempEntity tempentity : attendanceTempEntitys) {
  116. map_user2AttendanceTemp.put(tempentity.getUserId(), tempentity);
  117. }
  118. for(TSUser tsBaseUser : userList) {
  119. if(!map_userid2Personnel.containsKey(tsBaseUser.getId())) {
  120. continue;
  121. }
  122. PersonnelBaseArchivesManageEntity personnelBaseArchivesManageEntity = map_userid2Personnel.get(tsBaseUser.getId());
  123. // 如果员工未离职
  124. if(Globals.JOBSTATUS_1.equals(personnelBaseArchivesManageEntity.getPositionStatus()) || Globals.JOBSTATUS_2.equals(personnelBaseArchivesManageEntity.getPositionStatus())) {
  125. // 如果用户没有当天的实时查看信息,则新建一条
  126. if(!map_user2AttendanceTemp.containsKey(tsBaseUser.getId())) {
  127. AttendanceTempEntity attendanceTempEntity = new AttendanceTempEntity();
  128. // 员工ID
  129. attendanceTempEntity.setUserId(tsBaseUser.getId());
  130. // 员工编号
  131. attendanceTempEntity.setUserCode(tsBaseUser.getUserNum());
  132. // 员工姓名
  133. attendanceTempEntity.setRealname(tsBaseUser.getRealName());
  134. // 查询所属单位
  135. StringBuilder mainOrgSql = new StringBuilder();
  136. mainOrgSql.append(" SELECT ");
  137. mainOrgSql.append(" depart.id id");
  138. mainOrgSql.append(" FROM t_s_user_org userOrg ");
  139. mainOrgSql.append(" LEFT JOIN t_s_depart depart ON userOrg.org_id = depart.id ");
  140. mainOrgSql.append(" WHERE ");
  141. mainOrgSql.append(" userOrg.user_id = '" + tsBaseUser.getId() + "'");
  142. mainOrgSql.append(" AND userOrg.status = '0' ");
  143. mainOrgSql.append(" AND userOrg.ifpluralism <> '1' ");
  144. List<Map<String, Object>> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString());
  145. // 所属单位ID
  146. attendanceTempEntity.setBelongUnitid((String)mainOrgMapList.get(0).get("id"));
  147. // 考勤日期
  148. attendanceTempEntity.setAttendanceDate(nowDate);
  149. // 一线员工
  150. if(Globals.MANAGETYPE_2.equals(personnelBaseArchivesManageEntity.getManagerType())) {
  151. // 获取班次信息
  152. Map<String, Object> arrangeDutyEntityMap = this.getArrangeDutyInfo(nowDate, tsBaseUser.getId());
  153. String returnFlg = (String)arrangeDutyEntityMap.get("returnFlg");
  154. if("1".equals(returnFlg)) {
  155. ArrangeDutyEntity arrangeDutyEntity = (ArrangeDutyEntity)arrangeDutyEntityMap.get("arrangeDutyEntity");
  156. attendanceTempEntity.setArrangeDutyId(arrangeDutyEntity.getId());
  157. // 班次类型为夜班
  158. int year = Integer.valueOf(nowDateString.substring(0,4));
  159. int month = Integer.valueOf(nowDateString.substring(5,7));
  160. int day = Integer.valueOf(nowDateString.substring(8,10));
  161. if(Globals.DUTYTYPE_yeban115.equals(arrangeDutyEntity.getDutyType())) {
  162. // 基准时间计算
  163. String normalworkStime = arrangeDutyEntity.getNormalworkStime();
  164. String normalworkEtime = arrangeDutyEntity.getNormalworkEtime();
  165. if(StringUtil.isNotEmpty(normalworkStime) && StringUtil.isNotEmpty(normalworkEtime)) {
  166. Date datumStime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkStime.substring(0, 2)), Integer.valueOf(normalworkStime.substring(3, 5)), 0);
  167. Date datumEtimeTemp = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkEtime.substring(0, 2)), Integer.valueOf(normalworkEtime.substring(3, 5)), 0);
  168. Date datumEtime = new Date(datumEtimeTemp.getTime() + 1000 * 60 * 60 * 24);
  169. // 设置基准时间
  170. attendanceTempEntity.setDatumStime(datumStime);
  171. attendanceTempEntity.setDatumEtime(datumEtime);
  172. }
  173. } else {
  174. // 基准时间计算
  175. String normalworkStime = arrangeDutyEntity.getNormalworkStime();
  176. String normalworkEtime = arrangeDutyEntity.getNormalworkEtime();
  177. if(StringUtil.isNotEmpty(normalworkStime) && StringUtil.isNotEmpty(normalworkEtime)) {
  178. Date datumStime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkStime.substring(0, 2)), Integer.valueOf(normalworkStime.substring(3, 5)), 0);
  179. Date datumEtime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkEtime.substring(0, 2)), Integer.valueOf(normalworkEtime.substring(3, 5)), 0);
  180. // 设置基准时间
  181. attendanceTempEntity.setDatumStime(datumStime);
  182. attendanceTempEntity.setDatumEtime(datumEtime);
  183. }
  184. }
  185. } else {
  186. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_6);
  187. }
  188. } else {
  189. // 一线员工以外
  190. int year = Integer.valueOf(nowDateString.substring(0,4));
  191. int month = Integer.valueOf(nowDateString.substring(5,7));
  192. int day = Integer.valueOf(nowDateString.substring(8,10));
  193. String calendarHql = "from CalendarEntity where year =? and month =? and day = ?";
  194. List<CalendarEntity> calendarList = calendarService.findHql(calendarHql, year, month, day);
  195. if(Globals.dtype_0.equals(calendarList.get(0).getDtype())) {
  196. Date datumStime = new Date(year - 1900, month - 1, day, 8, 30, 0);
  197. Date datumEtime = new Date(year - 1900, month - 1, day, 17, 0, 0);
  198. // 设置基准时间
  199. attendanceTempEntity.setDatumStime(datumStime);
  200. attendanceTempEntity.setDatumEtime(datumEtime);
  201. } else {
  202. ;
  203. }
  204. }
  205. // 是否请假
  206. // List<HolidayEntity> holidayEntityList = attendanceTempDao.getHolidayEntityList(tsBaseUser.getId(), nowDateString, WorkFlowGlobals.BPM_BUS_STATUS_3);
  207. // if(holidayEntityList.size() > 0) {
  208. // String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  209. // if(StringUtil.isEmpty(attendanceStatus)) {
  210. // attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_4);
  211. // } else {
  212. // attendanceTempEntity.setAttendanceStatus(attendanceStatus + "," + Globals.ATTENDANCE_STATUS_4);
  213. // }
  214. // }
  215. try{
  216. attendanceTempService.save(attendanceTempEntity);
  217. String message = "员工ID:" + attendanceTempEntity.getUserCode() + "实时查看基础数据添加成功";
  218. //systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  219. }catch(Exception e){
  220. e.printStackTrace();
  221. String message = "员工ID:" + attendanceTempEntity.getUserCode() + "实时查看基础数据添加失败";
  222. //systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);
  223. }
  224. }
  225. }
  226. }
  227. }
  228. /**
  229. * 处理钉钉考勤原始记录表中的数据到考勤实时查看表
  230. *
  231. */
  232. @Override
  233. public boolean attendanceTempSynchronization(Date date) {
  234. boolean returnFlg = true;
  235. // 根据原始记录表中未处理的信息对实时查看表进行编辑
  236. String dingAttendanceInfoHql = "from DingAttendanceinfoEntity where isDispose <> 1";
  237. List<DingAttendanceinfoEntity> dingAttendanceinfoEntityList = null;
  238. if(date != null) {
  239. //手动刷新
  240. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  241. Date dateYesterday = new Date(date.getTime() - 1000 * 60 * 60 * 24);
  242. Date dateTomorrow = new Date(date.getTime() + 2000 * 60 * 60 * 24); //between field2 是小于不等于
  243. CriteriaQuery cq = new CriteriaQuery(DingAttendanceinfoEntity.class);
  244. try {
  245. cq.between("attendanceTime",sdf.parse(sdf.format(dateYesterday)),sdf.parse(sdf.format(dateTomorrow)));
  246. } catch (ParseException e) {
  247. org.jeecgframework.core.util.LogUtil.error(e.getMessage());
  248. e.printStackTrace();
  249. }
  250. // cq.add();
  251. // cq.eq("userId", "ff808081645a0c470164682d4a4a0488");
  252. cq.add();
  253. cq.addOrder("attendanceTime", SortDirection.desc);
  254. dingAttendanceinfoEntityList = systemService.getListByCriteriaQuery(cq, false);
  255. }else {
  256. dingAttendanceinfoEntityList = dingAttendanceinfoService.findHql(dingAttendanceInfoHql);
  257. }
  258. //String dingAttendanceInfoHql = "from DingAttendanceinfoEntity where userId='000000006120dd1c01612cf521d40173' order by attendanceDate desc"; //测试
  259. for (DingAttendanceinfoEntity dingAttendanceinfoEntity : dingAttendanceinfoEntityList) {
  260. String personnelByUserIdHql = "from PersonnelBaseArchivesManageEntity where userid = ?";
  261. List<PersonnelBaseArchivesManageEntity> personnelBaseArchivesManageEntityList = personnelBaseArchivesManageService.findHql(personnelByUserIdHql, dingAttendanceinfoEntity.getUserId());
  262. if(personnelBaseArchivesManageEntityList.size() == 0) {
  263. continue;
  264. }
  265. PersonnelBaseArchivesManageEntity personnelBaseArchivesManageEntity = personnelBaseArchivesManageEntityList.get(0);
  266. // 如果员工未离职
  267. if(Globals.JOBSTATUS_1.equals(personnelBaseArchivesManageEntity.getPositionStatus()) || Globals.JOBSTATUS_2.equals(personnelBaseArchivesManageEntity.getPositionStatus())) {
  268. // 一线员工
  269. if(Globals.MANAGETYPE_2.equals(personnelBaseArchivesManageEntity.getManagerType())) {
  270. // if("000000006120dd1c01612cf521d40173".equals(personnelBaseArchivesManageEntity.getUserid())) {
  271. // System.out.println("gllp");
  272. // }
  273. // ----------值夜班情况处理 ---20180308---yangxi---add---start----------
  274. // 获取前一天的日期
  275. Date dateYesterday = new Date(dingAttendanceinfoEntity.getAttendanceDate().getTime() - 1000 * 60 * 60 * 24);
  276. // 获取班次信息
  277. Map<String, Object> arrangeDutyEntityMapYesterday = this.getArrangeDutyInfo(dateYesterday, dingAttendanceinfoEntity.getUserId());
  278. String arrangeDutyEntityMapYesterdayFlg = (String)arrangeDutyEntityMapYesterday.get("returnFlg");
  279. if("1".equals(arrangeDutyEntityMapYesterdayFlg)) {
  280. ArrangeDutyEntity arrangeDutyEntityYesterday = (ArrangeDutyEntity)arrangeDutyEntityMapYesterday.get("arrangeDutyEntity");
  281. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntityYesterday.getDutyType())) {
  282. String ondutyStime = arrangeDutyEntityYesterday.getOndutyStime();
  283. String ondutyEtime = arrangeDutyEntityYesterday.getOndutyEtime();
  284. if(ondutyStime.compareTo(ondutyEtime) > 0) {
  285. String attendanceTempByUserIdAndDateHql = "from AttendanceTempEntity where userId =? and attendanceDate = ?";
  286. List<AttendanceTempEntity> attendanceTempEntityList = attendanceTempService.findHql(attendanceTempByUserIdAndDateHql, dingAttendanceinfoEntity.getUserId(), dateYesterday);
  287. if(attendanceTempEntityList.size() > 0) {
  288. AttendanceTempEntity attendanceTempEntity = attendanceTempEntityList.get(0);
  289. attendanceTempEntity = this.SetAttendanceStatus(attendanceTempEntity, attendanceTempEntityList, Globals.MANAGETYPE_2);
  290. // 所有签到时间List
  291. List<String> attendanceAllDatetimeList = new ArrayList<String>();
  292. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  293. String tempStr = dateFormat.format(dingAttendanceinfoEntity.getAttendanceTime());
  294. attendanceAllDatetimeList.add(tempStr.substring(0, 16));
  295. if(null != attendanceTempEntity.getAlldatetime()) {
  296. String tempStr3 = attendanceTempEntity.getAlldatetime();
  297. List<String> alldatetimeList = Arrays.asList(tempStr3.split(","));
  298. for(String alldatetime : alldatetimeList) {
  299. attendanceAllDatetimeList.add(alldatetime);
  300. }
  301. }
  302. // 所有签到时间去重排序
  303. HashSet<String> allDatetimeHashSet = new HashSet<String>(attendanceAllDatetimeList);
  304. attendanceAllDatetimeList.clear();
  305. attendanceAllDatetimeList.addAll(allDatetimeHashSet);
  306. Collections.sort(attendanceAllDatetimeList);
  307. try {
  308. // 计算签到时间和最新打卡时间
  309. Calendar yesterdayCalendar = Calendar.getInstance();
  310. Calendar todayCalendar = Calendar.getInstance();
  311. yesterdayCalendar.setTime(dateYesterday);
  312. todayCalendar.setTime(dingAttendanceinfoEntity.getAttendanceDate());
  313. String[] ondutyStimeTemp = ondutyStime.split(":");
  314. String[] ondutyEtimeTemp = ondutyStime.split(":");
  315. yesterdayCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyStimeTemp[0]));
  316. yesterdayCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyStimeTemp[1]));
  317. todayCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyEtimeTemp[0]));
  318. todayCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyEtimeTemp[1]));
  319. String startStr = dateFormat.format(yesterdayCalendar.getTime());
  320. String endStr = dateFormat.format(todayCalendar.getTime());
  321. List<String> attendanceTimeList = new ArrayList<String>();
  322. for (int i = 0; i < attendanceAllDatetimeList.size(); i++) {
  323. if(startStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") <= 0 && endStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") >= 0) {
  324. attendanceTimeList.add(attendanceAllDatetimeList.get(i));
  325. }
  326. }
  327. // 设置签到时间和最新打卡时间
  328. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntityYesterday, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, true);
  329. String attendanceAllDatetimeStr = "";
  330. for(String str : attendanceAllDatetimeList) {
  331. attendanceAllDatetimeStr += str + ",";
  332. }
  333. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  334. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  335. }
  336. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  337. attendanceTempService.saveOrUpdate(attendanceTempEntity);
  338. } catch (Exception e) {
  339. e.printStackTrace();
  340. returnFlg = false;
  341. }
  342. } else {
  343. // ======为了容错的代码,正常情况下跑定时任务,每天的基本信息都会自动生成的,不会出现前一天的实时查看数据没有的情况====== START
  344. AttendanceTempEntity attendanceTempEntity = new AttendanceTempEntity();
  345. // String userHql = "from TSBaseUser where id = ?";
  346. // List<TSBaseUser> userList = userService.findHql(userHql, dingAttendanceinfoEntity.getUserId());
  347. // TSBaseUser tsBaseUser = userList.get(0);
  348. TSUser tsBaseUser = userService.get(TSUser.class, dingAttendanceinfoEntity.getUserId());
  349. // 员工ID
  350. attendanceTempEntity.setUserId(tsBaseUser.getId());
  351. // 员工编号
  352. attendanceTempEntity.setUserCode(tsBaseUser.getUserNum());
  353. // 员工姓名
  354. attendanceTempEntity.setRealname(tsBaseUser.getRealName());
  355. // 查询所属单位
  356. StringBuilder mainOrgSql = new StringBuilder();
  357. mainOrgSql.append(" SELECT ");
  358. mainOrgSql.append(" depart.id id");
  359. mainOrgSql.append(" FROM t_s_user_org userOrg ");
  360. mainOrgSql.append(" LEFT JOIN t_s_depart depart ON userOrg.org_id = depart.id ");
  361. mainOrgSql.append(" WHERE ");
  362. mainOrgSql.append(" userOrg.user_id = '" + tsBaseUser.getId() + "'");
  363. mainOrgSql.append(" AND userOrg.status = '0' ");
  364. mainOrgSql.append(" AND userOrg.ifpluralism <> '1' ");
  365. List<Map<String, Object>> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString());
  366. // 所属单位ID
  367. attendanceTempEntity.setBelongUnitid((String)mainOrgMapList.get(0).get("id"));
  368. // 考勤日期
  369. attendanceTempEntity.setAttendanceDate(dateYesterday);
  370. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  371. String nowDateString = dfYMD.format(dateYesterday);
  372. // 获取班次信息
  373. Map<String, Object> arrangeDutyEntityMapTemp1 = this.getArrangeDutyInfo(dateYesterday, tsBaseUser.getId());
  374. String arrangeDutyEntityMapTemp1Flg = (String)arrangeDutyEntityMapTemp1.get("returnFlg");
  375. if("1".equals(arrangeDutyEntityMapTemp1Flg)) {
  376. ArrangeDutyEntity arrangeDutyEntity1 = (ArrangeDutyEntity)arrangeDutyEntityMapTemp1.get("arrangeDutyEntity");
  377. attendanceTempEntity.setArrangeDutyId(arrangeDutyEntity1.getId());
  378. int year = Integer.valueOf(nowDateString.substring(0,4));
  379. int month = Integer.valueOf(nowDateString.substring(5,7));
  380. int day = Integer.valueOf(nowDateString.substring(8,10));
  381. // 基准时间计算
  382. String normalworkStime = arrangeDutyEntity1.getNormalworkStime();
  383. String normalworkEtime = arrangeDutyEntity1.getNormalworkEtime();
  384. if(StringUtil.isNotEmpty(normalworkStime) && StringUtil.isNotEmpty(normalworkEtime)) {
  385. Date datumStime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkStime.substring(0, 2)), Integer.valueOf(normalworkStime.substring(3, 5)), 0);
  386. Date datumEtimeTemp = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkEtime.substring(0, 2)), Integer.valueOf(normalworkEtime.substring(3, 5)), 0);
  387. Date datumEtime = new Date(datumEtimeTemp.getTime() + 1000 * 60 * 60 * 24);
  388. // 设置基准时间
  389. attendanceTempEntity.setDatumStime(datumStime);
  390. attendanceTempEntity.setDatumEtime(datumEtime);
  391. }
  392. // 所有签到时间List
  393. List<String> attendanceAllDatetimeList = new ArrayList<String>();
  394. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  395. String tempStr = dateFormat.format(dingAttendanceinfoEntity.getAttendanceTime());
  396. attendanceAllDatetimeList.add(tempStr.substring(0, 16));
  397. try {
  398. // 计算签到时间和最新打卡时间
  399. Calendar yesterdayCalendar = Calendar.getInstance();
  400. Calendar todayCalendar = Calendar.getInstance();
  401. yesterdayCalendar.setTime(dateYesterday);
  402. todayCalendar.setTime(dingAttendanceinfoEntity.getAttendanceDate());
  403. String[] ondutyStimeTemp = ondutyStime.split(":");
  404. String[] ondutyEtimeTemp = ondutyStime.split(":");
  405. yesterdayCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyStimeTemp[0]));
  406. yesterdayCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyStimeTemp[1]));
  407. todayCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyEtimeTemp[0]));
  408. todayCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyEtimeTemp[1]));
  409. String startStr = dateFormat.format(yesterdayCalendar.getTime());
  410. String endStr = dateFormat.format(todayCalendar.getTime());
  411. List<String> attendanceTimeList = new ArrayList<String>();
  412. for (int i = 0; i < attendanceAllDatetimeList.size(); i++) {
  413. if(startStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") <= 0 && endStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") >= 0) {
  414. attendanceTimeList.add(attendanceAllDatetimeList.get(i));
  415. }
  416. }
  417. // 设置签到时间和最新打卡时间
  418. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntityYesterday, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, true);
  419. String attendanceAllDatetimeStr = "";
  420. for(String str : attendanceAllDatetimeList) {
  421. attendanceAllDatetimeStr += str + ",";
  422. }
  423. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  424. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  425. }
  426. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  427. attendanceTempService.saveOrUpdate(attendanceTempEntity);
  428. } catch (Exception e) {
  429. e.printStackTrace();
  430. returnFlg = false;
  431. }
  432. // 所有签到时间去重排序
  433. HashSet<String> allDatetimeHashSet = new HashSet<String>(attendanceAllDatetimeList);
  434. attendanceAllDatetimeList.clear();
  435. attendanceAllDatetimeList.addAll(allDatetimeHashSet);
  436. Collections.sort(attendanceAllDatetimeList);
  437. String attendanceAllDatetimeStr = "";
  438. for(String str : attendanceAllDatetimeList) {
  439. attendanceAllDatetimeStr += str + ",";
  440. }
  441. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  442. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  443. }
  444. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  445. } else {
  446. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_6);
  447. }
  448. try {
  449. attendanceTempService.save(attendanceTempEntity);
  450. } catch (Exception e) {
  451. returnFlg = false;
  452. e.printStackTrace();
  453. }
  454. // ======为了容错的代码,正常情况下跑定时任务,每天的基本信息都会自动生成的,不会出现前一天的实时查看数据没有的情况====== END
  455. }
  456. }
  457. }
  458. }
  459. // ----------值夜班情况处理 ---20180308---yangxi---add---end-----------
  460. // 获取班次信息
  461. Map<String, Object> arrangeDutyEntityMap = this.getArrangeDutyInfo(dingAttendanceinfoEntity.getAttendanceDate(), dingAttendanceinfoEntity.getUserId());
  462. String arrangeDutyFlg = (String)arrangeDutyEntityMap.get("returnFlg");
  463. if("1".equals(arrangeDutyFlg)) {
  464. ArrangeDutyEntity arrangeDutyEntity = (ArrangeDutyEntity)arrangeDutyEntityMap.get("arrangeDutyEntity");
  465. // 班次类型为休息时,判断休息前一天是不是夜班
  466. if (Globals.DUTYTYPE_xiuxi.equals(arrangeDutyEntity.getDutyType())) {
  467. // 获取前一天的日期
  468. Date dateTempDate = new Date(dingAttendanceinfoEntity.getAttendanceDate().getTime() - 1000 * 60 * 60 * 24);
  469. // 获取班次信息
  470. Map<String, Object> arrangeDutyEntityMapTemp = this.getArrangeDutyInfo(dateTempDate, dingAttendanceinfoEntity.getUserId());
  471. String arrangeDutyEntityMapTempFlg = (String)arrangeDutyEntityMapTemp.get("returnFlg");
  472. if("1".equals(arrangeDutyEntityMapTempFlg)) {
  473. ArrangeDutyEntity arrangeDutyEntityTemp = (ArrangeDutyEntity)arrangeDutyEntityMapTemp.get("arrangeDutyEntity");
  474. if (Globals.DUTYTYPE_yeban115.equals(arrangeDutyEntityTemp.getDutyType())) {
  475. String attendanceTempByUserIdAndDateHql = "from AttendanceTempEntity where userId =? and attendanceDate = ?";
  476. List<AttendanceTempEntity> attendanceTempEntityList = attendanceTempService.findHql(attendanceTempByUserIdAndDateHql, dingAttendanceinfoEntity.getUserId(), dateTempDate);
  477. if(attendanceTempEntityList.size() > 0) {
  478. AttendanceTempEntity attendanceTempEntity = attendanceTempEntityList.get(0);
  479. // 计算签到时间,最新打卡时间
  480. List<String> attendanceTimeList = new ArrayList<String>();
  481. // 所有签到时间List
  482. List<String> attendanceAllDatetimeList = new ArrayList<String>();
  483. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  484. String tempStr = dateFormat.format(dingAttendanceinfoEntity.getAttendanceTime());
  485. attendanceTimeList.add(tempStr.substring(0, 16));
  486. attendanceAllDatetimeList.add(tempStr.substring(0, 16));
  487. if (null != attendanceTempEntity.getSignDate()) {
  488. String tempStr1 = dateFormat.format(attendanceTempEntity.getSignDate());
  489. attendanceTimeList.add(tempStr1.substring(0, 16));
  490. }
  491. if (null != attendanceTempEntity.getNewestPunchcardDate()) {
  492. String tempStr2 = dateFormat.format(attendanceTempEntity.getNewestPunchcardDate());
  493. attendanceTimeList.add(tempStr2.substring(0, 16));
  494. }
  495. if(null != attendanceTempEntity.getAlldatetime()) {
  496. String tempStr3 = attendanceTempEntity.getAlldatetime();
  497. List<String> alldatetimeList = Arrays.asList(tempStr3.split(","));
  498. for(String alldatetime : alldatetimeList) {
  499. attendanceAllDatetimeList.add(alldatetime);
  500. }
  501. }
  502. // 签到时间及最新打卡时间去重排序
  503. HashSet<String> hashSet = new HashSet<String>(attendanceTimeList);
  504. attendanceTimeList.clear();
  505. attendanceTimeList.addAll(hashSet);
  506. Collections.sort(attendanceTimeList);
  507. // 所有签到时间去重排序
  508. HashSet<String> allDatetimeHashSet = new HashSet<String>(attendanceAllDatetimeList);
  509. attendanceAllDatetimeList.clear();
  510. attendanceAllDatetimeList.addAll(allDatetimeHashSet);
  511. Collections.sort(attendanceAllDatetimeList);
  512. try {
  513. String attendanceAllDatetimeStr = "";
  514. for(String str : attendanceAllDatetimeList) {
  515. attendanceAllDatetimeStr += str + ",";
  516. }
  517. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  518. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  519. }
  520. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  521. if (attendanceTimeList.size() == 1) {
  522. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  523. }
  524. if (attendanceTimeList.size() > 1) {
  525. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  526. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  527. }
  528. attendanceTempService.saveOrUpdate(attendanceTempEntity);
  529. } catch (ParseException e) {
  530. e.printStackTrace();
  531. returnFlg = false;
  532. } catch (Exception e) {
  533. e.printStackTrace();
  534. returnFlg = false;
  535. }
  536. } else {
  537. // ======为了容错的代码,正常情况下跑定时任务,每天的基本信息都会自动生成的,不会出现前一天的实时查看数据没有的情况====== START
  538. AttendanceTempEntity attendanceTempEntity = new AttendanceTempEntity();
  539. // String userHql = "from TSBaseUser where id = ?";
  540. // List<TSBaseUser> userList = userService.findHql(userHql, dingAttendanceinfoEntity.getUserId());
  541. // TSBaseUser tsBaseUser = userList.get(0);
  542. TSUser tsBaseUser = userService.get(TSUser.class, dingAttendanceinfoEntity.getUserId());
  543. // 员工ID
  544. attendanceTempEntity.setUserId(tsBaseUser.getId());
  545. // 员工编号
  546. attendanceTempEntity.setUserCode(tsBaseUser.getUserNum());
  547. // 员工姓名
  548. attendanceTempEntity.setRealname(tsBaseUser.getRealName());
  549. // 查询所属单位
  550. StringBuilder mainOrgSql = new StringBuilder();
  551. mainOrgSql.append(" SELECT ");
  552. mainOrgSql.append(" depart.id id");
  553. mainOrgSql.append(" FROM t_s_user_org userOrg ");
  554. mainOrgSql.append(" LEFT JOIN t_s_depart depart ON userOrg.org_id = depart.id ");
  555. mainOrgSql.append(" WHERE ");
  556. mainOrgSql.append(" userOrg.user_id = '" + tsBaseUser.getId() + "'");
  557. mainOrgSql.append(" AND userOrg.status = '0' ");
  558. mainOrgSql.append(" AND userOrg.ifpluralism <> '1' ");
  559. List<Map<String, Object>> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString());
  560. // 所属单位ID
  561. attendanceTempEntity.setBelongUnitid((String)mainOrgMapList.get(0).get("id"));
  562. // 考勤日期
  563. attendanceTempEntity.setAttendanceDate(dateTempDate);
  564. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  565. String nowDateString = dfYMD.format(dateTempDate);
  566. // 获取班次信息
  567. Map<String, Object> arrangeDutyEntityMapTemp1 = this.getArrangeDutyInfo(dateTempDate, tsBaseUser.getId());
  568. String arrangeDutyEntityMapTemp1Flg = (String)arrangeDutyEntityMapTemp1.get("returnFlg");
  569. if("1".equals(arrangeDutyEntityMapTemp1Flg)) {
  570. ArrangeDutyEntity arrangeDutyEntity1 = (ArrangeDutyEntity)arrangeDutyEntityMapTemp1.get("arrangeDutyEntity");
  571. attendanceTempEntity.setArrangeDutyId(arrangeDutyEntity1.getId());
  572. int year = Integer.valueOf(nowDateString.substring(0,4));
  573. int month = Integer.valueOf(nowDateString.substring(5,7));
  574. int day = Integer.valueOf(nowDateString.substring(8,10));
  575. // 基准时间计算
  576. String normalworkStime = arrangeDutyEntity1.getNormalworkStime();
  577. String normalworkEtime = arrangeDutyEntity1.getNormalworkEtime();
  578. if(StringUtil.isNotEmpty(normalworkStime) && StringUtil.isNotEmpty(normalworkEtime)) {
  579. Date datumStime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkStime.substring(0, 2)), Integer.valueOf(normalworkStime.substring(3, 5)), 0);
  580. Date datumEtimeTemp = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkEtime.substring(0, 2)), Integer.valueOf(normalworkEtime.substring(3, 5)), 0);
  581. Date datumEtime = new Date(datumEtimeTemp.getTime() + 1000 * 60 * 60 * 24);
  582. // 设置基准时间
  583. attendanceTempEntity.setDatumStime(datumStime);
  584. attendanceTempEntity.setDatumEtime(datumEtime);
  585. }
  586. // 计算签到时间,最新打卡时间
  587. List<String> attendanceTimeList = new ArrayList<String>();
  588. // 所有签到时间List
  589. List<String> attendanceAllDatetimeList = new ArrayList<String>();
  590. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  591. String tempStr = dateFormat.format(dingAttendanceinfoEntity.getAttendanceTime());
  592. attendanceTimeList.add(tempStr.substring(0, 16));
  593. attendanceAllDatetimeList.add(tempStr.substring(0, 16));
  594. // 签到时间及最新打卡时间去重排序
  595. HashSet<String> h = new HashSet<String>(attendanceTimeList);
  596. attendanceTimeList.clear();
  597. attendanceTimeList.addAll(h);
  598. Collections.sort(attendanceTimeList);
  599. // 所有签到时间去重排序
  600. HashSet<String> allDatetimeHashSet = new HashSet<String>(attendanceAllDatetimeList);
  601. attendanceAllDatetimeList.clear();
  602. attendanceAllDatetimeList.addAll(allDatetimeHashSet);
  603. Collections.sort(attendanceAllDatetimeList);
  604. try {
  605. if (attendanceTimeList.size() == 1) {
  606. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  607. }
  608. if (attendanceTimeList.size() > 1) {
  609. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  610. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  611. }
  612. String attendanceAllDatetimeStr = "";
  613. for(String str : attendanceAllDatetimeList) {
  614. attendanceAllDatetimeStr += str + ",";
  615. }
  616. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  617. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  618. }
  619. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  620. } catch (ParseException e) {
  621. e.printStackTrace();
  622. returnFlg = false;
  623. }
  624. } else {
  625. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_6);
  626. }
  627. try {
  628. attendanceTempService.save(attendanceTempEntity);
  629. } catch (Exception e) {
  630. returnFlg = false;
  631. e.printStackTrace();
  632. }
  633. // ======为了容错的代码,正常情况下跑定时任务,每天的基本信息都会自动生成的,不会出现前一天的实时查看数据没有的情况====== END
  634. }
  635. }
  636. } else {
  637. // 前一天未排班
  638. ;
  639. }
  640. } else {
  641. // 当天不是休息
  642. ;
  643. }
  644. } else {
  645. // 当天未排班
  646. ;
  647. }
  648. }
  649. // 处理本日的数据
  650. String attendanceTempByUserIdAndDateHql = "from AttendanceTempEntity where userId =? and attendanceDate = ?";
  651. List<AttendanceTempEntity> attendanceTempEntityList = attendanceTempService.findHql(attendanceTempByUserIdAndDateHql, dingAttendanceinfoEntity.getUserId(), dingAttendanceinfoEntity.getAttendanceDate());
  652. AttendanceTempEntity attendanceTempEntity = new AttendanceTempEntity();
  653. if(attendanceTempEntityList.size() > 0) {
  654. attendanceTempEntity = attendanceTempEntityList.get(0);
  655. // 计算签到时间,最新打卡时间
  656. List<String> attendanceTimeList = new ArrayList<String>();
  657. // 所有签到时间List
  658. List<String> attendanceAllDatetimeList = new ArrayList<String>();
  659. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  660. String tempStr = dateFormat.format(dingAttendanceinfoEntity.getAttendanceTime());
  661. attendanceTimeList.add(tempStr.substring(0, 16));
  662. attendanceAllDatetimeList.add(tempStr.substring(0, 16));
  663. if (null != attendanceTempEntity.getSignDate()) {
  664. String tempStr1 = dateFormat.format(attendanceTempEntity.getSignDate());
  665. attendanceTimeList.add(tempStr1.substring(0, 16));
  666. }
  667. if (null != attendanceTempEntity.getNewestPunchcardDate()) {
  668. String tempStr2 = dateFormat.format(attendanceTempEntity.getNewestPunchcardDate());
  669. attendanceTimeList.add(tempStr2.substring(0, 16));
  670. }
  671. if(null != attendanceTempEntity.getAlldatetime()) {
  672. String tempStr3 = attendanceTempEntity.getAlldatetime();
  673. List<String> alldatetimeList = Arrays.asList(tempStr3.split(","));
  674. for(String alldatetime : alldatetimeList) {
  675. attendanceAllDatetimeList.add(alldatetime);
  676. }
  677. }
  678. HashSet<String> h = new HashSet<String>(attendanceTimeList);
  679. attendanceTimeList.clear();
  680. attendanceTimeList.addAll(h);
  681. Collections.sort(attendanceTimeList);
  682. // 所有签到时间去重排序
  683. HashSet<String> allDatetimeHashSet = new HashSet<String>(attendanceAllDatetimeList);
  684. attendanceAllDatetimeList.clear();
  685. attendanceAllDatetimeList.addAll(allDatetimeHashSet);
  686. Collections.sort(attendanceAllDatetimeList);
  687. try {
  688. // 一线员工
  689. if(Globals.MANAGETYPE_2.equals(personnelBaseArchivesManageEntity.getManagerType())) {
  690. // 获取班次信息
  691. Map<String, Object> arrangeDutyEntityMap = this.getArrangeDutyInfo(dingAttendanceinfoEntity.getAttendanceDate(), dingAttendanceinfoEntity.getUserId());
  692. String arrangeDutyFlg = (String)arrangeDutyEntityMap.get("returnFlg");
  693. if("1".equals(arrangeDutyFlg)) {
  694. ArrangeDutyEntity arrangeDutyEntity = (ArrangeDutyEntity)arrangeDutyEntityMap.get("arrangeDutyEntity");
  695. // 班次类型为休息时,判断休息前一天是不是夜班
  696. if (Globals.DUTYTYPE_xiuxi.equals(arrangeDutyEntity.getDutyType())) {
  697. // 获取前一天的日期
  698. Date dateTempDate = new Date(dingAttendanceinfoEntity.getAttendanceDate().getTime() - 1000 * 60 * 60 * 24);
  699. // 获取班次信息
  700. Map<String, Object> arrangeDutyEntityMapTemp = this.getArrangeDutyInfo(dateTempDate, dingAttendanceinfoEntity.getUserId());
  701. String arrangeDutyEntityMapTempFlg = (String)arrangeDutyEntityMapTemp.get("returnFlg");
  702. if("1".equals(arrangeDutyEntityMapTempFlg)) {
  703. ArrangeDutyEntity arrangeDutyEntityTemp = (ArrangeDutyEntity)arrangeDutyEntityMapTemp.get("arrangeDutyEntity");
  704. if (Globals.DUTYTYPE_yeban115.equals(arrangeDutyEntityTemp.getDutyType())) {
  705. ;
  706. } else {
  707. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  708. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntity, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, false);
  709. } else {
  710. if (attendanceTimeList.size() == 1) {
  711. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  712. }
  713. if (attendanceTimeList.size() > 1) {
  714. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  715. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  716. }
  717. }
  718. }
  719. } else {
  720. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  721. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntity, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, false);
  722. } else {
  723. if (attendanceTimeList.size() == 1) {
  724. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  725. }
  726. if (attendanceTimeList.size() > 1) {
  727. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  728. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  729. }
  730. }
  731. }
  732. } else {
  733. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  734. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntity, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, false);
  735. } else {
  736. if (attendanceTimeList.size() == 1) {
  737. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  738. }
  739. if (attendanceTimeList.size() > 1) {
  740. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  741. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  742. }
  743. }
  744. }
  745. } else {
  746. if (attendanceTimeList.size() == 1) {
  747. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  748. }
  749. if (attendanceTimeList.size() > 1) {
  750. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  751. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  752. }
  753. }
  754. } else {
  755. if (attendanceTimeList.size() == 1) {
  756. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  757. }
  758. if (attendanceTimeList.size() > 1) {
  759. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  760. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  761. }
  762. }
  763. String attendanceAllDatetimeStr = "";
  764. for(String str : attendanceAllDatetimeList) {
  765. attendanceAllDatetimeStr += str + ",";
  766. }
  767. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  768. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  769. }
  770. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  771. attendanceTempService.saveOrUpdate(attendanceTempEntity);
  772. } catch (ParseException e) {
  773. e.printStackTrace();
  774. returnFlg = false;
  775. } catch (Exception e) {
  776. e.printStackTrace();
  777. returnFlg = false;
  778. }
  779. } else {
  780. // String userHql = "from TSBaseUser where id = ?";
  781. // List<TSBaseUser> userList = userService.findHql(userHql, dingAttendanceinfoEntity.getUserId());
  782. // TSBaseUser tsBaseUser = userList.get(0);
  783. TSUser user = userService.get(TSUser.class, dingAttendanceinfoEntity.getUserId());
  784. // 员工ID
  785. attendanceTempEntity.setUserId(user.getId());
  786. // 员工编号
  787. attendanceTempEntity.setUserCode(user.getUserNum());
  788. // 员工姓名
  789. attendanceTempEntity.setRealname(user.getRealName());
  790. // 查询所属单位
  791. StringBuilder mainOrgSql = new StringBuilder();
  792. mainOrgSql.append(" SELECT ");
  793. mainOrgSql.append(" depart.id id");
  794. mainOrgSql.append(" FROM t_s_user_org userOrg ");
  795. mainOrgSql.append(" LEFT JOIN t_s_depart depart ON userOrg.org_id = depart.id ");
  796. mainOrgSql.append(" WHERE ");
  797. mainOrgSql.append(" userOrg.user_id = '" + user.getId() + "'");
  798. mainOrgSql.append(" AND userOrg.status = '0' ");
  799. mainOrgSql.append(" AND userOrg.ifpluralism <> '1' ");
  800. List<Map<String, Object>> mainOrgMapList = systemService.findForJdbc(mainOrgSql.toString());
  801. // 所属单位ID
  802. attendanceTempEntity.setBelongUnitid((String)mainOrgMapList.get(0).get("id"));
  803. // 考勤日期
  804. attendanceTempEntity.setAttendanceDate(dingAttendanceinfoEntity.getAttendanceDate());
  805. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  806. String nowDateString = dfYMD.format(dingAttendanceinfoEntity.getAttendanceDate());
  807. // 一线员工
  808. if(Globals.MANAGETYPE_2.equals(personnelBaseArchivesManageEntity.getManagerType())) {
  809. // 获取班次信息
  810. Map<String, Object> arrangeDutyEntityMap = this.getArrangeDutyInfo(dingAttendanceinfoEntity.getAttendanceDate(), user.getId());
  811. String arrangeDutyEntityFlg = (String)arrangeDutyEntityMap.get("returnFlg");
  812. if("1".equals(arrangeDutyEntityFlg)) {
  813. ArrangeDutyEntity arrangeDutyEntity = (ArrangeDutyEntity)arrangeDutyEntityMap.get("arrangeDutyEntity");
  814. attendanceTempEntity.setArrangeDutyId(arrangeDutyEntity.getId());
  815. // 班次类型为夜班
  816. int year = Integer.valueOf(nowDateString.substring(0,4));
  817. int month = Integer.valueOf(nowDateString.substring(5,7));
  818. int day = Integer.valueOf(nowDateString.substring(8,10));
  819. if(Globals.DUTYTYPE_yeban115.equals(arrangeDutyEntity.getDutyType())) {
  820. // 基准时间计算
  821. String normalworkStime = arrangeDutyEntity.getNormalworkStime();
  822. String normalworkEtime = arrangeDutyEntity.getNormalworkEtime();
  823. if(StringUtil.isNotEmpty(normalworkStime) && StringUtil.isNotEmpty(normalworkEtime)) {
  824. Date datumStime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkStime.substring(0, 2)), Integer.valueOf(normalworkStime.substring(3, 5)), 0);
  825. Date datumEtimeTemp = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkEtime.substring(0, 2)), Integer.valueOf(normalworkEtime.substring(3, 5)), 0);
  826. Date datumEtime = new Date(datumEtimeTemp.getTime() + 1000 * 60 * 60 * 24);
  827. // 设置基准时间
  828. attendanceTempEntity.setDatumStime(datumStime);
  829. attendanceTempEntity.setDatumEtime(datumEtime);
  830. }
  831. } else {
  832. // 基准时间计算
  833. String normalworkStime = arrangeDutyEntity.getNormalworkStime();
  834. String normalworkEtime = arrangeDutyEntity.getNormalworkEtime();
  835. if(StringUtil.isNotEmpty(normalworkStime) && StringUtil.isNotEmpty(normalworkEtime)) {
  836. Date datumStime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkStime.substring(0, 2)), Integer.valueOf(normalworkStime.substring(3, 5)), 0);
  837. Date datumEtime = new Date(year - 1900, month - 1, day, Integer.valueOf(normalworkEtime.substring(0, 2)), Integer.valueOf(normalworkEtime.substring(3, 5)), 0);
  838. // 设置基准时间
  839. attendanceTempEntity.setDatumStime(datumStime);
  840. attendanceTempEntity.setDatumEtime(datumEtime);
  841. }
  842. }
  843. } else {
  844. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_6);
  845. }
  846. } else {
  847. // 一线员工以外
  848. int year = Integer.valueOf(nowDateString.substring(0,4));
  849. int month = Integer.valueOf(nowDateString.substring(5,7));
  850. int day = Integer.valueOf(nowDateString.substring(8,10));
  851. String calendarHql = "from CalendarEntity where year =? and month =? and day = ?";
  852. List<CalendarEntity> calendarList = calendarService.findHql(calendarHql, year, month, day);
  853. if(Globals.dtype_0.equals(calendarList.get(0).getDtype())) {
  854. Date datumStime = new Date(year - 1900, month - 1, day, 8, 30, 0);
  855. Date datumEtime = new Date(year - 1900, month - 1, day, 17, 0, 0);
  856. // 设置基准时间
  857. attendanceTempEntity.setDatumStime(datumStime);
  858. attendanceTempEntity.setDatumEtime(datumEtime);
  859. } else {
  860. ;
  861. }
  862. }
  863. // 计算签到时间,最新打卡时间
  864. List<String> attendanceTimeList = new ArrayList<String>();
  865. // 所有签到时间List
  866. List<String> attendanceAllDatetimeList = new ArrayList<String>();
  867. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  868. String tempStr = dateFormat.format(dingAttendanceinfoEntity.getAttendanceTime());
  869. attendanceTimeList.add(tempStr.substring(0, 16));
  870. attendanceAllDatetimeList.add(tempStr.substring(0, 16));
  871. if (null != attendanceTempEntity.getSignDate()) {
  872. String tempStr1 = dateFormat.format(attendanceTempEntity.getSignDate());
  873. attendanceTimeList.add(tempStr1.substring(0, 16));
  874. }
  875. if (null != attendanceTempEntity.getNewestPunchcardDate()) {
  876. String tempStr2 = dateFormat.format(attendanceTempEntity.getNewestPunchcardDate());
  877. attendanceTimeList.add(tempStr2.substring(0, 16));
  878. }
  879. if(null != attendanceTempEntity.getAlldatetime()) {
  880. String tempStr3 = attendanceTempEntity.getAlldatetime();
  881. List<String> alldatetimeList = Arrays.asList(tempStr3.split(","));
  882. for(String alldatetime : alldatetimeList) {
  883. attendanceAllDatetimeList.add(alldatetime);
  884. }
  885. }
  886. HashSet<String> h = new HashSet<String>(attendanceTimeList);
  887. attendanceTimeList.clear();
  888. attendanceTimeList.addAll(h);
  889. Collections.sort(attendanceTimeList);
  890. // 所有签到时间去重排序
  891. HashSet<String> allDatetimeHashSet = new HashSet<String>(attendanceAllDatetimeList);
  892. attendanceAllDatetimeList.clear();
  893. attendanceAllDatetimeList.addAll(allDatetimeHashSet);
  894. Collections.sort(attendanceAllDatetimeList);
  895. try {
  896. // 一线员工
  897. if(Globals.MANAGETYPE_2.equals(personnelBaseArchivesManageEntity.getManagerType())) {
  898. // 获取班次信息
  899. Map<String, Object> arrangeDutyEntityMap = this.getArrangeDutyInfo(dingAttendanceinfoEntity.getAttendanceDate(), dingAttendanceinfoEntity.getUserId());
  900. String arrangeDutyFlg = (String)arrangeDutyEntityMap.get("returnFlg");
  901. if("1".equals(arrangeDutyFlg)) {
  902. ArrangeDutyEntity arrangeDutyEntity = (ArrangeDutyEntity)arrangeDutyEntityMap.get("arrangeDutyEntity");
  903. // 班次类型为休息时,判断休息前一天是不是夜班
  904. if (Globals.DUTYTYPE_xiuxi.equals(arrangeDutyEntity.getDutyType())) {
  905. // 获取前一天的日期
  906. Date dateTempDate = new Date(dingAttendanceinfoEntity.getAttendanceDate().getTime() - 1000 * 60 * 60 * 24);
  907. // 获取班次信息
  908. Map<String, Object> arrangeDutyEntityMapTemp = this.getArrangeDutyInfo(dateTempDate, dingAttendanceinfoEntity.getUserId());
  909. String arrangeDutyEntityMapTempFlg = (String)arrangeDutyEntityMapTemp.get("returnFlg");
  910. if("1".equals(arrangeDutyEntityMapTempFlg)) {
  911. ArrangeDutyEntity arrangeDutyEntityTemp = (ArrangeDutyEntity)arrangeDutyEntityMapTemp.get("arrangeDutyEntity");
  912. if (Globals.DUTYTYPE_yeban115.equals(arrangeDutyEntityTemp.getDutyType())) {
  913. ;
  914. } else {
  915. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  916. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntity, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, false);
  917. } else {
  918. if (attendanceTimeList.size() == 1) {
  919. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  920. }
  921. if (attendanceTimeList.size() > 1) {
  922. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  923. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  924. }
  925. }
  926. }
  927. } else {
  928. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  929. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntity, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, false);
  930. } else {
  931. if (attendanceTimeList.size() == 1) {
  932. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  933. }
  934. if (attendanceTimeList.size() > 1) {
  935. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  936. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  937. }
  938. }
  939. }
  940. } else {
  941. if (Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  942. attendanceTempEntity = this.getZhibanTime(arrangeDutyEntity, dingAttendanceinfoEntity, attendanceAllDatetimeList, attendanceTempEntity, false);
  943. } else {
  944. if (attendanceTimeList.size() == 1) {
  945. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  946. }
  947. if (attendanceTimeList.size() > 1) {
  948. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  949. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  950. }
  951. }
  952. }
  953. } else {
  954. if (attendanceTimeList.size() == 1) {
  955. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  956. }
  957. if (attendanceTimeList.size() > 1) {
  958. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  959. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  960. }
  961. }
  962. } else {
  963. if (attendanceTimeList.size() == 1) {
  964. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  965. }
  966. if (attendanceTimeList.size() > 1) {
  967. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeList.get(0) + ":00"));
  968. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeList.get(attendanceTimeList.size() - 1) + ":00"));
  969. }
  970. }
  971. String attendanceAllDatetimeStr = "";
  972. for(String str : attendanceAllDatetimeList) {
  973. attendanceAllDatetimeStr += str + ",";
  974. }
  975. if(StringUtil.isNotEmpty(attendanceAllDatetimeStr)) {
  976. attendanceAllDatetimeStr = attendanceAllDatetimeStr.substring(0,attendanceAllDatetimeStr.length() - 1);
  977. }
  978. attendanceTempEntity.setAlldatetime(attendanceAllDatetimeStr);
  979. attendanceTempService.save(attendanceTempEntity);
  980. } catch (ParseException e) {
  981. e.printStackTrace();
  982. returnFlg = false;
  983. } catch (Exception e) {
  984. e.printStackTrace();
  985. returnFlg = false;
  986. }
  987. }
  988. // 更新原始记录表中的数据为【已处理】
  989. dingAttendanceinfoEntity.setIsDispose(Globals.SHIFOU_01_1);
  990. try {
  991. dingAttendanceinfoService.saveOrUpdate(dingAttendanceinfoEntity);
  992. } catch (Exception e) {
  993. e.printStackTrace();
  994. returnFlg = false;
  995. }
  996. }
  997. }
  998. return returnFlg;
  999. }
  1000. /**
  1001. * 考勤实时查看分析考勤状态
  1002. *
  1003. */
  1004. @Override
  1005. public void SetAttendanceStatusAndWarning(Date date) {
  1006. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  1007. // 获取当前日期
  1008. Date nowDate = new Date();
  1009. if(null != date) {
  1010. nowDate = date;
  1011. }
  1012. Date yesterdayDate = new Date(nowDate.getTime() - 1000 * 60 * 60 * 24);
  1013. String nowDateString = dfYMD.format(nowDate);
  1014. String yesterdayDateString = dfYMD.format(yesterdayDate);
  1015. try {
  1016. nowDate = dfYMD.parse(nowDateString);
  1017. yesterdayDate = dfYMD.parse(yesterdayDateString);
  1018. } catch (ParseException e1) {
  1019. e1.printStackTrace();
  1020. }
  1021. long time1 = System.currentTimeMillis();
  1022. String attendanceTempByDateHql = "from AttendanceTempEntity where attendanceDate =? or attendanceDate = ?";
  1023. List<AttendanceTempEntity> attendanceTempEntityList = attendanceTempService.findHql(attendanceTempByDateHql, nowDate, yesterdayDate);
  1024. long time2 = System.currentTimeMillis();
  1025. //System.out.println("attendanceTempEntityList cost:"+(time2-time1) +" ms");
  1026. // 推送app消息的项目经理userid列表
  1027. ArrayList<String> userIdList=new ArrayList<String>();
  1028. for(AttendanceTempEntity attendanceTempEntity : attendanceTempEntityList) {
  1029. // if("000000006120dd1c01612cf521d40173".equals(attendanceTempEntity.getUserId())) {
  1030. // System.out.println("gllp");
  1031. // }
  1032. long time3 = System.currentTimeMillis();
  1033. String personnelByUserIdHql = "from PersonnelBaseArchivesManageEntity where userid = ?";
  1034. List<PersonnelBaseArchivesManageEntity> personnelBaseArchivesManageEntityList = personnelBaseArchivesManageService.findHql(personnelByUserIdHql, attendanceTempEntity.getUserId());
  1035. long time4 = System.currentTimeMillis();
  1036. //System.out.println("personnelBaseArchivesManageEntityList cost:"+(time4-time3) +" ms");
  1037. if(personnelBaseArchivesManageEntityList.size() == 0) {
  1038. continue;
  1039. }
  1040. PersonnelBaseArchivesManageEntity personnelBaseArchivesManageEntity = personnelBaseArchivesManageEntityList.get(0);
  1041. // 如果员工未离职
  1042. if(Globals.JOBSTATUS_1.equals(personnelBaseArchivesManageEntity.getPositionStatus()) || Globals.JOBSTATUS_2.equals(personnelBaseArchivesManageEntity.getPositionStatus())) {
  1043. // 一线员工
  1044. if(Globals.MANAGETYPE_2.equals(personnelBaseArchivesManageEntity.getManagerType())) {
  1045. long time5 = System.currentTimeMillis();
  1046. attendanceTempEntity = this.SetAttendanceStatus(attendanceTempEntity, attendanceTempEntityList,Globals.MANAGETYPE_2);
  1047. long time6 = System.currentTimeMillis();
  1048. //System.out.println("SetAttendanceStatus cost:"+(time6-time5) +" ms");
  1049. } else {
  1050. // 非一线员工(管理人员)
  1051. }
  1052. }
  1053. // 添加项目经理维度的预警消息数据
  1054. if(Globals.DUTYTYPE_zhiban.equals(attendanceTempEntity.getDutyType())){
  1055. // 值班状态下, 超过最晚打卡时间
  1056. if(attendanceTempEntity.getDatumEtime() != null && new Date().after(attendanceTempEntity.getDatumEtime())) {
  1057. long time7 = System.currentTimeMillis();
  1058. userIdList.addAll(this.setAttendanceWarnMsgByUser(attendanceTempEntity));
  1059. long time8 = System.currentTimeMillis();
  1060. //System.out.println("setAttendanceWarnMsgByUser cost:"+(time8-time7) +" ms");
  1061. }
  1062. }else {
  1063. long time9 = System.currentTimeMillis();
  1064. userIdList.addAll(this.setAttendanceWarnMsgByUser(attendanceTempEntity));
  1065. long time10 = System.currentTimeMillis();
  1066. //System.out.println("setAttendanceWarnMsgByUser cost:"+(time10-time9) +" ms");
  1067. }
  1068. // try {
  1069. // attendanceTempService.save(attendanceTempEntity);
  1070. // } catch (Exception e) {
  1071. // org.jeecgframework.core.util.LogUtil.error(e.getMessage());
  1072. // }
  1073. }
  1074. HashSet<String> hashSet = new HashSet<String>(userIdList);
  1075. userIdList.clear();
  1076. userIdList.addAll(hashSet);
  1077. pushProcessor.pushCommon(userIdList, Globals.msg_type_3);
  1078. //通过项目维度 统计计算预警消息
  1079. long time11 = System.currentTimeMillis();
  1080. this.setAttendanceWarnMsgByProject(yesterdayDate);
  1081. long time12 = System.currentTimeMillis();
  1082. //System.out.println("setAttendanceWarnMsgByProject yesterdayDate cost:"+(time12-time11) +" ms");
  1083. this.setAttendanceWarnMsgByProject(nowDate);
  1084. long time13 = System.currentTimeMillis();
  1085. //System.out.println("setAttendanceWarnMsgByProject nowDate cost:"+(time13-time12) +" ms");
  1086. }
  1087. /**
  1088. * 获取班次信息
  1089. *
  1090. * @param date
  1091. * @param userId
  1092. * @return
  1093. */
  1094. private Map<String, Object> getArrangeDutyInfo(Date date, String userId) {
  1095. Map<String, Object> returnMap = new HashMap<String, Object>();
  1096. // 检索项目排班详细表
  1097. String projarrangeDetailHql = "from ProjarrangeDetailEntity where userid =? and yearmonth = ?";
  1098. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  1099. String dateString = dfYMD.format(date);
  1100. String yearMonth = dateString.substring(0, 7);
  1101. List<ProjarrangeDetailEntity> projarrangeDetailEntityList = projarrangeDetailService.findHql(projarrangeDetailHql, userId, yearMonth);
  1102. if(projarrangeDetailEntityList.size() > 0) {
  1103. // 项目排班详细表ID
  1104. String projarrangeDetailId = projarrangeDetailEntityList.get(0).getId();
  1105. // 检索日历表
  1106. String calendarHql = "from CalendarEntity where year =? and month =? and day = ?";
  1107. int year = Integer.valueOf(dateString.substring(0,4));
  1108. int month = Integer.valueOf(dateString.substring(5,7));
  1109. int day = Integer.valueOf(dateString.substring(8,10));
  1110. List<CalendarEntity> calendarList = calendarService.findHql(calendarHql, year, month, day);
  1111. // 日历表ID
  1112. String calendarId = calendarList.get(0).getId();
  1113. // 检索员工排班详情表
  1114. String userArrangeDetailHql = "from UserArrangeDetailEntity where calendarid =? and projarrangeDetailid = ?";
  1115. List<UserArrangeDetailEntity> userArrangeDetailEntityList = userArrangeDetailService.findHql(userArrangeDetailHql, calendarId, projarrangeDetailId);
  1116. if(userArrangeDetailEntityList.size() > 0) {
  1117. // 班次ID
  1118. String arrangeDutyId = userArrangeDetailEntityList.get(0).getShiftid();
  1119. // 班次信息
  1120. String arrangeDutyHql = "from ArrangeDutyEntity where id = ?";
  1121. List<ArrangeDutyEntity> arrangeDutyEntityList = arrangeDutyService.findHql(arrangeDutyHql, arrangeDutyId);
  1122. ArrangeDutyEntity arrangeDutyEntity = new ArrangeDutyEntity();
  1123. if (arrangeDutyEntityList.size() != 0) {
  1124. arrangeDutyEntity = arrangeDutyEntityList.get(0);
  1125. returnMap.put("returnFlg", "1");
  1126. returnMap.put("arrangeDutyEntity", arrangeDutyEntity);
  1127. } else {
  1128. returnMap.put("returnFlg", "0");
  1129. returnMap.put("arrangeDutyEntity", new ArrangeDutyEntity());
  1130. }
  1131. } else {
  1132. returnMap.put("returnFlg", "0");
  1133. returnMap.put("arrangeDutyEntity", new ArrangeDutyEntity());
  1134. }
  1135. } else {
  1136. returnMap.put("returnFlg", "0");
  1137. returnMap.put("arrangeDutyEntity", new ArrangeDutyEntity());
  1138. }
  1139. return returnMap;
  1140. }
  1141. // /**
  1142. // * 判断员工是否离职
  1143. // *
  1144. // * @param entity
  1145. // * @param date
  1146. // * @return
  1147. // * @throws Exception
  1148. // */
  1149. // private boolean checkUserIsLeave(PersonnelBaseArchivesManageEntity entity, Date date) {
  1150. // boolean result = true;
  1151. // if (oConvertUtils.isNotEmpty(entity)&&oConvertUtils.isNotEmpty(date)) {
  1152. // Date leaveDate = entity.getLeaveDate();
  1153. // if (oConvertUtils.isEmpty(leaveDate)) {
  1154. // result = false;
  1155. // } else {
  1156. // result = leaveDate.before(date);
  1157. // }
  1158. // }
  1159. // return result;
  1160. // }
  1161. /**
  1162. * 设置考勤状态
  1163. *
  1164. * @param attendanceTempEntity
  1165. * @param attendanceTempEntityList
  1166. * @param manageType
  1167. * @return
  1168. */
  1169. private AttendanceTempEntity SetAttendanceStatus(AttendanceTempEntity attendanceTempEntity, List<AttendanceTempEntity> attendanceTempEntityList, String manageType) {
  1170. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  1171. SimpleDateFormat dfYMDHm = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  1172. // userId
  1173. String userId = attendanceTempEntity.getUserId();
  1174. // 考勤日期
  1175. Date todayDate = attendanceTempEntity.getAttendanceDate();
  1176. Date tomorrowDate = new Date(attendanceTempEntity.getAttendanceDate().getTime() + 1000 * 60 * 60 * 24);
  1177. Date yesterdayDate = new Date(attendanceTempEntity.getAttendanceDate().getTime() - 1000 * 60 * 60 * 24);
  1178. String todayDateStr = dfYMD.format(todayDate);
  1179. String tomorrowDateStr = dfYMD.format(tomorrowDate);
  1180. String yesterdayDateStr = dfYMD.format(yesterdayDate);
  1181. AttendanceTempEntity yesterdayTempEntity = getYesterdayTempEntity(attendanceTempEntityList, yesterdayDate);
  1182. // 计算后的基准出勤时间
  1183. String userBaseAttendanceTime = "";
  1184. // 计算后的基准退勤时间
  1185. String userBaseRetreatTime = "";
  1186. // 开始打卡分钟数
  1187. int spunchMinute = 0;
  1188. // 结束打卡分钟数
  1189. int epunchMinute = 0;
  1190. if(attendanceTempEntity.getAttendanceStatus() != null) {
  1191. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_0);
  1192. }
  1193. // // 是否请假
  1194. // List<HolidayEntity> holidayEntityList = attendanceTempDao.getHolidayEntityList(userId, attendanceDateStr, WorkFlowGlobals.BPM_BUS_STATUS_3);
  1195. // if(holidayEntityList.size() > 0) {
  1196. // String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1197. // if(StringUtil.isEmpty(attendanceStatus)) {
  1198. // attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_4);
  1199. // } else {
  1200. // attendanceTempEntity.setAttendanceStatus(attendanceStatus + "," + Globals.ATTENDANCE_STATUS_4);
  1201. // }
  1202. // }
  1203. // 一线员工
  1204. if(Globals.MANAGETYPE_2.equals(manageType)) {
  1205. String arrangeDutyId = attendanceTempEntity.getArrangeDutyId();
  1206. // 班次Id为空的情况,考勤状态设置未排班
  1207. if(StringUtil.isEmpty(arrangeDutyId)) {
  1208. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1209. if(StringUtil.isNotEmpty(attendanceStatus)) {
  1210. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_6;
  1211. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1212. } else{
  1213. attendanceStatus = Globals.ATTENDANCE_STATUS_6;
  1214. }
  1215. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1216. return attendanceTempEntity;
  1217. } else {
  1218. // 班次Id不为空的情况
  1219. String arrangeDutyHql = "from ArrangeDutyEntity where id = ?";
  1220. List<ArrangeDutyEntity> arrangeDutyEntityList = arrangeDutyService.findHql(arrangeDutyHql, arrangeDutyId);
  1221. ArrangeDutyEntity arrangeDutyEntity = arrangeDutyEntityList.get(0);
  1222. // 班次为加班,休息的情况状态都是正常
  1223. if(Globals.DUTYTYPE_jiaban.equals(arrangeDutyEntity.getDutyType()) || Globals.DUTYTYPE_xiuxi.equals(arrangeDutyEntity.getDutyType())) {
  1224. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_0);
  1225. return attendanceTempEntity;
  1226. }
  1227. // 班次为值班的情况
  1228. if(Globals.DUTYTYPE_zhiban.equals(arrangeDutyEntity.getDutyType())) {
  1229. attendanceTempEntity.setDutyType(Globals.DUTYTYPE_zhiban);
  1230. String ondutyStimeTemp = todayDateStr + " " + arrangeDutyEntity.getOndutyStime();
  1231. Date nowDate = new Date();
  1232. SimpleDateFormat hmFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  1233. String nowDateStr = hmFormat.format(nowDate);
  1234. if(nowDateStr.compareTo(ondutyStimeTemp) <= 0) {
  1235. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_0);
  1236. } else {
  1237. String allDateTime = attendanceTempEntity.getAlldatetime();
  1238. if(StringUtil.isNotEmpty(allDateTime)) {
  1239. String ondutyStime = arrangeDutyEntity.getOndutyStime();
  1240. String ondutyEtime = arrangeDutyEntity.getOndutyEtime();
  1241. if(ondutyStime.compareTo(ondutyEtime) > 0) {
  1242. ondutyStime = todayDateStr + " " + ondutyStime;
  1243. ondutyEtime = tomorrowDateStr + " " + ondutyEtime;
  1244. } else {
  1245. ondutyStime = todayDateStr + " " + ondutyStime;
  1246. ondutyEtime = todayDateStr + " " + ondutyEtime;
  1247. }
  1248. List<String> allDateTimeList = Arrays.asList(allDateTime.split(","));
  1249. for(String dateTime : allDateTimeList) {
  1250. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_3);
  1251. if (dateTime.compareTo(ondutyStime) >= 0 && dateTime.compareTo(ondutyEtime) <= 0) {
  1252. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_0);
  1253. break;
  1254. }
  1255. }
  1256. } else {
  1257. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_3);
  1258. }
  1259. }
  1260. return attendanceTempEntity;
  1261. } else {
  1262. if(Globals.DUTYTYPE_yeban115.equals(arrangeDutyEntity.getDutyType())) {
  1263. attendanceTempEntity.setDutyType(Globals.DUTYTYPE_yeban115);
  1264. // 正常上班时间
  1265. String normalworkStime = todayDateStr + " " + arrangeDutyEntity.getNormalworkStime();
  1266. // 正常下班时间
  1267. String normalworkEtime = tomorrowDateStr + " " + arrangeDutyEntity.getNormalworkEtime();
  1268. // 值班开始时间
  1269. String ondutyStime = "";
  1270. if(StringUtil.isNotEmpty(arrangeDutyEntity.getOndutyStime())) {
  1271. ondutyStime = tomorrowDateStr + " " + arrangeDutyEntity.getOndutyStime();
  1272. }
  1273. // 值班结束时间
  1274. String ondutyEtime = "";
  1275. if(StringUtil.isNotEmpty(arrangeDutyEntity.getOndutyEtime())) {
  1276. ondutyEtime = tomorrowDateStr + " " + arrangeDutyEntity.getOndutyEtime();
  1277. }
  1278. // 超时加班开始时间
  1279. String timeoutOvertimeStime = "";
  1280. if(StringUtil.isNotEmpty(arrangeDutyEntity.getTimeOutOvertimeStime())) {
  1281. timeoutOvertimeStime = tomorrowDateStr + " " + arrangeDutyEntity.getTimeOutOvertimeStime();
  1282. }
  1283. // 超时加班结束时间
  1284. String timeoutOvertimeEtime = "";
  1285. if(StringUtil.isNotEmpty(arrangeDutyEntity.getTimeOutOvertimeEtime())) {
  1286. timeoutOvertimeEtime = tomorrowDateStr + " " + arrangeDutyEntity.getTimeOutOvertimeEtime();
  1287. }
  1288. // 开始打卡分钟数
  1289. if(null != arrangeDutyEntity.getSpunchMinute()) {
  1290. spunchMinute = arrangeDutyEntity.getSpunchMinute();
  1291. }
  1292. // 结束打卡分钟数
  1293. if(null != arrangeDutyEntity.getEpunchMinute()) {
  1294. epunchMinute = arrangeDutyEntity.getEpunchMinute();
  1295. }
  1296. // 加班备案时间
  1297. Map<String, String> todayOvertimeRecord = new HashMap<String, String>();
  1298. Map<String, String> tomorrowOvertimeRecord = new HashMap<String, String>();
  1299. List<OvertimeRecordEntity> todayOvertimeRecordEntityList = attendanceTempDao.getOvertimeRecordEntityList(userId, todayDateStr);
  1300. List<OvertimeRecordEntity> tomorrowOvertimeRecordEntityList = attendanceTempDao.getOvertimeRecordEntityList(userId, tomorrowDateStr);
  1301. int i = 1;
  1302. for (OvertimeRecordEntity overtimeRecordEntity : todayOvertimeRecordEntityList) {
  1303. todayOvertimeRecord.put("overtimeRecordStime" + i, dfYMDHm.format(overtimeRecordEntity.getOvertimeStime()));
  1304. todayOvertimeRecord.put("overtimeRecordEtime" + i, dfYMDHm.format(overtimeRecordEntity.getOvertimeEtime()));
  1305. i++;
  1306. }
  1307. i = 1;
  1308. for (OvertimeRecordEntity overtimeRecordEntity : tomorrowOvertimeRecordEntityList) {
  1309. tomorrowOvertimeRecord.put("overtimeRecordStime" + i, dfYMDHm.format(overtimeRecordEntity.getOvertimeStime()));
  1310. tomorrowOvertimeRecord.put("overtimeRecordEtime" + i, dfYMDHm.format(overtimeRecordEntity.getOvertimeEtime()));
  1311. i++;
  1312. }
  1313. Map<String, String> baseTimeMap = getEffectiveAttendanceTime(normalworkStime, normalworkEtime, ondutyStime, ondutyEtime, timeoutOvertimeStime, timeoutOvertimeEtime, todayOvertimeRecord, tomorrowOvertimeRecord, "1");
  1314. String baseRetreatTimeTemp = baseTimeMap.get("baseRetreatTime");
  1315. String baseAttendanceTime = baseTimeMap.get("baseAttendanceTime");
  1316. String baseRetreatTime = baseTimeMap.get("baseRetreatTime");
  1317. userBaseAttendanceTime = baseAttendanceTime;
  1318. userBaseRetreatTime = baseRetreatTime;
  1319. HolidayEntity todayHolidayEntity = null;
  1320. HolidayEntity tomorrowHolidayEntity = null;
  1321. // 当天是否请假
  1322. List<HolidayEntity> attendanceHolidayEntityList = attendanceTempDao.getHolidayEntityList(attendanceTempEntity.getUserId(), todayDateStr, WorkFlowGlobals.BPM_BUS_STATUS_3);
  1323. // 当天请假开始时间和结束时间
  1324. String todayHolidayStime = "";
  1325. String todayHolidayEtime = "";
  1326. if(attendanceHolidayEntityList.size() != 0) {
  1327. // 考勤状态添加【请假】
  1328. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1329. if(StringUtil.isEmpty(attendanceStatus)) {
  1330. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_4);
  1331. } else {
  1332. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_4;
  1333. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1334. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1335. }
  1336. todayHolidayEntity = attendanceHolidayEntityList.get(0);
  1337. // 休假开始时间
  1338. Date holidayStime = todayHolidayEntity.getHolidayStime();
  1339. // 休假结束时间
  1340. Date holidayEtime = todayHolidayEntity.getHolidayEtime();
  1341. // 休假开始日期
  1342. String holidaySdate = dfYMD.format(holidayStime);
  1343. // 休假结束日期
  1344. String holidayEdate = dfYMD.format(holidayEtime);
  1345. // 请假开始日期等于当天
  1346. if(todayDateStr.equals(holidaySdate)) {
  1347. todayHolidayStime = dfYMDHm.format(holidayStime);
  1348. // 请假结束日期等于当天
  1349. if(todayDateStr.equals(holidayEdate)) {
  1350. todayHolidayEtime = dfYMDHm.format(holidayEtime);
  1351. } else {
  1352. todayHolidayEtime = tomorrowDateStr + " 00:00";
  1353. }
  1354. } else {
  1355. todayHolidayStime = todayDateStr + " 00:00";
  1356. // 请假结束日期等于当天
  1357. if(todayDateStr.equals(holidayEdate)) {
  1358. todayHolidayEtime = dfYMDHm.format(holidayEtime);
  1359. } else {
  1360. todayHolidayEtime = tomorrowDateStr + " 00:00";
  1361. }
  1362. }
  1363. if (todayHolidayStime.compareTo(baseAttendanceTime) <= 0 && todayHolidayEtime.compareTo(baseAttendanceTime) > 0) {
  1364. baseAttendanceTime = todayHolidayEtime;
  1365. }
  1366. }
  1367. // 第二天是否请假
  1368. List<HolidayEntity> tomorrowHolidayEntityList = attendanceTempDao.getHolidayEntityList(attendanceTempEntity.getUserId(), tomorrowDateStr, WorkFlowGlobals.BPM_BUS_STATUS_3);
  1369. // 第二天请假开始时间和结束时间
  1370. String tomorrowHolidayStime = "";
  1371. String tomorrowHolidayEtime = "";
  1372. if(tomorrowHolidayEntityList.size() != 0) {
  1373. // 考勤状态添加【请假】
  1374. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1375. if(StringUtil.isEmpty(attendanceStatus)) {
  1376. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_4);
  1377. } else {
  1378. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_4;
  1379. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1380. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1381. }
  1382. tomorrowHolidayEntity = tomorrowHolidayEntityList.get(0);
  1383. // 休假开始时间
  1384. Date holidayStime = tomorrowHolidayEntity.getHolidayStime();
  1385. // 休假结束时间
  1386. Date holidayEtime = tomorrowHolidayEntity.getHolidayEtime();
  1387. // 休假开始日期
  1388. String holidaySdate = dfYMD.format(holidayStime);
  1389. // 休假结束日期
  1390. String holidayEdate = dfYMD.format(holidayEtime);
  1391. // 请假开始日期等于当天
  1392. if(tomorrowDateStr.equals(holidaySdate)) {
  1393. tomorrowHolidayStime = dfYMDHm.format(holidayStime);
  1394. // 请假结束日期等于当天
  1395. if(tomorrowDateStr.equals(holidayEdate)) {
  1396. tomorrowHolidayEtime = dfYMDHm.format(holidayEtime);
  1397. } else {
  1398. tomorrowHolidayEtime = tomorrowDateStr + " 23:59";
  1399. }
  1400. } else {
  1401. tomorrowHolidayStime = tomorrowDateStr + " 00:00";
  1402. // 请假结束日期等于当天
  1403. if(tomorrowDateStr.equals(holidayEdate)) {
  1404. tomorrowHolidayEtime = dfYMDHm.format(holidayEtime);
  1405. } else {
  1406. tomorrowHolidayEtime = tomorrowDateStr + " 23:59";
  1407. }
  1408. }
  1409. if (tomorrowHolidayStime.compareTo(baseAttendanceTime) <= 0 && tomorrowHolidayEtime.compareTo(baseAttendanceTime) > 0) {
  1410. if(tomorrowHolidayEtime.compareTo(baseRetreatTimeTemp) >= 0) {
  1411. ;
  1412. } else {
  1413. baseAttendanceTime = tomorrowHolidayEtime;
  1414. }
  1415. }
  1416. if (tomorrowHolidayStime.compareTo(baseRetreatTime) < 0 && tomorrowHolidayEtime.compareTo(baseRetreatTime) >= 0) {
  1417. baseRetreatTime = tomorrowHolidayStime;
  1418. }
  1419. }
  1420. if(todayHolidayEntity != null) {
  1421. String holidayType = todayHolidayEntity.getHolidayType();
  1422. if(!Globals.REST_TYPE_0.equals(holidayType) && !Globals.REST_TYPE_1.equals(holidayType)
  1423. &&!Globals.REST_TYPE_7.equals(holidayType)) {
  1424. return attendanceTempEntity;
  1425. }
  1426. }
  1427. if(baseAttendanceTime.equals(baseRetreatTime)) {
  1428. return attendanceTempEntity;
  1429. } else {
  1430. userBaseAttendanceTime = baseAttendanceTime;
  1431. userBaseRetreatTime = baseRetreatTime;
  1432. }
  1433. } else {
  1434. // 正常上班时间
  1435. String normalworkStime = todayDateStr + " " + arrangeDutyEntity.getNormalworkStime();
  1436. // 正常下班时间
  1437. String normalworkEtime = todayDateStr + " " + arrangeDutyEntity.getNormalworkEtime();
  1438. // 值班开始时间
  1439. String ondutyStime = "";
  1440. if(StringUtil.isNotEmpty(arrangeDutyEntity.getOndutyStime())) {
  1441. ondutyStime = todayDateStr + " " + arrangeDutyEntity.getOndutyStime();
  1442. }
  1443. // 值班结束时间
  1444. String ondutyEtime = "";
  1445. if(StringUtil.isNotEmpty(arrangeDutyEntity.getOndutyEtime())) {
  1446. ondutyEtime = todayDateStr + " " + arrangeDutyEntity.getOndutyEtime();
  1447. }
  1448. // 超时加班开始时间
  1449. String timeoutOvertimeStime = "";
  1450. if(StringUtil.isNotEmpty(arrangeDutyEntity.getTimeOutOvertimeStime())) {
  1451. timeoutOvertimeStime = todayDateStr + " " + arrangeDutyEntity.getTimeOutOvertimeStime();
  1452. }
  1453. // 超时加班结束时间
  1454. String timeoutOvertimeEtime = "";
  1455. if(StringUtil.isNotEmpty(arrangeDutyEntity.getTimeOutOvertimeEtime())) {
  1456. timeoutOvertimeEtime = todayDateStr + " " + arrangeDutyEntity.getTimeOutOvertimeEtime();
  1457. }
  1458. // 开始打卡分钟数
  1459. if(null != arrangeDutyEntity.getSpunchMinute()) {
  1460. spunchMinute = arrangeDutyEntity.getSpunchMinute();
  1461. }
  1462. // 结束打卡分钟数
  1463. if(null != arrangeDutyEntity.getEpunchMinute()) {
  1464. epunchMinute = arrangeDutyEntity.getEpunchMinute();
  1465. }
  1466. // 加班备案时间
  1467. Map<String, String> todayOvertimeRecord = new HashMap<String, String>();
  1468. Map<String, String> tomorrowOvertimeRecord = new HashMap<String, String>();
  1469. List<OvertimeRecordEntity> todayOvertimeRecordEntityList = attendanceTempDao.getOvertimeRecordEntityList(userId, todayDateStr);
  1470. int i = 1;
  1471. for (OvertimeRecordEntity overtimeRecordEntity : todayOvertimeRecordEntityList) {
  1472. todayOvertimeRecord.put("overtimeRecordStime" + i, dfYMDHm.format(overtimeRecordEntity.getOvertimeStime()));
  1473. todayOvertimeRecord.put("overtimeRecordEtime" + i, dfYMDHm.format(overtimeRecordEntity.getOvertimeEtime()));
  1474. i++;
  1475. }
  1476. Map<String, String> baseTimeMap = getEffectiveAttendanceTime(normalworkStime, normalworkEtime, ondutyStime, ondutyEtime, timeoutOvertimeStime, timeoutOvertimeEtime, todayOvertimeRecord, tomorrowOvertimeRecord, "0");
  1477. String baseAttendanceTime = baseTimeMap.get("baseAttendanceTime");
  1478. String baseRetreatTime = baseTimeMap.get("baseRetreatTime");
  1479. userBaseAttendanceTime = baseAttendanceTime;
  1480. userBaseRetreatTime = baseRetreatTime;
  1481. HolidayEntity todayHolidayEntity = null;
  1482. // 当天是否请假
  1483. List<HolidayEntity> attendanceHolidayEntityList = attendanceTempDao.getHolidayEntityList(attendanceTempEntity.getUserId(), todayDateStr, WorkFlowGlobals.BPM_BUS_STATUS_3);
  1484. // 当天请假开始时间和结束时间
  1485. String todayHolidayStime = "";
  1486. String todayHolidayEtime = "";
  1487. if(attendanceHolidayEntityList.size() != 0) {
  1488. // 考勤状态添加【请假】
  1489. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1490. if(StringUtil.isEmpty(attendanceStatus)) {
  1491. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_4);
  1492. } else {
  1493. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_4;
  1494. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1495. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1496. }
  1497. for(int j = 0; j < attendanceHolidayEntityList.size(); j++) {
  1498. todayHolidayEntity = attendanceHolidayEntityList.get(j);
  1499. // 休假开始时间
  1500. Date holidayStime = todayHolidayEntity.getHolidayStime();
  1501. // 休假结束时间
  1502. Date holidayEtime = todayHolidayEntity.getHolidayEtime();
  1503. // 休假开始日期
  1504. String holidaySdate = dfYMD.format(holidayStime);
  1505. // 休假结束日期
  1506. String holidayEdate = dfYMD.format(holidayEtime);
  1507. // 请假开始日期等于当天
  1508. if(todayDateStr.equals(holidaySdate)) {
  1509. todayHolidayStime = dfYMDHm.format(holidayStime);
  1510. // 请假结束日期等于当天
  1511. if(todayDateStr.equals(holidayEdate)) {
  1512. todayHolidayEtime = dfYMDHm.format(holidayEtime);
  1513. } else {
  1514. todayHolidayEtime = tomorrowDateStr + " 00:00";
  1515. }
  1516. } else {
  1517. todayHolidayStime = todayDateStr + " 00:00";
  1518. // 请假结束日期等于当天
  1519. if(todayDateStr.equals(holidayEdate)) {
  1520. todayHolidayEtime = dfYMDHm.format(holidayEtime);
  1521. } else {
  1522. todayHolidayEtime = tomorrowDateStr + " 00:00";
  1523. }
  1524. }
  1525. if(todayHolidayStime.equals(todayDateStr + " 00:00") && todayHolidayEtime.equals(tomorrowDateStr + " 00:00")) {
  1526. return attendanceTempEntity;
  1527. } else {
  1528. if(todayHolidayStime.compareTo(baseAttendanceTime) <= 0) {
  1529. if(todayHolidayEtime.compareTo(baseAttendanceTime) >= 0 && todayHolidayEtime.compareTo(baseRetreatTime) <= 0) {
  1530. baseAttendanceTime = todayHolidayEtime;
  1531. }
  1532. if(todayHolidayEtime.compareTo(baseAttendanceTime) >= 0 && todayHolidayEtime.compareTo(baseRetreatTime) >= 0) {
  1533. return attendanceTempEntity;
  1534. }
  1535. }
  1536. if(todayHolidayStime.compareTo(baseAttendanceTime) > 0 && todayHolidayStime.compareTo(baseRetreatTime) < 0) {
  1537. if(todayHolidayEtime.compareTo(baseRetreatTime) >= 0) {
  1538. baseRetreatTime = todayHolidayStime;
  1539. }
  1540. }
  1541. }
  1542. if(todayHolidayEntity != null) {
  1543. String holidayType = todayHolidayEntity.getHolidayType();
  1544. if(!Globals.REST_TYPE_0.equals(holidayType) && !Globals.REST_TYPE_1.equals(holidayType)) {
  1545. return attendanceTempEntity;
  1546. }
  1547. }
  1548. if(baseAttendanceTime.equals(baseRetreatTime)) {
  1549. return attendanceTempEntity;
  1550. } else {
  1551. userBaseAttendanceTime = baseAttendanceTime;
  1552. userBaseRetreatTime = baseRetreatTime;
  1553. }
  1554. }
  1555. }
  1556. }
  1557. try {
  1558. Date nowDate = new Date();
  1559. Date userBaseAttendanceDateTime = dfYMDHm.parse(userBaseAttendanceTime);
  1560. Date userBaseRetreatDateTime = dfYMDHm.parse(userBaseRetreatTime);
  1561. // 当前时间Calendar
  1562. Calendar nowDateCalendar = Calendar.getInstance();
  1563. nowDateCalendar.setTime(nowDate);
  1564. // 基准出勤时间Calendar
  1565. Calendar userBaseAttendanceCalendar = Calendar.getInstance();
  1566. userBaseAttendanceCalendar.setTime(userBaseAttendanceDateTime);
  1567. Calendar userBaseAttendanceTempCalendar = Calendar.getInstance();
  1568. userBaseAttendanceTempCalendar.setTime(userBaseAttendanceDateTime);
  1569. // 基准退勤时间Calendar
  1570. Calendar userBaseRetreatCalendar = Calendar.getInstance();
  1571. userBaseRetreatCalendar.setTime(userBaseRetreatDateTime);
  1572. Calendar userBaseRetreatTempCalendar = Calendar.getInstance();
  1573. userBaseRetreatTempCalendar.setTime(userBaseRetreatDateTime);
  1574. if(spunchMinute != 0) {
  1575. userBaseAttendanceTempCalendar.add(Calendar.MINUTE, -spunchMinute);
  1576. }
  1577. if(epunchMinute != 0) {
  1578. userBaseRetreatTempCalendar.add(Calendar.MINUTE, epunchMinute);
  1579. }
  1580. String allDateTime = attendanceTempEntity.getAlldatetime();
  1581. List<String> allDateTimeList = new ArrayList<String>();
  1582. if(StringUtil.isNotEmpty(allDateTime)) {
  1583. List<String> allDateTimeTempList = Arrays.asList(allDateTime.split(","));
  1584. for(String temp : allDateTimeTempList) {
  1585. allDateTimeList.add(temp);
  1586. }
  1587. }
  1588. // 实际出勤时间
  1589. String attendanceDateTime = "";
  1590. // 实际退勤时间
  1591. String retreatDateTime = "";
  1592. for(String dateTimeString : allDateTimeList) {
  1593. Date dateTime = dfYMDHm.parse(dateTimeString);
  1594. Calendar dateTimeCalendar = Calendar.getInstance();
  1595. dateTimeCalendar.setTime(dateTime);
  1596. if(!dateTimeCalendar.before(userBaseAttendanceTempCalendar)) {
  1597. if(StringUtil.isEmpty(attendanceDateTime)) {
  1598. attendanceDateTime = dateTimeString;
  1599. continue;
  1600. }
  1601. } else {
  1602. continue;
  1603. }
  1604. if(!dateTimeCalendar.after(userBaseRetreatTempCalendar)) {
  1605. retreatDateTime = dateTimeString;
  1606. }
  1607. }
  1608. if(nowDateCalendar.after(userBaseAttendanceTempCalendar)) {
  1609. if(StringUtil.isNotEmpty(attendanceDateTime)) {
  1610. Date attendanceDateTimeForDate = dfYMDHm.parse(attendanceDateTime);
  1611. Calendar attendanceDateTimeForDateCalendar = Calendar.getInstance();
  1612. attendanceDateTimeForDateCalendar.setTime(attendanceDateTimeForDate);
  1613. int dateDiffint = DataUtils.dateDiff('m', attendanceDateTimeForDateCalendar,userBaseAttendanceCalendar);
  1614. if(dateDiffint > 10 && dateDiffint <= 30) {
  1615. attendanceTempEntity.setLateminute(dateDiffint);
  1616. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1617. if(StringUtil.isEmpty(attendanceStatus)) {
  1618. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_1);
  1619. } else {
  1620. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_1;
  1621. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1622. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1623. }
  1624. }
  1625. }
  1626. if(StringUtil.isNotEmpty(retreatDateTime)) {
  1627. Date retreatDateTimeForDate = dfYMDHm.parse(retreatDateTime);
  1628. Calendar retreatDateTimeForDateCalendar = Calendar.getInstance();
  1629. retreatDateTimeForDateCalendar.setTime(retreatDateTimeForDate);
  1630. int dateDiffint = DataUtils.dateDiff('m', userBaseRetreatCalendar,retreatDateTimeForDateCalendar);
  1631. if(dateDiffint > 10 && dateDiffint <= 30) {
  1632. attendanceTempEntity.setLeaveearlyminute(dateDiffint);
  1633. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1634. if(StringUtil.isEmpty(attendanceStatus)) {
  1635. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_2);
  1636. } else {
  1637. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_2;
  1638. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1639. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1640. }
  1641. }
  1642. }
  1643. }
  1644. if(nowDateCalendar.after(userBaseRetreatTempCalendar)) {
  1645. if(arrangeDutyEntity.getDutyType().equals(Globals.DUTYTYPE_yeban115)) {
  1646. retreatDateTime = getTomorrowTetreatDateTime(attendanceTempEntity, arrangeDutyEntity, userBaseRetreatDateTime);
  1647. }
  1648. if(StringUtil.isEmpty(attendanceDateTime) || StringUtil.isEmpty(retreatDateTime)) {
  1649. if(StringUtil.isEmpty(attendanceDateTime) && StringUtil.isEmpty(retreatDateTime)) {
  1650. // 两次都没打卡,算旷工
  1651. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1652. if(StringUtil.isEmpty(attendanceStatus)) {
  1653. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_3);
  1654. } else {
  1655. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_3;
  1656. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1657. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1658. }
  1659. }else {
  1660. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1661. if(StringUtil.isEmpty(attendanceStatus)) {
  1662. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_5);
  1663. } else {
  1664. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_5;
  1665. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1666. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1667. }
  1668. }
  1669. } else {
  1670. // 出勤是否旷工
  1671. Date attendanceDateTimeForDate = dfYMDHm.parse(attendanceDateTime);
  1672. Calendar attendanceDateTimeForDateCalendar = Calendar.getInstance();
  1673. attendanceDateTimeForDateCalendar.setTime(attendanceDateTimeForDate);
  1674. int attendanceDateTimeDiffint = DataUtils.dateDiff('m', attendanceDateTimeForDateCalendar,userBaseAttendanceCalendar);
  1675. if(attendanceDateTimeDiffint > 30) {
  1676. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1677. if(StringUtil.isEmpty(attendanceStatus)) {
  1678. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_3);
  1679. } else {
  1680. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_3;
  1681. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1682. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1683. }
  1684. }
  1685. // 退勤是否旷工
  1686. Date retreatDateTimeForDate = dfYMDHm.parse(retreatDateTime);
  1687. Calendar retreatDateTimeForDateCalendar = Calendar.getInstance();
  1688. retreatDateTimeForDateCalendar.setTime(retreatDateTimeForDate);
  1689. int retreatDateTimeDiffint = DataUtils.dateDiff('m', userBaseRetreatCalendar,retreatDateTimeForDateCalendar);
  1690. if(retreatDateTimeDiffint > 30) {
  1691. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  1692. if(StringUtil.isEmpty(attendanceStatus)) {
  1693. attendanceTempEntity.setAttendanceStatus(Globals.ATTENDANCE_STATUS_3);
  1694. } else {
  1695. attendanceStatus += "," + Globals.ATTENDANCE_STATUS_3;
  1696. attendanceStatus = attendanceStatusSort(attendanceStatus);
  1697. attendanceTempEntity.setAttendanceStatus(attendanceStatus);
  1698. }
  1699. }
  1700. }
  1701. }
  1702. } catch (ParseException e1) {
  1703. e1.printStackTrace();
  1704. }
  1705. }
  1706. }
  1707. } else {
  1708. // 非一线员工
  1709. }
  1710. return attendanceTempEntity;
  1711. }
  1712. /**
  1713. * @param attendanceTempEntity
  1714. * @param arrangeDutyEntity
  1715. * @param userBaseRetreatDateTime
  1716. * @return
  1717. */
  1718. private String getTomorrowTetreatDateTime(AttendanceTempEntity attendanceTempEntity,
  1719. ArrangeDutyEntity arrangeDutyEntity, Date standardEndDateTime) {
  1720. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1721. Calendar standardEndCalendar = Calendar.getInstance();
  1722. standardEndCalendar.setTime(standardEndDateTime);
  1723. Calendar retreatCalendar = Calendar.getInstance();
  1724. retreatCalendar.setTime(standardEndDateTime);
  1725. if(null != arrangeDutyEntity.getEpunchMinute()) {
  1726. retreatCalendar.add(Calendar.MINUTE, arrangeDutyEntity.getEpunchMinute()+1);
  1727. }
  1728. CriteriaQuery cq = new CriteriaQuery(DingAttendanceinfoEntity.class);
  1729. cq.eq("userId", attendanceTempEntity.getUserId());
  1730. cq.add();
  1731. cq.between("attendanceTime", standardEndCalendar.getTime(), retreatCalendar.getTime());
  1732. cq.add();
  1733. cq.addOrder("attendanceTime", SortDirection.desc);
  1734. // String hql = "from DingAttendanceinfoEntity where attendanceTime like '" +sdf.format(userBaseRetreatTempCalendar)+"%' "
  1735. // + "and userId='" +attendanceTempEntity.getUserId() +"'";
  1736. List<DingAttendanceinfoEntity> entitiesFromDB = systemService.getListByCriteriaQuery(cq, false);
  1737. if(entitiesFromDB != null && entitiesFromDB.size()>0) {
  1738. Date attTime = entitiesFromDB.get(0).getAttendanceTime();
  1739. return sdf.format(attTime);
  1740. }
  1741. return null;
  1742. }
  1743. /**
  1744. * @param attendanceTempEntity
  1745. * @param userBaseRetreatTempCalendar
  1746. * @return
  1747. */
  1748. private String getTomorrowTetreatDateTime(AttendanceTempEntity attendanceTempEntity, Calendar userBaseRetreatTempCalendar) {
  1749. String strDateFormat = "yyyy-MM";
  1750. SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
  1751. // CriteriaQuery cq = new CriteriaQuery(DingAttendanceinfoEntity.class);
  1752. // cq.like("attendanceTime", sdf.format(userBaseRetreatTempCalendar)+"%");
  1753. // cq.add();
  1754. // cq.between("attendanceTime", curdate, tomdate);
  1755. // cq.add();
  1756. // cq.addOrder("attendanceTime", SortDirection.asc);
  1757. String hql = "from DingAttendanceinfoEntity where attendanceTime like '" +sdf.format(userBaseRetreatTempCalendar)+"%' "
  1758. + "and userId='" +attendanceTempEntity.getUserId() +"'";
  1759. List<DingAttendanceinfoEntity> entitiesFromDB = systemService.findHql(hql);
  1760. return null;
  1761. }
  1762. /**
  1763. * @param attendanceTempEntityList
  1764. * @param yesterdayDateStr
  1765. * @return
  1766. */
  1767. private AttendanceTempEntity getYesterdayTempEntity(List<AttendanceTempEntity> attendanceTempEntityList,
  1768. Date yesterdayDate) {
  1769. if(yesterdayDate != null && attendanceTempEntityList != null && attendanceTempEntityList.size()>0) {
  1770. for(AttendanceTempEntity entity : attendanceTempEntityList) {
  1771. if(entity.getAttendanceDate().compareTo(yesterdayDate) == 0) {
  1772. return entity;
  1773. }
  1774. }
  1775. }
  1776. return null;
  1777. }
  1778. /**
  1779. * 获取基准出退勤时间(不包含请假,开始结束打卡分钟数)
  1780. *
  1781. * @param normalworkStime 正常上班时间
  1782. * @param normalworkEtime 正常下班时间
  1783. * @param ondutyStime 值班开始时间
  1784. * @param ondutyEtime 值班结束时间
  1785. * @param timeoutOvertimeStime 超时加班开始时间
  1786. * @param timeoutOvertimeEtime 超时加班结束时间
  1787. * @param todayOvertimeRecord 当天加班备案开始时间
  1788. * @param tomorrowOvertimeRecord 第二天加班备案时间
  1789. * @param flg 白班夜班区分 1:夜班
  1790. * @return Map<String, String>
  1791. * baseAttendanceTime 基准开始时间
  1792. * baseRetreatTime 基准结束时间
  1793. */
  1794. private Map<String, String> getEffectiveAttendanceTime(
  1795. String normalworkStime, String normalworkEtime, String ondutyStime,
  1796. String ondutyEtime, String timeoutOvertimeStime,
  1797. String timeoutOvertimeEtime,
  1798. Map<String, String> todayOvertimeRecord,
  1799. Map<String, String> tomorrowOvertimeRecord,
  1800. String flg) {
  1801. Map<String, String> returnMap = new HashMap<String, String>();
  1802. // 基准出勤时间
  1803. String baseAttendanceTime = normalworkStime;
  1804. // 基准退勤时间
  1805. String baseRetreatTime = normalworkEtime;
  1806. // 基准出勤时间计算
  1807. if (StringUtil.isNotEmpty(ondutyStime)) {
  1808. if (StringUtil.isNotEmpty(timeoutOvertimeStime)) {
  1809. if (baseAttendanceTime.equals(timeoutOvertimeEtime)) {
  1810. baseAttendanceTime = timeoutOvertimeStime;
  1811. if (baseAttendanceTime.equals(ondutyEtime)) {
  1812. baseAttendanceTime = ondutyStime;
  1813. } else {
  1814. ;
  1815. }
  1816. } else {
  1817. if (baseAttendanceTime.equals(ondutyEtime)) {
  1818. baseAttendanceTime = ondutyStime;
  1819. if (baseAttendanceTime.equals(timeoutOvertimeEtime)) {
  1820. baseAttendanceTime = timeoutOvertimeStime;
  1821. } else {
  1822. ;
  1823. }
  1824. }
  1825. }
  1826. } else {
  1827. if (baseAttendanceTime.equals(ondutyEtime)) {
  1828. baseAttendanceTime = ondutyStime;
  1829. } else {
  1830. ;
  1831. }
  1832. }
  1833. } else {
  1834. if (StringUtil.isNotEmpty(timeoutOvertimeStime)) {
  1835. if (baseAttendanceTime.equals(timeoutOvertimeEtime)) {
  1836. baseAttendanceTime = timeoutOvertimeStime;
  1837. } else {
  1838. ;
  1839. }
  1840. }
  1841. }
  1842. // 基准退勤时间计算
  1843. if (StringUtil.isNotEmpty(ondutyStime)) {
  1844. if (StringUtil.isNotEmpty(timeoutOvertimeStime)) {
  1845. if (baseRetreatTime.equals(timeoutOvertimeStime)) {
  1846. baseRetreatTime = timeoutOvertimeEtime;
  1847. if (baseRetreatTime.equals(ondutyStime)) {
  1848. baseRetreatTime = ondutyEtime;
  1849. } else {
  1850. ;
  1851. }
  1852. } else {
  1853. if (baseRetreatTime.equals(ondutyStime)) {
  1854. baseRetreatTime = ondutyEtime;
  1855. if (baseRetreatTime.equals(timeoutOvertimeStime)) {
  1856. baseRetreatTime = timeoutOvertimeEtime;
  1857. } else {
  1858. ;
  1859. }
  1860. } else {
  1861. ;
  1862. }
  1863. }
  1864. } else {
  1865. if (baseRetreatTime.equals(ondutyStime)) {
  1866. baseRetreatTime = ondutyEtime;
  1867. } else {
  1868. ;
  1869. }
  1870. }
  1871. } else {
  1872. if (StringUtil.isNotEmpty(timeoutOvertimeStime)) {
  1873. if (baseRetreatTime.equals(timeoutOvertimeStime)) {
  1874. baseRetreatTime = timeoutOvertimeEtime;
  1875. } else {
  1876. ;
  1877. }
  1878. }
  1879. }
  1880. int todayOvertimeRecordSize = todayOvertimeRecord.size() / 2;
  1881. int tomorrowOvertimeRecordSize = tomorrowOvertimeRecord.size() / 2;
  1882. if("1".equals(flg)) {
  1883. if(todayOvertimeRecordSize > 0) {
  1884. for(int i = 1; i <= todayOvertimeRecordSize; i++) {
  1885. String todayOvertimeRecordStr = todayOvertimeRecord.get("overtimeRecordEtime" + i);
  1886. if (baseAttendanceTime.equals(todayOvertimeRecordStr)) {
  1887. baseAttendanceTime = todayOvertimeRecord.get("overtimeRecordStime" + i);
  1888. for(int j = i - 1; j > 0; j--) {
  1889. String todayOvertimeRecordStr1 = todayOvertimeRecord.get("overtimeRecordEtime" + j);
  1890. if (baseAttendanceTime.equals(todayOvertimeRecordStr1)) {
  1891. baseAttendanceTime = todayOvertimeRecord.get("overtimeRecordStime" + j);
  1892. }
  1893. }
  1894. } else {
  1895. break;
  1896. }
  1897. }
  1898. }
  1899. if(tomorrowOvertimeRecordSize > 0) {
  1900. for(int i = tomorrowOvertimeRecordSize; i >= 1; i--) {
  1901. String tomorrowOvertimeRecordStr = tomorrowOvertimeRecord.get("overtimeRecordStime" + i);
  1902. if (baseRetreatTime.equals(tomorrowOvertimeRecordStr)) {
  1903. baseRetreatTime = tomorrowOvertimeRecord.get("overtimeRecordEtime" + i);
  1904. for(int j = i + 1; j <= todayOvertimeRecordSize; j++) {
  1905. String todayOvertimeRecordStr1 = todayOvertimeRecord.get("overtimeRecordStime" + j);
  1906. if (baseRetreatTime.equals(todayOvertimeRecordStr1)) {
  1907. baseRetreatTime = todayOvertimeRecord.get("overtimeRecordEtime" + j);
  1908. }
  1909. }
  1910. } else {
  1911. break;
  1912. }
  1913. }
  1914. }
  1915. } else {
  1916. if(todayOvertimeRecordSize > 0) {
  1917. // 获取基准出勤时间
  1918. for(int i = 1; i <= todayOvertimeRecordSize; i++) {
  1919. String todayOvertimeRecordStr = todayOvertimeRecord.get("overtimeRecordEtime" + i);
  1920. if (baseAttendanceTime.equals(todayOvertimeRecordStr)) {
  1921. baseAttendanceTime = todayOvertimeRecord.get("overtimeRecordStime" + i);
  1922. for(int j = i - 1; j > 0; j--) {
  1923. String todayOvertimeRecordStr1 = todayOvertimeRecord.get("overtimeRecordEtime" + j);
  1924. if (baseAttendanceTime.equals(todayOvertimeRecordStr1)) {
  1925. baseAttendanceTime = todayOvertimeRecord.get("overtimeRecordStime" + j);
  1926. }
  1927. }
  1928. }
  1929. }
  1930. // 获取基准退勤时间
  1931. for(int i = 1; i <= todayOvertimeRecordSize; i++) {
  1932. String todayOvertimeRecordStr = todayOvertimeRecord.get("overtimeRecordStime" + i);
  1933. if (baseRetreatTime.equals(todayOvertimeRecordStr)) {
  1934. baseRetreatTime = todayOvertimeRecord.get("overtimeRecordEtime" + i);
  1935. for(int j = i + 1; j <= todayOvertimeRecordSize; j++) {
  1936. String todayOvertimeRecordStr1 = todayOvertimeRecord.get("overtimeRecordStime" + j);
  1937. if (baseRetreatTime.equals(todayOvertimeRecordStr1)) {
  1938. baseRetreatTime = todayOvertimeRecord.get("overtimeRecordEtime" + j);
  1939. }
  1940. }
  1941. }
  1942. }
  1943. }
  1944. }
  1945. returnMap.put("baseAttendanceTime", baseAttendanceTime);
  1946. returnMap.put("baseRetreatTime", baseRetreatTime);
  1947. return returnMap;
  1948. }
  1949. /**
  1950. * 对考勤状态进行去重排序
  1951. *
  1952. * @param attendanceStatus
  1953. * @return
  1954. */
  1955. private String attendanceStatusSort(String attendanceStatus) {
  1956. List<String> attendanceStatusList = new ArrayList<String>();
  1957. List<String> attendanceStatusTempList = Arrays.asList(attendanceStatus.split(","));
  1958. for(String temp : attendanceStatusTempList) {
  1959. attendanceStatusList.add(temp);
  1960. }
  1961. HashSet<String> attendanceStatusHashSet = new HashSet<String>(attendanceStatusList);
  1962. attendanceStatusList.clear();
  1963. attendanceStatusList.addAll(attendanceStatusHashSet);
  1964. Collections.sort(attendanceStatusList);
  1965. attendanceStatus = "";
  1966. for(String str : attendanceStatusList) {
  1967. attendanceStatus += str + ",";
  1968. }
  1969. attendanceStatus = attendanceStatus.substring(0,attendanceStatus.length() - 1);
  1970. return attendanceStatus;
  1971. }
  1972. /**
  1973. * 根据组织Id获取项目Id以及项目——部门之间的名称
  1974. *
  1975. * @param belongUnitid
  1976. * @return returnMap
  1977. * projectId 项目Id
  1978. * projectName 项目——部门名称
  1979. */
  1980. private Map<String, String> getProjectNameByBelongUnitid(String belongUnitid) {
  1981. Map<String, String> returnMap = new HashMap<String, String>();
  1982. String projectId = "";
  1983. String projectName = "";
  1984. List<String> departNameList = new ArrayList<String>();
  1985. while (1 == 1) {
  1986. Map<String, String> departInfo = this.getDepartById(belongUnitid);
  1987. String id = departInfo.get("id");
  1988. belongUnitid = departInfo.get("parentDepartId");
  1989. String orgType = departInfo.get("orgType");
  1990. String departName = departInfo.get("departName");
  1991. if(StringUtil.isEmpty(id)) {
  1992. break;
  1993. } else {
  1994. departNameList.add(departName);
  1995. projectId = id;
  1996. if (Globals.org_type_2.equals(orgType)) {
  1997. if (StringUtil.isEmpty(belongUnitid)) {
  1998. break;
  1999. } else {
  2000. ;
  2001. }
  2002. } else {
  2003. break;
  2004. }
  2005. }
  2006. }
  2007. for(int i = departNameList.size() - 1; i >= 0; i--) {
  2008. projectName += departNameList.get(i) + "-";
  2009. }
  2010. if(StringUtil.isNotEmpty(projectName)) {
  2011. projectName = projectName.substring(0, projectName.length() - 1);
  2012. }
  2013. returnMap.put("projectId", projectId);
  2014. returnMap.put("projectName", projectName);
  2015. return returnMap;
  2016. }
  2017. /**
  2018. * 根据组织Id获取组织信息
  2019. *
  2020. * @param id 组织Id
  2021. * @return returnDepartInfo
  2022. * id 组织Id
  2023. * parentDepartId 父组织Id
  2024. * orgType 组织类型
  2025. * departName 组织名
  2026. */
  2027. private Map<String, String> getDepartById(String id) {
  2028. Map<String, String> returnDepartInfo = new HashMap<String, String>();
  2029. // 查询组织信息
  2030. StringBuilder SelectDepartByIdSql = new StringBuilder();
  2031. SelectDepartByIdSql.append(" SELECT ");
  2032. SelectDepartByIdSql.append(" id,parentdepartid,org_type,departname ");
  2033. SelectDepartByIdSql.append(" FROM t_s_depart ");
  2034. SelectDepartByIdSql.append(" WHERE ");
  2035. SelectDepartByIdSql.append(" id = '" + id + "'");
  2036. List<Map<String, Object>> departList = systemService
  2037. .findForJdbc(SelectDepartByIdSql.toString());
  2038. Map<String, Object> departInfo = departList.get(0);
  2039. String parentDepartId = (String) departInfo.get("parentdepartid");
  2040. String orgType = (String) departInfo.get("org_type");
  2041. String departName = (String) departInfo.get("departname");
  2042. returnDepartInfo.put("id", id);
  2043. returnDepartInfo.put("parentDepartId", parentDepartId);
  2044. returnDepartInfo.put("orgType", orgType);
  2045. returnDepartInfo.put("departName", departName);
  2046. return returnDepartInfo;
  2047. }
  2048. private AttendanceTempEntity getZhibanTime(ArrangeDutyEntity arrangeDutyEntity, DingAttendanceinfoEntity dingAttendanceinfoEntity, List<String> attendanceAllDatetimeList, AttendanceTempEntity attendanceTempEntity, boolean yesterdayFlg) throws Exception {
  2049. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2050. String ondutyStime = arrangeDutyEntity.getOndutyStime();
  2051. String ondutyEtime = arrangeDutyEntity.getOndutyEtime();
  2052. if(ondutyStime.compareTo(ondutyEtime) > 0) {
  2053. // 值夜班
  2054. Calendar startCalendar = Calendar.getInstance();
  2055. Calendar endCalendar = Calendar.getInstance();
  2056. if(yesterdayFlg) {
  2057. // 开始日期
  2058. Date dateYesterday = new Date(dingAttendanceinfoEntity.getAttendanceDate().getTime() - 1000 * 60 * 60 * 24);
  2059. startCalendar.setTime(dateYesterday);
  2060. // 结束日期
  2061. endCalendar.setTime(dingAttendanceinfoEntity.getAttendanceDate());
  2062. } else {
  2063. // 开始日期
  2064. startCalendar.setTime(dingAttendanceinfoEntity.getAttendanceDate());
  2065. Date dateTomorrow = new Date(dingAttendanceinfoEntity.getAttendanceDate().getTime() + 1000 * 60 * 60 * 24);
  2066. // 结束日期
  2067. endCalendar.setTime(dateTomorrow);
  2068. }
  2069. String[] ondutyStimeTemp = ondutyStime.split(":");
  2070. String[] ondutyEtimeTemp = ondutyEtime.split(":");
  2071. startCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyStimeTemp[0]));
  2072. startCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyStimeTemp[1]));
  2073. endCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyEtimeTemp[0]));
  2074. endCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyEtimeTemp[1]));
  2075. String startStr = dateFormat.format(startCalendar.getTime());
  2076. String endStr = dateFormat.format(endCalendar.getTime());
  2077. List<String> attendanceTimeListTemp = new ArrayList<String>();
  2078. for (int i = 0; i < attendanceAllDatetimeList.size(); i++) {
  2079. if(startStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") <= 0 && endStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") >= 0) {
  2080. attendanceTimeListTemp.add(attendanceAllDatetimeList.get(i));
  2081. }
  2082. }
  2083. if (attendanceTimeListTemp.size() == 1) {
  2084. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeListTemp.get(0) + ":00"));
  2085. }
  2086. if (attendanceTimeListTemp.size() > 1) {
  2087. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeListTemp.get(0) + ":00"));
  2088. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeListTemp.get(attendanceTimeListTemp.size() - 1) + ":00"));
  2089. }
  2090. } else {
  2091. // 值日班
  2092. // 开始时间
  2093. Calendar startCalendar = Calendar.getInstance();
  2094. // 结束时间
  2095. Calendar endCalendar = Calendar.getInstance();
  2096. startCalendar.setTime(dingAttendanceinfoEntity.getAttendanceDate());
  2097. endCalendar.setTime(dingAttendanceinfoEntity.getAttendanceDate());
  2098. String[] ondutyStimeTemp = ondutyStime.split(":");
  2099. String[] ondutyEtimeTemp = ondutyEtime.split(":");
  2100. startCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyStimeTemp[0]));
  2101. startCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyStimeTemp[1]));
  2102. endCalendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(ondutyEtimeTemp[0]));
  2103. endCalendar.set(Calendar.MINUTE, Integer.valueOf(ondutyEtimeTemp[1]));
  2104. String startStr = dateFormat.format(startCalendar.getTime());
  2105. String endStr = dateFormat.format(endCalendar.getTime());
  2106. List<String> attendanceTimeListTemp = new ArrayList<String>();
  2107. for (int i = 0; i < attendanceAllDatetimeList.size(); i++) {
  2108. if(startStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") <= 0 && endStr.compareTo(attendanceAllDatetimeList.get(i) + ":00") >= 0) {
  2109. attendanceTimeListTemp.add(attendanceAllDatetimeList.get(i));
  2110. }
  2111. }
  2112. if (attendanceTimeListTemp.size() == 1) {
  2113. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeListTemp.get(0) + ":00"));
  2114. }
  2115. if (attendanceTimeListTemp.size() > 1) {
  2116. attendanceTempEntity.setSignDate(dateFormat.parse(attendanceTimeListTemp.get(0) + ":00"));
  2117. attendanceTempEntity.setNewestPunchcardDate(dateFormat.parse(attendanceTimeListTemp.get(attendanceTimeListTemp.size() - 1) + ":00"));
  2118. }
  2119. }
  2120. return attendanceTempEntity;
  2121. }
  2122. /**
  2123. * 给项目经理发送预警消息
  2124. *
  2125. * @param attendanceTempEntity
  2126. */
  2127. private List<String> setAttendanceWarnMsgByUser(AttendanceTempEntity attendanceTempEntity) {
  2128. //推送app消息的项目经理userid列表
  2129. ArrayList<String> userIdList=new ArrayList<String>();
  2130. // 考勤状态
  2131. String attendanceStatus = attendanceTempEntity.getAttendanceStatus();
  2132. List<String> attendanceStatusList = new ArrayList<String>();
  2133. if(StringUtil.isNotEmpty(attendanceStatus)) {
  2134. attendanceStatusList = Arrays.asList(attendanceStatus.split(","));
  2135. }
  2136. if(attendanceStatusList.size() > 0) {
  2137. for(String status : attendanceStatusList) {
  2138. if(Globals.ATTENDANCE_STATUS_1.equals(status) || Globals.ATTENDANCE_STATUS_2.equals(status)
  2139. || Globals.ATTENDANCE_STATUS_3.equals(status) || Globals.ATTENDANCE_STATUS_5.equals(status)) {
  2140. // 用户Id
  2141. String userId = attendanceTempEntity.getUserId();
  2142. // 用户姓名
  2143. String realname = attendanceTempEntity.getRealname();
  2144. // if("0000000061459498016145fbf2ea0af1".equals(attendanceTempEntity.getUserId())) {
  2145. // System.out.println("");
  2146. // }
  2147. // 所属组织
  2148. String belongUnitid = attendanceTempEntity.getBelongUnitid();
  2149. // 考勤时间
  2150. Date attendanceDate = attendanceTempEntity.getAttendanceDate();
  2151. // 迟到分钟数
  2152. Integer lateminute = attendanceTempEntity.getLateminute();
  2153. // 早退分钟数
  2154. Integer leaveearlyminute = attendanceTempEntity.getLeaveearlyminute();
  2155. // 所属组织名称
  2156. // String belongUnitname = departService.get(TSDepart.class, belongUnitid).getDepartname();
  2157. // 所属项目名称
  2158. String projectId = this.getBybelongId(userId);
  2159. String projectNameString = departService.get(TSDepart.class, belongUnitid).getDepartname();
  2160. // 状态名称
  2161. String statusName = "";
  2162. // 提示信息
  2163. String msgInfo = "";
  2164. // 消息类型
  2165. String msgType = "";
  2166. if(Globals.ATTENDANCE_STATUS_1.equals(status)) {
  2167. statusName = "迟到";
  2168. msgType = "chidao";
  2169. msgInfo = realname + " " + statusName + "<span class= 'redWord '>" + lateminute.intValue() + "</span>分钟";
  2170. }
  2171. if(Globals.ATTENDANCE_STATUS_2.equals(status)) {
  2172. statusName = "早退";
  2173. msgType = "zaotui";
  2174. msgInfo = realname + " " + statusName + "<span class= 'redWord '>" + leaveearlyminute.intValue() + "</span>分钟";
  2175. }
  2176. if(Globals.ATTENDANCE_STATUS_3.equals(status)) {
  2177. statusName = "旷工";
  2178. msgType = "kuanggong";
  2179. msgInfo = realname + " " + statusName;
  2180. }
  2181. if(Globals.ATTENDANCE_STATUS_5.equals(status)) {
  2182. statusName = "未打卡";
  2183. msgType = "weidaka";
  2184. msgInfo = realname + " " + statusName;
  2185. }
  2186. String attendanceWarnMsgHql = "from AttendanceWarnMsgEntity where userId =? and sendTime =? and msgType =? and msgContent = ?";
  2187. List<AttendanceWarnMsgEntity> attendanceWarnMsgEntityList = attendanceWarnMsgService.findHql(attendanceWarnMsgHql, userId, attendanceDate, msgType, msgInfo);
  2188. if (attendanceWarnMsgEntityList.size() == 0) {
  2189. AttendanceWarnMsgEntity attendanceWarnMsgEntity = new AttendanceWarnMsgEntity();
  2190. attendanceWarnMsgEntity.setMsgContent(msgInfo);
  2191. attendanceWarnMsgEntity.setUserId(userId);
  2192. attendanceWarnMsgEntity.setOrgId(projectId);
  2193. attendanceWarnMsgEntity.setMsgTitle(projectNameString);
  2194. attendanceWarnMsgEntity.setSendTime(attendanceDate);
  2195. attendanceWarnMsgEntity.setCreateDate(new Date());
  2196. attendanceWarnMsgEntity.setMsgType(msgType);
  2197. try {
  2198. attendanceWarnMsgService.save(attendanceWarnMsgEntity);
  2199. } catch (Exception e) {
  2200. e.printStackTrace();
  2201. }
  2202. List<AttendanceWarnMsgDetailEntity> msgdetaillist = new ArrayList<>();
  2203. //将msg 发送给项目经理
  2204. String pid = attendanceWarnMsgEntity.getOrgId();
  2205. String mngid = null;
  2206. TSDepart depart = commonService.get(TSDepart.class, pid);
  2207. if (null!=depart) {
  2208. mngid = depart.getDeptProjManagerid();
  2209. }
  2210. if (oConvertUtils.isNotEmpty(mngid)) {
  2211. AttendanceWarnMsgDetailEntity detailEntity = new AttendanceWarnMsgDetailEntity();
  2212. detailEntity.setMsgId(attendanceWarnMsgEntity.getId());
  2213. detailEntity.setReceivedId(mngid);
  2214. detailEntity.setReadStatus(Globals.read_status_0);
  2215. msgdetaillist.add(detailEntity);
  2216. userIdList.add(mngid);
  2217. }
  2218. // 根据用户userIdList和消息具体类型批量推送
  2219. attendanceWarnMsgService.batchSave(msgdetaillist);
  2220. }
  2221. }
  2222. }
  2223. }
  2224. return userIdList;
  2225. }
  2226. /**
  2227. * 通过人查询所属项目
  2228. * @param userid
  2229. * @return
  2230. */
  2231. private String getBybelongId(String userid){
  2232. String temp = "";
  2233. StringBuffer hql = new StringBuffer("from TSUserOrg where tsUser.id = :userid and ifpluralism = 0 and status=0");
  2234. List<TSUserOrg> tsList = commonService.getSession().createQuery(hql.toString()).setParameter("userid", userid).list();
  2235. if(!tsList.isEmpty()){
  2236. TSUserOrg uo = tsList.get(0);
  2237. TSDepart tsDepart = uo.getTsDepart();
  2238. if("1".equals(tsDepart.getOrgType()) || "3".equals(tsDepart.getOrgType()) || "4".equals(tsDepart.getOrgType()) || "5".equals(tsDepart.getOrgType())){
  2239. temp = tsDepart.getId();
  2240. }else if("2".equals(tsDepart.getOrgType()) && "1".equals(tsDepart.getTSPDepart().getOrgType())){
  2241. temp = tsDepart.getId();
  2242. }else{
  2243. temp = selectById(tsDepart.getId());
  2244. }
  2245. }
  2246. return temp;
  2247. }
  2248. private String selectById(String id){
  2249. String temp = "";
  2250. TSDepart tsDepart = commonService.getEntity(TSDepart.class,id);
  2251. if("3".equals(tsDepart.getOrgType()) || "5".equals(tsDepart.getOrgType())){
  2252. temp = tsDepart.getId();
  2253. }else{
  2254. if(tsDepart.getTSPDepart() != null){
  2255. selectById(tsDepart.getTSPDepart().getId());
  2256. temp = tsDepart.getTSPDepart().getId();
  2257. }
  2258. }
  2259. return temp;
  2260. }
  2261. private void setAttendanceWarnMsgByProject(Date date) {
  2262. SimpleDateFormat dfYMD = new SimpleDateFormat("yyyy-MM-dd");
  2263. String dateStr = dfYMD.format(date);
  2264. List<ProjectAbnormalDetailDto> padtolist = attendanceWarnMsgMinidao.getProjectAbnormalDetail(dateStr);
  2265. if (!ListUtils.isNullOrEmpty(padtolist)) {
  2266. ArrayList<String> userIdList=new ArrayList<String>();
  2267. for (ProjectAbnormalDetailDto dto :padtolist) {
  2268. AttendanceWarnMsgEntity msgEntity = new AttendanceWarnMsgEntity();
  2269. String msgContent = "";
  2270. if (Globals.msg_type_chidao.equals(dto.getMsgtype())) {
  2271. msgEntity.setMsgType(dto.getMsgtype());
  2272. /*迟到总人数达 <span class= 'redWord '>10 </span>人 已达总人数的 <span class= 'redWord '>20 %</span>*/
  2273. msgContent ="迟到总人数达 <span class= 'redWord '>"+dto.getErrorcount()+" </span>人 已达总人数的 <span class= 'redWord '>"+dto.getTotalpercent()+" %</span>";
  2274. }
  2275. if (Globals.msg_type_kuanggong.equals(dto.getMsgtype())) {
  2276. msgEntity.setMsgType(dto.getMsgtype());
  2277. /*旷工总人数达 <span class= 'redWord '>5 </span>人 已达总人数的 <span class= 'redWord '>10 %</span>*/
  2278. msgContent ="旷工总人数达 <span class= 'redWord '>"+dto.getErrorcount()+" </span>人 已达总人数的 <span class= 'redWord '>"+dto.getTotalpercent()+" %</span>";
  2279. }
  2280. if (Globals.msg_type_zaotui.equals(dto.getMsgtype())) {
  2281. msgEntity.setMsgType(dto.getMsgtype());
  2282. /*早退总人数达 <span class= 'redWord '>10 </span>人 已达总人数的 <span class= 'redWord '>20 %</span>*/
  2283. msgContent ="早退总人数达 <span class= 'redWord '>"+dto.getErrorcount()+" </span>人 已达总人数的 <span class= 'redWord '>"+dto.getTotalpercent()+" %</span>";
  2284. }
  2285. if (Globals.msg_type_weidaka.equals(dto.getMsgtype())) {
  2286. msgEntity.setMsgType(dto.getMsgtype());
  2287. /*早退总人数达 <span class= 'redWord '>10 </span>人 已达总人数的 <span class= 'redWord '>20 %</span>*/
  2288. msgContent ="未打卡总人数达 <span class= 'redWord '>"+dto.getErrorcount()+" </span>人 已达总人数的 <span class= 'redWord '>"+dto.getTotalpercent()+" %</span>";
  2289. }
  2290. if (oConvertUtils.isNotEmpty(msgEntity.getMsgType())) {
  2291. String projectname = "";
  2292. if (oConvertUtils.isNotEmpty(oConvertUtils.getString(dto.getPid()))) {
  2293. TSDepart depart = commonService.get(TSDepart.class, dto.getPid());
  2294. if (null!=depart) {
  2295. projectname =depart.getDepartname();
  2296. }
  2297. }
  2298. msgEntity.setMsgContent(msgContent);
  2299. msgEntity.setOrgId(dto.getPid());
  2300. msgEntity.setMsgTitle(projectname);
  2301. msgEntity.setSendTime(date);
  2302. msgEntity.setCreateDate(new Date());
  2303. CriteriaQuery cq = new CriteriaQuery(AttendanceWarnMsgEntity.class);
  2304. cq.eq("orgId", msgEntity.getOrgId());
  2305. cq.add();
  2306. cq.isNull("userId");
  2307. cq.add();
  2308. cq.eq("msgContent", msgEntity.getMsgContent());
  2309. cq.add();
  2310. List<AttendanceWarnMsgEntity> msglist = commonService.getListByCriteriaQuery( cq, false);
  2311. if (ListUtils.isNullOrEmpty(msglist)) {
  2312. commonService.save(msgEntity);
  2313. HashSet<String> useridHashSet = new HashSet<String>();
  2314. List<AttendanceWarnMsgDto> msgDtolist = new ArrayList<AttendanceWarnMsgDto>();
  2315. //将msg 发送给系统的人事部人员 和管理层人员
  2316. List<AttendanceWarnMsgDto> attendanceWarnMsgDtolist = attendanceWarnMsgMinidao.getAllLeaderUserIdList();
  2317. if (null==attendanceWarnMsgDtolist) {
  2318. attendanceWarnMsgDtolist = new ArrayList<AttendanceWarnMsgDto>();
  2319. }
  2320. for (AttendanceWarnMsgDto msgDto: attendanceWarnMsgDtolist) {
  2321. if (useridHashSet.contains(msgDto.getUserId())) {
  2322. }else {
  2323. msgDtolist.add(msgDto);
  2324. useridHashSet.add(msgDto.getUserId());
  2325. }
  2326. }
  2327. //将msg 发送给区域管理人员
  2328. String orgid = msgEntity.getOrgId();
  2329. // 查询当前员工的区域组织机构
  2330. TSDepart tsDepart = getQyDepartByorgid(orgid);
  2331. if (oConvertUtils.isEmpty(tsDepart)||oConvertUtils.isEmpty(tsDepart.getId())) {
  2332. } else{
  2333. //根据departid 查询该区域的区域总经理
  2334. List<AttendanceWarnMsgDto> attendanceWarnMsgDtos= attendanceWarnMsgMinidao.getAllQYJLUserIdListByOrgid(tsDepart.getId());
  2335. for (AttendanceWarnMsgDto msgDto: attendanceWarnMsgDtos) {
  2336. if (useridHashSet.contains(msgDto.getUserId())) {
  2337. }else {
  2338. msgDtolist.add(msgDto);
  2339. useridHashSet.add(msgDto.getUserId());
  2340. }
  2341. }
  2342. }
  2343. List<AttendanceWarnMsgDetailEntity> msgdetaillist = new ArrayList<>();
  2344. if (!ListUtils.isNullOrEmpty(msgDtolist)) {
  2345. for (AttendanceWarnMsgDto msgDto : msgDtolist) {
  2346. AttendanceWarnMsgDetailEntity detailEntity = new AttendanceWarnMsgDetailEntity();
  2347. detailEntity.setMsgId(msgEntity.getId());
  2348. detailEntity.setReceivedId(msgDto.getUserId());
  2349. detailEntity.setReadStatus(Globals.read_status_0);
  2350. msgdetaillist.add(detailEntity);
  2351. userIdList.add(msgDto.getUserId());
  2352. }
  2353. commonService.batchSave(msgdetaillist);
  2354. }
  2355. }
  2356. }
  2357. }
  2358. HashSet<String> hashSet = new HashSet<String>(userIdList);
  2359. userIdList.clear();
  2360. userIdList.addAll(hashSet);
  2361. // 根据用户userIdList和消息具体类型批量推送
  2362. pushProcessor.pushCommon(userIdList, Globals.msg_type_3);
  2363. }
  2364. }
  2365. /**
  2366. * 获取区域
  2367. *
  2368. * @param orgid
  2369. * @return
  2370. */
  2371. private TSDepart getQyDepartByorgid(String orgid) {
  2372. TSDepart tsDepart = commonService.get(TSDepart.class, orgid);
  2373. if (tsDepart.getOrgType().equals(Globals.org_type_4)) {
  2374. return tsDepart;
  2375. } else {
  2376. TSDepart parentdepart = tsDepart.getTSPDepart();
  2377. if (oConvertUtils.isEmpty(parentdepart)||oConvertUtils.isEmpty(parentdepart.getId())) {
  2378. return null;
  2379. } else {
  2380. return getQyDepartByorgid(tsDepart.getTSPDepart().getId());
  2381. }
  2382. }
  2383. }
  2384. }