Explorar el Código

优化考勤打卡

wuxw hace 3 años
padre
commit
37aff83df2

+ 35 - 0
java110-bean/src/main/java/com/java110/dto/attendanceClasses/AttendanceClassesTaskDetailDto.java

@@ -18,11 +18,15 @@ public class AttendanceClassesTaskDetailDto extends PageDto implements Serializa
     //打卡状态 10000未考勤  30000正常考勤 40000 迟到 50000早退 60000 免考勤 70000 补考勤
     public static final String STATE_REPLENISH = "70000";//补考勤
     public static final String STATE_WAIT = "10000";//补考勤
+    public static final String STATE_NORMAL = "30000";//正常考勤
+    public static final String STATE_LATE = "40000";//迟到
+    public static final String STATE_LEAVE = "50000";//早退
 
     public static final String SPEC_CD_START = "1001" ;//上班时间
     public static final String SPEC_CD_END = "2002" ;//上班时间
 
     private String checkTime;
+    private String nowCheckTime;
     private String detailId;
     private String specCd;
     private String specName;
@@ -37,6 +41,12 @@ public class AttendanceClassesTaskDetailDto extends PageDto implements Serializa
     private String value;
     private String taskId;
 
+
+
+    private String classId;
+
+    private String staffId;
+
     private String[] taskIds;
 
 
@@ -185,4 +195,29 @@ public class AttendanceClassesTaskDetailDto extends PageDto implements Serializa
     public void setLateValue(String lateValue) {
         this.lateValue = lateValue;
     }
+
+    public String getNowCheckTime() {
+        return nowCheckTime;
+    }
+
+    public void setNowCheckTime(String nowCheckTime) {
+        this.nowCheckTime = nowCheckTime;
+    }
+
+    public String getClassId() {
+        return classId;
+    }
+
+    public void setClassId(String classId) {
+        this.classId = classId;
+    }
+
+
+    public String getStaffId() {
+        return staffId;
+    }
+
+    public void setStaffId(String staffId) {
+        this.staffId = staffId;
+    }
 }

+ 39 - 24
java110-bean/src/main/java/com/java110/po/attendanceLog/AttendanceLogPo.java

