MonthlySummaryServiceImpl.java 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  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. for (MonthlySummary monthlySummary : monthlySummaryList) {
  257. MonthlyDto monthlyDto = new MonthlyDto();
  258. //提取当月的所有打卡日期
  259. List<String> clockDateList = new ArrayList<>();
  260. //得到该员工当月的所有考勤打卡原始数据
  261. List<OriginalData> originalDataList = allOriginalDataList.stream().filter(x -> x.getUserId().equals(monthlySummary.getUserId()) && (monthlySummary.getWorkNum() == null ? true : x.getWorkNum().equals(monthlySummary.getWorkNum()))).collect(Collectors.toList());
  262. // List<OriginalData> originalDataList = originalDataService.queryByUserId("2328214111684948", null);
  263. for (OriginalData originalData : originalDataList) {
  264. //提取当月的所有打卡日期
  265. clockDateList.add(originalData.getDateOfAttendance());
  266. }
  267. //去重后得到考勤打卡的日期
  268. List<String> dateList = clockDateList.stream().distinct().collect(Collectors.toList());
  269. for (int mm = 0; mm < dateList.size(); mm++) {
  270. String date = dateList.get(mm);
  271. List<OriginalData> originalDataByDateList = allOriginalDataList.stream().filter(x -> x.getDateOfAttendance().equals(date) && x.getUserId().equals(monthlySummary.getUserId())).collect(Collectors.toList());
  272. if(originalDataByDateList.size() == 0){
  273. originalDataByDateList = allOriginalDataList.stream().filter(x -> x.getDateOfAttendance().equals(date) && x.getWorkNum().equals(monthlySummary.getWorkNum())).collect(Collectors.toList());
  274. }
  275. Optional<WorkerIdentity> data = allWorkIdentityList.stream().filter(x -> x.getUserId().equals(monthlySummary.getUserId())).findFirst();
  276. if(!(data != null && data.isPresent())) {
  277. data = allWorkIdentityList.stream().filter(x -> x.getWorkNum().equals(monthlySummary.getWorkNum())).findFirst();
  278. if(!(data != null && data.isPresent())){
  279. throw new RRException(BizCodeEnume.DATA_IS_NOT_EXIST, "用户 "+monthlySummary.getWorkName()+" userId不存在");
  280. }
  281. }
  282. String idCard = data.get().getIdCard();
  283. //查询该员工当日有打卡记录则记录出勤天数
  284. Boolean attendanceStatu = originalDataByDateList.size() > 0 ? Boolean.TRUE : Boolean.FALSE;
  285. //如果对应校区的打卡次数超过规定次数,则去除多余的打卡数据,保留对应的打卡机会
  286. if (!originalDataByDateList.get(0).getClockAddress().contains(MXH)) { //标识黄家湖打卡记录
  287. if (originalDataByDateList.size() > clockNameHJHList.size()) {
  288. originalDataByDateList = originalDataByDateList.subList(0, countHJH);
  289. }
  290. } else { //墨轩湖打卡记录
  291. if (originalDataByDateList.size() > clockNameMXHList.size()) {
  292. originalDataByDateList = originalDataByDateList.subList(0, countMXH);
  293. }
  294. }
  295. //获取当天打卡地址的字符串
  296. String campusStr = "";
  297. //获取打卡时间集合
  298. List<String> clockTimeList = new ArrayList<>();
  299. for (OriginalData originalData1 : originalDataByDateList) {
  300. // if (originalData1.getClockAddress().contains(HJH) || originalData1.getClockEquipment().contains("手机")) {
  301. if (!originalData1.getClockAddress().contains(MXH)) {
  302. // campusStr += HJH;
  303. campusStr += HJH + ",";
  304. clockTimeList.add(originalData1.getClockTime() + ":00");
  305. } else {
  306. // } else if (originalData1.getClockAddress().contains(MXH)) {
  307. // campusStr += MXH;
  308. campusStr += MXH + ",";
  309. clockTimeList.add(originalData1.getClockTime() + ":00");
  310. }
  311. }
  312. //------------------------------- 遍历员工当天的打卡数据 --------------------------------------------
  313. Boolean aBoolean = Boolean.TRUE;
  314. for (int m = 0; m < originalDataByDateList.size(); m++) {
  315. OriginalData originalData = originalDataByDateList.get(m);
  316. //获取第一次打卡的校区位置
  317. String campus = "";
  318. if (!originalDataByDateList.get(0).getClockAddress().contains(MXH)) {
  319. campus = HJH;
  320. } else {
  321. // } else if (originalDataByDateList.get(0).getClockAddress().contains(MXH)) {
  322. campus = MXH;
  323. }
  324. //获取当前的打卡校区地址
  325. String campusNow = "";
  326. if (!originalDataByDateList.get(m).getClockAddress().contains(MXH)) {
  327. campusNow = HJH;
  328. } else {
  329. // } else if (originalDataByDateList.get(m).getClockAddress().contains(MXH)) {
  330. campusNow = MXH;
  331. }
  332. //获取当前打卡的打卡名称
  333. String clockName = "";
  334. if (campus.equals(HJH)) {
  335. clockName = clockNameHJHList.get(m);
  336. } else {
  337. clockName = clockNameMXHList.get(m);
  338. }
  339. //判断当天的打卡数据中是否包含两个校区,包含则为异地打卡
  340. if (campusStr.contains(HJH) && campusStr.contains(MXH)) {
  341. if (!campus.contains(campusNow)) {
  342. //记录异地打卡天数
  343. monthlyDto.setAbnormalClockNumber(monthlyDto.getAbnormalClockNumber() + 1);
  344. monthlyDto.setAbnormalClockRecond(monthlyDto.getAbnormalClockRecond() + date.substring(3) + " " + clockName + " " + campusNow + "\r\n");
  345. break;
  346. }
  347. }
  348. else {
  349. //-------------------------------------------- 判断缺卡情况 ---------------------------------------------------------------
  350. //设置各个校区的缺卡默认值
  351. String shortageStrHJH = "";
  352. //如果缺卡天数为空,则添加默值
  353. if (!StringUtils.hasText(monthlyDto.getDaysOfcardShortageInHuangjiahu())) {
  354. for (int t = 0; t < clockNameHJHList.size() - 1; t++) {
  355. int countSHJH = t + 1;
  356. shortageStrHJH += "缺卡" + countSHJH + "次" + 0 + "天\r\n";
  357. }
  358. monthlyDto.setDaysOfcardShortageInHuangjiahu(shortageStrHJH);
  359. }
  360. String shortageStrMXH = "";
  361. if (!StringUtils.hasText(monthlyDto.getDaysOfcardShortageInMoxuanhu())) {
  362. for (int t = 0; t < clockNameMXHList.size() - 1; t++) {
  363. int countSMXH = t + 1;
  364. shortageStrMXH += "缺卡" + countSMXH + "次" + 0 + "天\r\n";
  365. }
  366. monthlyDto.setDaysOfcardShortageInMoxuanhu(shortageStrMXH);
  367. }
  368. //黄家湖/墨轩湖出勤天数
  369. String[] campusSplit = campusStr.split(",");
  370. if (attendanceStatu) {
  371. if (campusStr.contains(HJH) && campusSplit.length == countHJH) {
  372. monthlyDto.setDaysOfAttendanceInHuangjiahu(monthlyDto.getDaysOfAttendanceInHuangjiahu() + 1);
  373. } else if (campusStr.contains(MXH) && campusSplit.length == countMXH) {
  374. monthlyDto.setDaysOfAttendanceInMoxuanhu(monthlyDto.getDaysOfAttendanceInMoxuanhu() + 1);
  375. }
  376. }
  377. //防止重复计算出勤天数
  378. attendanceStatu = Boolean.FALSE;
  379. //判断缺卡情况
  380. if (campus.equals(HJH)) {
  381. int dateSize = originalDataByDateList.size();
  382. if (dateSize < clockNameHJHList.size()) {
  383. int shortageCountHJH = clockNameHJHList.size() - dateSize;
  384. String recondOfHJHStr = monthlyDto.getRecondOfcardShortageInHuangjiahu();
  385. String clockTimeStr = chackClockTime(clockTimeList, campus);
  386. clockTimeStr = clockTimeStr.substring(0, clockTimeStr.length() - 1);
  387. String[] splitClockTime = clockTimeStr.split(";");
  388. for (int qw = 0; qw < splitClockTime.length; qw++) {
  389. Integer clockIndex = Integer.parseInt(splitClockTime[qw].split("、")[0]);
  390. Integer clockCount = Integer.parseInt(splitClockTime[qw].split("、")[1]);
  391. if (!clockTimeStr.contains("true")) {
  392. for (int w = 0; w < clockCount; w++) {
  393. if (qw > 0) {
  394. recondOfHJHStr += date.substring(3) + " " + clockNameHJHList.get(w+clockIndex+1) + "缺卡\r\n";
  395. // recondOfHJHStr += date.substring(3) + " " + clockNameHJHList.get(w+clockIndex) + "缺卡\r\n";
  396. }else {
  397. recondOfHJHStr += date.substring(3) + " " + clockNameHJHList.get(w+clockIndex) + "缺卡\r\n";
  398. }
  399. //黄家湖缺卡天数
  400. monthlyDto.setRecondOfcardShortageInHuangjiahu(recondOfHJHStr);
  401. }
  402. }
  403. }
  404. monthlyDto.setDaysOfcardShortageInHuangjiahu(DateUtil.getCount(monthlyDto.getDaysOfcardShortageInHuangjiahu(), shortageCountHJH));
  405. break;
  406. }
  407. } else {
  408. int dateSize = originalDataByDateList.size();
  409. if (dateSize < clockNameMXHList.size()) {
  410. int shortageCountMXH = clockNameMXHList.size() - dateSize;
  411. String recondOfMXHStr = monthlyDto.getRecondOfcardShortageInMoxuanhu();
  412. String clockTimeStr = chackClockTime(clockTimeList, campus);
  413. clockTimeStr = clockTimeStr.substring(0, clockTimeStr.length() - 1);
  414. String[] splitClockTime = clockTimeStr.split(";");
  415. for (int qw = 0; qw < splitClockTime.length; qw++) {
  416. Integer clockIndex = Integer.parseInt(splitClockTime[qw].split("、")[0]);
  417. Integer clockCount = Integer.parseInt(splitClockTime[qw].split("、")[1]);
  418. if (!clockTimeStr.contains("true")) {
  419. for (int w = 0; w < clockCount; w++) {
  420. if (qw > 0) {
  421. int countMXHs = w+clockIndex+1;
  422. if (countMXHs >= clockNameMXHList.size()-1) {
  423. countMXHs = clockNameMXHList.size()-1;
  424. }
  425. recondOfMXHStr += date.substring(3) + " " + clockNameMXHList.get(countMXHs) + "缺卡\r\n";
  426. }else {
  427. recondOfMXHStr += date.substring(3) + " " + clockNameMXHList.get(w+clockIndex) + "缺卡\r\n";
  428. }
  429. //黄家湖缺卡天数
  430. monthlyDto.setRecondOfcardShortageInMoxuanhu(recondOfMXHStr);
  431. }
  432. }
  433. }
  434. monthlyDto.setDaysOfcardShortageInMoxuanhu(DateUtil.getCount(monthlyDto.getDaysOfcardShortageInMoxuanhu(), shortageCountMXH));
  435. break;
  436. }
  437. // int dateSize = originalDataByDateList.size();
  438. // if (dateSize < clockNameMXHList.size()) {
  439. // int shortageCountMXH = clockNameMXHList.size() - dateSize;
  440. // String recondOfMXHStr = monthlyDto.getRecondOfcardShortageInMoxuanhu();
  441. // for (int w = clockNameMXHList.size() - 1; w > dateSize - 1; w--) {
  442. // recondOfMXHStr += date.substring(3) + " " + clockNameMXHList.get(w) + "缺卡\r\n";
  443. // //墨轩湖缺卡天数
  444. // monthlyDto.setRecondOfcardShortageInMoxuanhu(recondOfMXHStr);
  445. // }
  446. // monthlyDto.setDaysOfcardShortageInMoxuanhu(DateUtil.getCount(monthlyDto.getDaysOfcardShortageInMoxuanhu(), shortageCountMXH));
  447. // break;
  448. // }
  449. }
  450. //-------------------------------------------- 判断迟到情况 ---------------------------------------------------------------
  451. // 迟到或者早退则为 FALSE, TRUE 为正常打卡
  452. String timeStatu = "";
  453. // 0 2 4 为上班卡
  454. if (m % 2 == 0) {
  455. String campusValue = campus;
  456. List<CampusTime> campusList = allCampusList.stream().filter(x -> x.getCampus().equals(campusValue)).collect(Collectors.toList());
  457. LateClock LocalData = allLateClockList.stream().filter(x -> x.getCampus().equals(campusValue)).findAny().get();
  458. // 打卡迟到记录判断
  459. timeStatu = changeTime(campusList, originalData.getClockTime(), LocalData.getLateOfWork(), "start", campusValue, m);
  460. // System.out.println(timeStatu + " start");
  461. //true正常 false 迟到
  462. String status = timeStatu.split("、")[0];
  463. long ltime = Long.parseLong(timeStatu.split("、")[1]);
  464. //记录迟到
  465. // if (status.contains("迟到")) {
  466. if (status.equals("false")) {
  467. ltime = Math.abs(ltime);
  468. if (ltime > 0 && ltime <= 20) {
  469. monthlyDto.setLeTwentyLateNumber(monthlyDto.getLeTwentyLateNumber() + 1);
  470. String record = date.substring(3) + " " + campusNow + clockName + " " +
  471. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  472. monthlyDto.setLateOfRecond(monthlyDto.getLateOfRecond() + record);
  473. } else if (ltime > 20 && ltime <= 30) {
  474. monthlyDto.setLequalThirtyLateNumber(monthlyDto.getLequalThirtyLateNumber() + 1);
  475. String record = date.substring(3) + " " + campusNow + clockName + " " +
  476. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  477. monthlyDto.setLateOfRecond(monthlyDto.getLateOfRecond() + record);
  478. } else if (ltime > 30) {
  479. monthlyDto.setGeThirtyLateNumber(monthlyDto.getGeThirtyLateNumber() + 1);
  480. String record = date.substring(3) + " " + campusNow + clockName + " " +
  481. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  482. monthlyDto.setLateOfRecond(monthlyDto.getLateOfRecond() + record);
  483. }
  484. }
  485. } else {
  486. String campusValue = campus;
  487. List<CampusTime> campusList = allCampusList.stream().filter(x -> x.getCampus().equals(campusValue)).collect(Collectors.toList());
  488. LateClock LocalData = allLateClockList.stream().filter(x -> x.getCampus().equals(campusValue)).findAny().get();
  489. // 打卡早退记录判断
  490. timeStatu = changeTime(campusList, originalData.getClockTime(), LocalData.getLeaveEarlyOfWork(), "end", campus, m);
  491. String status = timeStatu.split("、")[0];
  492. long ltime = Long.parseLong(timeStatu.split("、")[1]);
  493. ltime = Math.abs(ltime);
  494. //记录早退
  495. // if (status.equals("早退")) {
  496. if (status.equals("false")) {
  497. if (ltime > 0 && ltime <= 20) {
  498. monthlyDto.setLeTwentyLeaveNumber(monthlyDto.getLeTwentyLeaveNumber() + 1);
  499. String record = date.substring(3) + " " + campusNow + clockName + " " +
  500. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  501. monthlyDto.setLeaveOfRecond(monthlyDto.getLeaveOfRecond() + record);
  502. } else if (ltime > 20 && ltime <= 30) {
  503. monthlyDto.setLequalThirtyLeaveNumber(monthlyDto.getLequalThirtyLeaveNumber() + 1);
  504. String record = date.substring(3) + " " + campusNow + clockName + " " +
  505. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  506. monthlyDto.setLeaveOfRecond(monthlyDto.getLeaveOfRecond() + record);
  507. } else if (ltime > 30) {
  508. monthlyDto.setGeThirtyLeaveNumber(monthlyDto.getGeThirtyLeaveNumber() + 1);
  509. String record = date.substring(3) + " " + campusNow + clockName + " " +
  510. originalDataByDateList.get(m).getClockTime().substring(originalDataByDateList.get(m).getClockTime().length() - 5) + "\r\n";
  511. monthlyDto.setLeaveOfRecond(monthlyDto.getLeaveOfRecond() + record);
  512. }
  513. }
  514. }
  515. }
  516. }
  517. //计算个人单月总计出行天数
  518. Integer countOfHJH = monthlyDto.getDaysOfAttendanceInHuangjiahu() + getShortage(monthlyDto.getDaysOfcardShortageInHuangjiahu());
  519. Integer countOfMXH = monthlyDto.getDaysOfAttendanceInMoxuanhu() + getShortage(monthlyDto.getDaysOfcardShortageInMoxuanhu());
  520. //统计黄家湖总出勤天数
  521. monthlyDto.setSumAttendanceInHuangjiahu(countOfHJH);
  522. //统计墨轩湖总出勤天数
  523. monthlyDto.setSumAttendanceInMoxuanhu(countOfMXH);
  524. //出现总天数 = 黄家湖出勤天数+黄家湖缺卡天数+墨轩湖出勤天数+墨轩湖缺卡天数+异地打卡天数 = 黄家湖总出勤天数 + 墨轩湖总出勤天数 + 异地打卡天数
  525. Integer sumCount = countOfHJH + countOfMXH + monthlyDto.getAbnormalClockNumber();
  526. monthlyDto.setAttendanceDays(sumCount);
  527. monthlyDto.setIdCard(idCard);
  528. }
  529. monthlyDtoList.add(monthlyDto);
  530. }
  531. return monthlyDtoList;
  532. }
  533. public String chackClockTime(List<String> clockTimeList, String campus) {
  534. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  535. List<ClockTimeVo> clockTimeVoList = new ArrayList<>();
  536. List<CampusTime> campusTimeList = campusTimeService.queryCampusTime(campus);
  537. List<String> timeList = new ArrayList<>();
  538. CampusTime campusTimeA = campusTimeList.get(0);
  539. for (int c = 0; c < campusTimeList.size(); c++) {
  540. CampusTime campusTime = campusTimeList.get(c);
  541. if (c == campusTimeList.size() - 1) {
  542. timeList.add(campusTime.getStartTime() + "、" + campusTime.getStartTime() + "、" + campusTime.getCount());
  543. } else {
  544. // for (int d = 0; d < campusTimeList.get(c).getCount(); d++) {
  545. timeList.add(campusTime.getStartTime() + "、" + campusTimeList.get(c + 1).getStartTime() + "、" + campusTime.getCount());
  546. // }
  547. }
  548. }
  549. List<ClockTimeVo> clockTimeVO2List = new ArrayList<>();
  550. for (int x = 0; x < clockTimeList.size(); x++) {
  551. String clockTime = clockTimeList.get(x);
  552. for (int i = 0; i < timeList.size(); i++) {
  553. ClockTimeVo clockTimeVo2 = new ClockTimeVo();
  554. ClockTimeVo clockTimeVo = new ClockTimeVo();
  555. String timeStr = timeList.get(i);
  556. String[] startAndEndTime = timeStr.split("、");
  557. String yms = clockTime.split(" ")[0];
  558. //上班规则
  559. Calendar calendar = Calendar.getInstance();
  560. String leaveTimeNowStr = "";
  561. String lateTimeNowStr = "";
  562. String[] YMS = clockTime.split(" ")[0].split("-");
  563. String[] HMS = startAndEndTime[0].split(":");
  564. String[] HMS1 = startAndEndTime[1].split(":");
  565. if (i == 0) {
  566. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  567. lateTimeNowStr = format(calendar.getTime());
  568. 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);
  569. leaveTimeNowStr = format(calendar.getTime());
  570. } else if (i == timeList.size() - 1) { //下班打卡截至时间
  571. 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);
  572. lateTimeNowStr = format(calendar.getTime());
  573. leaveTimeNowStr = clockTime.split(" ")[0] + " " + "23:59:59";
  574. } else { //中间卡规则
  575. 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);
  576. lateTimeNowStr = format(calendar.getTime());
  577. 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);
  578. leaveTimeNowStr = format(calendar.getTime());
  579. }
  580. clockTimeVo2.setClockTimeEnd(leaveTimeNowStr);
  581. clockTimeVo2.setClockTimeStart(lateTimeNowStr);
  582. clockTimeVo2.setStartTime(HMS[0]);
  583. clockTimeVO2List.add(clockTimeVo2);
  584. int compareTo = clockTime.compareTo(lateTimeNowStr);
  585. // System.out.println(lateTimeNowStr + " -------getClockTimeStart--------- " + clockTime + " " + compareTo);
  586. if (compareTo > 0) {
  587. compareTo = leaveTimeNowStr.compareTo(clockTime);
  588. // System.out.println(leaveTimeNowStr + " --------getClockTimeEnd-------- " + clockTime + " " + compareTo);
  589. if (compareTo > 0) {
  590. //在规定的范围内打卡,无缺卡
  591. if (clockTimeVoList.size() == 0) {
  592. clockTimeVo.setClockTimeStart(lateTimeNowStr);
  593. clockTimeVo.setClockTimeEnd(leaveTimeNowStr);
  594. clockTimeVo.setCount(clockTimeVo.getCount() + 1);
  595. clockTimeVo.setStartTime(HMS[0]);
  596. } else {
  597. for (int r = 0; r < clockTimeVoList.size(); r++) {
  598. ClockTimeVo clockTimeVo1 = clockTimeVoList.get(r);
  599. if (clockTimeVo1.getClockTimeStart().equals(lateTimeNowStr)) {
  600. clockTimeVo.setCount(clockTimeVo1.getCount() + 1);
  601. clockTimeVo.setClockTimeStart(clockTimeVo1.getClockTimeStart());
  602. clockTimeVo.setClockTimeEnd(clockTimeVo1.getClockTimeEnd());
  603. clockTimeVo.setStartTime(HMS[0]);
  604. clockTimeVoList.remove(r);
  605. } else {
  606. clockTimeVo.setClockTimeStart(lateTimeNowStr);
  607. clockTimeVo.setClockTimeEnd(leaveTimeNowStr);
  608. clockTimeVo.setCount(clockTimeVo.getCount() + 1);
  609. clockTimeVo.setStartTime(HMS[0]);
  610. }
  611. }
  612. }
  613. clockTimeVoList.add(clockTimeVo);
  614. }
  615. }
  616. }
  617. }
  618. List<ClockTimeVo> clockTimeVO2ListUnique = clockTimeVO2List.stream().collect(Collectors.collectingAndThen(
  619. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ClockTimeVo::getClockTimeStart))), ArrayList::new));
  620. List<ClockTimeVo> clockTimeVoListUnique = clockTimeVoList.stream().collect(Collectors.collectingAndThen(
  621. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ClockTimeVo::getClockTimeStart))), ArrayList::new));
  622. //
  623. List<ClockTimeVo> clockTimeVoListNew = new ArrayList<>();
  624. // System.out.println(clockTimeVO2ListUnique.size()+" --------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "+clockTimeVoListUnique.size());
  625. for (int as = 0; as < clockTimeVO2ListUnique.size(); as++) {
  626. ClockTimeVo clockTimeVO2 = clockTimeVO2ListUnique.get(as);
  627. for (int asa = 0; asa < clockTimeVoListUnique.size(); asa++) {
  628. ClockTimeVo clockTimeVo1 = clockTimeVoListUnique.get(asa);
  629. // System.out.println(clockTimeVo1.getClockTimeStart()+" ----clockTimeVo1-----------"+clockTimeVO2.getClockTimeStart());
  630. if (clockTimeVO2.getClockTimeStart().equals(clockTimeVo1.getClockTimeStart())) {
  631. // clockTimeVO2ListUnique.remove(as);
  632. clockTimeVoListNew.add(clockTimeVo1);
  633. }else {
  634. clockTimeVoListNew.add(clockTimeVO2);
  635. }
  636. }
  637. }
  638. // clockTimeVoListNew.forEach(ssss->{
  639. // System.out.println(ssss + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");
  640. // });
  641. List<ClockTimeVo> newList = clockTimeVoListNew.stream().sorted(Comparator.comparing(ClockTimeVo::getCount).reversed())
  642. .collect(Collectors.toList());
  643. List<ClockTimeVo> clockTimeVoListUniqueNew = newList.stream().collect(Collectors.collectingAndThen(
  644. Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ClockTimeVo::getClockTimeStart))), ArrayList::new));
  645. //
  646. // clockTimeVoListUniqueNew.forEach(d -> {
  647. // System.out.println(d + " dddddddddddd");
  648. // });
  649. String size = "";
  650. for (int y = 0; y < campusTimeList.size(); y++) {
  651. CampusTime campusTime = campusTimeList.get(y);
  652. Integer countCA = campusTime.getCount();
  653. for (int h = 0; h < clockTimeVoListUniqueNew.size(); h++) {
  654. ClockTimeVo clockTimeVo = clockTimeVoListUniqueNew.get(h);
  655. Integer countCL = clockTimeVo.getCount();
  656. int count = countCA - countCL;
  657. if (campusTime.getStartTime().split(":")[0].equals(clockTimeVo.getStartTime())) {
  658. if (count > 0) {
  659. size += y + "、" + count + ";";
  660. }
  661. }
  662. }
  663. }
  664. // System.out.println("*********************************************************************");
  665. // return "true、";
  666. // System.out.println(size + " clockTimeVo1clockTimeVo1clockTimeVo1clockTimeVo1 aaaaaaaaaaaaaaaaaaaaaa");
  667. if (StringUtils.hasText(size)) {
  668. return size;
  669. } else {
  670. return "true、" + ";";
  671. }
  672. // return clockTimeVO2ListUnique;
  673. }
  674. /**
  675. * 判断是否在该时间段内缺卡
  676. *
  677. * @param clockTime 打卡时间
  678. * @param campus 校区
  679. * @param index 传递的第几次打卡
  680. * @param size 数据集合的大小
  681. * @return
  682. */
  683. public String chackClock(String clockTime, String campus, Integer index, Integer size) {
  684. Boolean statu = Boolean.FALSE;
  685. try {
  686. String startTime = "";
  687. String endTime = "";
  688. Integer lateTimeNow = 0;
  689. Integer leaveTimeNow = 0;
  690. // String clockTimeH = clockTime.split(" ")[1];
  691. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  692. List<CampusTime> campusTimeList = campusTimeService.queryCampusTime(campus);
  693. LateClock lateClock = lateClockService.queryCampusTime(campus);
  694. List<String> timeList = new ArrayList<>();
  695. for (int c = 1; c < campusTimeList.size(); c++) {
  696. CampusTime campusTimeB = campusTimeList.get(c - 1);
  697. CampusTime campusTime = campusTimeList.get(c);
  698. if (campusTime.getClockName().contains("、")) {
  699. timeList.add(campusTimeB.getStartTime() + "、" + campusTime.getEndTime());
  700. timeList.add(campusTimeB.getStartTime() + "、" + campusTime.getEndTime());
  701. } else {
  702. timeList.add(campusTimeB.getStartTime() + "、" + campusTime.getEndTime());
  703. }
  704. }
  705. // System.out.println(
  706. // index + " indexindexindexindexindexindex"
  707. // );
  708. String timeStr = timeList.get(index);
  709. String[] startAndEndTime = timeStr.split("、");
  710. String yms = clockTime.split(" ")[0];
  711. //上班规则
  712. Calendar calendar = Calendar.getInstance();
  713. String leaveTimeNowStr = "";
  714. String lateTimeNowStr = "";
  715. // if (index == 0 || index == size - 1) {
  716. //
  717. // String[] YMS = clockTime.split(" ")[0].split("-");
  718. // String[] HMS = clockTime.split(" ")[1].split(":");
  719. // calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]), Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  720. // lateTimeNowStr = format(calendar.getTime());
  721. //
  722. // calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]), Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]) - 40, 0);
  723. // leaveTimeNowStr = format(calendar.getTime());
  724. //下班规则
  725. // } else
  726. if (index == size - 1) {
  727. String[] YMS = clockTime.split(" ")[0].split("-");
  728. String[] HMS = startAndEndTime[0].split(":");
  729. String[] HMS1 = startAndEndTime[1].split(":");
  730. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  731. lateTimeNowStr = format(calendar.getTime());
  732. 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);
  733. leaveTimeNowStr = format(calendar.getTime());
  734. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) - Integer.parseInt(lateClock.getLateOfWork());
  735. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]) - 40;
  736. //中间卡规则
  737. } else {
  738. String[] YMS = clockTime.split(" ")[0].split("-");
  739. String[] HMS = startAndEndTime[0].split(":");
  740. String[] HMS1 = startAndEndTime[1].split(":");
  741. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS[0]), Integer.parseInt(HMS[1]), 0);
  742. lateTimeNowStr = format(calendar.getTime());
  743. 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);
  744. leaveTimeNowStr = format(calendar.getTime());
  745. }
  746. // String lateTimeNowStr = startAndEndTime[0].split(":")[0] + ":" + lateTimeNow;
  747. // String leaveTimeNowStr = startAndEndTime[1].split(":")[0] + ":" + leaveTimeNow;
  748. // startTime = clockTime.split(" ")[0] + " " + lateTimeNowStr + ":00";
  749. // endTime = clockTime.split(" ")[0] + " " + leaveTimeNowStr + ":00";
  750. //下班打卡截至时间
  751. if (index == timeList.size() - 1) {
  752. leaveTimeNowStr = clockTime.split(" ")[0] + " " + "23:59:59";
  753. }
  754. clockTime = clockTime + ":00";
  755. String clockTimeNow = format(format.parse(clockTime));
  756. // String checkStartTime = format(format.parse(startTime));
  757. long clockTimeLong = format.parse(clockTime).getTime();
  758. long startTimeLong = format.parse(lateTimeNowStr).getTime();
  759. Integer compareTo = clockTimeNow.compareTo(lateTimeNowStr);
  760. if (compareTo > 0) {
  761. //当前时间已经计算了早退时间
  762. // String checkEndTime = format(format.parse(endTime));
  763. long endTimeLong = format.parse(leaveTimeNowStr).getTime();
  764. //打卡时间 - 考勤时间
  765. // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1 true
  766. compareTo = leaveTimeNowStr.compareTo(clockTimeNow);
  767. }
  768. statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  769. } catch (
  770. Exception e) {
  771. e.printStackTrace();
  772. }
  773. return statu + "、" + index;
  774. }
  775. /**
  776. * 校验打卡时间
  777. *
  778. * @param campusTimeList 校区打卡规则集合
  779. * @param clockTime 打卡时间
  780. * @param lateTime 迟到早退时间
  781. * @param type 须交验的时间段 start上班 end 下班
  782. * @param camousType 校区 HJH MXH
  783. * @return false 早退,迟到 true 正常打卡
  784. */
  785. public String changeTime(List<CampusTime> campusTimeList, String clockTime, String lateTime, String type, String camousType, Integer index) {
  786. int compareTo = 0;
  787. //打卡时间 - 考勤时间
  788. long csTime = 0L;
  789. try {
  790. List<String> timeList = new ArrayList<>();
  791. for (CampusTime campusTime : campusTimeList) {
  792. if (campusTime.getClockName().contains("、")) {
  793. timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  794. timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  795. } else {
  796. timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  797. }
  798. }
  799. //获取当前打卡时间段的打卡规则
  800. String campusTimeStr = timeList.get(index);
  801. String startTime = "";
  802. String endTime = "";
  803. Integer lateTimeNow = 0;
  804. Integer leaveTimeNow = 0;
  805. String[] startAndEndTime = campusTimeStr.split("、");
  806. Calendar calendar = Calendar.getInstance();
  807. String leaveTimeNowStr = "";
  808. String lateTimeNowStr = "";
  809. //上班规则
  810. if (index == 0) {
  811. String[] YMS = clockTime.split(" ")[0].split("-");
  812. String[] HMS = startAndEndTime[0].split(":");
  813. String[] HMS1 = startAndEndTime[1].split(":");
  814. // System.out.println(clockTime);
  815. 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);
  816. lateTimeNowStr = format(calendar.getTime());
  817. 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);
  818. leaveTimeNowStr = format(calendar.getTime());
  819. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) + Integer.parseInt(lateTime);
  820. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]) + Integer.parseInt(lateTime);
  821. //下班规则
  822. } else if (index == timeList.size() - 1) {
  823. String[] YMS = clockTime.split(" ")[0].split("-");
  824. String[] HMS = startAndEndTime[0].split(":");
  825. String[] HMS1 = startAndEndTime[1].split(":");
  826. 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);
  827. lateTimeNowStr = format(calendar.getTime());
  828. calendar.set(Integer.parseInt(YMS[0]), Integer.parseInt(YMS[1]) - 1, Integer.parseInt(YMS[2]), Integer.parseInt(HMS1[0]), Integer.parseInt(HMS1[1]), 0);
  829. leaveTimeNowStr = format(calendar.getTime());
  830. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) - Integer.parseInt(lateTime);
  831. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]);
  832. //中间卡规则
  833. } else {
  834. String[] YMS = clockTime.split(" ")[0].split("-");
  835. String[] HMS = startAndEndTime[0].split(":");
  836. String[] HMS1 = startAndEndTime[1].split(":");
  837. 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);
  838. lateTimeNowStr = format(calendar.getTime());
  839. 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);
  840. leaveTimeNowStr = format(calendar.getTime());
  841. // lateTimeNow = Integer.parseInt(startAndEndTime[0].split(":")[1]) - Integer.parseInt(lateTime);
  842. // leaveTimeNow = Integer.parseInt(startAndEndTime[1].split(":")[1]) + Integer.parseInt(lateTime);
  843. }
  844. // String lateTimeNowStr = startAndEndTime[0].split(":")[0] + ":" + lateTimeNow;
  845. // String leaveTimeNowStr = startAndEndTime[1].split(":")[0] + ":" + leaveTimeNow;
  846. // startTime = clockTime.split(" ")[0] + " " + lateTimeNowStr + ":00";
  847. // endTime = clockTime.split(" ")[0] + " " + leaveTimeNowStr + ":00";
  848. //下班打卡截至时间
  849. if (index == timeList.size() - 1) {
  850. leaveTimeNowStr = clockTime.split(" ")[0] + " " + "23:59:59";
  851. }
  852. clockTime = clockTime + ":00";
  853. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  854. String clockTimeNow = format(format.parse(clockTime));
  855. // String checkStartTime = format(format.parse(startTime));
  856. long clockTimeLong = format.parse(clockTime).getTime();
  857. long startTimeLong = format.parse(lateTimeNowStr).getTime();
  858. //打卡时间 - 考勤时间
  859. csTime = (clockTimeLong - startTimeLong) / 1000 / 60;
  860. // checkStartTime 早于 clockTimeNow compareTo>0 1 true
  861. compareTo = clockTimeNow.compareTo(lateTimeNowStr);
  862. if (compareTo > 0) {
  863. //当前时间已经计算了早退时间
  864. // String checkEndTime = format(format.parse(endTime));
  865. long endTimeLong = format.parse(leaveTimeNowStr).getTime();
  866. //打卡时间 - 考勤时间
  867. csTime = (clockTimeLong - endTimeLong) / 1000 / 60;
  868. // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1 true
  869. compareTo = leaveTimeNowStr.compareTo(clockTimeNow);
  870. }
  871. } catch (Exception e) {
  872. e.printStackTrace();
  873. }
  874. Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  875. return statu + "、" + csTime;
  876. }
  877. // /**
  878. // * 校验打卡时间
  879. // *
  880. // * @param campusTimeList 校区打卡规则集合
  881. // * @param clockTime 打卡时间
  882. // * @param lateTime 迟到早退时间
  883. // * @param type 须交验的时间段 start上班 end 下班
  884. // * @param camousType 校区 HJH MXH
  885. // * @return false 早退,迟到 true 正常打卡
  886. // */
  887. // public String changeTime(List<CampusTime> campusTimeList, String clockTime, String lateTime, String type, String camousType) {
  888. //
  889. // int compareTo = 0;
  890. // //打卡时间 - 考勤时间
  891. // long csTime = 0l;
  892. // try {
  893. // String[] clockTimeArr = clockTime.split(" ")[0].split("-");
  894. // SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd");
  895. // Calendar calendar = Calendar.getInstance();
  896. // List<String> timeList = new ArrayList<>();
  897. // for (CampusTime campusTime : campusTimeList) {
  898. // if (campusTime.getClockName().contains("、")) {
  899. // timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  900. // timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  901. // } else {
  902. // timeList.add(campusTime.getStartTime() + "、" + campusTime.getEndTime());
  903. // }
  904. // }
  905. //// //判断一个时间段之内打多次卡
  906. //// for (int n = 0; n < campusTimeList.size(); n++) {
  907. //// CampusTime campusTime = campusTimeList.get(n);
  908. //// //判断当前时间的打卡次数
  909. //// if (campusTime.getCount() > 1) {
  910. ////
  911. ////
  912. ////
  913. ////
  914. ////
  915. ////
  916. ////
  917. ////
  918. //// }
  919. //// }
  920. // for (int m = 0; m < timeList.size(); m++) {
  921. // String campusTimeStr = timeList.get(m);
  922. // String[] startAndEndTime = campusTimeStr.split("、");
  923. // String startTime = startAndEndTime[0];
  924. // String endTime = startAndEndTime[1];
  925. // //start 判断为上班上班时间
  926. //// if ("start".equals(type)) {
  927. // //当前时间已经计算了迟到时间
  928. // calendar.set(Integer.parseInt(clockTimeArr[0]), Integer.parseInt(clockTimeArr[1]), Integer.parseInt(clockTimeArr[2]) + Integer.parseInt(lateTime),
  929. // Integer.parseInt(startTime.split(":")[0]), Integer.parseInt(startTime.split(":")[1]));
  930. // String checkStartTime = format(calendar.getTime());
  931. // long clockTimeLong = format.parse(clockTime).getTime();
  932. // long startTimeLong = format.parse(checkStartTime).getTime();
  933. // //打卡时间 - 考勤时间
  934. // csTime = clockTimeLong - startTimeLong / 1000 / 60;
  935. // String clockTimeNow = format(format.parse(clockTime));
  936. // // checkStartTime 早于 clockTimeNow compareTo>0 1 true
  937. // compareTo = checkStartTime.compareTo(clockTimeNow);
  938. // //打卡时间大于起始时间则进行结束时间判断 大于其实时间 小于结束时间则为正常打卡
  939. // if (compareTo > 0) {
  940. // //当前时间已经计算了早退时间
  941. // calendar.set(Integer.parseInt(clockTimeArr[0]), Integer.parseInt(clockTimeArr[1]), Integer.parseInt(clockTimeArr[2]) - Integer.parseInt(lateTime),
  942. // Integer.parseInt(endTime.split(":")[0]), Integer.parseInt(endTime.split(":")[1]));
  943. // String checkEndTime = format(calendar.getTime());
  944. // long endTimeLong = format.parse(checkEndTime).getTime();
  945. // //打卡时间 - 考勤时间
  946. // csTime = clockTimeLong - endTimeLong / 1000 / 60;
  947. // // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1 true
  948. // compareTo = checkEndTime.compareTo(clockTimeNow);
  949. // if (compareTo < 0) {
  950. // Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  951. // return statu + "早退、" + csTime;
  952. // }
  953. // } else {
  954. // Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  955. // return statu + "迟到、" + csTime;
  956. // }
  957. //
  958. //// } else {
  959. //// calendar.set(Integer.parseInt(clockTimeArr[0]), Integer.parseInt(clockTimeArr[1]), Integer.parseInt(clockTimeArr[2])-Integer.parseInt(lateTime),
  960. //// Integer.parseInt(endTime.split(":")[0]), Integer.parseInt(endTime.split(":")[1]));
  961. //// String checkEndTime = format(calendar.getTime());
  962. //// String clockTimeNow = format(format.parse(clockTime));
  963. //// long clockTimeLong = format.parse(clockTime).getTime();
  964. //// long endTimeLong = format.parse(checkEndTime).getTime();
  965. //// //打卡时间 - 考勤时间
  966. //// csTime = clockTimeLong - endTimeLong/1000/60;
  967. //// // checkEndTime 晚于 clockTimeNow compareTo>0 迟到 1
  968. //// compareTo = clockTimeNow.compareTo(checkEndTime);
  969. //// }
  970. // }
  971. //
  972. // } catch (Exception e) {
  973. // e.printStackTrace();
  974. // }
  975. // // System.out.println(compareTo + " ------------timeStatutimeStatutimeStatutimeStatutimeStatu-----");
  976. // Boolean statu = compareTo > 0 ? Boolean.TRUE : Boolean.FALSE;
  977. // return statu + "正常、" + csTime;
  978. // }
  979. /**
  980. * 获取缺卡总天数
  981. *
  982. * @param shortageStr
  983. * @return
  984. */
  985. public Integer getShortage(String shortageStr) {
  986. Integer shortageCount = 0;
  987. String[] split = shortageStr.split("\r\n");
  988. for (int u = 0; u < split.length; u++) {
  989. if (split[u].contains("次") && split[u].contains("天")) {
  990. int indexT = split[u].indexOf("天");
  991. int indexC = split[u].indexOf("次");
  992. String count = split[u].substring(indexC + 1, indexT);
  993. shortageCount += Integer.parseInt(count);
  994. }
  995. }
  996. return shortageCount;
  997. }
  998. @Override
  999. public List<MonthlySummary> queryByWorkName(String workName) {
  1000. QueryWrapper<MonthlySummary> wrapper = new QueryWrapper<>();
  1001. wrapper.eq("work_name", workName);
  1002. List<MonthlySummary> list = this.list();
  1003. if (list.size() == 0) {
  1004. throw new RRException(BizCodeEnume.DATA_IS_NOT_EXIST, workName + "不存在");
  1005. }
  1006. return list;
  1007. }
  1008. /**
  1009. * 删除导入的月度汇总数据
  1010. *
  1011. * @return
  1012. */
  1013. public Boolean removeMonthlySummary() {
  1014. List<Long> idList = new ArrayList<>();
  1015. List<MonthlySummary> list = this.list();
  1016. if (list.size() == 0) {
  1017. return Boolean.TRUE;
  1018. }
  1019. list.forEach(monthlySummary -> {
  1020. idList.add(monthlySummary.getId());
  1021. });
  1022. return this.removeByIds(idList);
  1023. }
  1024. }