CheckInCmd.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package com.java110.common.cmd.attendanceClasses;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.common.smo.impl.AttendanceClassesTaskDetailInnerServiceSMOImpl;
  4. import com.java110.core.annotation.Java110Cmd;
  5. import com.java110.core.annotation.Java110Transactional;
  6. import com.java110.core.client.FileUploadTemplate;
  7. import com.java110.core.context.ICmdDataFlowContext;
  8. import com.java110.core.event.cmd.Cmd;
  9. import com.java110.core.event.cmd.CmdEvent;
  10. import com.java110.core.factory.GenerateCodeFactory;
  11. import com.java110.core.smo.IPhotoSMO;
  12. import com.java110.doc.annotation.*;
  13. import com.java110.dto.attendanceClasses.AttendanceClassesDto;
  14. import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto;
  15. import com.java110.dto.attendanceClasses.AttendanceClassesTaskDto;
  16. import com.java110.dto.attendanceClassesStaff.AttendanceClassesStaffDto;
  17. import com.java110.dto.file.FileDto;
  18. import com.java110.dto.org.OrgStaffRelDto;
  19. import com.java110.dto.store.StoreUserDto;
  20. import com.java110.dto.user.UserDto;
  21. import com.java110.intf.common.*;
  22. import com.java110.intf.store.IOrgStaffRelV1InnerServiceSMO;
  23. import com.java110.intf.store.IStoreInnerServiceSMO;
  24. import com.java110.intf.user.IAttendanceClassesStaffV1InnerServiceSMO;
  25. import com.java110.intf.user.IUserV1InnerServiceSMO;
  26. import com.java110.po.attendanceClasses.AttendanceClassesPo;
  27. import com.java110.po.attendanceClassesTask.AttendanceClassesTaskPo;
  28. import com.java110.po.attendanceClassesTaskDetail.AttendanceClassesTaskDetailPo;
  29. import com.java110.po.attendanceLog.AttendanceLogPo;
  30. import com.java110.utils.exception.CmdException;
  31. import com.java110.utils.util.Assert;
  32. import com.java110.utils.util.DateUtil;
  33. import com.java110.utils.util.StringUtil;
  34. import com.java110.vo.ResultVo;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import java.text.ParseException;
  37. import java.util.ArrayList;
  38. import java.util.Date;
  39. import java.util.List;
  40. @Java110CmdDoc(title = "考勤打卡",
  41. description = "外系统打卡",
  42. httpMethod = "post",
  43. url = "http://{ip}:{port}/app/attendanceClasses.checkIn",
  44. resource = "commonDoc",
  45. author = "吴学文",
  46. serviceCode = "attendanceClasses.checkIn"
  47. )
  48. @Java110ParamsDoc(params = {
  49. @Java110ParamDoc(name = "staffId", length = 30, remark = "打卡员工"),
  50. @Java110ParamDoc(name = "checkTime", type = "String", length = 30, remark = "考勤时间 YYYY-MM-DD hh24:mi:ss"),
  51. @Java110ParamDoc(name = "photo", type = "String", length = 2048, remark = "考勤图片"),
  52. })
  53. @Java110ResponseDoc(
  54. params = {
  55. @Java110ParamDoc(name = "code", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 其他失败"),
  56. @Java110ParamDoc(name = "msg", type = "String", length = 250, defaultValue = "成功", remark = "描述"),
  57. }
  58. )
  59. @Java110ExampleDoc(
  60. reqBody = "{\"classesId\":\"\",\"staffId\":\"xxx\",\"checkTime\":\"2022-01-01 09:09:09\",\"photo\":\"...\"}",
  61. resBody = "{'code':0,'msg':'成功'}"
  62. )
  63. /**
  64. * 考勤 打卡
  65. */
  66. @Java110Cmd(serviceCode = "attendanceClasses.checkIn")
  67. public class CheckInCmd extends Cmd {
  68. @Autowired
  69. private IStoreInnerServiceSMO storeInnerServiceSMOImpl;
  70. @Autowired
  71. private IAttendanceLogInnerServiceSMO attendanceLogInnerServiceSMOImpl;
  72. @Autowired
  73. private IAttendanceClassesTaskDetailInnerServiceSMO attendanceClassesTaskDetailInnerServiceSMOImpl;
  74. @Autowired
  75. private IAttendanceClassesV1InnerServiceSMO attendanceClassesV1InnerServiceSMOImpl;
  76. @Autowired
  77. private IAttendanceClassesTaskInnerServiceSMO attendanceClassesTaskInnerServiceSMOImpl;
  78. @Autowired
  79. private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
  80. @Autowired
  81. private IFileInnerServiceSMO fileInnerServiceSMOImpl;
  82. @Autowired
  83. private IAttendanceClassesStaffV1InnerServiceSMO attendanceClassesStaffV1InnerServiceSMOImpl;
  84. @Autowired
  85. private IPhotoSMO photoSMOImpl;
  86. @Override
  87. public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
  88. Assert.hasKeyAndValue(reqJson, "staffId", "未包含员工");
  89. Assert.hasKeyAndValue(reqJson, "checkTime", "未包含考勤时间");
  90. }
  91. @Override
  92. @Java110Transactional
  93. public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
  94. StoreUserDto storeUserDto = new StoreUserDto();
  95. storeUserDto.setUserId(reqJson.getString("staffId"));
  96. List<StoreUserDto> storeUserDtos = storeInnerServiceSMOImpl.getStoreUserInfo(storeUserDto);
  97. Assert.listOnlyOne(storeUserDtos, "未找到商户信息");
  98. UserDto userDto = new UserDto();
  99. userDto.setUserId(reqJson.getString("staffId"));
  100. List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
  101. Assert.listOnlyOne(storeUserDtos, "员工不存在");
  102. AttendanceClassesStaffDto attendanceClassesStaffDto = new AttendanceClassesStaffDto();
  103. attendanceClassesStaffDto.setStaffId(reqJson.getString("staffId"));
  104. attendanceClassesStaffDto.setStoreId(storeUserDtos.get(0).getStoreId());
  105. List<AttendanceClassesStaffDto> attendanceClassesStaffs = attendanceClassesStaffV1InnerServiceSMOImpl.queryAttendanceClassesStaffs(attendanceClassesStaffDto);
  106. if (attendanceClassesStaffs == null || attendanceClassesStaffs.size() < 1) {
  107. throw new CmdException("员工没有考勤任务");
  108. }
  109. for (AttendanceClassesStaffDto tmpAttendanceClassesStaffDto : attendanceClassesStaffs) {
  110. // 考勤班次是否存在
  111. AttendanceClassesDto attendanceClassesDto = new AttendanceClassesDto();
  112. attendanceClassesDto.setStoreId(storeUserDtos.get(0).getStoreId());
  113. attendanceClassesDto.setClassesId(tmpAttendanceClassesStaffDto.getClassesId());
  114. List<AttendanceClassesDto> attendanceClassesDtos = attendanceClassesV1InnerServiceSMOImpl.queryAttendanceClassess(attendanceClassesDto);
  115. if (attendanceClassesDtos == null || attendanceClassesDtos.size() < 1) {
  116. throw new CmdException("班次不存在");
  117. }
  118. doCheckInAttendanceLog(context, reqJson, storeUserDtos, userDtos, attendanceClassesDtos.get(0));
  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. context.setResponseEntity(ResultVo.error("重复打卡"));
  160. return;
  161. }
  162. context.setResponseEntity(ResultVo.error("未到时间"));
  163. return;
  164. }
  165. //当前考勤的 记录
  166. AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto = attendanceClassesTaskDetailDtos.get(0);
  167. AttendanceClassesTaskDetailPo attendanceClassesTaskDetailPo = new AttendanceClassesTaskDetailPo();
  168. attendanceClassesTaskDetailPo.setDetailId(nowAttendanceClassesTaskDetailDto.getDetailId());
  169. attendanceClassesTaskDetailPo.setCheckTime(reqJson.getString("checkTime"));
  170. attendanceClassesTaskDetailPo.setState(getState(nowAttendanceClassesTaskDetailDto, DateUtil.getDateFromStringA(reqJson.getString("checkTime"))));
  171. attendanceClassesTaskDetailPo.setFacePath(photo);
  172. flag = attendanceClassesTaskDetailInnerServiceSMOImpl.updateAttendanceClassesTaskDetail(attendanceClassesTaskDetailPo);
  173. if (flag < 1) {
  174. throw new CmdException("考勤失败");
  175. }
  176. attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
  177. attendanceClassesTaskDetailDto.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
  178. attendanceClassesTaskDetailDto.setState(AttendanceClassesTaskDetailDto.STATE_WAIT);
  179. int count = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetailsCount(attendanceClassesTaskDetailDto);
  180. AttendanceClassesTaskPo attendanceClassesTaskPo = new AttendanceClassesTaskPo();
  181. attendanceClassesTaskPo.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
  182. if (count > 0) {
  183. attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_DOING);
  184. } else {
  185. attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_FINISH);
  186. }
  187. flag = attendanceClassesTaskInnerServiceSMOImpl.updateAttendanceClassesTask(attendanceClassesTaskPo);
  188. if (flag < 1) {
  189. throw new CmdException("考勤失败");
  190. }
  191. String msg = "打卡成功";
  192. if (AttendanceClassesTaskDetailDto.STATE_LATE.equals(attendanceClassesTaskDetailPo.getState())) {
  193. msg = "打开迟到";
  194. }
  195. if (AttendanceClassesTaskDetailDto.STATE_LEAVE.equals(attendanceClassesTaskDetailPo.getState())) {
  196. msg = "打开早退";
  197. }
  198. context.setResponseEntity(ResultVo.createResponseEntity(ResultVo.CODE_OK, msg));
  199. }
  200. /**
  201. * 考勤状态计算
  202. *
  203. * @param nowAttendanceClassesTaskDetailDto
  204. * @param checkTime
  205. * @return
  206. */
  207. private String getState(AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto, Date checkTime) {
  208. Date value = DateUtil.getDateFromStringA(nowAttendanceClassesTaskDetailDto.getValue());
  209. if (AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(nowAttendanceClassesTaskDetailDto.getSpecCd())) {
  210. if (checkTime.after(value)) {
  211. return AttendanceClassesTaskDetailDto.STATE_LATE;
  212. }
  213. return AttendanceClassesTaskDetailDto.STATE_NORMAL;
  214. }
  215. if (checkTime.before(value)) {
  216. return AttendanceClassesTaskDetailDto.STATE_LEAVE;
  217. }
  218. return AttendanceClassesTaskDetailDto.STATE_NORMAL;
  219. }
  220. }