Commit 27a725b9 authored by 廖旭伟's avatar 廖旭伟

考勤汇总

parent 202450cf
package com.mortals.xhx.module.attendance.dao;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.model.vo.ErrorSummaryVo;
import com.mortals.xhx.module.attendance.model.vo.LeaveSummaryVo;
import com.mortals.xhx.module.attendance.model.vo.VacationBalanceSummaryVo;
import java.util.List;
/***
* 考勤汇总
*/
public interface AttendanceSummaryDao {
/**
* 汇总当前日期假期余额
* @param query
* @return
*/
List<VacationBalanceSummaryVo> getVacationBalanceSummary(AttendanceSummaryQuery query);
/**
* 汇总当前日期请假情况
* @param query
* @return
*/
List<LeaveSummaryVo> getLeaveSummary(AttendanceSummaryQuery query);
/**
* 汇总当前日期异常考勤
* @param query
* @return
*/
List<ErrorSummaryVo> getErrorSummary(AttendanceSummaryQuery query);
}
package com.mortals.xhx.module.attendance.dao.ibatis;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.model.vo.ErrorSummaryVo;
import com.mortals.xhx.module.attendance.model.vo.LeaveSummaryVo;
import com.mortals.xhx.module.attendance.model.vo.VacationBalanceSummaryVo;
import com.mortals.xhx.module.attendance.dao.AttendanceSummaryDao;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("attendanceSummaryDao")
public class AttendanceSummaryDaoImpl extends SqlSessionDaoSupport implements AttendanceSummaryDao {
protected String namespace = this.getClass().getName();
@Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
protected String getSqlId(String id) {
return this.namespace + "." + id;
}
@Override
public List<VacationBalanceSummaryVo> getVacationBalanceSummary(AttendanceSummaryQuery query) {
return this.getSqlSession().selectList(this.getSqlId("getVacationBalanceSummary"), query);
}
@Override
public List<LeaveSummaryVo> getLeaveSummary(AttendanceSummaryQuery query) {
return this.getSqlSession().selectList(this.getSqlId("getLeaveSummary"), query);
}
@Override
public List<ErrorSummaryVo> getErrorSummary(AttendanceSummaryQuery query) {
return this.getSqlSession().selectList(this.getSqlId("getErrorSummary"), query);
}
}
package com.mortals.xhx.module.attendance.model.vo;
import lombok.Data;
/**
* 考勤汇总查询对象
*/
@Data
public class AttendanceSummaryQuery {
/** 汇总日期 yyyy-mm-dd */
private String summaryTime;
private String summaryTimeStart;
private String summaryTimeEnd;
public AttendanceSummaryQuery(String summaryTime){
this.summaryTime = summaryTime;
}
public AttendanceSummaryQuery(){
}
}
package com.mortals.xhx.module.attendance.model.vo;
import lombok.Data;
/**
* 考勤异常汇总
*/
@Data
public class ErrorSummaryVo {
/**
* 员工ID
*/
private Long staffId;
/**
* 员工姓名
*/
private String staffName;
/**
* 年
*/
private Integer year;
/**
* 月
*/
private Integer month;
/**
* 日
*/
private Integer day;
/**
* 缺卡次数
*/
private Integer morningTimes;
/**
* 考勤汇总-迟到(次)
*/
private Integer lateTimes;
/**
* 考勤汇总-早退(次)
*/
private Integer overtimeTimes;
}
package com.mortals.xhx.module.attendance.model.vo;
import lombok.Data;
/**
* 请假汇总
*/
@Data
public class LeaveSummaryVo {
/**
* 员工ID
*/
private Long staffId;
/**
* 员工姓名
*/
private String staffName;
/**
* 年
*/
private Integer year;
/**
* 月
*/
private Integer month;
/**
* 日
*/
private Integer day;
/**
* 请假类型(1.事假,2.调休,3.病假,4.年假,5.产假,6.陪产假,7.婚假,8.例假,9.哺乳假,10.丧假,11.回单位,12.因公请假,13.外出勘验,14.值班补班,15.体检,16.隔离,17.因公外出,18.公休,19.育儿假,20.调回单位,21.探亲假)
*/
private Integer leaveType;
/**
* 时长,单位秒
*/
private Integer duration;
}
package com.mortals.xhx.module.attendance.model.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* 假期余额汇总
*/
@Data
public class VacationBalanceSummaryVo {
/**
* 员工ID
*/
private Long staffId;
/**
* 员工姓名
*/
private String staffName;
/**
* 所属部门
*/
private Long deptId;
/**
* 所属部门名称
*/
private String deptName;
/**
* 工号
*/
private String workNum;
/**
* 联系电话
*/
private String phoneNumber;
/**
* 年
*/
private Integer year;
/**
* 月
*/
private Integer month;
/**
* 日
*/
private Integer day;
/**
* 事假(天)
*/
private BigDecimal personalLeaveDays;
/**
* 调休(天)
*/
private BigDecimal compensatedLeaveDays;
/**
* 病假(天)
*/
private BigDecimal sickLeaveDays;
/**
* 年假(天)
*/
private BigDecimal annualLeaveDays;
/**
* 婚假(天)
*/
private BigDecimal marriageLeaveDays;
/**
* 产假(天)
*/
private BigDecimal maternityLeaveDays;
/**
* 陪产假(天)
*/
private BigDecimal paternityLeaveDays;
/**
* 例假(天)
*/
private BigDecimal menstrualLeaveDays;
/**
* 哺乳假(天)
*/
private BigDecimal breastfeedingLeaveDays;
/**
* 丧假(天)
*/
private BigDecimal bereavementLeaveDays;
/**
* 回单位(天)
*/
private BigDecimal backToUnit;
/**
* 因公请假(天)
*/
private BigDecimal onDutyLeave;
/**
* 外出勘验(天)
*/
private BigDecimal outOfOffice;
/**
* 值班补班(天)
*/
private BigDecimal shiftCompensation;
/**
* 体检(天)
*/
private BigDecimal physicalExamination;
/**
* 隔离(天)
*/
private BigDecimal quarantine;
/**
* 因公外出(与窗口工作无关/天)
*/
private BigDecimal businessTrip;
/**
* 公休(天)
*/
private BigDecimal publicHoliday;
/**
* 育儿假(天)
*/
private BigDecimal childRearingLeave;
/**
* 调回单位(或离职/天)
*/
private BigDecimal transferBack;
/**
* 探亲假(天)
*/
private BigDecimal homeLeave;
}
package com.mortals.xhx.module.attendance.service; package com.mortals.xhx.module.attendance.service;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.attendance.model.AttendanceStatEntity; import com.mortals.xhx.module.attendance.model.AttendanceStatEntity;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
/** /**
* AttendanceStatService * AttendanceStatService
* *
...@@ -11,4 +13,9 @@ import com.mortals.xhx.module.attendance.model.AttendanceStatEntity; ...@@ -11,4 +13,9 @@ import com.mortals.xhx.module.attendance.model.AttendanceStatEntity;
*/ */
public interface AttendanceStatService extends ICRUDService<AttendanceStatEntity,Long>{ public interface AttendanceStatService extends ICRUDService<AttendanceStatEntity,Long>{
/**
* 生成考勤汇总数据
* @param query
*/
void doAttendanceSummary(AttendanceSummaryQuery query);
} }
\ No newline at end of file
package com.mortals.xhx.module.attendance.service.impl; package com.mortals.xhx.module.attendance.service.impl;
import com.mortals.framework.model.PageInfo; import com.mortals.framework.model.PageInfo;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.common.code.LeaveTypeEnum;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.attendance.dao.AttendanceSummaryDao;
import com.mortals.xhx.module.attendance.model.AttendanceStaffStatEntity; import com.mortals.xhx.module.attendance.model.AttendanceStaffStatEntity;
import com.mortals.xhx.module.attendance.model.AttendanceStaffStatQuery; import com.mortals.xhx.module.attendance.model.AttendanceStaffStatQuery;
import com.mortals.xhx.module.attendance.model.AttendanceStatQuery;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.model.vo.ErrorSummaryVo;
import com.mortals.xhx.module.attendance.model.vo.LeaveSummaryVo;
import com.mortals.xhx.module.attendance.model.vo.VacationBalanceSummaryVo;
import com.mortals.xhx.module.attendance.service.AttendanceStaffStatService; import com.mortals.xhx.module.attendance.service.AttendanceStaffStatService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl; import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
...@@ -13,6 +25,8 @@ import com.mortals.xhx.module.attendance.dao.AttendanceStatDao; ...@@ -13,6 +25,8 @@ import com.mortals.xhx.module.attendance.dao.AttendanceStatDao;
import com.mortals.xhx.module.attendance.model.AttendanceStatEntity; import com.mortals.xhx.module.attendance.model.AttendanceStatEntity;
import com.mortals.xhx.module.attendance.service.AttendanceStatService; import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -26,6 +40,8 @@ import java.util.List; ...@@ -26,6 +40,8 @@ import java.util.List;
public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<AttendanceStatDao, AttendanceStatEntity, Long> implements AttendanceStatService { public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<AttendanceStatDao, AttendanceStatEntity, Long> implements AttendanceStatService {
@Autowired @Autowired
private AttendanceStaffStatService attendanceStaffStatService; private AttendanceStaffStatService attendanceStaffStatService;
@Autowired
private AttendanceSummaryDao attendanceSummaryDao;
@Override @Override
protected void findAfter(AttendanceStatEntity entity, Context context, List<AttendanceStatEntity> list) throws AppException { protected void findAfter(AttendanceStatEntity entity, Context context, List<AttendanceStatEntity> list) throws AppException {
...@@ -122,4 +138,101 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc ...@@ -122,4 +138,101 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
}); });
super.findAfter(params, pageInfo, context, list); super.findAfter(params, pageInfo, context, list);
} }
@Override
public void doAttendanceSummary(AttendanceSummaryQuery query) {
try {
long currentTime = System.currentTimeMillis();
if (query == null) {
query = new AttendanceSummaryQuery(DateUtils.getCurrStrDate());
}
if (StringUtils.isEmpty(query.getSummaryTime())) {
query.setSummaryTime(DateUtils.getCurrStrDate());
}
log.info("开始汇总[" + query.getSummaryTime() + "]考勤.....");
//汇总当前日期假期余额
List<VacationBalanceSummaryVo> vacationBalanceSummaryVoList = attendanceSummaryDao.getVacationBalanceSummary(query);
if (CollectionUtils.isNotEmpty(vacationBalanceSummaryVoList)) {
for (VacationBalanceSummaryVo item : vacationBalanceSummaryVoList) {
AttendanceStatEntity temp = this.selectOne(new AttendanceStatQuery().staffId(item.getStaffId()).year(item.getYear()).month(item.getMonth()).day(item.getDay()));
if (temp == null) {
AttendanceStatEntity attendanceStatEntity = new AttendanceStatEntity();
attendanceStatEntity.initAttrValue();
BeanUtils.copyProperties(item, attendanceStatEntity, BeanUtil.getNullPropertyNames(item));
attendanceStatEntity.setCreateTime(new Date());
attendanceStatEntity.setCreateUserId(1l);
this.dao.insert(attendanceStatEntity);
} else {
BeanUtils.copyProperties(item, temp, BeanUtil.getNullPropertyNames(item));
this.dao.update(temp);
}
}
}
log.info("完成汇总当前日期假期余额.....");
//汇总当前日期请假情况
List<LeaveSummaryVo> leaveSummaryVoList = attendanceSummaryDao.getLeaveSummary(query);
if (CollectionUtils.isNotEmpty(leaveSummaryVoList)) {
BigDecimal hour = new BigDecimal(3600);
for (LeaveSummaryVo item : leaveSummaryVoList) {
AttendanceStatEntity temp = this.selectOne(new AttendanceStatQuery().staffId(item.getStaffId()).year(item.getYear()).month(item.getMonth()).day(item.getDay()));
if (temp != null) {
BigDecimal leaveTime = new BigDecimal(item.getDuration()).divide(hour, 1, BigDecimal.ROUND_HALF_DOWN);
LeaveTypeEnum leaveTypeEnum = LeaveTypeEnum.getByValue(item.getLeaveType());
switch (leaveTypeEnum) {
case 事假:
temp.setPersonalLeave(leaveTime);
break;
case 调休:
temp.setCompensatedLeaveDays(leaveTime);
break;
case 病假:
temp.setSickLeave(leaveTime);
break;
case 年假:
temp.setAnnualLeaveDays(leaveTime);
break;
case 产假:
temp.setMaternityLeave(leaveTime);
break;
case 陪产假:
temp.setPaternityLeaveDays(leaveTime);
break;
case 婚假:
temp.setMarriageLeave(leaveTime);
break;
case 例假:
temp.setMenstrualLeaveDays(leaveTime);
break;
case 哺乳假:
temp.setBreastfeedingLeaveDays(leaveTime);
break;
case 丧假:
temp.setFuneralLeave(leaveTime);
break;
default:
temp.setPersonalLeave(leaveTime);
break;
}
this.dao.update(temp);
}
}
}
log.info("完成汇总当前日期请假情况.....");
//汇总当前日期异常考勤
List<ErrorSummaryVo> errorSummaryVoList = attendanceSummaryDao.getErrorSummary(query);
if (CollectionUtils.isNotEmpty(errorSummaryVoList)) {
for (ErrorSummaryVo item : errorSummaryVoList) {
AttendanceStatEntity temp = this.selectOne(new AttendanceStatQuery().staffId(item.getStaffId()).year(item.getYear()).month(item.getMonth()).day(item.getDay()));
if (temp != null) {
BeanUtils.copyProperties(item, temp, BeanUtil.getNullPropertyNames(item));
this.dao.update(temp);
}
}
}
log.info("完成汇总当前日期异常考勤.....");
log.info("日期:" + query.getSummaryTime() + ",考勤汇总执行完成,耗时:" + (System.currentTimeMillis() - currentTime) + "毫秒....");
}catch (Exception e){
log.error("考勤汇总出错",e);
}
}
} }
\ No newline at end of file
package com.mortals.xhx.module.attendance.web; package com.mortals.xhx.module.attendance.web;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.model.Result;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController; import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService; import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.module.attendance.model.AttendanceClassQuery; import com.mortals.xhx.module.attendance.model.AttendanceClassQuery;
import com.mortals.xhx.module.attendance.model.AttendanceGroupQuery; import com.mortals.xhx.module.attendance.model.AttendanceGroupQuery;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceClassService; import com.mortals.xhx.module.attendance.service.AttendanceClassService;
import com.mortals.xhx.module.attendance.service.AttendanceGroupService; import com.mortals.xhx.module.attendance.service.AttendanceGroupService;
import com.mortals.xhx.module.dept.model.DeptQuery; import com.mortals.xhx.module.dept.model.DeptQuery;
import com.mortals.xhx.module.dept.service.DeptService; import com.mortals.xhx.module.dept.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -19,12 +27,14 @@ import com.mortals.xhx.module.attendance.model.AttendanceStatEntity; ...@@ -19,12 +27,14 @@ import com.mortals.xhx.module.attendance.model.AttendanceStatEntity;
import com.mortals.xhx.module.attendance.service.AttendanceStatService; import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
import java.util.HashMap;
import java.util.List; import java.time.LocalDate;
import java.util.Map; import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*; import static com.mortals.framework.ap.SysConstains.*;
...@@ -48,6 +58,9 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController< ...@@ -48,6 +58,9 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
@Autowired @Autowired
private DeptService deptService; private DeptService deptService;
@Autowired
private ICacheService cacheService;
@Autowired @Autowired
private AttendanceClassService attendanceClassService; private AttendanceClassService attendanceClassService;
...@@ -55,6 +68,10 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController< ...@@ -55,6 +68,10 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
super.setModuleDesc( "考勤汇总信息"); super.setModuleDesc( "考勤汇总信息");
} }
private ExecutorService executorService = Executors.newCachedThreadPool();
private static String SUMMARY_TASK_KEY ="attendanceSummaryTask:run";
@Override @Override
protected void init(Map<String, Object> model, Context context) { protected void init(Map<String, Object> model, Context context) {
this.addDict(model,"deptId",deptService.find(new DeptQuery()).stream().collect(Collectors.toMap(x->x.getId().toString(), y->y.getDeptName()))); this.addDict(model,"deptId",deptService.find(new DeptQuery()).stream().collect(Collectors.toMap(x->x.getId().toString(), y->y.getDeptName())));
...@@ -63,5 +80,61 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController< ...@@ -63,5 +80,61 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
super.init(model, context); super.init(model, context);
} }
@PostMapping({"summary"})
@UnAuth
public Rest<Object> summary(@RequestBody AttendanceSummaryQuery query) {
Rest<Object> ret = new Rest();
Map<String, Object> model = new HashMap();
Context context = this.getContext();
String busiDesc = "执行考勤汇总任务";
int code=1;
try {
String verify = cacheService.get(SUMMARY_TASK_KEY);
if(StringUtils.isNotEmpty(verify)&&verify.equals("true")){
throw new AppException("汇总任务正在执行,请勿重复操作");
}
executorService.submit(new Runnable() {
@Override
public void run() {
cacheService.setnx(SUMMARY_TASK_KEY,"true",3600);
if(StringUtils.isNotEmpty(query.getSummaryTimeStart()) && StringUtils.isNotEmpty(query.getSummaryTimeEnd())){
List<String> dateList = getDatesBetween(query.getSummaryTimeStart(),query.getSummaryTimeEnd());
for(String day:dateList){
AttendanceSummaryQuery temp = new AttendanceSummaryQuery(day);
service.doAttendanceSummary(temp);
}
}else {
service.doAttendanceSummary(query);
}
}
});
cacheService.setnx(SUMMARY_TASK_KEY,"false",60);
model.put("message_info","开始执行考勤汇总,请稍后查看");
} catch (Exception var9) {
code = -1;
this.doException(this.request, busiDesc, model, var9);
}
ret.setCode(code);
ret.setMsg(model.get("message_info") == null ? "" : model.remove("message_info").toString());
return ret;
}
public static List<String> getDatesBetween(String startDateStr, String endDateStr) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(startDateStr, formatter);
LocalDate endDate = LocalDate.parse(endDateStr, formatter);
List<String> dates = new ArrayList<>();
//这里是判断开始日期是否在结束日期之后或者=结束日期
while (startDate .isBefore(endDate) || startDate .isEqual(endDate)) {
String add = startDate .format(formatter);
dates.add(add);
startDate = startDate .plusDays(1);
}
return dates;
}
public static void main(String[] args){
List<String> sss = getDatesBetween("2023-07-28","2023-08-04");
System.out.println(sss);
}
} }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.attendance.dao.ibatis.AttendanceSummaryDaoImpl">
<!-- 汇总当前日期假期余额 -->
<select id="getVacationBalanceSummary" parameterType="com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery" resultType="com.mortals.xhx.module.attendance.model.vo.VacationBalanceSummaryVo">
SELECT
s.id AS staffId,
s.`name` AS staffName,
s.phoneNumber,
s.workNum,
s.deptId,
s.deptName,
DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%Y') as `year`,
DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%m') as `month`,
DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%d') as `day`,
IFNULL(b.personalLeaveDays,0) as personalLeaveDays,
IFNULL(b.compensatedLeaveDays,0) as compensatedLeaveDays,
IFNULL(b.sickLeaveDays,0) as sickLeaveDays,
IFNULL(b.annualLeaveDays,0) as annualLeaveDays,
IFNULL(b.marriageLeaveDays,0) as marriageLeaveDays,
IFNULL(b.maternityLeaveDays,0) as maternityLeaveDays,
IFNULL(b.paternityLeaveDays,0) as paternityLeaveDays,
IFNULL(b.menstrualLeaveDays,0) as menstrualLeaveDays,
IFNULL(b.breastfeedingLeaveDays,0) as breastfeedingLeaveDays,
IFNULL(b.bereavementLeaveDays,0) as bereavementLeaveDays,
IFNULL(b.backToUnit,0) as backToUnit,
IFNULL(b.onDutyLeave,0) as onDutyLeave,
IFNULL(b.outOfOffice,0) as outOfOffice,
IFNULL(b.shiftCompensation,0) as shiftCompensation,
IFNULL(b.physicalExamination,0) as physicalExamination,
IFNULL(b.quarantine,0) as quarantine,
IFNULL(b.businessTrip,0) as businessTrip,
IFNULL(b.publicHoliday,0) as publicHoliday,
IFNULL(b.childRearingLeave,0) as childRearingLeave,
IFNULL(b.transferBack,0) as transferBack,
IFNULL(b.homeLeave,0) as homeLeave
FROM
mortals_xhx_staff s
LEFT JOIN mortals_xhx_attendance_vacation_balance b ON s.id = b.staffId
</select>
<!-- 汇总当前日期请假情况 -->
<select id="getLeaveSummary" parameterType="com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery" resultType="com.mortals.xhx.module.attendance.model.vo.LeaveSummaryVo">
SELECT
leavePersonId AS staffId,
leavePerson AS staffName,
leaveType,
IFNULL(sum(duration),0) as duration,
ANY_VALUE(DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%Y')) as `year`,
ANY_VALUE(DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%m')) as `month`,
ANY_VALUE(DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%d')) as `day`
FROM
mortals_xhx_attendance_leave_record
WHERE
auditResult = 1
AND processStatus = 2
AND STR_TO_DATE(date_format(startTime,'%Y-%m-%d'),'%Y-%m-%d') <![CDATA[ >= ]]> STR_TO_DATE(#{summaryTime},'%Y-%m-%d')
AND STR_TO_DATE(date_format(endTime,'%Y-%m-%d'),'%Y-%m-%d') <![CDATA[ <= ]]> STR_TO_DATE(#{summaryTime},'%Y-%m-%d')
GROUP BY leavePersonId,leavePerson,leaveType
</select>
<!-- 汇总当前日期异常考勤 -->
<select id="getErrorSummary" parameterType="com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery" resultType="com.mortals.xhx.module.attendance.model.vo.ErrorSummaryVo">
select
e.staffId,
e.staffName,
ANY_VALUE(DATE_FORMAT(errorDateTime,'%Y')) as `year`,
ANY_VALUE(DATE_FORMAT(errorDateTime,'%m')) as `month`,
ANY_VALUE(DATE_FORMAT(errorDateTime,'%d')) as `day`,
sum(case errorStatus when 0 then 1 ELSE 0 end) as afternoonTimes,
sum(case errorStatus when 1 then 1 ELSE 0 end) as overtimeTimes,
sum(case errorStatus when 2 then 1 ELSE 0 end) as lateTimes
from
mortals_xhx_attendance_record_error e
where
processStatus = 1
and errorStatus != 4
and e.errorDateTime <![CDATA[ >= ]]> STR_TO_DATE(left(concat(#{summaryTime},' 00:00:00'),19),'%Y-%m-%d %k:%i:%s')
and e.errorDateTime <![CDATA[ <= ]]> STR_TO_DATE(left(concat(#{summaryTime},' 23:59:59'),19),'%Y-%m-%d %k:%i:%s')
group by
e.staffId,
e.staffName
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment