Bladeren bron

1.人员信息添加bug修复。

zhengqiang 5 jaren geleden
bovenliggende
commit
da6df1213a

+ 1 - 0
common/src/main/java/com/jpsoft/smart/modules/base/dao/PersonInfoDAO.java

@@ -19,4 +19,5 @@ public interface PersonInfoDAO {
 	PersonInfo findByOpenId(String openId);
     List<PersonInfo> findByCompanyId(String companyId);
     long countByCompanyCode(String code,Long personId);
+	List<PersonInfo> findByCompanyCode(String code);
 }

+ 3 - 1
common/src/main/java/com/jpsoft/smart/modules/base/service/PersonInfoService.java

@@ -20,5 +20,7 @@ public interface PersonInfoService {
 
     List<PersonInfo> findByCompanyId(String companyId);
 
-    long countByCompanyCode(String code,Long personId);
+    long countByCompanyCode(String code,Long relatePersonId);
+
+	List<PersonInfo> findByCompanyCode(String code);
 }

+ 7 - 2
common/src/main/java/com/jpsoft/smart/modules/base/service/impl/PersonInfoServiceImpl.java

@@ -84,7 +84,12 @@ public class PersonInfoServiceImpl implements PersonInfoService {
 	}
 
 	@Override
-	public long countByCompanyCode(String code,Long personId) {
-		return personInfoDAO.countByCompanyCode(code,personId);
+	public long countByCompanyCode(String code,Long relatePersonId) {
+		return personInfoDAO.countByCompanyCode(code, relatePersonId);
+	}
+
+	@Override
+	public List<PersonInfo> findByCompanyCode(String code) {
+		return personInfoDAO.findByCompanyCode(code);
 	}
 }

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

@@ -1,5 +1,6 @@
 package com.jpsoft.smart.modules.business.dao;
 
+import java.util.Date;
 import java.util.List;
 import org.springframework.stereotype.Repository;
 import com.jpsoft.smart.modules.business.entity.WorkAttendance;
@@ -15,4 +16,5 @@ public interface WorkAttendanceDAO {
 	int delete(String id);
 	List<WorkAttendance> list();
 	List<WorkAttendance> search(Map<String,Object> searchParams,List<Sort> sortList);
+    List<WorkAttendance> findByPersonIdAndDate(Long personId, Date startDate, Date endDate);
 }

+ 3 - 0
common/src/main/java/com/jpsoft/smart/modules/business/entity/WorkAttendance.java

@@ -102,4 +102,7 @@ public class WorkAttendance {
      */
     @ApiModelProperty(value = "记录温度")
     private BigDecimal temperature;
+
+    @ApiModelProperty(value = "上班-1,下班-2")
+    private String classifier;
 }

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

@@ -1,5 +1,6 @@
 package com.jpsoft.smart.modules.business.service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import com.jpsoft.smart.modules.business.entity.WorkAttendance;
@@ -14,4 +15,5 @@ public interface WorkAttendanceService {
 	int delete(String id);
 	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);
 }

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

@@ -1,5 +1,6 @@
 package com.jpsoft.smart.modules.business.service.impl;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -67,4 +68,9 @@ public class WorkAttendanceServiceImpl implements WorkAttendanceService {
         
         return page;
 	}
+
+	@Override
+	public List<WorkAttendance> findByPersonIdAndDate(Long personId, Date startDate, Date endDate) {
+		return workAttendanceDAO.findByPersonIdAndDate(personId,startDate,endDate);
+	}
 }

+ 7 - 0
common/src/main/resources/mapper/base/PersonInfo.xml

@@ -270,4 +270,11 @@
             )
         </if>
     </select>
+    <select id="findByCompanyCode" resultMap="com.jpsoft.smart.modules.base.dao.PersonInfoDAO.PersonInfoMap">
+        select a.*
+        from base_person_info a
+        left join base_company_info b on a.company_id = b.id_
+        where a.del_flag = 0
+        and b.code_ like #{code}
+    </select>
 </mapper>

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

@@ -9,12 +9,16 @@
         <result property="personId" column="person_id"/>
         <result property="result" column="result_"/>
         <result property="temperature" column="temperature_"/>
+        <result property="recordTime" column="record_time"/>
         <result property="createBy" column="create_by"/>
         <result property="createTime" column="create_time"/>
         <result property="updateBy" column="update_by"/>
         <result property="updateTime" column="update_time"/>
         <result property="delFlag" column="del_flag"/>
     </resultMap>
