瀏覽代碼

完善考勤报表。

zhengqiang 5 年之前
父節點
當前提交
598fe021f3

+ 1 - 0
common/src/main/java/com/jpsoft/smart/modules/business/dao/WorkAttendanceDAO.java

@@ -17,4 +17,5 @@ public interface WorkAttendanceDAO {
 	List<WorkAttendance> list();
 	List<WorkAttendance> search(Map<String,Object> searchParams,List<Sort> sortList);
     List<WorkAttendance> findByPersonIdAndDate(Long personId, Date startDate, Date endDate);
+    int deleteByCompanyCodeAndDate(String companyCode, Date startDate, Date endDate);
 }

+ 1 - 0
common/src/main/java/com/jpsoft/smart/modules/business/service/WorkAttendanceService.java

@@ -16,4 +16,5 @@ public interface WorkAttendanceService {
 	List<WorkAttendance> list();
 	Page<WorkAttendance> pageSearch(Map<String, Object> searchParams,int pageNum,int pageSize,boolean count,List<Sort> sortList);
     List<WorkAttendance> findByPersonIdAndDate(Long personId, Date startDate, Date endDate);
+    int deleteByCompanyCodeAndDate(String companyCode, Date startDate, Date endDate);
 }

+ 5 - 0
common/src/main/java/com/jpsoft/smart/modules/business/service/impl/WorkAttendanceServiceImpl.java

@@ -73,4 +73,9 @@ public class WorkAttendanceServiceImpl implements WorkAttendanceService {
 	public List<WorkAttendance> findByPersonIdAndDate(Long personId, Date startDate, Date endDate) {
 		return workAttendanceDAO.findByPersonIdAndDate(personId,startDate,endDate);
 	}
+
+	@Override
+	public int deleteByCompanyCodeAndDate(String companyCode, Date startDate, Date endDate) {
+		return workAttendanceDAO.deleteByCompanyCodeAndDate(companyCode,startDate,endDate);
+	}
 }

+ 12 - 0
common/src/main/resources/mapper/business/WorkAttendance.xml

@@ -116,4 +116,16 @@
             order by record_time asc
         ]]>
     </select>
+    <delete id="deleteByCompanyCodeAndDate">
+        delete from business_work_attendance
+        where person_id in (
+            select a.id_ from base_person_info a,base_company_info b
+            where a.company_id=b.id_
+            and b.code_ like #{companyCode}
+        )
+        <![CDATA[
+            and record_time>=#{startDate}
+            and record_time<=#{endDate}
+        ]]>
+    </delete>
 </mapper>

+ 88 - 15
web/src/main/java/com/jpsoft/smart/modules/business/controller/WorkAttendanceController.java

@@ -1,6 +1,5 @@
 package com.jpsoft.smart.modules.business.controller;
 
-import com.github.pagehelper.Page;
 import com.jpsoft.smart.config.OSSConfig;
 import com.jpsoft.smart.modules.base.entity.AlarmConfig;
 import com.jpsoft.smart.modules.base.entity.CompanyInfo;
@@ -9,18 +8,17 @@ import com.jpsoft.smart.modules.base.service.AlarmConfigService;
 import com.jpsoft.smart.modules.base.service.CompanyInfoService;
 import com.jpsoft.smart.modules.base.service.PersonInfoService;
 import com.jpsoft.smart.modules.common.utils.OSSUtil;
-import com.jpsoft.smart.modules.common.utils.PojoUtils;
 import com.jpsoft.smart.modules.common.dto.Sort;
 import com.jpsoft.smart.modules.common.dto.MessageResult;
 import com.jpsoft.smart.modules.business.entity.WorkAttendance;
 import com.jpsoft.smart.modules.business.service.WorkAttendanceService;
-import com.sun.corba.se.spi.orbutil.threadpool.Work;
+import com.jpsoft.smart.schduled.UnmeasureTemperatureAlarmTask;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
 import org.joda.time.DateTime;
 import org.joda.time.Days;
 import org.joda.time.Months;
