Prechádzať zdrojové kódy

考勤记录重复bug修复。

zhengqiang 3 rokov pred
rodič
commit
ccc90e1476

+ 2 - 0
common/src/main/java/com/jpsoft/shinestar/modules/business/dao/WorkScheduleAttendanceDAO.java

@@ -57,4 +57,6 @@ public interface WorkScheduleAttendanceDAO {
     int updateWorkMinute(WorkScheduleAttendance wsa);
 
 	double findSumWorkMinuteByParams(Long personId, Date startDate, Date endDate, Map<String, Object> searchParams);
+
+    List<Map> queryDuplicateRecord(Date startDate, int limit);
 }

+ 2 - 0
common/src/main/java/com/jpsoft/shinestar/modules/business/service/WorkScheduleAttendanceService.java

@@ -85,4 +85,6 @@ public interface WorkScheduleAttendanceService {
 	int updateWorkMinute(WorkScheduleAttendance wsa);
 
     BigDecimal findSumWorkMinuteByParams(Long personId, Date startDate, Date endDate,Map<String, Object> searchParams);
+
+	List<Map> queryDuplicateRecord(Date startDate, int limit);
 }

+ 77 - 68
common/src/main/java/com/jpsoft/shinestar/modules/business/service/impl/WorkScheduleAttendanceServiceImpl.java

@@ -26,6 +26,7 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -51,6 +52,9 @@ public class WorkScheduleAttendanceServiceImpl implements WorkScheduleAttendance
     @Autowired
     private ValueOperations<String, Object> valueOperations;
 
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
     @Autowired
     private DeviceInfoService deviceInfoService;
 
