MonthlySummaryServiceImpl.java 60 KB

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