@@ -6,62 +6,77 @@ import java.util.Date;
 public class AttendanceLogPo implements Serializable {
 
     private String departmentName;
-private String departmentId;
-private String staffName;
-private String logId;
-private String statusCd = "0";
-private String storeId;
-private String staffId;
-private String clockTime;
-public String getDepartmentName() {
+    private String departmentId;
+    private String staffName;
+    private String logId;
+    private String statusCd = "0";
+    private String storeId;
+    private String staffId;
+    private String clockTime;
+
+    public String getDepartmentName() {
         return departmentName;
     }
-public void setDepartmentName(String departmentName) {
+
+    public void setDepartmentName(String departmentName) {
         this.departmentName = departmentName;
     }
-public String getDepartmentId() {
+
+    public String getDepartmentId() {
         return departmentId;
     }
-public void setDepartmentId(String departmentId) {
+
+    public void setDepartmentId(String departmentId) {
         this.departmentId = departmentId;
     }
-public String getStaffName() {
+
+    public String getStaffName() {
         return staffName;
     }
-public void setStaffName(String staffName) {
+
+    public void setStaffName(String staffName) {
         this.staffName = staffName;
     }
-public String getLogId() {
+
+    public String getLogId() {
         return logId;
     }
-public void setLogId(String logId) {
+
+    public void setLogId(String logId) {
         this.logId = logId;
     }
-public String getStatusCd() {
+
+    public String getStatusCd() {
         return statusCd;
     }
-public void setStatusCd(String statusCd) {
+
+    public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
-public String getStoreId() {
+
+    public String getStoreId() {
         return storeId;
     }
-public void setStoreId(String storeId) {
+
+    public void setStoreId(String storeId) {
         this.storeId = storeId;
     }
-public String getStaffId() {
+
+    public String getStaffId() {
         return staffId;
     }
-public void setStaffId(String staffId) {
+
+    public void setStaffId(String staffId) {
         this.staffId = staffId;
     }
-public String getClockTime() {
+
+    public String getClockTime() {
         return clockTime;
     }
-public void setClockTime(String clockTime) {
+
+    public void setClockTime(String clockTime) {
         this.clockTime = clockTime;
     }
 
 
-
 }

+ 11 - 0
java110-db/src/main/resources/mapper/common/AttendanceClassesTaskDetailServiceDaoImplMapper.xml

@@ -21,12 +21,23 @@
         specCd,t.status_cd,t.status_cd statusCd,t.remark,t.face_path,t.face_path facePath,t.state,t.store_id,t.store_id
         storeId,t.value,t.task_id,t.task_id taskId,td.`name` specName,td1.name stateName,t.leave_value leaveValue,t.late_value lateValue
         from attendance_classes_task_detail t
+        left join attendance_classes_task act on t.task_id = act.task_id and act.status_cd = '0'
         left join t_dict td on t.spec_cd = td.status_cd and td.table_name = 'attendance_classes_attr' and td.table_columns = 'spec_cd'
         left join t_dict td1 on t.state = td1.status_cd and td1.table_name = 'attendance_classes_task_detail' and td1.table_columns = 'state'
         where 1 =1
+        <if test="classId !=null and classId != ''">
+            and act.class_id = #{classId}
+        </if>
+        <if test="staffId !=null and staffId != ''">
+            and act.staff_id = #{staffId}
+        </if>
         <if test="checkTime !=null and checkTime != ''">
             and t.check_time= #{checkTime}
         </if>
+        <if test="nowCheckTime !=null and nowCheckTime != ''">
+            and t.leave_value &lt; #{nowCheckTime}
+            and t.late_value &gt; #{nowCheckTime}
+        </if>
         <if test="detailId !=null and detailId != ''">
             and t.detail_id= #{detailId}
         </if>

+ 222 - 0
service-common/src/main/java/com/java110/common/cmd/attendanceClasses/CheckInCmd.java

@@ -0,0 +1,222 @@
+package com.java110.common.cmd.attendanceClasses;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.smo.impl.AttendanceClassesTaskDetailInnerServiceSMOImpl;
+import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.client.FileUploadTemplate;
+import com.java110.core.context.ICmdDataFlowContext;
+import com.java110.core.event.cmd.Cmd;
+import com.java110.core.event.cmd.CmdEvent;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.doc.annotation.*;
+import com.java110.dto.attendanceClasses.AttendanceClassesDto;
+import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto;
+import com.java110.dto.attendanceClasses.AttendanceClassesTaskDto;
+import com.java110.dto.file.FileDto;
+import com.java110.dto.store.StoreUserDto;
+import com.java110.dto.user.UserDto;
+import com.java110.intf.common.*;
+import com.java110.intf.store.IStoreInnerServiceSMO;
+import com.java110.intf.user.IUserV1InnerServiceSMO;
+import com.java110.po.attendanceClasses.AttendanceClassesPo;
+import com.java110.po.attendanceClassesTask.AttendanceClassesTaskPo;
+import com.java110.po.attendanceClassesTaskDetail.AttendanceClassesTaskDetailPo;
+import com.java110.po.attendanceLog.AttendanceLogPo;
+import com.java110.utils.exception.CmdException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+
+
+@Java110CmdDoc(title = "考勤打卡",
+        description = "外系统打卡",
+        httpMethod = "post",
+        url = "http://{ip}:{port}/app/attendanceClasses.checkIn",
+        resource = "commonDoc",
+        author = "吴学文",
+        serviceCode = "attendanceClasses.checkIn"
+)
+
+@Java110ParamsDoc(params = {
+        @Java110ParamDoc(name = "classesId", length = 30, remark = "班次ID"),
+        @Java110ParamDoc(name = "staffId", length = 30, remark = "打卡员工"),
+        @Java110ParamDoc(name = "checkTime", type = "String", length = 30, remark = "考勤时间 YYYY-MM-DD hh24:mi:ss"),
+        @Java110ParamDoc(name = "photo", type = "String", length = 2048, remark = "考勤图片"),
+
+})
+
+@Java110ResponseDoc(
+        params = {
+                @Java110ParamDoc(name = "code", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 其他失败"),
+                @Java110ParamDoc(name = "msg", type = "String", length = 250, defaultValue = "成功", remark = "描述"),
+        }
+)
+
+@Java110ExampleDoc(
+        reqBody = "{\"classesId\":\"\",\"staffId\":\"xxx\",\"checkTime\":\"2022-01-01 09:09:09\",\"photo\":\"...\"}",
+        resBody = "{'code':0,'msg':'成功'}"
+)
+/**
+ * 考勤 打卡
+ */
+@Java110Cmd(serviceCode = "attendanceClasses.checkIn")
+public class CheckInCmd extends Cmd {
+
+    @Autowired
+    private IStoreInnerServiceSMO storeInnerServiceSMOImpl;
+
+    @Autowired
+    private IAttendanceLogInnerServiceSMO attendanceLogInnerServiceSMOImpl;
+
+    @Autowired
+    private IAttendanceClassesTaskDetailInnerServiceSMO attendanceClassesTaskDetailInnerServiceSMOImpl;
+
+    @Autowired
+    private IAttendanceClassesV1InnerServiceSMO attendanceClassesV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IAttendanceClassesTaskInnerServiceSMO attendanceClassesTaskInnerServiceSMOImpl;
+
+    @Autowired
+    private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IFileInnerServiceSMO fileInnerServiceSMOImpl;
+
+    @Override
+    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
+
+        Assert.hasKeyAndValue(reqJson, "classId", "未包含班次");
+        Assert.hasKeyAndValue(reqJson, "staffId", "未包含员工");
+        Assert.hasKeyAndValue(reqJson, "clockTime", "未包含考勤时间");
+    }
+
+    @Override
+    public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
+
+        StoreUserDto storeUserDto = new StoreUserDto();
+        storeUserDto.setUserId(reqJson.getString("staffId"));
+        List<StoreUserDto> storeUserDtos = storeInnerServiceSMOImpl.getStoreUserInfo(storeUserDto);
+
+        Assert.listOnlyOne(storeUserDtos, "未找到商户信息");
+
+        UserDto userDto = new UserDto();
+        userDto.setUserId(reqJson.getString("staffId"));
+        List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
+
+        Assert.listOnlyOne(storeUserDtos, "员工不存在");
+
+        // 考勤班次是否存在
+        AttendanceClassesDto attendanceClassesDto = new AttendanceClassesDto();
+        attendanceClassesDto.setStoreId(storeUserDtos.get(0).getStoreId());
+        attendanceClassesDto.setClassesId(reqJson.getString("classId"));
+        List<AttendanceClassesDto> attendanceClassesDtos = attendanceClassesV1InnerServiceSMOImpl.queryAttendanceClassess(attendanceClassesDto);
+
+        Assert.listOnlyOne(attendanceClassesDtos, "班次不存在");
+
+
+        AttendanceLogPo attendanceLogPo = new AttendanceLogPo();
+        attendanceLogPo.setLogId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_logId));
+        attendanceLogPo.setStoreId(storeUserDtos.get(0).getStoreId());
+        attendanceLogPo.setStaffId(reqJson.getString("staffId"));
+        attendanceLogPo.setClockTime(reqJson.getString("clockTime"));
+        attendanceLogPo.setDepartmentId(attendanceClassesDtos.get(0).getClassesObjId());
+        attendanceLogPo.setDepartmentName(attendanceClassesDtos.get(0).getClassesObjName());
+        attendanceLogPo.setStaffName(userDtos.get(0).getName());
+
+        int flag = attendanceLogInnerServiceSMOImpl.saveAttendanceLog(attendanceLogPo);
+
+        if (flag < 1) {
+            throw new CmdException("考勤失败");
+        }
+
+        // 查询是否为上班
+
+        AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
+        attendanceClassesTaskDetailDto.setNowCheckTime(reqJson.getString("clockTime"));
+        attendanceClassesTaskDetailDto.setClassId(reqJson.getString("classId"));
+        attendanceClassesTaskDetailDto.setStaffId(reqJson.getString("staffId"));
+        List<AttendanceClassesTaskDetailDto> attendanceClassesTaskDetailDtos = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetails(attendanceClassesTaskDetailDto);
+
+        if (attendanceClassesTaskDetailDtos == null || attendanceClassesTaskDetailDtos.size() < 1) {
+            context.setResponseEntity(ResultVo.error("不是考勤范围内"));
+            return;
+        }
+
+        String photo = "";
+        if (reqJson.containsKey("photo") && !StringUtil.isEmpty(reqJson.getString("photo"))) {
+            FileDto fileDto = new FileDto();
+            fileDto.setFileId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_file_id));
+            fileDto.setFileName(fileDto.getFileId());
+            fileDto.setContext(reqJson.getString("photo"));
+            fileDto.setSuffix("jpeg");
+            fileDto.setCommunityId("-1");
+            photo = fileInnerServiceSMOImpl.saveFile(fileDto);
+        }
+
+        //当前考勤的 记录
+        AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto = attendanceClassesTaskDetailDtos.get(0);
+
+        AttendanceClassesTaskDetailPo attendanceClassesTaskDetailPo = new AttendanceClassesTaskDetailPo();
+        attendanceClassesTaskDetailPo.setDetailId(nowAttendanceClassesTaskDetailDto.getDetailId());
+        attendanceClassesTaskDetailPo.setCheckTime(reqJson.getString("clockTime"));
+        attendanceClassesTaskDetailPo.setState(getState(nowAttendanceClassesTaskDetailDto, DateUtil.getDateFromStringA(reqJson.getString("clockTime"))));
+        attendanceClassesTaskDetailPo.setFacePath(photo);
+        flag = attendanceClassesTaskDetailInnerServiceSMOImpl.updateAttendanceClassesTaskDetail(attendanceClassesTaskDetailPo);
+
+        if (flag < 1) {
+            throw new CmdException("考勤失败");
+        }
+
+
+        attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
+        attendanceClassesTaskDetailDto.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
+        attendanceClassesTaskDetailDto.setState(AttendanceClassesTaskDetailDto.STATE_WAIT);
+        int count = attendanceClassesTaskDetailInnerServiceSMOImpl.queryAttendanceClassesTaskDetailsCount(attendanceClassesTaskDetailDto);
+        AttendanceClassesTaskPo attendanceClassesTaskPo = new AttendanceClassesTaskPo();
+        attendanceClassesTaskPo.setTaskId(nowAttendanceClassesTaskDetailDto.getTaskId());
+        if(count > 0){
+            attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_DOING);
+        }else{
+            attendanceClassesTaskPo.setState(AttendanceClassesTaskDto.STATE_FINISH);
+        }
+
+        flag = attendanceClassesTaskInnerServiceSMOImpl.updateAttendanceClassesTask(attendanceClassesTaskPo);
+
+        if (flag < 1) {
+            throw new CmdException("考勤失败");
+        }
+    }
+
+    /**
+     * 考勤状态计算
+     *
+     * @param nowAttendanceClassesTaskDetailDto
+     * @param clockTime
+     * @return
+     */
+    private String getState(AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto, Date clockTime) {
+
+        Date value = DateUtil.getDateFromStringA(nowAttendanceClassesTaskDetailDto.getValue());
+
+        if(AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(nowAttendanceClassesTaskDetailDto.getSpecCd())){
+
+            if(clockTime.after(value)){
+                return AttendanceClassesTaskDetailDto.STATE_LATE;
+            }
+            return AttendanceClassesTaskDetailDto.STATE_NORMAL;
+        }
+
+
+        if(clockTime.before(value)){
+            return AttendanceClassesTaskDetailDto.STATE_LEAVE;
+        }
+        return AttendanceClassesTaskDetailDto.STATE_NORMAL;
+    }
+}