CheckInCmd.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package com.java110.common.cmd.attendanceClasses;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.core.annotation.Java110Cmd;
  4. import com.java110.core.annotation.Java110Transactional;
  5. import com.java110.core.context.ICmdDataFlowContext;
  6. import com.java110.core.event.cmd.Cmd;
  7. import com.java110.core.event.cmd.CmdEvent;
  8. import com.java110.core.factory.GenerateCodeFactory;
  9. import com.java110.core.smo.IPhotoSMO;
  10. import com.java110.doc.annotation.*;
  11. import com.java110.dto.attendance.AttendanceClassesDto;
  12. import com.java110.dto.attendance.AttendanceClassesTaskDetailDto;
  13. import com.java110.dto.attendance.AttendanceClassesTaskDto;
  14. import com.java110.dto.attendance.AttendanceClassesStaffDto;
  15. import com.java110.dto.file.FileDto;
  16. import com.java110.dto.store.StoreUserDto;
  17. import com.java110.dto.user.UserDto;
  18. import com.java110.intf.common.*;
  19. import com.java110.intf.store.IStoreInnerServiceSMO;
  20. import com.java110.intf.user.IAttendanceClassesStaffV1InnerServiceSMO;
  21. import com.java110.intf.user.IUserV1InnerServiceSMO;
  22. import com.java110.po.attendance.AttendanceClassesTaskPo;
  23. import com.java110.po.attendance.AttendanceClassesTaskDetailPo;
  24. import com.java110.po.attendance.AttendanceLogPo;
  25. import com.java110.utils.exception.CmdException;
  26. import com.java110.utils.util.Assert;
  27. import com.java110.utils.util.DateUtil;
  28. import com.java110.utils.util.ListUtil;
  29. import com.java110.utils.util.StringUtil;
  30. import com.java110.vo.ResultVo;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import java.text.ParseException;
  33. import java.util.Date;
  34. import java.util.List;
  35. @Java110CmdDoc(title = "考勤打卡",
  36. description = "外系统打卡",
  37. httpMethod = "post",
  38. url = "http://{ip}:{port}/app/attendanceClasses.checkIn",
  39. resource = "commonDoc",
  40. author = "吴学文",
  41. serviceCode = "attendanceClasses.checkIn"
  42. )
  43. @Java110ParamsDoc(params = {
  44. @Java110ParamDoc(name = "staffId", length = 30, remark = "打卡员工"),
  45. @Java110ParamDoc(name = "checkTime", type = "String", length = 30, remark = "考勤时间 YYYY-MM-DD hh24:mi:ss"),
  46. @Java110ParamDoc(name = "photo", type = "String", length = 2048, remark = "考勤图片"),
  47. })
  48. @Java110ResponseDoc(
  49. params = {
  50. @Java110ParamDoc(name = "code", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 其他失败"),
  51. @Java110ParamDoc(name = "msg", type = "String", length = 250, defaultValue = "成功", remark = "描述"),
  52. }
  53. )
  54. @Java110ExampleDoc(
  55. reqBody = "{\"classesId\":\"\",\"staffId\":\"xxx\",\"checkTime\":\"2022-01-01 09:09:09\",\"photo\":\"...\"}",
  56. resBody = "{'code':0,'msg':'成功'}"
  57. )
  58. /**
  59. * 考勤 打卡
  60. */
  61. @Java110Cmd(serviceCode = "attendanceClasses.checkIn")
  62. public class CheckInCmd extends Cmd {
  63. @Autowired
  64. private IStoreInnerServiceSMO storeInnerServiceSMOImpl;
  65. @Autowired
  66. private IAttendanceLogInnerServiceSMO attendanceLogInnerServiceSMOImpl;
  67. @Autowired
  68. private IAttendanceClassesTaskDetailInnerServiceSMO attendanceClassesTaskDetailInnerServiceSMOImpl;
  69. @Autowired
  70. private IAttendanceClassesV1InnerServiceSMO attendanceClassesV1InnerServiceSMOImpl;
  71. @Autowired
  72. private IAttendanceClassesTaskInnerServiceSMO attendanceClassesTaskInnerServiceSMOImpl;
  73. @Autowired
  74. private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
  75. @Autowired
  76. private IFileInnerServiceSMO fileInnerServiceSMOImpl;
  77. @Autowired
  78. private IAttendanceClassesStaffV1InnerServiceSMO attendanceClassesStaffV1InnerServiceSMOImpl;
  79. @Autowired
  80. private IPhotoSMO photoSMOImpl;
  81. @Override
  82. public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
  83. Assert.hasKeyAndValue(reqJson, "staffId", "未包含员工");
  84. Assert.hasKeyAndValue(reqJson, "checkTime", "未包含考勤时间");
  85. }
  86. @Override
  87. @Java110Transactional
  88. public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
  89. StoreUserDto storeUserDto = new StoreUserDto();
  90. storeUserDto.setUserId(reqJson.getString("staffId"));
  91. List<StoreUserDto> storeUserDtos = storeInnerServiceSMOImpl.getStoreUserInfo(storeUserDto);
  92. Assert.listOnlyOne(storeUserDtos, "未找到商户信息");
  93. UserDto userDto = new UserDto();
  94. userDto.setUserId(reqJson.getString("staffId"));
  95. List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
  96. Assert.listOnlyOne(storeUserDtos, "员工不存在");
  97. AttendanceClassesStaffDto attendanceClassesStaffDto = new AttendanceClassesStaffDto();
  98. attendanceClassesStaffDto.setStaffId(reqJson.getString("staffId"));
  99. attendanceClassesStaffDto.setStoreId(storeUserDtos.get(0).getStoreId());
  100. List<AttendanceClassesStaffDto> attendanceClassesStaffs = attendanceClassesStaffV1InnerServiceSMOImpl.queryAttendanceClassesStaffs(attendanceClassesStaffDto);
  101. if (ListUtil.isNull(attendanceClassesStaffs)) {
  102. throw new CmdException("员工没有考勤任务");
  103. }
  104. boolean hasCheckInAttendance = false;
  105. for (AttendanceClassesStaffDto tmpAttendanceClassesStaffDto : attendanceClassesStaffs) {
  106. // 考勤班次是否存在
  107. AttendanceClassesDto attendanceClassesDto = new AttendanceClassesDto();
  108. attendanceClassesDto.setStoreId(storeUserDtos.get(0).getStoreId());
  109. attendanceClassesDto.setClassesId(tmpAttendanceClassesStaffDto.getClassesId());
  110. List<AttendanceClassesDto> attendanceClassesDtos = attendanceClassesV1InnerServiceSMOImpl.queryAttendanceClassess(attendanceClassesDto);
  111. if (ListUtil.isNull(attendanceClassesDtos)) {
  112. continue;
  113. }
  114. hasCheckInAttendance = true;
  115. doCheckInAttendanceLog(context, reqJson, storeUserDtos, userDtos, attendanceClassesDtos.get(0));
  116. }
  117. if (!hasCheckInAttendance) {
  118. throw new CmdException("班次不存在");
  119. }
  120. }
  121. private void doCheckInAttendanceLog(ICmdDataFlowContext context, JSONObject reqJson, List<StoreUserDto> storeUserDtos, List<UserDto> userDtos, AttendanceClassesDto attendanceClassesDto) {
  122. String photo = "";
  123. if (reqJson.containsKey("photo") && !StringUtil.isEmpty(reqJson.getString("photo"))) {
  124. FileDto fileDto = new FileDto();
  125. fileDto.setFileId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_file_id));
  126. fileDto.setFileName(fileDto.getFileId());
  127. fileDto.setContext(reqJson.getString("photo"));
  128. fileDto.setSuffix("jpeg");
  129. fileDto.setCommunityId("-1");
  130. photo = fileInnerServiceSMOImpl.saveFile(fileDto);
  131. }
  132. AttendanceLogPo attendanceLogPo = new AttendanceLogPo();
  133. attendanceLogPo.setLogId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_logId));
  134. attendanceLogPo.setStoreId(storeUserDtos.get(0).getStoreId());
  135. attendanceLogPo.setStaffId(reqJson.getString("staffId"));
  136. attendanceLogPo.setClockTime(reqJson.getString("checkTime"));
  137. attendanceLogPo.setDepartmentId(attendanceClassesDto.getClassesId());
  138. attendanceLogPo.setDepartmentName(attendanceClassesDto.getClassesName());
  139. attendanceLogPo.setStaffName(userDtos.get(0).getName());
  140. attendanceLogPo.setFacePath(photo);
  141. int flag = attendanceLogInnerServiceSMOImpl.saveAttendanceLog(attendanceLogPo);
  142. if (flag < 1) {
  143. throw new CmdException("考勤失败");
  144. }
  145. // 查询是否为上班
  146. AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
  147. attendanceClassesTaskDetailDto.setNowCheckTime(reqJson.getString("checkTime"));
  148. attendanceClassesTaskDetailDto.setClassId(attendanceClassesDto.getClassesId());
  149. attendanceClassesTaskDetailDto.setStaffId(reqJson.getString("staffId"));
  150. attendanceClassesTaskDetailDto.setState(AttendanceClassesTaskDetailDto.STATE_WAIT);
  151. List<AttendanceClassesTaskDetailDto> attendanceClassesTaskDetailDtos = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetails(attendanceClassesTaskDetailDto);
  152. if (attendanceClassesTaskDetailDtos == null || attendanceClassesTaskDetailDtos.size() < 1) {
  153. attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
  154. attendanceClassesTaskDetailDto.setNowCheckTime(reqJson.getString("checkTime"));
  155. attendanceClassesTaskDetailDto.setClassId(attendanceClassesDto.getClassesId());
  156. attendanceClassesTaskDetailDto.setStaffId(reqJson.getString("staffId"));
  157. attendanceClassesTaskDetailDtos = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetails(attendanceClassesTaskDetailDto);
  158. if (attendanceClassesTaskDetailDtos != null && attendanceClassesTaskDetailDtos.size() > 0) {
  159. String specName = "上班:";
  160. if (!AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(attendanceClassesTaskDetailDtos.get(0).getSpecCd())) {
  161. specName = "下班:";
  162. }
  163. updateAttendanceLogRemark(attendanceLogPo.getLogId(), specName + "重复打卡");
  164. context.setResponseEntity(ResultVo.error("重复打卡"));
  165. return;
  166. }
  167. updateAttendanceLogRemark(attendanceLogPo.getLogId(), "未到时间");
  168. context.setResponseEntity(ResultVo.error("未到时间"));
  169. return;
  170. }
  171. //当前考勤的 记录
  172. AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto = attendanceClassesTaskDetailDtos.get(0);
  173. AttendanceClassesTaskDetailPo attendanceClassesTaskDetailPo = new AttendanceClassesTaskDetailPo();
  174. attendanceClassesTaskDetailPo.setDetailId(nowAttendanceClassesTaskDetailDto.getDetailId());
  175. attendanceClassesTaskDetailPo.setCheckTime(reqJson.getString("checkTime"));
  176. attendanceClassesTaskDetailPo.setState(getState(nowAttendanceClassesTaskDetailDto, DateUtil.getDateFromStringA(reqJson.getString("checkTime"))));
  177. attendanceClassesTaskDetailPo.setFacePath(photo);
  178. flag = attendanceClassesTaskDetailInnerServiceSMOImpl.updateAttendanceClassesTaskDetail(attendanceClassesTaskDetailPo);
  179. String specName = "上班:";
  180. if (!AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(nowAttendanceClassesTaskDetailDto.getSpecCd())) {
  181. specName = "下班:";
  182. }
  183. if (flag < 1) {
  184. updateAttendanceLogRemark(attendanceLogPo.getLogId(), specName + "考勤失败");
  185. throw new CmdException("考勤失败");
  186. }
  187. attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
  188. attendanceClassesTaskDetailDto.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
  189. attendanceClassesTaskDetailDto.setState(AttendanceClassesTaskDetailDto.STATE_WAIT);
  190. int count = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetailsCount(attendanceClassesTaskDetailDto);
  191. AttendanceClassesTaskPo attendanceClassesTaskPo = new AttendanceClassesTaskPo();
  192. attendanceClassesTaskPo.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
  193. if (count > 0) {
  194. attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_DOING);
  195. } else {
  196. attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_FINISH);
  197. }
  198. flag = attendanceClassesTaskInnerServiceSMOImpl.updateAttendanceClassesTask(attendanceClassesTaskPo);
  199. // if (flag < 1) {
  200. // updateAttendanceLogRemark(attendanceLogPo.getLogId(), specName + "考勤失败");
  201. // throw new CmdException("考勤失败");
  202. // }
  203. String msg = "打卡成功";
  204. if (AttendanceClassesTaskDetailDto.STATE_LATE.equals(attendanceClassesTaskDetailPo.getState())) {
  205. msg = "打卡迟到";
  206. }
  207. if (AttendanceClassesTaskDetailDto.STATE_LEAVE.equals(attendanceClassesTaskDetailPo.getState())) {
  208. msg = "打卡早退";
  209. }
  210. updateAttendanceLogRemark(attendanceLogPo.getLogId(), specName + msg);
  211. context.setResponseEntity(ResultVo.createResponseEntity(ResultVo.CODE_OK, msg));
  212. }
  213. private void updateAttendanceLogRemark(String logId, String remark) {
  214. AttendanceLogPo attendanceLogPo = new AttendanceLogPo();
  215. attendanceLogPo.setLogId(logId);
  216. attendanceLogPo.setRemark(remark.length() > 1000 ? remark.substring(0, 1000) : remark);
  217. attendanceLogInnerServiceSMOImpl.updateAttendanceLog(attendanceLogPo);
  218. }
  219. /**
  220. * 考勤状态计算
  221. *
  222. * @param nowAttendanceClassesTaskDetailDto
  223. * @param checkTime
  224. * @return
  225. */
  226. private String getState(AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto, Date checkTime) {
  227. Date value = DateUtil.getDateFromStringA(nowAttendanceClassesTaskDetailDto.getValue());
  228. if (AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(nowAttendanceClassesTaskDetailDto.getSpecCd())) {
  229. if (checkTime.after(value)) {
  230. return AttendanceClassesTaskDetailDto.STATE_LATE;
  231. }
  232. return AttendanceClassesTaskDetailDto.STATE_NORMAL;
  233. }
  234. if (checkTime.before(value)) {
  235. return AttendanceClassesTaskDetailDto.STATE_LEAVE;
  236. }
  237. return AttendanceClassesTaskDetailDto.STATE_NORMAL;
  238. }
  239. }