Procházet zdrojové kódy

加入考勤统计。

tomatozq před 5 roky
rodič
revize
c578404b8f

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

@@ -2,6 +2,8 @@ package com.jpsoft.smart.modules.business.dao;
 
 import java.util.Date;
 import java.util.List;
+
+import org.joda.time.DateTime;
 import org.springframework.stereotype.Repository;
 import com.jpsoft.smart.modules.business.entity.WorkAttendance;
 import java.util.Map;
@@ -18,4 +20,5 @@ public interface WorkAttendanceDAO {
 	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);
+    List<WorkAttendance> findByPeriod(Long personId, String alarmConfigId, Date recordTime);
 }

+ 8 - 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.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -17,4 +18,11 @@ public interface WorkAttendanceService {
 	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);
+
+	/**
+	 * 打卡
+	 * @param personId
+	 * @param recordDate
+	 */
+	boolean punchIn(Long personId, BigDecimal temperature,Date recordDate);
 }

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

@@ -1,10 +1,24 @@
 package com.jpsoft.smart.modules.business.service.impl;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import javax.annotation.Resource;
+
+import com.jpsoft.smart.modules.base.dao.AlarmConfigDAO;
+import com.jpsoft.smart.modules.base.dao.CompanyInfoDAO;
+import com.jpsoft.smart.modules.base.dao.PersonInfoDAO;
+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.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.weaver.patterns.PerSingleton;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import com.jpsoft.smart.modules.business.dao.WorkAttendanceDAO;
@@ -14,12 +28,22 @@ import com.github.pagehelper.Page;
 import com.jpsoft.smart.modules.common.dto.Sort;
 import com.github.pagehelper.PageHelper;
 
