CardToShrOSFService.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by FernFlower decompiler)
  4. //
  5. package com.kingdee.eas.custom.szpgm.osf.task;
  6. import cn.hutool.core.util.StrUtil;
  7. import cn.hutool.http.HttpUtil;
  8. import com.alibaba.fastjson.JSON;
  9. import com.alibaba.fastjson.JSONArray;
  10. import com.alibaba.fastjson.JSONObject;
  11. import com.kingdee.bos.BOSException;
  12. import com.kingdee.bos.Context;
  13. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  14. import com.kingdee.bos.metadata.entity.EntityViewInfo;
  15. import com.kingdee.bos.metadata.entity.FilterInfo;
  16. import com.kingdee.bos.metadata.entity.FilterItemInfo;
  17. import com.kingdee.bos.metadata.entity.SelectorItemInfo;
  18. import com.kingdee.bos.metadata.query.util.CompareType;
  19. import com.kingdee.bos.tool.function.Strings;
  20. import com.kingdee.eas.base.permission.UserInfo;
  21. import com.kingdee.eas.common.EASBizException;
  22. import com.kingdee.eas.framework.CoreBaseCollection;
  23. import com.kingdee.eas.hr.ats.AttendanceEquipmentFactory;
  24. import com.kingdee.eas.hr.ats.AttendanceEquipmentInfo;
  25. import com.kingdee.eas.hr.ats.AttendanceFileFactory;
  26. import com.kingdee.eas.hr.ats.AttendanceFileInfo;
  27. import com.kingdee.eas.hr.ats.PunchCardRecordCollection;
  28. import com.kingdee.eas.hr.ats.PunchCardRecordFactory;
  29. import com.kingdee.eas.hr.ats.PunchCardRecordInfo;
  30. import com.kingdee.eas.hr.ats.PunchCardSourceEnum;
  31. import com.kingdee.shr.ats.web.util.HRTimeWebUtils;
  32. import java.sql.Timestamp;
  33. import java.time.LocalDate;
  34. import java.time.LocalDateTime;
  35. import java.time.LocalTime;
  36. import java.time.format.DateTimeFormatter;
  37. import java.util.Date;
  38. import java.util.HashMap;
  39. import java.util.HashSet;
  40. import java.util.Map;
  41. import java.util.Set;
  42. import org.apache.log4j.Logger;
  43. public class CardToShrOSFService implements IHRMsfService {
  44. private static Logger logger = Logger.getLogger(CardToShrOSFService.class);
  45. private static final String TIME_RANGE = "timeRange";
  46. private static final String STOP = "stop";
  47. private static final String RESTART = "ReStart";
  48. private static final String SPEND_FACE = "刷脸";
  49. public Object process(Context ctx, Map param) throws EASBizException, BOSException {
  50. System.out.println("同步打卡记录开始---------------------------------------------------------------------------------------");
  51. Map retMap = new HashMap();
  52. JSONArray formatErrorRecords = new JSONArray();
  53. JSONArray notExistRecords = new JSONArray();
  54. JSONArray duplicateRecords = new JSONArray();
  55. int recordCtn = 0;
  56. int successCtn = 0;
  57. String url = (String)param.get("url");
  58. String sign = (String)param.get("sign");
  59. String forwardHour = (String)param.get("forwardHour");
  60. String startDate = (String)param.get("startDate");
  61. String endDate = (String)param.get("endDate");
  62. String empNo = (String)param.get("empNo");
  63. String minusMinutes = (String)param.get("minusMinutes");
  64. String size = (String)param.get("size");
  65. LocalDateTime startTime = LocalDateTime.now();
  66. LocalDateTime endTime = LocalDateTime.now();
  67. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  68. try {
  69. if (StrUtil.isNotBlank(startDate)) {
  70. if (startDate.length() > 10) {
  71. startTime = LocalDateTime.parse(startDate, formatter);
  72. } else {
  73. LocalDate localDate = LocalDate.parse(startDate, DateTimeFormatter.ISO_LOCAL_DATE);
  74. startTime = LocalDateTime.of(localDate, LocalTime.MIN);
  75. }
  76. } else if (StrUtil.isNotBlank(minusMinutes)) {
  77. startTime = startTime.minusMinutes((long)Integer.parseInt(minusMinutes));
  78. } else {
  79. startTime = startTime.minusMinutes(5L);
  80. }
  81. if (StrUtil.isNotBlank(forwardHour)) {
  82. startTime = startTime.minusHours((long)Integer.parseInt(forwardHour));
  83. }
  84. if (StrUtil.isNotBlank(endDate)) {
  85. if (startDate.length() > 10) {
  86. endTime = LocalDateTime.parse(endDate, formatter);
  87. } else {
  88. LocalDate localDate = LocalDate.parse(endDate, DateTimeFormatter.ISO_LOCAL_DATE);
  89. endTime = LocalDateTime.of(localDate, LocalTime.MAX);
  90. }
  91. }
  92. } catch (Exception e) {
  93. System.out.println("日期格式化异常");
  94. e.printStackTrace();
  95. }
  96. int pageIndex = 0;
  97. int pageSize = 200;
  98. if (StrUtil.isNotBlank(size)) {
  99. pageSize = Integer.parseInt(size);
  100. }
  101. int code = 0;
  102. boolean end = false;
  103. int pageCount = 0;
  104. try {
  105. do {
  106. ++pageIndex;
  107. Map<String, Object> paramMap = new HashMap();
  108. paramMap.put("recordStartDate", startTime.format(formatter));
  109. paramMap.put("recordEndDate", endTime.format(formatter));
  110. paramMap.put("pageIndex", pageIndex);
  111. paramMap.put("pageSize", pageSize);
  112. paramMap.put("timestamp", System.currentTimeMillis() / 1000L);
  113. if (StrUtil.isNotBlank(empNo)) {
  114. paramMap.put("empNo", empNo);
  115. }
  116. paramMap.put("sign", SignUtil.generateSignature(paramMap, sign));
  117. String jsonResult = null;
  118. try {
  119. paramMap.put("url", url);
  120. System.out.println("同步打卡记录参数:" + JSON.toJSONString(paramMap));
  121. jsonResult = HttpUtil.post(url, JSON.toJSONString(paramMap));
  122. System.out.println("请求结果:" + jsonResult);
  123. } catch (Exception e) {
  124. logger.error("请求异常", e);
  125. e.printStackTrace();
  126. }
  127. try {
  128. if (!StrUtil.isNotBlank(jsonResult)) {
  129. code = 1;
  130. System.out.println("没有数据");
  131. } else {
  132. JSONObject jsonObject = JSONObject.parseObject(jsonResult);
  133. code = jsonObject.getInteger("code");
  134. JSONObject data = jsonObject.getJSONObject("data");
  135. if (0 == code && null != data) {
  136. pageCount = data.getInteger("pageCount");
  137. JSONArray datalist = data.getJSONArray("datalist");
  138. JSONArray recordsJson = new JSONArray();
  139. recordCtn += datalist.size();
  140. for(int i = 0; i < datalist.size(); ++i) {
  141. JSONObject record = datalist.getJSONObject(i);
  142. String eventType = record.getString("eventType");
  143. if ("刷脸".equals(eventType)) {
  144. String EquNo = record.getString("devId");
  145. EquNo = EquNo.replaceAll(" ", "");
  146. record.put("EquNo", EquNo);
  147. String CardId = record.getString("empNo");
  148. CardId = CardId.replaceAll(" ", "");
  149. record.put("CardId", CardId);
  150. String recordTime = record.getString("recordTime");
  151. recordTime = recordTime.replaceAll("/", "-");
  152. String[] Recs = recordTime.split(" ");
  153. String RecDate = Recs[0];
  154. String RecTime = Recs[1];
  155. if (!RecTime.startsWith("0")) {
  156. RecTime = "0" + RecTime;
  157. }
  158. record.put("RecDate", RecDate);
  159. record.put("RecTime", RecTime);
  160. record.put("Address", record.getString("devName"));
  161. recordsJson.add(record);
  162. } else {
  163. notExistRecords.add(record);
  164. }
  165. }
  166. try {
  167. System.out.println(recordsJson.toJSONString());
  168. Map<String, Object> ret = this.saveCards(ctx, recordsJson);
  169. successCtn += (Integer)ret.get("successCtn");
  170. formatErrorRecords.addAll((JSONArray)ret.get("formatErrorRecords"));
  171. notExistRecords.addAll((JSONArray)ret.get("notExistRecords"));
  172. } catch (Exception e) {
  173. logger.error("数据保存异常", e);
  174. e.printStackTrace();
  175. }
  176. }
  177. }
  178. } catch (Exception e) {
  179. e.printStackTrace();
  180. logger.error("保存打卡记录异常", e);
  181. }
  182. } while(pageIndex <= pageCount && 0 == code);
  183. } catch (Exception e) {
  184. logger.error("处理数据异常", e);
  185. e.printStackTrace();
  186. }
  187. retMap.put("recordCtn", recordCtn);
  188. retMap.put("successCtn", successCtn);
  189. retMap.put("formatErrorRecords", formatErrorRecords);
  190. retMap.put("notExistRecords", notExistRecords);
  191. retMap.put("duplicateRecords", duplicateRecords);
  192. System.out.println("同步打卡记录结束---------------------------------------------------------------------------------------");
  193. return retMap;
  194. }
  195. public Map saveCards(Context ctx, JSONArray recordsJson) throws BOSException, EASBizException {
  196. Map retMap = new HashMap();
  197. retMap.put("recordCtn", recordsJson.size());
  198. Set<String> EquNoSet = new HashSet();
  199. Set<String> setCardId = new HashSet();
  200. Timestamp minDateTime = null;
  201. Timestamp maxDateTime = null;
  202. JSONArray formatErrorRecords = new JSONArray();
  203. JSONArray notExistRecords = new JSONArray();
  204. JSONArray duplicateRecords = new JSONArray();
  205. CoreBaseCollection cardColl = new CoreBaseCollection();
  206. for(int i = 0; i < recordsJson.size(); ++i) {
  207. JSONObject jsonObject = recordsJson.getJSONObject(i);
  208. String EquNo = Strings.nullAsEmpty(jsonObject.getString("EquNo"));
  209. String CardId = Strings.nullAsEmpty(jsonObject.getString("CardId"));
  210. String RecDate = Strings.nullAsEmpty(jsonObject.getString("RecDate"));
  211. String RecTime = Strings.nullAsEmpty(jsonObject.getString("RecTime"));
  212. String Address = Strings.nullAsEmpty(jsonObject.getString("Address"));
  213. Date punchCardDate = HRTimeWebUtils.stringToShortDate(RecDate, true);
  214. Timestamp punchCardTime = HRTimeWebUtils.stringToTimestamp(RecDate + " " + RecTime, true);
  215. if (!"".equals(EquNo) && !"".equals(CardId) && punchCardDate != null && punchCardTime != null) {
  216. PunchCardRecordInfo cardInfo = new PunchCardRecordInfo();
  217. cardInfo.setEquipmentNum(EquNo);
  218. cardInfo.setAttendanceNum(CardId);
  219. cardInfo.setPunchCardDate(punchCardDate);
  220. cardInfo.setPunchCardTime(punchCardTime);
  221. cardInfo.setPunchCardPlace(Address);
  222. cardInfo.setPunchCardSource(PunchCardSourceEnum.attenceMachine);
  223. EquNoSet.add(EquNo);
  224. setCardId.add(CardId);
  225. cardColl.add(cardInfo);
  226. if (minDateTime != null && maxDateTime != null) {
  227. if (punchCardTime.getTime() < minDateTime.getTime()) {
  228. minDateTime = punchCardTime;
  229. } else if (punchCardTime.getTime() > maxDateTime.getTime()) {
  230. maxDateTime = punchCardTime;
  231. }
  232. } else {
  233. minDateTime = punchCardTime;
  234. maxDateTime = punchCardTime;
  235. }
  236. } else {
  237. formatErrorRecords.add(jsonObject);
  238. }
  239. }
  240. Map<String, AttendanceFileInfo> attendanceFileMap = AttendanceFileFactory.getLocalInstance(ctx).getPersonByAttendanceNum(setCardId);
  241. PunchCardRecordCollection existColl = this.getExistedPunchCardRecordCollection(ctx, minDateTime, maxDateTime, EquNoSet, setCardId);
  242. CoreBaseCollection cardCollFinally = new CoreBaseCollection();
  243. for(int i = 0; i < cardColl.size(); ++i) {
  244. PunchCardRecordInfo cardInfo = (PunchCardRecordInfo)cardColl.get(i);
  245. JSONObject jsObject = new JSONObject();
  246. jsObject.put("EquNo", cardInfo.getEquipmentNum());
  247. jsObject.put("CardId", cardInfo.getAttendanceNum());
  248. jsObject.put("RecDate", HRTimeWebUtils.dateShortToString(cardInfo.getPunchCardDate()));
  249. jsObject.put("RecTime", HRTimeWebUtils.timestampToString(cardInfo.getPunchCardTime()).substring(11));
  250. jsObject.put("Address", cardInfo.getPunchCardPlace());
  251. if (attendanceFileMap.containsKey(cardInfo.getAttendanceNum())) {
  252. if (!existColl.contains(cardInfo)) {
  253. cardInfo.setPunchCardSource(PunchCardSourceEnum.attenceMachine);
  254. AttendanceFileInfo attendanceFileInfo = (AttendanceFileInfo)attendanceFileMap.get(cardInfo.getAttendanceNum());
  255. cardInfo.setProposer(attendanceFileInfo.getProposer());
  256. cardInfo.setHrOrgUnit(attendanceFileInfo.getHrOrgUnit());
  257. cardInfo.setAdminOrgUnit(attendanceFileInfo.getAdminOrgUnit());
  258. cardInfo.setAdminOrgUnit(attendanceFileInfo.getAttAdminOrgUnit());
  259. cardInfo.setDescription(cardInfo.getEquipmentNum());
  260. try {
  261. cardInfo.setCreator((UserInfo)ctx.get("UserInfo"));
  262. cardInfo.setLastUpdateUser((UserInfo)ctx.get("UserInfo"));
  263. cardInfo.setCreateTime(new Timestamp(System.currentTimeMillis()));
  264. cardInfo.setLastUpdateTime(new Timestamp(System.currentTimeMillis()));
  265. } catch (Exception var23) {
  266. var23.printStackTrace();
  267. }
  268. cardCollFinally.add(cardInfo);
  269. }
  270. } else {
  271. notExistRecords.add(jsObject);
  272. }
  273. }
  274. PunchCardRecordFactory.getLocalInstance(ctx).saveBatchData(cardCollFinally);
  275. retMap.put("successCtn", cardCollFinally.size());
  276. retMap.put("formatErrorRecords", formatErrorRecords);
  277. retMap.put("notExistRecords", notExistRecords);
  278. retMap.put("duplicateRecords", duplicateRecords);
  279. return retMap;
  280. }
  281. private Map<String, AttendanceEquipmentInfo> getAttendanceEquipmentInfo(Context ctx, Set<String> EquNoSet) throws BOSException {
  282. new HashSet();
  283. EntityViewInfo evi = new EntityViewInfo();
  284. FilterInfo fi = new FilterInfo();
  285. evi.setFilter(fi);
  286. evi.getSelector().add(new SelectorItemInfo("id"));
  287. evi.getSelector().add(new SelectorItemInfo("state"));
  288. evi.getSelector().add(new SelectorItemInfo("address"));
  289. evi.getSelector().add(new SelectorItemInfo("number"));
  290. fi.getFilterItems().add(new FilterItemInfo("state", 1, CompareType.EQUALS));
  291. fi.getFilterItems().add(new FilterItemInfo("number", EquNoSet, CompareType.INCLUDE));
  292. CoreBaseCollection coll = AttendanceEquipmentFactory.getLocalInstance(ctx).getCollection(evi);
  293. Map<String, AttendanceEquipmentInfo> map = new HashMap();
  294. for(int i = 0; i < coll.size(); ++i) {
  295. AttendanceEquipmentInfo attendanceEquipmentInfo = (AttendanceEquipmentInfo)coll.get(i);
  296. map.put(attendanceEquipmentInfo.getNumber(), attendanceEquipmentInfo);
  297. }
  298. return map;
  299. }
  300. private PunchCardRecordCollection getExistedPunchCardRecordCollection(Context ctx, Timestamp minDateTime, Timestamp maxDateTime, Set<String> EquNoSet, Set<String> setCardId) throws BOSException {
  301. EntityViewInfo evi = new EntityViewInfo();
  302. FilterInfo fi = new FilterInfo();
  303. evi.setFilter(fi);
  304. evi.getSelector().add(new SelectorItemInfo("punchCardDate"));
  305. evi.getSelector().add(new SelectorItemInfo("punchCardTime"));
  306. evi.getSelector().add(new SelectorItemInfo("punchCardSource"));
  307. evi.getSelector().add(new SelectorItemInfo("equipmentNum"));
  308. evi.getSelector().add(new SelectorItemInfo("attendanceNum"));
  309. fi.getFilterItems().add(new FilterItemInfo("equipmentNum", EquNoSet, CompareType.INCLUDE));
  310. fi.getFilterItems().add(new FilterItemInfo("attendanceNum", setCardId, CompareType.INCLUDE));
  311. fi.getFilterItems().add(new FilterItemInfo("punchCardTime", maxDateTime, CompareType.LESS_EQUALS));
  312. fi.getFilterItems().add(new FilterItemInfo("punchCardTime", minDateTime, CompareType.GREATER_EQUALS));
  313. PunchCardRecordCollection existColl = PunchCardRecordFactory.getLocalInstance(ctx).getPunchCardRecordCollection(evi);
  314. return existColl;
  315. }
  316. public void setErrorMessage(Map<String, Object> param, String bizCode, String errorMsg) {
  317. }
  318. }