@@ -628,89 +632,89 @@ public class WorkScheduleAttendanceServiceImpl implements WorkScheduleAttendance
         int workMinutes = 0;
 
         try {
-            WorkShiftInfo workShiftInfo = workShiftInfoService.get(workShiftId);
+            String key = "wsa_" + personScheduleId + "_" + workShiftId + "_" + classify;
 
-            if (workShiftInfo != null) {
-                DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
+            boolean absent = valueOperations.setIfAbsent(key,true,1,TimeUnit.MINUTES);
 
-                if ("1".equals(classify)) {
-                    //上班
-                    DateTime workTime = DateTime.parse(attendanceDate + " " + workShiftInfo.getWorkTime(), formatter);
-                    workTime = workTime.plusDays(workShiftInfo.getWorkDayType());
+            if(absent) {
+                WorkShiftInfo workShiftInfo = workShiftInfoService.get(workShiftId);
 
-                    offsetMinute = Minutes.minutesBetween(new DateTime(recordTime), workTime).getMinutes();
-                } else {
-                    //下班
-                    DateTime closingTime = DateTime.parse(attendanceDate + " " + workShiftInfo.getClosingTime(), formatter);
-                    closingTime = closingTime.plusDays(workShiftInfo.getClosingDayType());
+                if (workShiftInfo != null) {
+                    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
 
-                    offsetMinute = Minutes.minutesBetween(new DateTime(recordTime), closingTime).getMinutes();
+                    if ("1".equals(classify)) {
+                        //上班
+                        DateTime workTime = DateTime.parse(attendanceDate + " " + workShiftInfo.getWorkTime(), formatter);
+                        workTime = workTime.plusDays(workShiftInfo.getWorkDayType());
+
+                        offsetMinute = Minutes.minutesBetween(new DateTime(recordTime), workTime).getMinutes();
+                    } else {
+                        //下班
+                        DateTime closingTime = DateTime.parse(attendanceDate + " " + workShiftInfo.getClosingTime(), formatter);
+                        closingTime = closingTime.plusDays(workShiftInfo.getClosingDayType());
 
-                    //计算本班次上班时长(下班时间-上班时间)
-                    List<WorkScheduleAttendance> onWorkList = workScheduleAttendanceDAO.findByPersonScheduleIdAndClassify(personScheduleId, workShiftId, "1");
+                        offsetMinute = Minutes.minutesBetween(new DateTime(recordTime), closingTime).getMinutes();
 
-                    if(onWorkList.size()>0){
-                        WorkScheduleAttendance workStartAttendance = onWorkList.get(0);
+                        //计算本班次上班时长(下班时间-上班时间)
+                        List<WorkScheduleAttendance> onWorkList = workScheduleAttendanceDAO.findByPersonScheduleIdAndClassify(personScheduleId, workShiftId, "1");
 
-                        if(StringUtils.isNotEmpty(workStartAttendance.getResult()) &&
-                        !"0".equals(workStartAttendance.getResult())){
-                            workMinutes = Minutes.minutesBetween(
-                                            new DateTime(workStartAttendance.getRecordTime()),
-                                            new DateTime(recordTime))
-                                    .getMinutes();
+                        if (onWorkList.size() > 0) {
+                            WorkScheduleAttendance workStartAttendance = onWorkList.get(0);
+
+                            if (StringUtils.isNotEmpty(workStartAttendance.getResult()) &&
+                                    !"0".equals(workStartAttendance.getResult())) {
+                                workMinutes = Minutes.minutesBetween(
+                                                new DateTime(workStartAttendance.getRecordTime()),
+                                                new DateTime(recordTime))
+                                        .getMinutes();
+                            }
                         }
                     }
                 }
-            }
-        }
-        catch (Exception ex){
-            log.error(ex.getMessage(),ex);
-        }
 
-        WorkScheduleAttendance workEndAttendance = new WorkScheduleAttendance();
+                WorkScheduleAttendance workEndAttendance = new WorkScheduleAttendance();
 
-        List<WorkScheduleAttendance> attendanceList = workScheduleAttendanceDAO.findByPersonScheduleIdAndClassify(personScheduleId, workShiftId, classify);
+                List<WorkScheduleAttendance> attendanceList = workScheduleAttendanceDAO.findByPersonScheduleIdAndClassify(personScheduleId, workShiftId, classify);
 
-        if (attendanceList.size() == 0) {
-            workEndAttendance.setId(UUID.randomUUID().toString());
-            workEndAttendance.setPersonScheduleId(personScheduleId);
-            workEndAttendance.setWorkShiftId(workShiftId);
-            workEndAttendance.setAttendanceDate(attendanceDate);
-            workEndAttendance.setClassify(classify);
-            workEndAttendance.setResult(result);
-            workEndAttendance.setLateLeaveMinute(new BigDecimal(minutes));
-            workEndAttendance.setWorkStatus(workStatus);
-            workEndAttendance.setPersonId(personId);
-            workEndAttendance.setDelFlag(false);
-            workEndAttendance.setTemperature(temperature);
-            workEndAttendance.setRecordTime(recordTime);
-            workEndAttendance.setCreateTime(new Date());
-            workEndAttendance.setOffsetMinute(new BigDecimal(offsetMinute));
-            workEndAttendance.setWorkMinute(new BigDecimal(workMinutes));
-
-            if(workOverPerson!=null){
-                workEndAttendance.setWorkOverPersonId(workOverPerson.getId());
-            }
+                if (attendanceList.size() > 0) {
+                    for (WorkScheduleAttendance workScheduleAttendance : attendanceList) {
+                        workScheduleAttendance.setDelFlag(true);
+                        workScheduleAttendance.setUpdateTime(new Date());
 
-            workScheduleAttendanceDAO.insert(workEndAttendance);
-        } else {
-            workEndAttendance = attendanceList.get(0);
-
-            workEndAttendance.setAttendanceDate(attendanceDate);
-            workEndAttendance.setResult(result);
-            workEndAttendance.setWorkStatus(workStatus);
-            workEndAttendance.setDelFlag(false);
-            workEndAttendance.setTemperature(temperature);
-            workEndAttendance.setRecordTime(recordTime);
-            workEndAttendance.setUpdateTime(new Date());
-            workEndAttendance.setOffsetMinute(new BigDecimal(offsetMinute));
-            workEndAttendance.setWorkMinute(new BigDecimal(workMinutes));
-
-            if(workOverPerson!=null){
-                workEndAttendance.setWorkOverPersonId(workOverPerson.getId());
-            }
+                        workScheduleAttendanceDAO.update(workScheduleAttendance);
+                    }
+                }
 
-            workScheduleAttendanceDAO.update(workEndAttendance);
+                workEndAttendance.setId(UUID.randomUUID().toString());
+                workEndAttendance.setPersonScheduleId(personScheduleId);
+                workEndAttendance.setWorkShiftId(workShiftId);
+                workEndAttendance.setAttendanceDate(attendanceDate);
+                workEndAttendance.setClassify(classify);
+                workEndAttendance.setResult(result);
+                workEndAttendance.setLateLeaveMinute(new BigDecimal(minutes));
+                workEndAttendance.setWorkStatus(workStatus);
+                workEndAttendance.setPersonId(personId);
+                workEndAttendance.setDelFlag(false);
+                workEndAttendance.setTemperature(temperature);
+                workEndAttendance.setRecordTime(recordTime);
+                workEndAttendance.setCreateTime(new Date());
+                workEndAttendance.setOffsetMinute(new BigDecimal(offsetMinute));
+                workEndAttendance.setWorkMinute(new BigDecimal(workMinutes));
+
+                if (workOverPerson != null) {
+                    workEndAttendance.setWorkOverPersonId(workOverPerson.getId());
+                }
+
+                workScheduleAttendanceDAO.insert(workEndAttendance);
+
+                redisTemplate.delete(key);
+            }
+            else{
+                log.warn(key + "正在处理中");
+            }
+        }
+        catch (Exception ex){
+            log.error(ex.getMessage(),ex);
         }
     }
 
@@ -1288,4 +1292,9 @@ public class WorkScheduleAttendanceServiceImpl implements WorkScheduleAttendance
         double workMinute = workScheduleAttendanceDAO.findSumWorkMinuteByParams(personId, startDate, endDate, searchParams);
         return new BigDecimal(workMinute);
     }
+
+    @Override
+    public List<Map> queryDuplicateRecord(Date startDate, int limit) {
+        return workScheduleAttendanceDAO.queryDuplicateRecord(startDate,limit);
+    }
 }

