MonthlySummaryServiceImpl.java 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154
  1. package com.chuanghai.attendance.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.chuanghai.attendance.common.exception.BizCodeEnume;
  5. import com.chuanghai.attendance.common.exception.RRException;
  6. import com.chuanghai.attendance.dao.MonthlySummaryDao;
  7. import com.chuanghai.attendance.dto.MonthlyDto;
  8. import com.chuanghai.attendance.entity.*;
  9. import com.chuanghai.attendance.service.*;
  10. import com.chuanghai.attendance.utils.DateUtil;
  11. import com.chuanghai.attendance.utils.excel.ExcelImportXLSXUtil;
  12. import com.chuanghai.attendance.vo.ClockTimeVo;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.util.StringUtils;
  17. import org.springframework.web.multipart.MultipartFile;
  18. import java.text.SimpleDateFormat;
  19. import java.util.*;
  20. import java.util.stream.Collectors;
  21. import static com.alibaba.excel.util.DateUtils.format;
  22. /**
  23. * @Author: binguo
  24. * @Date: 2022/10/9 星期日 16:06
  25. * @Description: com.chuanghai.attendance.service.impl
  26. * @Version: 1.0
  27. */
  28. @Slf4j
  29. @Service("monthlySummaryService")
  30. public class MonthlySummaryServiceImpl extends ServiceImpl<MonthlySummaryDao, MonthlySummary> implements MonthlySummaryService {
  31. @Autowired
  32. private DayDetailsService dayDetailsService;
  33. @Autowired
  34. private CampusTimeService campusTimeService;
  35. @Autowired
  36. private LateClockService lateClockService;
  37. @Autowired
  38. private OriginalDataService originalDataService;
  39. @Autowired
  40. private WorkerIdentityService workerIdentityService;
  41. private static String HJH = "黄家湖";
  42. // private static String HJH = "华东";
  43. private static String MXH = "墨轩湖";
  44. /**
  45. * 导入钉钉考勤原始数据信息
  46. *
  47. * @param file
  48. * @throws Exception
  49. */
  50. @Override
  51. public Boolean importMonthDataExcel(MultipartFile file) throws Exception {
  52. List<MonthlySummary> monthlySummaryList = new ArrayList<>();
  53. List<DayDetails> dayDetailsList = new ArrayList<>();
  54. //删除导入的月度汇总每日数据
  55. Boolean aBoolean = dayDetailsService.removeDayDetails();
  56. //删除导入的月度汇总数据
  57. Boolean mBoolean = removeMonthlySummary();
  58. Boolean statu = Boolean.FALSE;
  59. if (aBoolean && mBoolean) {
  60. List<String[]> list = null;
  61. try {
  62. list = ExcelImportXLSXUtil.readerExcel(file.getInputStream(), "月度汇总", 59);
  63. }catch (Exception e){
  64. e.printStackTrace();
  65. throw new RRException(BizCodeEnume.FILE_IMPORT_ERROR);
  66. }
  67. int count = 0;
  68. for (String[] strings : list) {
  69. count++;
  70. DayDetails dayDetails = new DayDetails();
  71. if (count < 5) {
  72. if (count == 3) {
  73. dayDetails.setUserId("title");
  74. dayDetails.setWorkName("title");
  75. dayDetails.setOneOfMonth(strings[26]);
  76. dayDetails.setTwoOfMonth(strings[27]);
  77. dayDetails.setThreeOfMonth(strings[28]);
  78. dayDetails.setFourOfMonth(strings[29]);
  79. dayDetails.setFiveOfMonth(strings[30]);
  80. dayDetails.setSixOfMonth(strings[31]);
  81. dayDetails.setSevenOfMonth(strings[32]);
  82. dayDetails.setEightOfMonth(strings[33]);
  83. dayDetails.setNineOfMonth(strings[34]);
  84. dayDetails.setTenOfMonth(strings[35]);
  85. dayDetails.setElevenOfMonth(strings[36]);
  86. dayDetails.setTwelveOfMonth(strings[37]);
  87. dayDetails.setThirteenOfMonth(strings[38]);
  88. dayDetails.setFourteenOfMonth(strings[39]);
  89. dayDetails.setFifteenOfMonth(strings[40]);
  90. dayDetails.setSixteenOfMonth(strings[41]);
  91. dayDetails.setSeventeenOfMonth(strings[42]);
  92. dayDetails.setEighteenOfMonth(strings[43]);
  93. dayDetails.setNineteenOfMonth(strings[44]);
  94. dayDetails.setTwentyOfMonth(strings[45]);
  95. dayDetails.setTwentyOneOfMonth(strings[46]);
  96. dayDetails.setTwentyTwoOfMonth(strings[47]);
  97. dayDetails.setTwentyThreeOfMonth(strings[48]);
  98. dayDetails.setTwentyFourOfMonth(strings[49]);
  99. dayDetails.setTwentyFiveOfMonth(strings[50]);
  100. dayDetails.setTwentySixOfMonth(strings[51]);
  101. dayDetails.setTwentySevenOfMonth(strings[52]);
  102. dayDetails.setTwentyEightOfMonth(strings[53]);
  103. dayDetails.setTwentyNineOfMonth(strings[54]);
  104. dayDetails.setThirtyOfMonth(strings[55]);
  105. dayDetails.setThirtyOneOfMonth(strings[56]);
  106. } else {
  107. continue;
  108. }
  109. } else {
  110. MonthlySummary monthlySummary = new MonthlySummary();
  111. monthlySummary.setWorkName(strings[0]);
  112. monthlySummary.setGroupOfCheck(strings[1]);
  113. monthlySummary.setDepartment(strings[2]);
  114. monthlySummary.setWorkNum(strings[3]);
  115. monthlySummary.setUserId(strings[4]);
  116. monthlySummary.setAttendanceDay(strings[5]);
  117. monthlySummary.setRestDay(strings[6]);
  118. monthlySummary.setWorkHours(strings[7]);
  119. monthlySummary.setNumberOfLate(strings[8]);
  120. monthlySummary.setNumberOfLateTime(strings[9]);
  121. monthlySummary.setNumberOfSeriousLateness(strings[10]);
  122. monthlySummary.setDurationOfSevereLateness(strings[11]);
  123. monthlySummary.setDaysOfAbsenteeismAndLateness(strings[12]);
  124. monthlySummary.setLeaveEarlyNumber(strings[13]);
  125. monthlySummary.setLeaveEarlyTimes(strings[14]);
  126. monthlySummary.setLackOfWorkCardTimes(strings[15]);
  127. monthlySummary.setLackOfMissingWorkCardTimes(strings[16]);
  128. monthlySummary.setAbsenteeismDay(strings[17]);
  129. monthlySummary.setEvectionDay(strings[18]);
  130. monthlySummary.setGoOutDay(strings[19]);
  131. monthlySummary.setPrivateAffairLeaveDay(strings[20]);
  132. monthlySummary.setMaternityLeaveDay(strings[21]);
  133. monthlySummary.setMarriageLeaveDay(strings[22]);
  134. monthlySummary.setEscortFalse(strings[23]);
  135. monthlySummary.setSickLeaveDay(strings[24]);
  136. monthlySummary.setBereavementLeave(strings[25]);
  137. //封装钉钉考勤月度汇总
  138. monthlySummaryList.add(monthlySummary);
  139. // DayDetails dayDetails = new DayDetails();
  140. dayDetails.setUserId(strings[4]);
  141. dayDetails.setWorkName(strings[0]);
  142. dayDetails.setOneOfMonth(strings[26]);
  143. dayDetails.setTwoOfMonth(strings[27]);
  144. dayDetails.setThreeOfMonth(strings[28]);
  145. dayDetails.setFourOfMonth(strings[29]);
  146. dayDetails.setFiveOfMonth(strings[30]);
  147. dayDetails.setSixOfMonth(strings[31]);
  148. dayDetails.setSevenOfMonth(strings[32]);
  149. dayDetails.setEightOfMonth(strings[33]);
  150. dayDetails.setNineOfMonth(strings[34]);
  151. dayDetails.setTenOfMonth(strings[35]);
  152. dayDetails.setElevenOfMonth(strings[36]);
  153. dayDetails.setTwelveOfMonth(strings[37]);
  154. dayDetails.setThirteenOfMonth(strings[38]);
  155. dayDetails.setFourteenOfMonth(strings[39]);
  156. dayDetails.setFifteenOfMonth(strings[40]);
  157. dayDetails.setSixteenOfMonth(strings[41]);
  158. dayDetails.setSeventeenOfMonth(strings[42]);
  159. dayDetails.setEighteenOfMonth(strings[43]);
  160. dayDetails.setNineteenOfMonth(strings[44]);
  161. dayDetails.setTwentyOfMonth(strings[45]);
  162. dayDetails.setTwentyOneOfMonth(strings[46]);
  163. dayDetails.setTwentyTwoOfMonth(strings[47]);
  164. dayDetails.setTwentyThreeOfMonth(strings[48]);
  165. dayDetails.setTwentyFourOfMonth(strings[49]);
  166. dayDetails.setTwentyFiveOfMonth(strings[50]);
  167. dayDetails.setTwentySixOfMonth(strings[51]);
  168. dayDetails.setTwentySevenOfMonth(strings[52]);
  169. dayDetails.setTwentyEightOfMonth(strings[53]);
  170. dayDetails.setTwentyNineOfMonth(strings[54]);
  171. dayDetails.setThirtyOfMonth(strings[55]);
  172. dayDetails.setThirtyOneOfMonth(strings[56]);
  173. }
  174. //封装本月度每日的工作详情
  175. // if (StringUtils.hasText(dayDetails.getOneOfMonth()) && StringUtils.hasText(dayDetails.getTwentyOneOfMonth())) {
  176. // dayDetailsList.add(dayDetails);
  177. // }
  178. dayDetailsList.add(dayDetails);
  179. }
  180. }
  181. boolean d = dayDetailsService.saveBatch(dayDetailsList, dayDetailsList.size());
  182. boolean m = this.saveBatch(monthlySummaryList, monthlySummaryList.size());
  183. if (m & d) {
  184. statu = Boolean.TRUE;
  185. }
  186. return statu;
  187. }
  188. @Override
  189. public List<MonthlySummary> queryAll() {
  190. List<MonthlySummary> list = this.list();
  191. if (list.size() == 0) {
  192. throw new RRException(BizCodeEnume.DATA_IS_NOT_EXIST, "月度汇总数据不存在");
  193. }
  194. return list;
  195. }
  196. /**
  197. * 通过校区获取打卡名称
  198. *
  199. * @param campus
  200. * @return
  201. */
  202. public List<String> getClockNameList(String campus) {
  203. List<String> clockNameList = new ArrayList<>();
  204. //查询校区的打卡时间段
  205. List<CampusTime> campusTimeList = campusTimeService.queryCampusTime(campus);
  206. for (CampusTime campusTime : campusTimeList) {
  207. if (campusTime.getClockName().contains("、")) {
  208. clockNameList.add(campusTime.getClockName().split("、")[0]);
  209. clockNameList.add(campusTime.getClockName().split("、")[1]);
  210. } else {
  211. clockNameList.add(campusTime.getClockName());
  212. }
  213. }
  214. return clockNameList;
  215. }
  216. /**
  217. * 通过校区获取打卡次数
  218. *
  219. * @param campus
  220. * @return
  221. */
  222. public Integer getClockCampus(String campus) {
  223. Integer count = 0;
  224. List<CampusTime> campusTimeList = campusTimeService.queryCampusTime(campus);
  225. for (CampusTime campusTime : campusTimeList) {
  226. count += campusTime.getCount();
  227. }
  228. return count;
  229. }
  230. //解析报表数据
  231. @Override
  232. public List<MonthlyDto> analyse() {
  233. //各校区打卡次数
  234. Integer countHJH = this.getClockCampus(HJH);
  235. Integer countMXH = this.getClockCampus(MXH);
  236. //查询校区的打卡时间段集合及打卡次数
  237. List<CampusTime> allCampusList = campusTimeService.queryAllCampusTime();
  238. List<LateClock> allLateClockList = lateClockService.queryAllCampusTime();
  239. List<CampusTime> campusTimeHJHList = allCampusList.stream().filter(x -> x.getCampus().equals(HJH)).collect(Collectors.toList());
  240. List<String> clockNameHJHList = getClockNameList(HJH);
  241. List<CampusTime> campusTimeMXHList = allCampusList.stream().filter(x -> x.getCampus().equals(MXH)).collect(Collectors.toList());
  242. List<String> clockNameMXHList = getClockNameList(MXH);
  243. //查询校区的早退规则
  244. LateClock lateClockHJH = allLateClockList.stream().filter(x -> x.getCampus().equals(HJH)).findAny().get();
  245. LateClock lateClockMXH = allLateClockList.stream().filter(x -> x.getCampus().equals(MXH)).findAny().get();
  246. //创建接收分析结果的对象
  247. List<MonthlySummary> monthlySummaryList = this.queryAll();
  248. ArrayList<MonthlyDto> monthlyDtoList = new ArrayList<>();
  249. List<String> userIds = monthlySummaryList.stream().map(MonthlySummary::getUserId).collect(Collectors.toList());
  250. List<String> workNums = monthlySummaryList.stream().map(MonthlySummary::getWorkNum).collect(Collectors.toList());
  251. List<OriginalData> allOriginalDataList = originalDataService.queryByUserId(userIds, workNums);
  252. List<WorkerIdentity> allWorkIdentityList = workerIdentityService.queryByuserIds(userIds, workNums);
  253. for (MonthlySummary monthlySummary : monthlySummaryList) {
  254. MonthlyDto monthlyDto = new MonthlyDto();
  255. //提取当月的所有打卡日期
  256. List<String> clockDateList = new ArrayList<>();
  257. //得到该员工当月的所有考勤打卡原始数据
  258. List<OriginalData> originalDataList = allOriginalDataList.stream().filter(x -> x.getUserId().equals(monthlySummary.getUserId()) && (monthlySummary.getWorkNum() == null ? true : x.getWorkNum().equals(monthlySummary.getWorkNum()))).collect(Collectors.toList());
  259. // List<OriginalData> originalDataList = originalDataService.queryByUserId("2328214111684948", null);
  260. for (OriginalData originalData : originalDataList) {
  261. //提取当月的所有打卡日期
  262. clockDateList.add(originalData.getDateOfAttendance());
  263. }
  264. //去重后得到考勤打卡的日期
  265. List<String> dateList = clockDateList.stream().distinct().collect(Collectors.toList());
  266. for (int mm = 0; mm < dateList.size(); mm++) {
  267. String date = dateList.get(mm);
  268. List<OriginalData> originalDataByDateList = allOriginalDataList.stream().filter(x -> x.getDateOfAttendance().equals(date) && x.getUserId().equals(monthlySummary.getUserId())).collect(Collectors.toList());
  269. if(originalDataByDateList.size() == 0){
  270. originalDataByDateList = allOriginalDataList.stream().filter(x -> x.getDateOfAttendance().equals(date) && x.getWorkNum().equals(monthlySummary.getWorkNum())).collect(Collectors.toList());
  271. }
  272. Optional<WorkerIdentity> data = allWorkIdentityList.stream().filter(x -> x.getUserId().equals(monthlySummary.getUserId())).findFirst();
  273. if(!(data != null && data.isPresent())) {
  274. data = allWorkIdentityList.stream().filter(x -> x.getWorkNum().equals(monthlySummary.getWorkNum())).findFirst();
  275. if(!(data != null && data.isPresent())){
  276. throw new RRException(BizCodeEnume.DATA_IS_NOT_EXIST, "用户 "+monthlySummary.getWorkName()+" userId不存在");
  277. }
  278. }
  279. String idCard = data.get().getIdCard();
  280. //查询该员工当日有打卡记录则记录出勤天数
  281. Boolean attendanceStatu = originalDataByDateList.size() > 0 ? Boolean.TRUE : Boolean.FALSE;
  282. //如果对应校区的打卡次数超过规定次数,则去除多余的打卡数据,保留对应的打卡机会
  283. if (!originalDataByDateList.get(0).getClockAddress().contains(MXH)) { //标识黄家湖打卡记录
  284. if (originalDataByDateList.size() > clockNameHJHList.size()) {
  285. originalDataByDateList = originalDataByDateList.subList(0, countHJH);
  286. }
  287. } else { //墨轩湖打卡记录
  288. if (originalDataByDateList.size() > clockNameMXHList.size()) {
  289. originalDataByDateList = originalDataByDateList.subList(0, countMXH);
  290. }
  291. }
  292. //获取当天打卡地址的字符串
  293. String campusStr = "";
  294. //获取打卡时间集合
  295. List<String> clockTimeList = new ArrayList<>();
  296. for (OriginalData originalData1 : originalDataByDateList) {
  297. // if (originalData1.getClockAddress().contains(HJH) || originalData1.getClockEquipment().contains("手机")) {
  298. if (!originalData1.getClockAddress().contains(MXH)) {
  299. // campusStr += HJH;
  300. campusStr += HJH + ",";
  301. clockTimeList.add(originalData1.getClockTime() + ":00");
  302. } else {
  303. // } else if (originalData1.getClockAddress().contains(MXH)) {
  304. // campusStr += MXH;
  305. campusStr += MXH + ",";
  306. clockTimeList.add(originalData1.getClockTime() + ":00");
  307. }
  308. }
  309. //------------------------------- 遍历员工当天的打卡数据 --------------------------------------------
  310. Boolean aBoolean = Boolean.TRUE;
  311. for (int m = 0; m < originalDataByDateList.size(); m++) {
  312. OriginalData originalData = originalDataByDateList.get(m);
  313. //获取第一次打卡的校区位置
  314. String campus = "";
  315. if (!originalDataByDateList.get(0).getClockAddress().contains(MXH)) {
  316. campus = HJH;
  317. } else {
  318. // } else if (originalDataByDateList.get(0).getClockAddress().contains(MXH)) {
  319. campus = MXH;
  320. }
  321. //获取当前的打卡校区地址
  322. String campusNow = "";
  323. if (!originalDataByDateList.get(m).getClockAddress().contains(MXH)) {
  324. campusNow = HJH;
  325. } else {
  326. // } else if (originalDataByDateList.get(m).getClockAddress().contains(MXH)) {
  327. campusNow = MXH;
  328. }
  329. //获取当前打卡的打卡名称
  330. String clockName = "";
  331. if (campus.equals(HJH)) {
  332. clockName = clockNameHJHList.get(m);
  333. } else {
  334. clockName = clockNameMXHList.get(m);
  335. }
  336. //判断当天的打卡数据中是否包含两个校区,包含则为异地打卡
  337. if (campusStr.contains(HJH) && campusStr.contains(MXH)) {
  338. if (!campus.contains(campusNow)) {
  339. //记录异地打卡天数
  340. monthlyDto.setAbnormalClockNumber(monthlyDto.getAbnormalClockNumber() + 1);
  341. monthlyDto.setAbnormalClockRecond(monthlyDto.getAbnormalClockRecond() + date.substring(3) + " " + clockName + " " + campusNow + "\r\n");
  342. break;
  343. }
  344. }
  345. else {
  346. //-------------------------------------------- 判断缺卡情况 ---------------------------------------------------------------
  347. //设置各个校区的缺卡默认值
  348. String shortageStrHJH = "";
  349. //如果缺卡天数为空,则添加默值
  350. if (!StringUtils.hasText(monthlyDto.getDaysOfcardShortageInHuangjiahu())) {
  351. for (int t = 0; t < clockNameHJHList.size() - 1; t++) {
  352. int countSHJH = t + 1;
  353. shortageStrHJH += "缺卡" + countSHJH + "次" + 0 + "天\r\n";
  354. }
  355. monthlyDto.setDaysOfcardShortageInHuangjiahu(shortageStrHJH);
  356. }
  357. String shortageStrMXH = "";
  358. if (!StringUtils.hasText(monthlyDto.getDaysOfcardShortageInMoxuanhu())) {
  359. for (int t = 0; t < clockNameMXHList.size() - 1; t++) {
  360. int countSMXH = t + 1;
  361. shortageStrMXH += "缺卡" + countSMXH + "次" + 0 + "天\r\n";
  362. }
  363. monthlyDto.setDaysOfcardShortageInMoxuanhu(shortageStrMXH);
  364. }
  365. //黄家湖/墨轩湖出勤天数
  366. String[] campusSplit = campusStr.split(",");
  367. if (attendanceStatu) {
  368. if (campusStr.contains(HJH) && campusSplit.length == countHJH) {
  369. monthlyDto.setDaysOfAttendanceInHuangjiahu(monthlyDto.getDaysOfAttendanceInHuangjiahu() + 1);
  370. } else if (campusStr.contains(MXH) && campusSplit.length == countMXH) {
  371. monthlyDto.setDaysOfAttendanceInMoxuanhu(monthlyDto.getDaysOfAttendanceInMoxuanhu() + 1);
  372. }
  373. }
  374. //防止重复计算出勤天数
  375. attendanceStatu = Boolean.FALSE;
  376. //判断缺卡情况
  377. if (campus.equals(HJH)) {
  378. int dateSize = originalDataByDateList.size();
  379. if (dateSize < clockNameHJHList.size()) {
  380. int shortageCountHJH = clockNameHJHList.size() - dateSize;
  381. String recondOfHJHStr = monthlyDto.getRecondOfcardShortageInHuangjiahu();
  382. String clockTimeStr = chackClockTime(clockTimeList, campus);
  383. clockTimeStr = clockTimeStr.substring(0, clockTimeStr.length() - 1);
  384. String[] splitClockTime = clockTimeStr.split(";");
  385. for (int qw = 0; qw < splitClockTime.length; qw++) {
  386. Integer clockIndex = Integer.parseInt(splitClockTime[qw].split("、")[0]);
  387. Integer clockCount = Integer.parseInt(splitClockTime[qw].split("、")[1]);
  388. if (!clockTimeStr.contains("true")) {
  389. for (int w = 0; w < clockCount; w++) {
  390. if (qw > 0) {
  391. recondOfHJHStr += date.substring(3) + " " + clockNameHJHList.get(w+clockIndex+1) + "缺卡\r\n";
  392. // recondOfHJHStr += date.substring(3) + " " + clockNameHJHList.get(w+clockIndex) + "缺卡\r\n";
  393. }else {
  394. recondOfHJHStr += date.substring(3) + " " + clockNameHJHList.get(w+clockIndex) + "缺卡\r\n";
  395. }
  396. //黄家湖缺卡天数
  397. monthlyDto.setRecondOfcardShortageInHuangjiahu(recondOfHJHStr);
  398. }
  399. }
  400. }
  401. monthlyDto.setDaysOfcardShortageInHuangjiahu(DateUtil.getCount(monthlyDto.getDaysOfcardShortageInHuangjiahu(), shortageCountHJH));
  402. break;
  403. }
  404. } else {
  405. int dateSize = originalDataByDateList.size();
  406. if (dateSize < clockNameMXHList.size()) {
  407. int shortageCountMXH = clockNameMXHList.size() - dateSize;
  408. String recondOfMXHStr = monthlyDto.getRecondOfcardShortageInMoxuanhu();
  409. String clockTimeStr = chackClockTime(clockTimeList, campus);
  410. clockTimeStr = clockTimeStr.substring(0, clockTimeStr.length() - 1);
  411. String[] splitClockTime = clockTimeStr.split(";");
  412. for (int qw = 0; qw < splitClockTime.length; qw++) {
  413. Integer clockIndex = Integer.parseInt(splitClockTime[qw].split("、")[0]);
  414. Integer clockCount = Integer.parseInt(splitClockTime[qw].split("、")[1]);
  415. if (!clockTimeStr.contains("true")) {
  416. for (int w = 0; w < clockCount; w++) {
  417. if (qw > 0) {
  418. int countMXHs = w+clockIndex+1;
  419. if (countMXHs >= clockNameMXHList.size()-1) {
  420. countMXHs = clockNameMXHList.size()-1;
  421. }
  422. recondOfMXHStr += date.substring(3) + " " + clockNameMXHList.get(countMXHs) + "缺卡\r\n";
  423. }else {
  424. recondOfMXHStr += date.substring(3) + " " + clockNameMXHList.get(w+clockIndex) + "缺卡\r\n";
  425. }
  426. //黄家湖缺卡天数
  427. monthlyDto.setRecondOfcardShortageInMoxuanhu(recondOfMXHStr);
  428. }
  429. }
  430. }
  431. monthlyDto.setDaysOfcardShortageInMoxuanhu(DateUtil.getCount(monthlyDto.getDaysOfcardShortageInMoxuanhu(), shortageCountMXH));
  432. break;
  433. }
  434. // int dateSize = originalDataByDateList.size();
  435. // if (dateSize < clockNameMXHList.size()) {
  436. // int shortageCountMXH = clockNameMXHList.size() - dateSize;
  437. // String recondOfMXHStr = monthlyDto.getRecondOfcardShortageInMoxuanhu();
  438. // for (int w = clockNameMXHList.size() - 1; w > dateSize - 1; w--) {
  439. // recondOfMXHStr += date.substring(3) + " " + clockNameMXHList.get(w) + "缺卡\r\n";
  440. // //墨轩湖缺卡天数
  441. // monthlyDto.setRecondOfcardShortageInMoxuanhu(recondOfMXHStr);
  442. // }
  443. // monthlyDto.setDaysOfcardShortageInMoxuanhu(DateUtil.getCount(monthlyDto.getDaysOfcardShortageInMoxuanhu(), shortageCountMXH));
  444. // break;
  445. // }
  446. }
  447. //-------------------------------------------- 判断迟到情况 ---------------------------------------------------------------
  448. // 迟到或者早退则为 FALSE, TRUE 为正常打卡
  449. String timeStatu = "";
  450. // 0 2 4 为上班卡
  451. if (m % 2 == 0) {
  452. String campusValue = campus;
  453. List<CampusTime> campusList = allCampusList.stream().filter(x -> x.getCampus().equals(campusValue)).collect(Collectors.toList());
  454. LateClock LocalData = allLateClockList.stream().filter(x -> x.getCampus().equals(campusValue)).findAny().get();
  455. // 打卡迟到记录判断
  456. timeStatu = changeTime(campusList, originalData.getClockTime(), LocalData.getLateOfWork(), "start", campusValue, m);
  457. // System.out.println(timeStatu + " start");
  458. //true正常 false 迟到
  459. String status = timeStatu.split("、")[0];
  460. long ltime = Long.parseLong(timeStatu.split("、")[1]);
  461. //记录迟到
  462. // if (status.contains("迟到")) {
  463. if (status.equals("false")) {
  464. ltime = Math.abs(ltime);
  465. if (ltime > 0 && ltime <= 20) {
  466. monthlyDto.setLeTwentyLateNumber(monthlyDto.getLeTwentyLateNumber() + 1);
  467. String record = date.substring(3) + " " + campusNow + clockName + " " +
  468. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  469. monthlyDto.setLateOfRecond(monthlyDto.getLateOfRecond() + record);
  470. } else if (ltime > 20 && ltime <= 30) {
  471. monthlyDto.setLequalThirtyLateNumber(monthlyDto.getLequalThirtyLateNumber() + 1);
  472. String record = date.substring(3) + " " + campusNow + clockName + " " +
  473. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  474. monthlyDto.setLateOfRecond(monthlyDto.getLateOfRecond() + record);
  475. } else if (ltime > 30) {
  476. monthlyDto.setGeThirtyLateNumber(monthlyDto.getGeThirtyLateNumber() + 1);
  477. String record = date.substring(3) + " " + campusNow + clockName + " " +
  478. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  479. monthlyDto.setLateOfRecond(monthlyDto.getLateOfRecond() + record);
  480. }
  481. }
  482. } else {
  483. String campusValue = campus;
  484. List<CampusTime> campusList = allCampusList.stream().filter(x -> x.getCampus().equals(campusValue)).collect(Collectors.toList());
  485. LateClock LocalData = allLateClockList.stream().filter(x -> x.getCampus().equals(campusValue)).findAny().get();
  486. // 打卡早退记录判断
  487. timeStatu = changeTime(campusList, originalData.getClockTime(), LocalData.getLeaveEarlyOfWork(), "end", campus, m);
  488. String status = timeStatu.split("、")[0];
  489. long ltime = Long.parseLong(timeStatu.split("、")[1]);
  490. ltime = Math.abs(ltime);
  491. //记录早退
  492. // if (status.equals("早退")) {
  493. if (status.equals("false")) {
  494. if (ltime > 0 && ltime <= 20) {
  495. monthlyDto.setLeTwentyLeaveNumber(monthlyDto.getLeTwentyLeaveNumber() + 1);
  496. String record = date.substring(3) + " " + campusNow + clockName + " " +
  497. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  498. monthlyDto.setLeaveOfRecond(monthlyDto.getLeaveOfRecond() + record);
  499. } else if (ltime > 20 && ltime <= 30) {
  500. monthlyDto.setLequalThirtyLeaveNumber(monthlyDto.getLequalThirtyLeaveNumber() + 1);
  501. String record = date.substring(3) + " " + campusNow + clockName + " " +
  502. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  503. monthlyDto.setLeaveOfRecond(monthlyDto.getLeaveOfRecond() + record);
  504. } else if (ltime > 30) {
  505. monthlyDto.setGeThirtyLeaveNumber(monthlyDto.getGeThirtyLeaveNumber() + 1);
  506. String record = date.substring(3) + " " + campusNow + clockName + " " +
  507. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  508. monthlyDto.setLeaveOfRecond(monthlyDto.getLeaveOfRecond() + record);
  509. }
  510. }
  511. }
  512. }
  513. }
  514. //计算个人单月总计出行天数
  515. Integer countOfHJH = monthlyDto.getDaysOfAttendanceInHuangjiahu() + getShortage(monthlyDto.getDaysOfcardShortageInHuangjiahu());
  516. Integer countOfMXH = monthlyDto.getDaysOfAttendanceInMoxuanhu() + getShortage(monthlyDto.getDaysOfcardShortageInMoxuanhu());
  517. //统计黄家湖总出勤天数
  518. monthlyDto.setSumAttendanceInHuangjiahu(countOfHJH);
  519. //统计墨轩湖总出勤天数
  520. monthlyDto.setSumAttendanceInMoxuanhu(countOfMXH);
  521. //出现总天数 = 黄家湖出勤天数+黄家湖缺卡天数+墨轩湖出勤天数+墨轩湖缺卡天数+异地打卡天数 = 黄家湖总出勤天数 + 墨轩湖总出勤天数 + 异地打卡天数
  522. Integer sumCount = countOfHJH + countOfMXH + monthlyDto.getAbnormalClockNumber();
  523. monthlyDto.setAttendanceDays(sumCount);
  524. monthlyDto.setIdCard(idCard);
  525. }
  526. monthlyDtoList.add(monthlyDto);
  527. }
  528. return monthlyDtoList;
  529. }
  530. public String chackClockTime(List<String> clockTimeList, String campus) {
  531. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  532. List<ClockTimeVo> clockTimeVoList = new ArrayList<>();
  533. List<CampusTime> campusTimeList = campusTimeService.queryCampusTime(campus);
  534. List<String> timeList = new ArrayList<>();
  535. CampusTime campusTimeA = campusTimeList.get(0);
  536. for (int c = 0; c < campusTimeList.size(); c++) {
  537. CampusTime campusTime = campusTimeList.get(c);
  538. if (c == campusTimeList.size() - 1) {
  539. timeList.add(campusTime.getStartTime() + "、" + campusTime.getStartTime() + "、" + campusTime.getCount());
  540. } else {
  541. // for (int d = 0; d < campusTimeList.get(c).getCount(); d++) {
  542. timeList.add(campusTime.getStartTime() + "、" + campusTimeList.get(c + 1).getStartTime() + "、" + campusTime.getCount());
  543. // }
  544. }
  545. }
  546. List<ClockTimeVo> clockTimeVO2List = new ArrayList<>();
  547. for (int x = 0; x < clockTimeList.size(); x++) {
  548. String clockTime = clockTimeList.get(x);
  549. for (int i = 0; i < timeList.size(); i++) {
  550. ClockTimeVo clockTimeVo2 = new ClockTimeVo();
  551. ClockTimeVo clockTimeVo = new ClockTimeVo();
  552. String timeStr = timeList.get(i);
  553. String[] startAndEndTime = timeStr.split("、");
  554. String yms = clockTime.split(" ")[0];
  555. //上班规则
  556. Calendar calendar = Calendar.getInstance();
  557. String leaveTimeNowStr = "";
  558. String lateTimeNowStr = "";
  559. String[] YMS = clockTime.split(" ")[0].split("-");
  560. String[] HMS = startAndEndTime[0].split(":");
  561. String[] HMS1 = startAndEndTime[1].split(":");
  562. if (i == 0) {
  563. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  564. lateTimeNowStr = format(calendar.getTime());
  565. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]) - 40, 0);
  566. leaveTimeNowStr = format(calendar.getTime());
  567. } else if (i == timeList.size() - 1) { //下班打卡截至时间
  568. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]) - 40, 0);
  569. lateTimeNowStr = format(calendar.getTime());
  570. leaveTimeNowStr = clockTime.split(" ")[0] + " " + "23:59:59";
  571. } else { //中间卡规则
  572. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]) - 40, 0);
  573. lateTimeNowStr = format(calendar.getTime());
  574. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]) - 40, 0);
  575. leaveTimeNowStr = format(calendar.getTime());
  576. }
  577. clockTimeVo2.setClockTimeEnd(leaveTimeNowStr);
  578. clockTimeVo2.setClockTimeStart(lateTimeNowStr);
  579. clockTimeVo2.setStartTime(HMS[0]);
  580. clockTimeVO2List.add(clockTimeVo2);
  581. int compareTo = clockTime.compareTo(lateTimeNowStr);
  582. // System.out.println(lateTimeNowStr + " -------getClockTimeStart--------- " + clockTime + " " + compareTo);
  583. if (compareTo > 0) {
  584. compareTo = leaveTimeNowStr.compareTo(clockTime);
  585. // System.out.println(leaveTimeNowStr + " --------getClockTimeEnd-------- " + clockTime + " " + compareTo);
  586. if (compareTo > 0) {
  587. //在规定的范围内打卡,无缺卡
  588. if (clockTimeVoList.size() == 0) {
  589. clockTimeVo.setClockTimeStart(lateTimeNowStr);
  590. clockTimeVo.setClockTimeEnd(leaveTimeNowStr);
  591. clockTimeVo.setCount(clockTimeVo.getCount() + 1);
  592. clockTimeVo.setStartTime(HMS[0]);
  593. } else {
  594. for (int r = 0; r < clockTimeVoList.size(); r++) {
  595. ClockTimeVo clockTimeVo1 = clockTimeVoList.get(r);
  596. if (clockTimeVo1.getClockTimeStart().equals(lateTimeNowStr)) {
  597. clockTimeVo.setCount(clockTimeVo1.getCount() + 1);
  598. clockTimeVo.setClockTimeStart(clockTimeVo1.getClockTimeStart());
  599. clockTimeVo.setClockTimeEnd(clockTimeVo1.getClockTimeEnd());
  600. clockTimeVo.setStartTime(HMS[0]);
  601. clockTimeVoList.remove(r);
  602. } else {
  603. clockTimeVo.setClockTimeStart(lateTimeNowStr);
  604. clockTimeVo.setClockTimeEnd(leaveTimeNowStr);
  605. clockTimeVo.setCount(clockTimeVo.getCount() + 1);
  606. clockTimeVo.setStartTime(HMS[0]);
  607. }
  608. }
  609. }
  610. clockTimeVoList.add(clockTimeVo);
  611. }
  612. }
  613. }
  614. }
  615. List<ClockTimeVo> clockTimeVO2ListUnique = clockTimeVO2List.stream().collect(Collectors.collectingAndThen(
  616. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ClockTimeVo::getClockTimeStart))), ArrayList::new));
  617. List<ClockTimeVo> clockTimeVoListUnique = clockTimeVoList.stream().collect(Collectors.collectingAndThen(
  618. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ClockTimeVo::getClockTimeStart))), ArrayList::new));
  619. //
  620. List<ClockTimeVo> clockTimeVoListNew = new ArrayList<>();
  621. // System.out.println(clockTimeVO2ListUnique.size()+" --------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "+clockTimeVoListUnique.size());
  622. for (int as = 0; as < clockTimeVO2ListUnique.size(); as++) {
  623. ClockTimeVo clockTimeVO2 = clockTimeVO2ListUnique.get(as);
  624. for (int asa = 0; asa < clockTimeVoListUnique.size(); asa++) {
  625. ClockTimeVo clockTimeVo1 = clockTimeVoListUnique.get(asa);
  626. // System.out.println(clockTimeVo1.getClockTimeStart()+" ----clockTimeVo1-----------"+clockTimeVO2.getClockTimeStart());
  627. if (clockTimeVO2.getClockTimeStart().equals(clockTimeVo1.getClockTimeStart())) {
  628. // clockTimeVO2ListUnique.remove(as);
  629. clockTimeVoListNew.add(clockTimeVo1);
  630. }else {
  631. clockTimeVoListNew.add(clockTimeVO2);
  632. }
  633. }
  634. }
  635. // clockTimeVoListNew.forEach(ssss->{
  636. // System.out.println(ssss + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");
  637. // });
  638. List<ClockTimeVo> newList = clockTimeVoListNew.stream().sorted(Comparator.comparing(ClockTimeVo::getCount).reversed())
  639. .collect(Collectors.toList());
  640. List<ClockTimeVo> clockTimeVoListUniqueNew = newList.stream().collect(Collectors.collectingAndThen(
  641. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ClockTimeVo::getClockTimeStart))), ArrayList::new));
  642. //
  643. // clockTimeVoListUniqueNew.forEach(d -> {
  644. // System.out.println(d + " dddddddddddd");
  645. // });
  646. String size = "";
  647. for (int y = 0; y < campusTimeList.size(); y++) {
  648. CampusTime campusTime = campusTimeList.get(y);
  649. Integer countCA = campusTime.getCount();
  650. for (int h = 0; h < clockTimeVoListUniqueNew.size(); h++) {
  651. ClockTimeVo clockTimeVo = clockTimeVoListUniqueNew.get(h);
  652. Integer countCL = clockTimeVo.getCount();
  653. int count = countCA - countCL;
  654. if (campusTime.getStartTime().split(":")[0].equals(clockTimeVo.getStartTime())) {
  655. if (count > 0) {
  656. size += y + "、" + count + ";";
  657. }
  658. }
  659. }
  660. }
  661. // System.out.println("*********************************************************************");
  662. // return "true、";
  663. // System.out.println(size + " clockTimeVo1clockTimeVo1clockTimeVo1clockTimeVo1 aaaaaaaaaaaaaaaaaaaaaa");
  664. if (StringUtils.hasText(size)) {
  665. return size;
  666. } else {
  667. return "true、" + ";";
  668. }
  669. // return clockTimeVO2ListUnique;
  670. }
  671. /**
  672. * 判断是否在该时间段内缺卡
  673. *
  674. * @param clockTime 打卡时间
  675. * @param campus 校区
  676. * @param index 传递的第几次打卡
  677. * @param size 数据集合的大小
  678. * @return
  679. */
  680. public String chackClock(String clockTime, String campus, Integer index, Integer size) {
  681. Boolean statu = Boolean.FALSE;
  682. try {
  683. String startTime = "";
  684. String endTime = "";
  685. Integer lateTimeNow = 0;
  686. Integer leaveTimeNow = 0;
  687. // String clockTimeH = clockTime.split(" ")[1];
  688. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  689. List<CampusTime> campusTimeList = campusTimeService.queryCampusTime(campus);
  690. LateClock lateClock = lateClockService.queryCampusTime(campus);
  691. List<String> timeList = new ArrayList<>();
  692. for (int c = 1; c < campusTimeList.size(); c++) {
  693. CampusTime campusTimeB = campusTimeList.get(c - 1);
  694. CampusTime campusTime = campusTimeList.get(c);
  695. if (campusTime.getClockName().contains("、")) {
  696. timeList.add(campusTimeB.getStartTime() + "、" + campusTime.getEndTime());
  697. timeList.add(campusTimeB.getStartTime() + "、" + campusTime.getEndTime());
  698. } else {
  699. timeList.add(campusTimeB.getStartTime() + "、" + campusTime.getEndTime());
  700. }
  701. }
  702. // System.out.println(
  703. // index + " indexindexindexindexindexindex"
  704. // );
  705. String timeStr = timeList.get(index);
  706. String[] startAndEndTime = timeStr.split("、");
  707. String yms = clockTime.split(" ")[0];
  708. //上班规则
  709. Calendar calendar = Calendar.getInstance();
  710. String leaveTimeNowStr = "";
  711. String lateTimeNowStr = "";
  712. // if (index == 0 || index == size - 1) {
  713. //
  714. // String[] YMS = clockTime.split(" ")[0].split("-");
  715. // String[] HMS = clockTime.split(" ")[1].split(":");
  716. // calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]), Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  717. // lateTimeNowStr = format(calendar.getTime());
  718. //
  719. // calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]), Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]) - 40, 0);
  720. // leaveTimeNowStr = format(calendar.getTime());
  721. //下班规则
  722. // } else
  723. if (index == size - 1) {
  724. String[] YMS = clockTime.split(" ")[0].split("-");
  725. String[] HMS = startAndEndTime[0].split(":");
  726. String[] HMS1 = startAndEndTime[1].split(":");
  727. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  728. lateTimeNowStr = format(calendar.getTime());
  729. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]) - 40, 0);
  730. leaveTimeNowStr = format(calendar.getTime());
  731. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) - Integer.parseInt(lateClock.getLateOfWork());
  732. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]) - 40;
  733. //中间卡规则
  734. } else {
  735. String[] YMS = clockTime.split(" ")[0].split("-");
  736. String[] HMS = startAndEndTime[0].split(":");
  737. String[] HMS1 = startAndEndTime[1].split(":");
  738. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  739. lateTimeNowStr = format(calendar.getTime());
  740. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]) - 40, 0);
  741. leaveTimeNowStr = format(calendar.getTime());
  742. }
  743. // String lateTimeNowStr = startAndEndTime[0].split(":")[0] + ":" + lateTimeNow;
  744. // String leaveTimeNowStr = startAndEndTime[1].split(":")[0] + ":" + leaveTimeNow;
  745. // startTime = clockTime.split(" ")[0] + " " + lateTimeNowStr + ":00";
  746. // endTime = clockTime.split(" ")[0] + " " + leaveTimeNowStr + ":00";
  747. //下班打卡截至时间
  748. if (index == timeList.size() - 1) {
  749. leaveTimeNowStr = clockTime.split(" ")[0] + " " + "23:59:59";
  750. }
  751. clockTime = clockTime + ":00";
  752. String clockTimeNow = format(format.parse(clockTime));
  753. // String checkStartTime = format(format.parse(startTime));
  754. long clockTimeLong = format.parse(clockTime).getTime();
  755. long startTimeLong = format.parse(lateTimeNowStr).getTime();
  756. Integer compareTo = clockTimeNow.compareTo(lateTimeNowStr);
  757. if (compareTo > 0) {
  758. //当前时间已经计算了早退时间
  759. // String checkEndTime = format(format.parse(endTime));
  760. long endTimeLong = format.parse(leaveTimeNowStr).getTime();
  761. //打卡时间 - 考勤时间
  762. // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1 true
  763. compareTo = leaveTimeNowStr.compareTo(clockTimeNow);
  764. }
  765. statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  766. } catch (
  767. Exception e) {
  768. e.printStackTrace();
  769. }
  770. return statu + "、" + index;
  771. }
  772. /**
  773. * 校验打卡时间
  774. *
  775. * @param campusTimeList 校区打卡规则集合
  776. * @param clockTime 打卡时间
  777. * @param lateTime 迟到早退时间
  778. * @param type 须交验的时间段 start上班 end 下班
  779. * @param camousType 校区 HJH MXH
  780. * @return false 早退,迟到 true 正常打卡
  781. */
  782. public String changeTime(List<CampusTime> campusTimeList, String clockTime, String lateTime, String type, String camousType, Integer index) {
  783. int compareTo = 0;
  784. //打卡时间 - 考勤时间
  785. long csTime = 0L;
  786. try {
  787. List<String> timeList = new ArrayList<>();
  788. for (CampusTime campusTime : campusTimeList) {
  789. if (campusTime.getClockName().contains("、")) {
  790. timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  791. timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  792. } else {
  793. timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  794. }
  795. }
  796. //获取当前打卡时间段的打卡规则
  797. String campusTimeStr = timeList.get(index);
  798. String startTime = "";
  799. String endTime = "";
  800. Integer lateTimeNow = 0;
  801. Integer leaveTimeNow = 0;
  802. String[] startAndEndTime = campusTimeStr.split("、");
  803. Calendar calendar = Calendar.getInstance();
  804. String leaveTimeNowStr = "";
  805. String lateTimeNowStr = "";
  806. //上班规则
  807. if (index == 0) {
  808. String[] YMS = clockTime.split(" ")[0].split("-");
  809. String[] HMS = startAndEndTime[0].split(":");
  810. String[] HMS1 = startAndEndTime[1].split(":");
  811. // System.out.println(clockTime);
  812. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]) - 1, Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  813. lateTimeNowStr = format(calendar.getTime());
  814. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]) + Integer.parseInt(lateTime), 0);
  815. leaveTimeNowStr = format(calendar.getTime());
  816. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) + Integer.parseInt(lateTime);
  817. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]) + Integer.parseInt(lateTime);
  818. //下班规则
  819. } else if (index == timeList.size() - 1) {
  820. String[] YMS = clockTime.split(" ")[0].split("-");
  821. String[] HMS = startAndEndTime[0].split(":");
  822. String[] HMS1 = startAndEndTime[1].split(":");
  823. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]) - Integer.parseInt(lateTime), 0);
  824. lateTimeNowStr = format(calendar.getTime());
  825. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]), 0);
  826. leaveTimeNowStr = format(calendar.getTime());
  827. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) - Integer.parseInt(lateTime);
  828. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]);
  829. //中间卡规则
  830. } else {
  831. String[] YMS = clockTime.split(" ")[0].split("-");
  832. String[] HMS = startAndEndTime[0].split(":");
  833. String[] HMS1 = startAndEndTime[1].split(":");
  834. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]) - Integer.parseInt(lateTime), 0);
  835. lateTimeNowStr = format(calendar.getTime());
  836. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]) + Integer.parseInt(lateTime), 0);
  837. leaveTimeNowStr = format(calendar.getTime());
  838. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) - Integer.parseInt(lateTime);
  839. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]) + Integer.parseInt(lateTime);
  840. }
  841. // String lateTimeNowStr = startAndEndTime[0].split(":")[0] + ":" + lateTimeNow;
  842. // String leaveTimeNowStr = startAndEndTime[1].split(":")[0] + ":" + leaveTimeNow;
  843. // startTime = clockTime.split(" ")[0] + " " + lateTimeNowStr + ":00";
  844. // endTime = clockTime.split(" ")[0] + " " + leaveTimeNowStr + ":00";
  845. //下班打卡截至时间
  846. if (index == timeList.size() - 1) {
  847. leaveTimeNowStr = clockTime.split(" ")[0] + " " + "23:59:59";
  848. }
  849. clockTime = clockTime + ":00";
  850. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  851. String clockTimeNow = format(format.parse(clockTime));
  852. // String checkStartTime = format(format.parse(startTime));
  853. long clockTimeLong = format.parse(clockTime).getTime();
  854. long startTimeLong = format.parse(lateTimeNowStr).getTime();
  855. //打卡时间 - 考勤时间
  856. csTime = (clockTimeLong - startTimeLong) / 1000 / 60;
  857. // checkStartTime 早于 clockTimeNow compareTo>0 1 true
  858. compareTo = clockTimeNow.compareTo(lateTimeNowStr);
  859. if (compareTo > 0) {
  860. //当前时间已经计算了早退时间
  861. // String checkEndTime = format(format.parse(endTime));
  862. long endTimeLong = format.parse(leaveTimeNowStr).getTime();
  863. //打卡时间 - 考勤时间
  864. csTime = (clockTimeLong - endTimeLong) / 1000 / 60;
  865. // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1 true
  866. compareTo = leaveTimeNowStr.compareTo(clockTimeNow);
  867. }
  868. } catch (Exception e) {
  869. e.printStackTrace();
  870. }
  871. Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  872. return statu + "、" + csTime;
  873. }
  874. // /**
  875. // * 校验打卡时间
  876. // *
  877. // * @param campusTimeList 校区打卡规则集合
  878. // * @param clockTime 打卡时间
  879. // * @param lateTime 迟到早退时间
  880. // * @param type 须交验的时间段 start上班 end 下班
  881. // * @param camousType 校区 HJH MXH
  882. // * @return false 早退,迟到 true 正常打卡
  883. // */
  884. // public String changeTime(List<CampusTime> campusTimeList, String clockTime, String lateTime, String type, String camousType) {
  885. //
  886. // int compareTo = 0;
  887. // //打卡时间 - 考勤时间
  888. // long csTime = 0l;
  889. // try {
  890. // String[] clockTimeArr = clockTime.split(" ")[0].split("-");
  891. // SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd");
  892. // Calendar calendar = Calendar.getInstance();
  893. // List<String> timeList = new ArrayList<>();
  894. // for (CampusTime campusTime : campusTimeList) {
  895. // if (campusTime.getClockName().contains("、")) {
  896. // timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  897. // timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  898. // } else {
  899. // timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  900. // }
  901. // }
  902. //// //判断一个时间段之内打多次卡
  903. //// for (int n = 0; n < campusTimeList.size(); n++) {
  904. //// CampusTime campusTime = campusTimeList.get(n);
  905. //// //判断当前时间的打卡次数
  906. //// if (campusTime.getCount() > 1) {
  907. ////
  908. ////
  909. ////
  910. ////
  911. ////
  912. ////
  913. ////
  914. ////
  915. //// }
  916. //// }
  917. // for (int m = 0; m < timeList.size(); m++) {
  918. // String campusTimeStr = timeList.get(m);
  919. // String[] startAndEndTime = campusTimeStr.split("、");
  920. // String startTime = startAndEndTime[0];
  921. // String endTime = startAndEndTime[1];
  922. // //start 判断为上班上班时间
  923. //// if ("start".equals(type)) {
  924. // //当前时间已经计算了迟到时间
  925. // calendar.set(Integer.parseInt(clockTimeArr[0]), Integer.parseInt(clockTimeArr[1]), Integer.parseInt(clockTimeArr[2]) + Integer.parseInt(lateTime),
  926. // Integer.parseInt(startTime.split(":")[0]), Integer.parseInt(startTime.split(":")[1]));
  927. // String checkStartTime = format(calendar.getTime());
  928. // long clockTimeLong = format.parse(clockTime).getTime();
  929. // long startTimeLong = format.parse(checkStartTime).getTime();
  930. // //打卡时间 - 考勤时间
  931. // csTime = clockTimeLong - startTimeLong / 1000 / 60;
  932. // String clockTimeNow = format(format.parse(clockTime));
  933. // // checkStartTime 早于 clockTimeNow compareTo>0 1 true
  934. // compareTo = checkStartTime.compareTo(clockTimeNow);
  935. // //打卡时间大于起始时间则进行结束时间判断 大于其实时间 小于结束时间则为正常打卡
  936. // if (compareTo > 0) {
  937. // //当前时间已经计算了早退时间
  938. // calendar.set(Integer.parseInt(clockTimeArr[0]), Integer.parseInt(clockTimeArr[1]), Integer.parseInt(clockTimeArr[2]) - Integer.parseInt(lateTime),
  939. // Integer.parseInt(endTime.split(":")[0]), Integer.parseInt(endTime.split(":")[1]));
  940. // String checkEndTime = format(calendar.getTime());
  941. // long endTimeLong = format.parse(checkEndTime).getTime();
  942. // //打卡时间 - 考勤时间
  943. // csTime = clockTimeLong - endTimeLong / 1000 / 60;
  944. // // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1 true
  945. // compareTo = checkEndTime.compareTo(clockTimeNow);
  946. // if (compareTo < 0) {
  947. // Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  948. // return statu + "早退、" + csTime;
  949. // }
  950. // } else {
  951. // Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  952. // return statu + "迟到、" + csTime;
  953. // }
  954. //
  955. //// } else {
  956. //// calendar.set(Integer.parseInt(clockTimeArr[0]), Integer.parseInt(clockTimeArr[1]), Integer.parseInt(clockTimeArr[2])-Integer.parseInt(lateTime),
  957. //// Integer.parseInt(endTime.split(":")[0]), Integer.parseInt(endTime.split(":")[1]));
  958. //// String checkEndTime = format(calendar.getTime());
  959. //// String clockTimeNow = format(format.parse(clockTime));
  960. //// long clockTimeLong = format.parse(clockTime).getTime();
  961. //// long endTimeLong = format.parse(checkEndTime).getTime();
  962. //// //打卡时间 - 考勤时间
  963. //// csTime = clockTimeLong - endTimeLong/1000/60;
  964. //// // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1
  965. //// compareTo = clockTimeNow.compareTo(checkEndTime);
  966. //// }
  967. // }
  968. //
  969. // } catch (Exception e) {
  970. // e.printStackTrace();
  971. // }
  972. // // System.out.println(compareTo + " ------------timeStatutimeStatutimeStatutimeStatutimeStatu-----");
  973. // Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  974. // return statu + "正常、" + csTime;
  975. // }
  976. /**
  977. * 获取缺卡总天数
  978. *
  979. * @param shortageStr
  980. * @return
  981. */
  982. public Integer getShortage(String shortageStr) {
  983. Integer shortageCount = 0;
  984. String[] split = shortageStr.split("\r\n");
  985. for (int u = 0; u < split.length; u++) {
  986. if (split[u].contains("次") && split[u].contains("天")) {
  987. int indexT = split[u].indexOf("天");
  988. int indexC = split[u].indexOf("次");
  989. String count = split[u].substring(indexC + 1, indexT);
  990. shortageCount += Integer.parseInt(count);
  991. }
  992. }
  993. return shortageCount;
  994. }
  995. @Override
  996. public List<MonthlySummary> queryByWorkName(String workName) {
  997. QueryWrapper<MonthlySummary> wrapper = new QueryWrapper<>();
  998. wrapper.eq("work_name", workName);
  999. List<MonthlySummary> list = this.list();
  1000. if (list.size() == 0) {
  1001. throw new RRException(BizCodeEnume.DATA_IS_NOT_EXIST, workName + "不存在");
  1002. }
  1003. return list;
  1004. }
  1005. /**
  1006. * 删除导入的月度汇总数据
  1007. *
  1008. * @return
  1009. */
  1010. public Boolean removeMonthlySummary() {
  1011. List<Long> idList = new ArrayList<>();
  1012. List<MonthlySummary> list = this.list();
  1013. if (list.size() == 0) {
  1014. return Boolean.TRUE;
  1015. }
  1016. list.forEach(monthlySummary -> {
  1017. idList.add(monthlySummary.getId());
  1018. });
  1019. return this.removeByIds(idList);
  1020. }
  1021. }