MonthlySummaryServiceImpl.java 62 KB

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