+    <resultMap id="WorkAttendanceMap2" type="com.jpsoft.smart.modules.business.entity.WorkAttendance" extends="WorkAttendanceMap">
+        <result property="classifier" column="classifier_"/>
+    </resultMap>
     <insert id="insert" parameterType="com.jpsoft.smart.modules.business.entity.WorkAttendance">
         <!--
         <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
@@ -101,4 +105,15 @@
             ${sort.name} ${sort.order}
         </foreach>
     </select>
+    <select id="findByPersonIdAndDate" resultMap="WorkAttendanceMap2">
+        <![CDATA[
+            select a.*,b.classifier_ from business_work_attendance a,base_alarm_config b
+            where a.alarm_config_id = b.id_
+            and a.person_id=#{personId}
+            and a.record_time>=#{startDate}
+            and a.record_time<#{endDate}
+            and a.del_flag=0
+            order by record_time asc
+        ]]>
+    </select>
 </mapper>

+ 291 - 0
web/src/main/java/com/jpsoft/smart/modules/business/controller/WorkAttendanceController.java

@@ -1,22 +1,45 @@
 package com.jpsoft.smart.modules.business.controller;
 
 import com.github.pagehelper.Page;
+import com.jpsoft.smart.modules.base.entity.AlarmConfig;
+import com.jpsoft.smart.modules.base.entity.CompanyInfo;
+import com.jpsoft.smart.modules.base.entity.PersonInfo;
+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.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 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.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
+import org.joda.time.Months;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 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.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/workAttendance")
@@ -27,6 +50,15 @@ public class WorkAttendanceController {
     @Autowired
     private WorkAttendanceService workAttendanceService;
 
+    @Autowired
+    private CompanyInfoService companyInfoService;
+
+    @Autowired
+    private PersonInfoService personInfoService;
+
+    @Autowired
+    private AlarmConfigService alarmConfigService;
+
     @ApiOperation(value="创建空记录")
     @GetMapping("create")
     public MessageResult<WorkAttendance> create(){
@@ -222,4 +254,263 @@ public class WorkAttendanceController {
 
         return msgResult;
     }
+
+    @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 = "exportXls",method = RequestMethod.POST)
+    public MessageResult<List> exportXls(
+            String companyId,
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
+            @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
+            @RequestAttribute String subject){
+
+        //当前用户ID
+        System.out.println(subject);
+
+        MessageResult<List> msgResult = new MessageResult<>();
+
+        try {
+            //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("最多只能查询一个月内的考勤记录!");
+            }
+
+            CompanyInfo companyInfo = companyInfoService.get(companyId);
+
+            //todo 查询考勤设置
+            List<AlarmConfig> alarmConfigList = alarmConfigService.findByCompanyId(companyId);
+
+            int dayOfWorkAttendanceNum = alarmConfigList.size();
+
+            //todo 查询单位人员
+            List<PersonInfo> personInfoList = personInfoService.findByCompanyCode(companyInfo.getCode() + "%");
+
+            int days = Days.daysBetween(startTime,endTime).getDays();
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+            List<Map> personMapList = new ArrayList<>();
+
+            for (PersonInfo personInfo : personInfoList) {
+                //todo 每个人在指定时间段(出勤天数,休息天数,迟到次数,早退次数,上班缺卡次数,下班缺卡次数,旷工天数)
+                int workDays=0,restDays=0,lateNum=0,leaveNum=0,missCardOnWorkCount=0,missCardOffWorkCount=0,missCardAllDayCount=0;
+
+                Map<String,Object> personMap = new HashMap<>();
+                Map<String,List> workAttendanceMap = new HashMap<>();
+
+                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);
+                }
+
+                //todo 每个人在指定时间段内每天的考勤情况
+                List<WorkAttendance> workAttendanceList = workAttendanceService.findByPersonIdAndDate(personInfo.getId(),startDate,endDate);
+
+                for (WorkAttendance workAttendance : workAttendanceList) {
+                    if(workAttendance.getRecordTime()!=null) {
+                        String key = sdf.format(workAttendance.getRecordTime());
+                        workAttendanceMap.get(key).add(workAttendance);
+                    }
+                }
+
+                for (int i=0;i<=days;i++){
+                    DateTime dt = startTime.plusDays(i);
+                    String key = dt.toString("yyyy-MM-dd");
+
+                    List<WorkAttendance> workAttendances = workAttendanceMap.get(key);
+
+                    if (workAttendances.size()==0){
+                        //单天不需要考勤则不会有记录
+                        restDays++;
+                    }
+                    else{
+                        workDays++;
+
+                        for (WorkAttendance workAttendance : workAttendances) {
+                            String result = workAttendance.getResult();
+
+                            if (result.equals(WorkAttendance.LATE)){
+                                lateNum++; //迟到
+                            }
+                            else if(result.equals(WorkAttendance.LEAVE_EARLY)){
+                                leaveNum++; //早退
+                            }
+                            else if(result.equals(WorkAttendance.MISSING)){
+                                if (workAttendance.getClassifier().equals("1")){
+                                    //上班缺卡
+                                    missCardOffWorkCount++;
+                                }
+                                else{
+                                    //下班缺卡
+                                    missCardOffWorkCount++;
+                                }
+                            }
+
+                            if (dayOfWorkAttendanceNum == missCardOnWorkCount + missCardOffWorkCount){
+                                //当天的考勤总数=上下班缺卡之和
+                                missCardAllDayCount++;
+                            }
+                        }
+                    }
+                }
+
+                personMap.put("personInfo",personInfo);
+                personMap.put("company",personInfo.getPosition1());
+                personMap.put("department",personInfo.getPosition2());
+                personMap.put("jobNumber",personInfo.getPosition3());
+                personMap.put("workDays",workDays);
+                personMap.put("restDays",restDays);
+                personMap.put("lateNum",lateNum);
+                personMap.put("leaveNum",leaveNum);
+                personMap.put("missCardOnWorkCount",missCardOnWorkCount);
+                personMap.put("missCardOffWorkCount",missCardOffWorkCount);
+                personMap.put("missCardAllDayCount",missCardAllDayCount);
+                personMap.put("workAttendanceMap",workAttendanceMap);
+
+                personMapList.add(personMap);
+            }
+
+            //todo 生成报表
+//            String tmplFilePath = "E:\\workAttendanceReport.xlsx";
+            createReport(startTime,endTime,personMapList);
+
+            msgResult.setData(personMapList);
+            msgResult.setResult(true);
+        }
+        catch (Exception ex){
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+            logger.error(ex.getMessage(),ex);
+        }
+
+        return msgResult;
+    }
+
+    private void createReport(DateTime startTime,DateTime endTime,List<Map> personMapList) throws Exception {
+        int days = Days.daysBetween(startTime,endTime).getDays();
+        ClassPathResource resource = new ClassPathResource("static/workAttendanceReport.xlsx");
+
+        Workbook wb = WorkbookFactory.create(resource.getInputStream());
+
+        Sheet sheet = wb.getSheetAt(0);
+
+        Row row1 = sheet.getRow(0);
+        Row row2 = sheet.getRow(1);
+        Row row3 = sheet.getRow(2);
+
+        String title = row1.getCell(0).getStringCellValue();
+        String subTitle = row2.getCell(0).getStringCellValue();
+
+        row1.getCell(0).setCellValue(String.format(title,startTime.toString("yyyy-MM-dd"),endTime.toString("yyyy-MM-dd")));
+        row2.getCell(0).setCellValue(String.format(subTitle,DateTime.now().toString("yyyy-MM-dd HH:mm")));
+
+        int dayStartColIndex = 11;
+
+        for (int i=0;i<days;i++){
+            DateTime dt = startTime.plusDays(i);
+            row3.getCell(dayStartColIndex + i).setCellValue(dt.toString("MM-dd") + "\r\n" + dt.dayOfWeek().getAsShortText(Locale.CHINA));
+        }
+
+        //todo 写考勤记录
+        int startRowIndex = 3;
+
+        for (int i=0;i<personMapList.size();i++) {
+            Row row = sheet.createRow(startRowIndex + i);
+            Map personMap = personMapList.get(i);
+
+            PersonInfo personInfo = (PersonInfo)personMap.get("personInfo");
+            row.createCell(0).setCellValue(personInfo.getName());
+
+            String companyName = (String)personMap.get("company");
+            row.createCell(1).setCellValue(companyName);
+
+            String department = (String)personMap.get("department");
+            row.createCell(2).setCellValue(department);
+
+            String jobNumber = (String)personMap.get("jobNumber");
+            row.createCell(3).setCellValue(jobNumber);
+
+            Integer workDays = Integer.valueOf(personMap.get("workDays").toString());
+            row.createCell(4).setCellValue(workDays);
+
+            Integer restDays = Integer.valueOf(personMap.get("restDays").toString());
+            row.createCell(5).setCellValue(restDays);
+
+            Integer lateNum = Integer.valueOf(personMap.get("lateNum").toString());
+            row.createCell(6).setCellValue(lateNum);
+
+            Integer leaveNum = Integer.valueOf(personMap.get("leaveNum").toString());
+            row.createCell(7).setCellValue(leaveNum);
+
+            Integer missCardOnWorkCount = Integer.valueOf(personMap.get("missCardOnWorkCount").toString());
+            row.createCell(8).setCellValue(missCardOnWorkCount);
+
+            Integer missCardOffWorkCount = Integer.valueOf(personMap.get("missCardOffWorkCount").toString());
+            row.createCell(9).setCellValue(missCardOffWorkCount);
+
+            Integer missCardAllDayCount = Integer.valueOf(personMap.get("missCardAllDayCount").toString());
+            row.createCell(10).setCellValue(missCardAllDayCount);
+
+            Map<String,List> workAttendanceMap = (Map<String,List>)personMap.get("workAttendanceMap");
+
+            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+
+            for(int j=0;j<days;j++){
+                String key = startTime.plusDays(j).toString("yyyy-MM-dd");
+
+                if (workAttendanceMap.containsKey(key)){
+                    List<WorkAttendance> workAttendanceList = workAttendanceMap.get(key);
+
+                    String value = workAttendanceList.stream().map((item)->{
+                        StringBuilder sb = new StringBuilder();
+
+                        if(item.getClassifier().equals(1)){
+                            sb.append("上班");
+                        }
+                        else{
+                            sb.append("下班");
+                        }
+
+                        if (WorkAttendance.SUCCESS.equals(item.getResult())){
+                            sb.append("正常打卡");
+                        }
+                        else if (WorkAttendance.LATE.equals(item.getResult())){
+                            sb.append("迟到");
+                        }
+                        else if (WorkAttendance.LEAVE_EARLY.equals(item.getResult())){
+                            sb.append("早退");
+                        }
+                        else{
+                            sb.append("缺卡");
+                        }
+
+                        if (item.getRecordTime()!=null) {
+                            sb.append(" " + sdf.format(item.getRecordTime()));
+                        }
+
+                        return sb.toString();
+                    }).collect(Collectors.joining("\r\n"));
+
+                    row.createCell(dayStartColIndex + j).setCellValue(value);
+                }
+            }
+        }
+
+        FileOutputStream output = new FileOutputStream("E:\\output.xlsx");
+
+        wb.write(output);
+        wb.close();
+        output.close();
+    }
 }

