CheckInCmd.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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. context.setResponseEntity(ResultVo.error("未到时间"));
  154. return;
  155. }
  156. //当前考勤的 记录
  157. AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto = attendanceClassesTaskDetailDtos.get(0);
  158. AttendanceClassesTaskDetailPo attendanceClassesTaskDetailPo = new AttendanceClassesTaskDetailPo();
  159. attendanceClassesTaskDetailPo.setDetailId(nowAttendanceClassesTaskDetailDto.getDetailId());
  160. attendanceClassesTaskDetailPo.setCheckTime(reqJson.getString("checkTime"));
  161. attendanceClassesTaskDetailPo.setState(getState(nowAttendanceClassesTaskDetailDto, DateUtil.getDateFromStringA(reqJson.getString("checkTime"))));
  162. attendanceClassesTaskDetailPo.setFacePath(photo);
  163. flag = attendanceClassesTaskDetailInnerServiceSMOImpl.updateAttendanceClassesTaskDetail(attendanceClassesTaskDetailPo);
  164. if (flag < 1) {
  165. throw new CmdException("考勤失败");
  166. }
  167. attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
  168. attendanceClassesTaskDetailDto.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
  169. attendanceClassesTaskDetailDto.setState(AttendanceClassesTaskDetailDto.STATE_WAIT);
  170. int count = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetailsCount(attendanceClassesTaskDetailDto);
  171. AttendanceClassesTaskPo attendanceClassesTaskPo = new AttendanceClassesTaskPo();
  172. attendanceClassesTaskPo.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
  173. if (count > 0) {
  174. attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_DOING);
  175. } else {
  176. attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_FINISH);
  177. }
  178. flag = attendanceClassesTaskInnerServiceSMOImpl.updateAttendanceClassesTask(attendanceClassesTaskPo);
  179. if (flag < 1) {
  180. throw new CmdException("考勤失败");
  181. }
  182. String msg = "打卡成功";
  183. if(AttendanceClassesTaskDetailDto.STATE_LATE.equals(attendanceClassesTaskDetailPo.getState())){
  184. msg = "打开迟到";
  185. }
  186. if(AttendanceClassesTaskDetailDto.STATE_LEAVE.equals(attendanceClassesTaskDetailPo.getState())){
  187. msg = "打开早退";
  188. }
  189. context.setResponseEntity(ResultVo.createResponseEntity(ResultVo.CODE_OK,msg));
  190. }
  191. /**
  192. * 考勤状态计算
  193. *
  194. * @param nowAttendanceClassesTaskDetailDto
  195. * @param checkTime
  196. * @return
  197. */
  198. private String getState(AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto, Date checkTime) {
  199. Date value = DateUtil.getDateFromStringA(nowAttendanceClassesTaskDetailDto.getValue());
  200. if (AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(nowAttendanceClassesTaskDetailDto.getSpecCd())) {
  201. if (checkTime.after(value)) {
  202. return AttendanceClassesTaskDetailDto.STATE_LATE;
  203. }
  204. return AttendanceClassesTaskDetailDto.STATE_NORMAL;
  205. }
  206. if (checkTime.before(value)) {
  207. return AttendanceClassesTaskDetailDto.STATE_LEAVE;
  208. }
  209. return AttendanceClassesTaskDetailDto.STATE_NORMAL;
  210. }
  211. }