@@ -30,8 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -55,6 +51,9 @@ public class WorkAttendanceController {
     @Autowired
     private AlarmConfigService alarmConfigService;
 
+    @Autowired
+    private UnmeasureTemperatureAlarmTask unmeasureTemperatureAlarmTask;
+
     @Autowired
     private OSSConfig ossConfig;
 
@@ -124,7 +123,7 @@ public class WorkAttendanceController {
                 Map<String,Object> personMap = new HashMap<>();
                 Map<String,List> workAttendanceMap = new HashMap<>();
 
-                for (int i=0;i<=days;i++){
+                for (int i=0;i<days;i++){
                     List<WorkAttendance> list = new ArrayList<>();
                     DateTime dt = startTime.plusDays(i);
                     workAttendanceMap.put(dt.toString("yyyy-MM-dd"),list);
@@ -140,7 +139,7 @@ public class WorkAttendanceController {
                     }
                 }
 
-                for (int i=0;i<=days;i++){
+                for (int i=0;i<days;i++){
                     DateTime dt = startTime.plusDays(i);
                     String key = dt.toString("yyyy-MM-dd");
 
@@ -254,6 +253,9 @@ public class WorkAttendanceController {
         //todo 写考勤记录
         int startRowIndex = 3;
 
+        Font redFont = wb.createFont();
+        redFont.setColor(Font.COLOR_RED);
+
         for (int i=0;i<personMapList.size();i++) {
             Row row = sheet.createRow(startRowIndex + i);
             Map personMap = personMapList.get(i);
@@ -301,8 +303,14 @@ public class WorkAttendanceController {
                 if (workAttendanceMap.containsKey(key)){
                     List<WorkAttendance> workAttendanceList = workAttendanceMap.get(key);
 
-                    String value = workAttendanceList.stream().map((item)->{
-                        StringBuilder sb = new StringBuilder();
+                    List<Map> posList = new ArrayList<>();
+
+                    StringBuilder sb = new StringBuilder();
+
+                    for (WorkAttendance item : workAttendanceList) {
+                        if (sb.length()!=0){
+                            sb.append("\r\n");
+                        }
 
                         if(item.getClassifier().equals(1)){
                             sb.append("上班");
@@ -320,18 +328,35 @@ public class WorkAttendanceController {
                         else if (WorkAttendance.LEAVE_EARLY.equals(item.getResult())){
                             sb.append("早退");
                         }
-                        else{
+
+                        Map<String,Integer> pos = null;
+
+                        if(WorkAttendance.MISSING.equals(item.getResult())){
+                            pos = new HashMap<>();
+                            pos.put("start",sb.length()-2);
                             sb.append("缺卡");
                         }
 
-                        if (item.getRecordTime()!=null) {
+                        if(item.getRecordTime()!=null) {
                             sb.append(" " + sdf.format(item.getRecordTime()));
+
+                            if(pos!=null) {
+                                pos.put("end", sb.length());
+                                posList.add(pos);
+                            }
                         }
+                    }
 
-                        return sb.toString();
-                    }).collect(Collectors.joining("\r\n"));
+                    XSSFRichTextString sText = new XSSFRichTextString(sb.toString());
 
-                    row.createCell(dayStartColIndex + j).setCellValue(value);
+                    for (Map map : posList) {
+                        int start = Integer.valueOf(map.get("start").toString());
+                        int end = Integer.valueOf(map.get("end").toString());
+
+                        sText.applyFont(start,end,redFont);
+                    }
+
+                    row.createCell(dayStartColIndex + j).setCellValue(sText);
                 }
             }
         }
@@ -367,4 +392,52 @@ public class WorkAttendanceController {
 
         return downloadUrl;
     }
+
+    @ApiOperation(value="更新考勤记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name="companyId",value = "单位编号",required = true,paramType = "form"),
+            @ApiImplicitParam(name = "startDate",value = "开始时间", required = true,paramType="form"),
+            @ApiImplicitParam(name = "endDate",value = "截止时间", required = true,paramType="form"),
+            @ApiImplicitParam(name = "subject",value = "subject", required = false,paramType="form")
+    })
+    @RequestMapping(value = "batchUpdate",method = RequestMethod.POST)
+    public MessageResult<String> batchUpdate(
+            String companyId,
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
+            @RequestAttribute String subject) {
+        MessageResult<String> messageResult = new MessageResult<>();
+
+        try {
+            if (startDate==null){
+                startDate = DateTime.now().dayOfMonth().withMinimumValue().toDate();
+            }
+
+            if (endDate==null){
+                endDate = DateTime.now().plusMonths(1).dayOfMonth().withMinimumValue().toDate();
+            }
+
+            //todo 起始时间与结束时间间隔最大1个月
+            DateTime startTime = new DateTime(startDate);
+            DateTime endTime = new DateTime(endDate);
+
+            int months = Months.monthsBetween(startTime,endTime).getMonths();
+
+            if(months>1){
+                throw new Exception("最多只能更新一个月内的考勤记录!");
+            }
+
+            int affectCount = unmeasureTemperatureAlarmTask.batchUpdate(companyId, startDate, endDate);
+
+            messageResult.setResult(true);
+            messageResult.setMessage("共添加" + affectCount + "考勤记录");
+        }
+        catch (Exception ex){
+            logger.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
 }

+ 79 - 16
web/src/main/java/com/jpsoft/smart/schduled/UnmeasureTemperatureAlarmTask.java

@@ -10,11 +10,13 @@ import com.sun.corba.se.spi.orbutil.threadpool.Work;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
+import org.joda.time.Days;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
@@ -44,6 +46,66 @@ public class UnmeasureTemperatureAlarmTask {
     @Autowired
     private WxConfig wxConfig;
 
+    public int batchUpdate(String companyId,Date startDate,Date endDate) throws Exception {
+        DateTime dt1 = new DateTime(startDate);
+        DateTime dt2 = new DateTime(endDate);
+
+        int days = Days.daysBetween(dt1,dt2).getDays();
+
+        List<AlarmConfig> configList = alarmConfigService.findByCompanyId(companyId);
+
+        CompanyInfo companyInfo = companyInfoService.get(companyId);
+
+        workAttendanceService.deleteByCompanyCodeAndDate(companyInfo.getCode() + "%",startDate,endDate);
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+
+        int affectCount = 0;
+
+        for (int i=0;i<days;i++){
+            DateTime now = dt1.plusDays(i);
+
+            String date = now.toString("yyyy-MM-dd");
+
+            for (AlarmConfig alarmConfig : configList) {
+                //是否工作日
+                if (alarmConfig.getWeekdays().indexOf(String.valueOf(now.getDayOfWeek())) == -1) {
+                    continue;
+                }
+
+                DateTime startTime = new DateTime(sdf.parse(date + " " + alarmConfig.getStartTime()));
+                DateTime attendanceTime = new DateTime(sdf.parse(date + " " + alarmConfig.getAttendanceTime()));
+                DateTime endTime = new DateTime(sdf.parse(date + " " + alarmConfig.getEndTime()));
+
+                if (alarmConfig.getClassifier().equals(1)) {
+                    //todo 上班考勤
+
+                    //准时上班
+                    affectCount += recordAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),WorkAttendance.SUCCESS);
+
+                    //迟到
+                    affectCount += recordAttendance(alarmConfig,attendanceTime.toDate(),endTime.toDate(),WorkAttendance.LATE);
+
+                    //缺卡
+                    affectCount += recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
+                } else {
+                    //todo 下班考勤
+
+                    //早退
+                    affectCount += recordAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),WorkAttendance.LEAVE_EARLY);
+
+                    //准时下班
+                    affectCount += recordAttendance(alarmConfig,attendanceTime.toDate(),endTime.toDate(),WorkAttendance.SUCCESS);
+
+                    //缺卡
+                    affectCount += recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
+                }
+            }
+        }
+
+        return affectCount;
+    }
+
     //每5分钟执行一次
     @Scheduled(cron="0 0/5 * * * ?")
     public void run() {
@@ -51,13 +113,6 @@ public class UnmeasureTemperatureAlarmTask {
 
         List<AlarmConfig> configList = alarmConfigService.list();
 
-//        try {
-//            //停100毫秒,以便后续时间比endTime大
-//            Thread.sleep(100);
-//        } catch (InterruptedException e) {
-//            e.printStackTrace();
-//        }
-
         DateTime now = DateTime.now();
 
         String date = now.toString("yyyy-MM-dd");
@@ -119,7 +174,7 @@ public class UnmeasureTemperatureAlarmTask {
                         }
 
                         //未到开始截止时间内打开算旷工
-                        recordUnAttendance(alarmConfig,startTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
+                        recordUnAttendance(alarmConfig,startTime.toDate(),attendanceTime.toDate(),endTime.toDate(),WorkAttendance.MISSING);
                     }
                 }
             }
@@ -136,37 +191,41 @@ public class UnmeasureTemperatureAlarmTask {
      * @param endDate
      * @param result
      */
-    private void recordUnAttendance(AlarmConfig alarmConfig, Date startDate, Date endDate, String result) {
+    private int recordUnAttendance(AlarmConfig alarmConfig, Date startDate,Date attendanceDate, Date endDate, String result) {
+        int affectCount = 0;
+
         CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId());
 
         String companyCode = companyInfo.getCode();
 
-        if (alarmConfig.getSubordinate()!=null && alarmConfig.getSubordinate()){
+        if (alarmConfig.getSubordinate() != null && alarmConfig.getSubordinate()) {
             companyCode += "%";
         }
 
         //todo 查询该单位当前时间段未考勤人员列表
-        List<PersonInfo> attendanceList = personDeviceLogService.queryUnAttendanceList(companyCode,startDate,endDate);
+        List<PersonInfo> attendanceList = personDeviceLogService.queryUnAttendanceList(companyCode, startDate, endDate);
 
-        for (PersonInfo personInfo: attendanceList) {
+        for (PersonInfo personInfo : attendanceList) {
             WorkAttendance workAttendance = new WorkAttendance();
             workAttendance.setId(UUID.randomUUID().toString());
             workAttendance.setPersonId(personInfo.getId());
             workAttendance.setAlarmConfigId(alarmConfig.getId());
             workAttendance.setCreateTime(new Date());
+            workAttendance.setRecordTime(attendanceDate);
             workAttendance.setResult(result);
             workAttendance.setDelFlag(false);
 
-            workAttendanceService.insert(workAttendance);
+            affectCount+= workAttendanceService.insert(workAttendance);
         }
+
+        return affectCount;
     }
 
     /**
      * 记录考勤
      * @param alarmConfig
      */
-    @Async
-    public void recordAttendance(AlarmConfig alarmConfig,Date startDate,Date endDate,String result) {
+    private int recordAttendance(AlarmConfig alarmConfig,Date startDate,Date endDate,String result) {
         CompanyInfo companyInfo = companyInfoService.get(alarmConfig.getCompanyId());
 
         String companyCode = companyInfo.getCode();
@@ -175,6 +234,8 @@ public class UnmeasureTemperatureAlarmTask {
             companyCode += "%";
         }
 
+        int affectCount = 0;
+
         //todo 查询该单位当前时间段考勤人员列表
         List<PersonInfo> attendanceList = personDeviceLogService.queryAttendanceList(companyCode,startDate,endDate);
 
@@ -204,8 +265,10 @@ public class UnmeasureTemperatureAlarmTask {
                 workAttendance.setTemperature(personDeviceLog.getTemperature());
             }
 
-            workAttendanceService.insert(workAttendance);
+            affectCount +=  workAttendanceService.insert(workAttendance);
         }
+
+        return affectCount;
     }
 
     @Async