Commit 5332d7a4 authored by 姬鋆屾's avatar 姬鋆屾
parents 9aa2b17f 479f71df
......@@ -19,18 +19,23 @@
<span class="ml10">修改为</span>
</div>
<div class="mt10">
<!-- 处理异常状态 -->
<!--
<Field label="" v-model="dealParams.processResult" type="select" :enumData="dict.errorStatus"/>
-->
<!-- 处理异常状态 -->
<el-select v-model="dealParams.processResult">
<el-option
v-for='($label, $value) in dict.errorStatus'
:key="$value"
:label="$label"
:value="$label">
:value="$value">
</el-option>
</el-select>
<!-- 早退/迟到 -->
<el-input style="width:220px" placeholder="请输入数字" :maxlength="4" v-model="duration"
v-if="dealParams.processResult == '迟到'|| dealParams.processResult == '早退'"
<el-input style="width:220px" placeholder="请输入数字" :maxlength="4" v-model="duration"
v-if="dealParams.processResult == '1'|| dealParams.processResult == '2'"
class="ml20" type="number">
<template slot="append">分钟</template>
</el-input>
......@@ -44,7 +49,7 @@
<div class="mt20">
<el-button type="primary" @click="saveForm">确定</el-button>
<el-button @click="cancleFn">取消</el-button>
</div>
</div>
</div>
</el-drawer>
......@@ -54,7 +59,7 @@
export default {
name: "AttendanceRecordDetail",
created() {
},
data() {
return {
......@@ -65,6 +70,7 @@
// 是否显示弹出层
open: false,
direction:"rtl",
toString: ["processResult"],
// 表单校验
rules: {
staffName: [
......@@ -77,6 +83,8 @@
},
dealParams:{
remark:'',
errorStatus:null,
durtion:0,
processResult:'',
recordErrorEntities:[],//处理员工
processStatus:1//处理状态
......@@ -131,8 +139,10 @@
this.$message.error('请选择处理结果')
return
}
if(this.duration && (this.dealParams.processResult == '早退' || this.dealParams.processResult == '迟到')){
this.dealParams.processResult = this.dealParams.processResult + this.duration +'分钟'
this.dealParams.errorStatus=this.dealParams.processResult
if(this.duration && (this.dealParams.processResult == '1' || this.dealParams.processResult == '2')){
this.dealParams.processResult =this.dict.errorStatus[this.dealParams.processResult] + this.duration +'分钟'
this.dealParams.durtion=this.duration
}
// 保存结果处理
this.$post(this.urls.saveUrl,this.dealParams).then(res => {
......@@ -145,6 +155,8 @@
this.open = false
this.dealParams = {
remark:'',
errorStatus:null,
durtion:0,
processResult:'',
recordErrorEntities:[],//处理员工
processStatus:1//处理状态
......
......@@ -91,14 +91,12 @@
{
name: "deptId",
type: "select",
label: "全部部门",
fuzzy: false
label: "全部部门"
},
{
name: "groupId",
type: "select",
label: "全部考勤组",
fuzzy: false
label: "全部考勤组"
},
/* {
name: "classId",
......@@ -109,38 +107,34 @@
{
name: "errorStatus",
type: "select",
label: "全部异常状态",
fuzzy: false
label: "全部异常状态"
},
{
name: "processStatus",
type: "select",
label: "全部处理状态",
fuzzy: false
label: "全部处理状态"
},
{
name:'attendanceDateStart',
name:'errorDateTimeStart',
type: "date",
label: "异常开始时间",
fuzzy: false
label: "异常开始时间"
},
{
name:'attendanceDateEnd',
type: "date",
label: "异常结束时间",
fuzzy: false
label: "errorDateTimeEnd"
},
{
name: "staffName",
type: "text",
label: "员工姓名",
fuzzy: false
fuzzy: true
},
{
name: "phoneNumber",
type: "text",
label: "手机号",
fuzzy: false
fuzzy: true
},
],
columns: [
......
......@@ -33,7 +33,7 @@ public class AttendanceSummaryTaskImpl implements ITaskExcuteService {
}
cacheService.set(SUMMARY_TASK_KEY,"true",600);
attendanceStatService.doAttendanceSummary(null);
cacheService.set(SUMMARY_TASK_KEY,"false",60);
cacheService.expire(SUMMARY_TASK_KEY,1);
}catch (Exception e){
}
......
......@@ -333,6 +333,7 @@ public class DingMessageController {
if(ObjectUtils.isEmpty(balanceEntity)){ //先判断数据库里没有这个人的请假记录就初始化对象
attendanceVacationBalanceEntity.initAttrValue();
}
attendanceVacationBalanceEntity.setRemark(processInstanceId); // 将钉钉的事物id存入假期余额 用于判断是否为同一条请假数据
attendanceVacationBalanceEntity.setStaffId(staffEntity.getId());
attendanceVacationBalanceEntity.setStaffName(staffEntity.getName());
attendanceVacationBalanceEntity.setDeptId(staffEntity.getDeptId());
......@@ -574,19 +575,23 @@ public class DingMessageController {
//审批状态为同意过后再修改假期余额
if(result.getResult().compareToIgnoreCase("AGREE") == 0){
//更新假期余额表
if(ObjectUtils.isEmpty(balanceEntity)){
attendanceVacationBalanceEntity.setCreateUserId(1L);
attendanceVacationBalanceEntity.setCreateTime(new Date());
balanceService.save(attendanceVacationBalanceEntity);
}else{
//更新对象必须传入id
attendanceVacationBalanceEntity.setId(balanceEntity.getId());
attendanceVacationBalanceEntity.setUpdateUserId(1L);
attendanceVacationBalanceEntity.setUpdateTime(new Date());
balanceService.update(attendanceVacationBalanceEntity);
AttendanceVacationBalanceEntity entity = balanceService.selectOne(new AttendanceVacationBalanceQuery().remark(processInstanceId));
if(ObjectUtils.isEmpty(entity)){ //当表中没有这条processInstanceId关联的数据表示没有扣除假期(钉钉会推送两条余额数据过来 需要加这个判断)
//更新假期余额表
if(ObjectUtils.isEmpty(balanceEntity)){
attendanceVacationBalanceEntity.setCreateUserId(1L);
attendanceVacationBalanceEntity.setCreateTime(new Date());
balanceService.save(attendanceVacationBalanceEntity);
}else{
//更新对象必须传入id
attendanceVacationBalanceEntity.setId(balanceEntity.getId());
attendanceVacationBalanceEntity.setUpdateUserId(1L);
attendanceVacationBalanceEntity.setUpdateTime(new Date());
balanceService.update(attendanceVacationBalanceEntity);
}
}
}
......
......@@ -24,4 +24,16 @@ public class AttendanceRecordErrorVo extends BaseEntityLong {
*/
private List<AttendanceRecordErrorEntity> recordErrorEntities;
/** 开始 异常时间 */
private String errorDateTimeStart;
/** 结束 异常时间 */
private String errorDateTimeEnd;
private Integer duration;
}
......@@ -31,6 +31,7 @@ public class ErrorSummaryVo {
* 缺卡次数
*/
private Integer morningTimes;
private Integer afternoonTimes;
/**
* 考勤汇总-迟到(次)
*/
......
package com.mortals.xhx.module.attendance.model.vo;
import com.mortals.framework.annotation.Excel;
import lombok.Data;
import java.util.Date;
/**
* 请假汇总
*/
......@@ -35,4 +38,12 @@ public class LeaveSummaryVo {
* 时长,单位秒
*/
private Integer duration;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
}
package com.mortals.xhx.module.attendance.service.impl;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.mortals.framework.model.PageInfo;
import com.mortals.xhx.busiz.h5.req.AttendSaveReq;
import com.mortals.xhx.busiz.h5.web.ApiWebPerformController;
import com.mortals.xhx.common.code.ErrorStatusEnum;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.attendance.model.AttendanceClassDetailEntity;
import com.mortals.xhx.module.attendance.model.AttendanceClassEntity;
import com.mortals.xhx.module.attendance.service.AttendanceClassDetailService;
import com.mortals.xhx.module.attendance.service.AttendanceClassService;
import com.mortals.xhx.module.perform.service.PerformAttendRecordService;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.service.StaffService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
......@@ -34,9 +41,13 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
@Autowired
private AttendanceClassService attendanceClassService;
@Autowired
private PerformAttendRecordService attendRecordService;
@Autowired
private ApiWebPerformController apiWebPerformController;
@Autowired
private StaffService staffService;
@Override
......@@ -65,9 +76,62 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
});
}
@Override
protected void updateAfter(AttendanceRecordErrorEntity entity, Context context) throws AppException {
if (YesNoEnum.YES.getValue() == entity.getProcessStatus()) {
//判断后打绩效
String ruleCode = "";
if (ErrorStatusEnum.早退.getValue() == entity.getErrorStatus()) {
//判断时间差定义
Long earlyMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE);
if (earlyMin >= 0L && earlyMin < 5L) {
//早退5分钟内
ruleCode = "ATTEND1002";
}
if (earlyMin >= 5L && earlyMin < 60L) {
//早退5分钟内
ruleCode = "ATTEND1004";
}
if (earlyMin >= 60L) {
//早退5分钟内
ruleCode = "ATTEND1006";
}
} else if (ErrorStatusEnum.迟到.getValue() == entity.getErrorStatus()) {
Long lateMin = DateUtil.between(entity.getErrorDateTime(), entity.getGoOffDateTime(), DateUnit.MINUTE);
if (lateMin >= 0L && lateMin < 5L) {
//迟到5分钟内
ruleCode = "ATTEND1001";
}
if (lateMin >= 5L && lateMin < 60L) {
//迟到5-60
ruleCode = "ATTEND1003";
}
if (lateMin >= 60L) {
//迟到60分钟以上
ruleCode = "ATTEND1005";
}
} else if (ErrorStatusEnum.缺卡.getValue() == entity.getErrorStatus()) {
ruleCode = "ATTEND1007";
}
if (!ObjectUtils.isEmpty(ruleCode)) {
AttendSaveReq attendSaveReq = new AttendSaveReq();
attendSaveReq.setAttendanceGroupId(entity.getAttendanceGroupId());
attendSaveReq.setAttendanceGroupName(entity.getAttendanceGroupName());
attendSaveReq.setAttendanceDate(entity.getActualAttendanceDateTime());
attendSaveReq.setErrorTime(entity.getErrorDateTime());
attendSaveReq.setGoOffTimeStr(entity.getGoOrOff());
attendSaveReq.setActualAttendTime(entity.getActualAttendanceDateTime());
attendSaveReq.setErrorResult(entity.getRemark());
attendSaveReq.setTitle("考勤:" + ErrorStatusEnum.getByValue(entity.getErrorStatus()).getDesc());
attendSaveReq.setHappenTime(entity.getErrorDateTime());
attendSaveReq.setRuleCode(ruleCode);
attendSaveReq.setStaffId(entity.getStaffId());
attendRecordService.saveAttend(attendSaveReq,context);
}
}
}
}
\ No newline at end of file
......@@ -27,6 +27,7 @@ import com.mortals.xhx.module.attendance.model.AttendanceStatEntity;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
......@@ -185,12 +186,32 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
//汇总当前日期请假情况
List<LeaveSummaryVo> leaveSummaryVoList = attendanceSummaryDao.getLeaveSummary(query);
if (CollectionUtils.isNotEmpty(leaveSummaryVoList)) {
BigDecimal hour = new BigDecimal(3600);
BigDecimal day = new BigDecimal(3600*24);
BigDecimal oneDay = new BigDecimal(1);
for (LeaveSummaryVo item : leaveSummaryVoList) {
String attendanceSummary = "";
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);
BigDecimal leaveTime = new BigDecimal(item.getDuration()).divide(day, 1, BigDecimal.ROUND_HALF_DOWN);
String endStr = DateUtils.getStrDate(item.getEndTime());
String dayStr = query.getSummaryTime();
if(endStr.equals(dayStr)){
if(leaveTime.compareTo(oneDay)>=0){
// 整数部分
BigDecimal integerPart = leaveTime.setScale(0, RoundingMode.DOWN);
// 小数部分
BigDecimal fractionalPart = leaveTime.subtract(integerPart);
if(fractionalPart.compareTo(new BigDecimal(0))==0){
leaveTime = oneDay;
}else {
leaveTime = fractionalPart;
}
}
}else {
if(leaveTime.compareTo(oneDay)>=0){
leaveTime=oneDay;
}
}
temp.setGoTimes(0); //默认只要有请假,当天就不算全勤
LeaveTypeEnum leaveTypeEnum = LeaveTypeEnum.getByValue(item.getLeaveType());
if(leaveTypeEnum == null){
......@@ -245,7 +266,7 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
staffStat.setUpdateTime(new Date());
attendanceStaffStatService.update(staffStat);
}else {
staffStat.setCreateTime(new Date());
staffStat.setCreateTime(DateUtils.StrToDate(query.getSummaryTime()));
staffStat.setCreateUserId(1l);
attendanceStaffStatService.save(staffStat);
}
......@@ -282,7 +303,7 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
staffStat.setUpdateTime(new Date());
attendanceStaffStatService.update(staffStat);
}else {
staffStat.setCreateTime(new Date());
staffStat.setCreateTime(DateUtils.StrToDate(query.getSummaryTime()));
staffStat.setCreateUserId(1l);
attendanceStaffStatService.save(staffStat);
}
......@@ -326,4 +347,5 @@ public class AttendanceStatServiceImpl extends AbstractCRUDServiceImpl<Attendanc
}
return result;
}
}
\ No newline at end of file
......@@ -143,22 +143,20 @@ public class AttendanceRecordErrorController extends BaseCRUDJsonBodyMappingCont
for (AttendanceRecordErrorEntity recordErrorEntity : entity.getRecordErrorEntities()) {
AttendanceRecordErrorEntity updateEntity = new AttendanceRecordErrorEntity();
updateEntity.setId(recordErrorEntity.getId());
updateEntity.setErrorDateTime(recordErrorEntity.getErrorDateTime());
updateEntity.setGoOffDateTime(recordErrorEntity.getGoOffDateTime());
updateEntity.setProcessStatus(entity.getProcessStatus());
updateEntity.setGoOffDateTime(null);
updateEntity.setProcessResult(entity.getProcessResult());
updateEntity.setStaffId(recordErrorEntity.getStaffId());
updateEntity.setErrorStatus(entity.getErrorStatus());
updateEntity.setOpertor(context.getUser().getRealName());
updateEntity.setOperDateTime(new Date());
updateEntity.setRemark(entity.getRemark());
updateEntity.setUpdateTime(new Date());
updateEntity.setUpdateUserId(this.getContextUserId(getContext()));
this.service.update(recordErrorEntity, getContext());
updateEntity.setDuration(entity.getDuration());
this.service.update(updateEntity, getContext());
}
/*
if(!ObjectUtils.isEmpty(entity.getRecordErrorEntities())){
this.batchSave(entity.getRecordErrorEntities());
}
*/
for (AttendanceRecordErrorEntity item : entity.getRecordErrorEntities()) {
DateUtils.convertTime2Str(item.getErrorDateTime().getTime(), DateUtils.P_yyyy_MM_dd);
......@@ -226,49 +224,6 @@ public class AttendanceRecordErrorController extends BaseCRUDJsonBodyMappingCont
}
@Override
protected int saveAfter(AttendanceRecordErrorEntity entity, Map<String, Object> model, Context context) throws AppException {
if (YesNoEnum.YES.getValue() == entity.getProcessStatus()) {
//已经处理,根据错误状态提交考勤绩效
String ruleCode = "";
if (ErrorStatusEnum.早退.getValue() == entity.getErrorStatus()) {
//判断时间差定义
//entity.getErrorStatus()
}
/* AttendSaveReq attendSaveReq = new AttendSaveReq();
attendSaveReq.setAttendanceGroupId(entity.getAttendanceGroupId());
attendSaveReq.setAttendanceGroupName(entity.getAttendanceGroupName());
attendSaveReq.setAttendanceDate(entity.getActualAttendanceDateTime());
attendSaveReq.setErrorTime(entity.getErrorDateTime());
attendSaveReq.setGoOffTimeStr(entity.getGoOrOff());
attendSaveReq.setActualAttendTime();
attendSaveReq.setErrorResult(entity.getRemark());
attendSaveReq.setExt();
attendSaveReq.setWorkNum();
attendSaveReq.setTitle();
attendSaveReq.setHappenTime(entity.getErrorDateTime());
attendSaveReq.setRuleCode(ruleCode);
attendSaveReq.setRuleId();
attendSaveReq.setPhone();
attendSaveReq.setPerformType();
attendSaveReq.setStaffId();*/
// apiWebPerformController.attendSave(attendSaveReq);
}
return super.saveAfter(entity, model, context);
}
@Override
protected int editAfter(Long id, Map<String, Object> model, AttendanceRecordErrorEntity entity, Context context) throws AppException {
this.addDict(model, "errorStatus", paramService.getParamBySecondOrganize("AttendanceRecordDetail", "goWorkResult"));
......
......@@ -108,9 +108,9 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
}else {
service.doAttendanceSummary(query);
}
cacheService.expire(SUMMARY_TASK_KEY,1);
}
});
cacheService.set(SUMMARY_TASK_KEY,"false",60);
model.put("message_info","开始执行考勤汇总,请稍后查看");
} catch (Exception var9) {
code = -1;
......
package com.mortals.xhx.module.perform.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.busiz.h5.req.AttendSaveReq;
import com.mortals.xhx.module.perform.model.PerformAttendRecordEntity;
import com.mortals.xhx.module.perform.dao.PerformAttendRecordDao;
/**
......@@ -23,4 +25,7 @@ public interface PerformAttendRecordService extends ICRUDService<PerformAttendRe
*/
void updateProcessStatus(Long id,Integer status) throws AppException;
void saveAttend(AttendSaveReq req, Context context) throws AppException;
}
\ No newline at end of file
package com.mortals.xhx.module.perform.service.impl;
import cn.hutool.core.date.DateUtil;
import com.mortals.xhx.busiz.h5.req.AttendSaveReq;
import com.mortals.xhx.common.code.*;
import com.mortals.xhx.common.utils.BeanUtil;
import com.mortals.xhx.module.attendance.model.*;
......@@ -12,7 +13,9 @@ import com.mortals.xhx.module.check.model.CheckAttendRecordEntity;
import com.mortals.xhx.module.check.service.CheckAttendRecordService;
import com.mortals.xhx.module.dept.model.DeptEntity;
import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.perform.model.PerformRulesCategoryEntity;
import com.mortals.xhx.module.perform.model.PerformRulesEntity;
import com.mortals.xhx.module.perform.service.PerformRulesCategoryService;
import com.mortals.xhx.module.perform.service.PerformRulesService;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.service.StaffService;
......@@ -55,6 +58,8 @@ public class PerformAttendRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
private AttendanceClassService classService;
@Autowired
private AttendanceClassDetailService classDetailService;
@Autowired
private PerformRulesCategoryService categoryService;
@Autowired
private PerformRulesService rulesService;
......@@ -202,4 +207,44 @@ public class PerformAttendRecordServiceImpl extends AbstractCRUDServiceImpl<Perf
dao.update(update);
}
@Override
public void saveAttend(AttendSaveReq req, Context context) throws AppException {
//考勤保存
//通过手机号码查询员工属性
PerformRulesEntity rule = getRule(req.getRuleCode());
StaffEntity staffEntity = staffService.getCache(req.getStaffId().toString());
PerformAttendRecordEntity recordEntity = new PerformAttendRecordEntity();
recordEntity.initAttrValue();
recordEntity.setSubMethod(SubMethodEnum.系统自动.getValue());
BeanUtils.copyProperties(req, recordEntity);
recordEntity.setStaffId(staffEntity.getId());
recordEntity.setStaffName(staffEntity.getName());
recordEntity.setDeptId(staffEntity.getDeptId());
recordEntity.setDeptName(staffEntity.getDeptName());
recordEntity.setSubAddType(rule.getSubAddType());
recordEntity.setScore(rule.getScore());
recordEntity.setRuleId(rule.getId());
recordEntity.setRuleName(rule.getName());
recordEntity.setCategoryId(rule.getCategoryId());
recordEntity.setCategoryName(rule.getCategoryName());
recordEntity.setDeductPerson("系统管理员");
recordEntity.setDeductTime(new Date());
recordEntity.setCreateUserId(this.getContextUserId(context));
recordEntity.setCreateTime(new Date());
recordEntity.setWorkNum(staffEntity.getWorkNum());
PerformRulesCategoryEntity categoryEntity = categoryService.get(rule.getCategoryId());
recordEntity.setCategoryName(categoryEntity == null ? "" : categoryEntity.getName());
this.save(recordEntity);
}
private PerformRulesEntity getRule(String ruleCode) {
PerformRulesEntity rule = rulesService.getCache(ruleCode);
if (ObjectUtils.isEmpty(rule))
throw new AppException(String.format("当前手机号码未找到匹配的员工!rule:%s", ruleCode));
return rule;
}
}
\ No newline at end of file
......@@ -50,7 +50,9 @@
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`
ANY_VALUE(DATE_FORMAT(STR_TO_DATE(#{summaryTime},'%Y-%m-%d'),'%d')) as `day`,
ANY_VALUE(startTime) as startTime,
ANY_VALUE(endTime) as endTime
FROM
mortals_xhx_attendance_leave_record
WHERE
......@@ -70,6 +72,7 @@
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 morningTimes,
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
......
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