+ 12 - 1
web/src/main/java/com/jpsoft/smart/schduled/UnmeasureTemperatureAlarmTask.java

@@ -85,7 +85,10 @@ public class UnmeasureTemperatureAlarmTask {
                     //todo 考勤时间已到
                     if (now.compareTo(attendanceTime)>=0 && now.compareTo(attendanceTime.plusMinutes(intervalMinute))<0) {
                         //todo  未测量人通知管理人员
-                        noticeManager(alarmConfig,startTime,attendanceTime);
+                        if(alarmConfig.getClassifier().equals(1)){
+                            //上班
+                            noticeManager(alarmConfig,startTime,attendanceTime);
+                        }
 
                         //todo 记录考勤
                         if (alarmConfig.getClassifier().equals(1)) {
@@ -100,6 +103,11 @@ public class UnmeasureTemperatureAlarmTask {
 
                     //todo 截止时间已到
                     if (now.compareTo(endTime)>=0 && now.compareTo(endTime.plusMinutes(intervalMinute))<0) {
+                        if(alarmConfig.getClassifier().equals(2)){
+                            //下班
+                            noticeManager(alarmConfig,attendanceTime,endTime);
+                        }
+
                         //todo 记录考勤
                         if (alarmConfig.getClassifier().equals(1)) {
                             //上班时间后截止时间前打卡算迟到
@@ -146,7 +154,9 @@ public class UnmeasureTemperatureAlarmTask {
             workAttendance.setPersonId(personInfo.getId());
             workAttendance.setAlarmConfigId(alarmConfig.getId());
             workAttendance.setCreateTime(new Date());
+            workAttendance.setRecordTime(new Date());
             workAttendance.setResult(result);
+            workAttendance.setDelFlag(false);
 
             workAttendanceService.insert(workAttendance);
         }
@@ -176,6 +186,7 @@ public class UnmeasureTemperatureAlarmTask {
             workAttendance.setAlarmConfigId(alarmConfig.getId());
             workAttendance.setCreateTime(new Date());
             workAttendance.setResult(result);
+            workAttendance.setDelFlag(false);
 
             List<PersonDeviceLog> logList = personDeviceLogService.findByPersonAndDate(personInfo.getId(),startDate,endDate);
 

BIN
web/src/main/resources/static/workAttendanceReport.xlsx