+@Slf4j
 @Transactional
 @Component(value="workAttendanceService")
 public class WorkAttendanceServiceImpl implements WorkAttendanceService {
 	@Resource(name="workAttendanceDAO")
 	private WorkAttendanceDAO workAttendanceDAO;
 
+	@Autowired
+	private PersonInfoDAO personInfoDAO;
+
+	@Autowired
+	private CompanyInfoDAO companyInfoDAO;
+
+	@Autowired
+	private AlarmConfigDAO alarmConfigDAO;
+
 	@Override
 	public WorkAttendance get(String id) {
 		// TODO Auto-generated method stub
@@ -78,4 +102,108 @@ public class WorkAttendanceServiceImpl implements WorkAttendanceService {
 	public int deleteByCompanyCodeAndDate(String companyCode, Date startDate, Date endDate) {
 		return workAttendanceDAO.deleteByCompanyCodeAndDate(companyCode,startDate,endDate);
 	}
+
+	@Override
+	public boolean punchIn(Long personId, BigDecimal temperature, Date recordDate) {
+		boolean result = false;
+
+		try {
+			PersonInfo personInfo = personInfoDAO.get(personId);
+			CompanyInfo companyInfo = companyInfoDAO.get(personInfo.getCompanyId());
+
+			String[] arr = companyInfo.getCode().split(",");
+
+			List<AlarmConfig> configList = null;
+
+			for (int i = arr.length - 1; i >= 0; i--) {
+				configList = alarmConfigDAO.findByCompanyId(arr[i]);
+
+				if (configList != null && configList.size() > 0) {
+					break;
+				}
+			}
+
+			DateTime recordTime = new DateTime(recordDate);
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+			String date = recordTime.toString("yyyy-MM-dd");
+
+			if (configList != null) {
+				for (AlarmConfig alarmConfig : configList) {
+					//是否工作日
+					if (alarmConfig.getWeekdays().indexOf(String.valueOf(recordTime.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()));
+
+					String attendanceResult = "";
+
+					if (alarmConfig.getClassifier().equals(1)) {
+						//todo 上班考勤
+
+						//准时上班
+						if (recordTime.compareTo(startTime)>0 && recordTime.compareTo(attendanceTime)<=0){
+							attendanceResult = WorkAttendance.SUCCESS;
+						}
+						else if(recordTime.compareTo(attendanceTime)>0 && recordTime.compareTo(endTime)<=0){
+							attendanceResult = WorkAttendance.LATE;
+
+							//当天是否已经有该时段正常上班打卡记录,如果有则不记录
+							List<WorkAttendance> workAttendances = workAttendanceDAO.findByPeriod(personId,alarmConfig.getId(),recordTime.toDate());
+
+							if (workAttendances.size()>0){
+								break;
+							}
+						}
+					} else {
+						//todo 下班考勤
+						//早退
+						if (recordTime.compareTo(startTime)>0 && recordTime.compareTo(attendanceTime)<=0){
+							attendanceResult = WorkAttendance.LEAVE_EARLY;
+						}
+						else if(recordTime.compareTo(attendanceTime)>0 && recordTime.compareTo(endTime)<=0){
+							attendanceResult = WorkAttendance.SUCCESS;
+
+							//当天是否已经有该时段早退记录则删除,只保留最后一次正常下班打卡记录
+							List<WorkAttendance> workAttendances = workAttendanceDAO.findByPeriod(personId,alarmConfig.getId(),recordTime.toDate());
+
+							for (WorkAttendance workAttendance : workAttendances) {
+								workAttendance.setDelFlag(true);
+								workAttendance.setUpdateTime(new Date());
+
+								workAttendanceDAO.update(workAttendance);
+							}
+						}
+					}
+
+					if (StringUtils.isNotEmpty(attendanceResult)) {
+						WorkAttendance workAttendance = new WorkAttendance();
+						workAttendance.setId(UUID.randomUUID().toString());
+						workAttendance.setPersonId(personInfo.getId());
+						workAttendance.setAlarmConfigId(alarmConfig.getId());
+						workAttendance.setCreateTime(new Date());
+						workAttendance.setDelFlag(false);
+
+						workAttendance.setTemperature(temperature);
+						workAttendance.setResult(attendanceResult);
+						workAttendance.setRecordTime(recordDate);
+
+						int affectCount = workAttendanceDAO.insert(workAttendance);
+
+						result = affectCount > 0;
+
+						break;
+					}
+				}
+			}
+		}
+		catch (Exception ex){
+			result = false;
+			log.error(ex.getMessage(),ex);
+		}
+
+		return result;
+	}
 }

+ 9 - 1
common/src/main/resources/mapper/business/WorkAttendance.xml

@@ -77,7 +77,7 @@
             <if test="recordTime!=null">
                 record_time=#{recordTime,jdbcType= TIMESTAMP },
             </if>
-            <if test="temperature_!=null">
+            <if test="temperature!=null">
                 temperature_=#{temperature,jdbcType= NUMERIC },
             </if>
         </set>
@@ -117,6 +117,14 @@
             order by record_time asc
         ]]>
     </select>
+    <select id="findByPeriod" resultMap="WorkAttendanceMap">
+        select * from business_work_attendance
+        where person_id=#{personId}
+        and alarm_config_id=#{alarmConfigId}
+        and DATEDIFF(#{recordTime},record_time)=0
+        and del_flag=0
+        order by record_time asc
+    </select>
     <delete id="deleteByCompanyCodeAndDate">
         delete from business_work_attendance
         where person_id in (

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

@@ -32,6 +32,7 @@ import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 import java.io.*;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -501,4 +502,32 @@ public class WorkAttendanceController {
 
         return messageResult;
     }
+
+    @ApiOperation(value="添加考勤记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name="personId",value = "人员编号",required = true,paramType = "form"),
+            @ApiImplicitParam(name="temperature",value = "温度",required = true,paramType = "form"),
+            @ApiImplicitParam(name = "recordTime",value = "考勤时间", required = true,paramType="form")
+    })
+    @RequestMapping(value = "add",method = RequestMethod.POST)
+    public MessageResult<String> add(
+            Long personId, BigDecimal temperature,
+            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date recordTime) {
+        MessageResult<String> messageResult = new MessageResult<>();
+
+        try {
+            boolean result = workAttendanceService.punchIn(personId,temperature,recordTime);
+
+            messageResult.setResult(result);
+
+            messageResult.setMessage(result ? "添加考勤记录成功!" : "添加考勤记录失败!");
+        }
+        catch (Exception ex){
+            logger.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
 }