+ 20 - 0
common/src/main/resources/mapper/business/WorkScheduleAttendance.xml

@@ -688,4 +688,24 @@
             AND classify_ = #{searchParams.classify}
         </if>
     </select>
+    <select id="queryDuplicateRecord" resultType="java.util.Map">
+        <![CDATA[
+            select * from (
+                select
+                person_schedule_id as personScheduleId,
+                work_shift_id as workShiftId,
+                classify_ as classify,
+                count(*) as total
+                from business_work_schedule_attendance
+                where
+                attendance_date>=#{startDate}
+                and
+                del_flag=0
+                group by person_schedule_id,work_shift_id,classify_
+            ) as t
+            where
+            t.total>1
+            limit ${limit}
+        ]]>
+    </select>
 </mapper>

+ 60 - 1
web/src/main/java/com/jpsoft/shinestar/modules/business/controller/WorkScheduleAttendanceController.java

@@ -78,6 +78,65 @@ public class WorkScheduleAttendanceController {
     @Autowired
     private OSSConfig ossConfig;
 
+    @ApiOperation(value = "删除重复考勤记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "startDate", value = "起始时间", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "limit", value = "查询记录数", required = true, paramType = "form")
+    })
+    @GetMapping("removeDuplicateRecord")
+    public MessageResult<Integer> removeDuplicateRecord(
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,int limit){
+        MessageResult<Integer> messageResult = new MessageResult<>();
+    
+        try {
+            int affectCount = 0;
+
+            List<Map> mapList = workScheduleAttendanceService.queryDuplicateRecord(startDate,limit);
+
+            for (Map map : mapList) {
+                String personScheduleId = String.valueOf(map.get("personScheduleId"));
+                String workShiftId = String.valueOf(map.get("workShiftId"));
+                String classify = String.valueOf(map.get("classify"));
+
+                List<WorkScheduleAttendance> attendanceList = workScheduleAttendanceService.findByPersonScheduleIdAndClassify(personScheduleId,workShiftId,classify);
+
+                int index = 0;
+
+                //recordTime desc排序
+                if ("1".equals(classify)){
+                    //上班保留最早记录
+                    index = attendanceList.size()-1;
+                }
+                else if("2".equals(classify)){
+                    //下班保留最迟记录
+                    index = 0;
+                }
+
+                for (int i = 0; i < attendanceList.size(); i++) {
+                    if(i!=index){
+                        WorkScheduleAttendance wsa = attendanceList.get(i);
+                        wsa.setDelFlag(true);
+                        wsa.setUpdateTime(new Date());
+
+                        affectCount += workScheduleAttendanceService.update(wsa);
+                    }
+                }
+            }
+
+            //todo 填写具体代码
+            messageResult.setData(affectCount);
+            messageResult.setResult(true);
+        }
+        catch (Exception ex){
+            log.error(ex.getMessage(),ex);
+    
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+    
+        return messageResult;
+    }
+
     @ApiOperation(value = "添加考勤记录")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "deviceNo", value = "设备编号", required = true, paramType = "form"),
@@ -89,7 +148,7 @@ public class WorkScheduleAttendanceController {
     public MessageResult<String> add(
             String deviceNo,
             Long personId, BigDecimal temperature,
-            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") Date recordTime) {
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date recordTime) {
         MessageResult<String> messageResult = new MessageResult<>();
 
         try {