package org.jeecg.modules.mdc.service.impl; import cn.hutool.core.date.DatePattern; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.mdc.entity.MdcEquipmentPunch; import org.jeecg.modules.mdc.mapper.MdcEquipmentPunchMapper; import org.jeecg.modules.mdc.service.IMdcEquipmentPunchService; import org.jeecg.modules.mdc.service.IMdcEquipmentService; import org.jeecg.modules.mdc.util.DateUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @Description: mdc_equipment_punch * @Author: jeecg-boot * @Date: 2025-06-09 * @Version: V1.0 */ @Service public class MdcEquipmentPunchServiceImpl extends ServiceImpl implements IMdcEquipmentPunchService { @Resource private IMdcEquipmentService mdcEquipmentService; /** * 查询当前登录人所负责设备打卡情况 * @return */ @Override public List queryList() { LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); List equipmentIds = Lists.newArrayList(); if (StringUtils.isNotBlank(user.getEquipmentIds())) { equipmentIds = Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA)); }else { equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); } if (CollectionUtils.isEmpty(equipmentIds)) { return Lists.newArrayList(); } if (StringUtils.isBlank(userId)) { return Lists.newArrayList(); } //根据设备、当前日期查询打卡记录 List mdcEquipmentPunches = this.baseMapper.list(equipmentIds, DateUtils.format(new Date(), DatePattern.PURE_DATE_PATTERN)); return mdcEquipmentPunches; } /** * 上班打卡 * @param mdcEquipmentPunch */ @Override public void workUp(MdcEquipmentPunch mdcEquipmentPunch) { LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if (StringUtils.isBlank(mdcEquipmentPunch.getEquipmentId())) { throw new JeecgBootException("请选择打卡设备!"); } /** * 校验是否在有效打卡范围之内 * 早班上班卡有效范围为:00:00:00 ~ 17:30:00 * 晚班上班卡有效范围为:00:00:00 ~ 23:00:00 */ Date startDate = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 00:00:00", DatePattern.NORM_DATETIME_PATTERN ); Date endDate = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:30:00", DatePattern.NORM_DATETIME_PATTERN ); if (mdcEquipmentPunch.getShiftSchedule() == 2) { //晚班无效打卡时间范围 endDate = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 23:00:00", DatePattern.NORM_DATETIME_PATTERN ); } if (startDate.compareTo(mdcEquipmentPunch.getCheckInTime()) == 1 || endDate.compareTo(mdcEquipmentPunch.getCheckInTime()) == -1) { throw new JeecgBootException("未在有效上班打卡时间内,不能打卡!"); } //查询所选设备当天是否已打上班卡 List equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA)); String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.PURE_DATE_PATTERN); //早班上班正常最晚打卡时间 String checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00"; //查询当前设备、当前打卡类型打卡记录 List equipmentPunchList = this.list(new LambdaQueryWrapper() .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule()) .eq(MdcEquipmentPunch::getRecordDate, currentDate) .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList)); List mdcEquipmentPunchList = equipmentPunchList.stream().filter(equipmentPunch -> Objects.nonNull(equipmentPunch.getCheckInTime())).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(mdcEquipmentPunchList)) { List equipmentIds = equipmentPunchList.stream() .filter(mdcEquipmentPunchInfo -> Objects.nonNull(mdcEquipmentPunchInfo.getCheckInTime())) .map(MdcEquipmentPunch::getEquipmentId) .distinct() .collect(Collectors.toList()); throw new JeecgBootException("设备[" + StringUtils.join(equipmentIds, StringPool.COMMA) + "]已打卡,无需重复打卡"); } List list = Lists.newArrayList(); //特殊处理晚班上班卡 if (mdcEquipmentPunch.getShiftSchedule() == 2) { //晚班正常上班卡最晚打卡时间 checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00"; } for (String equipment : equipmentIdList) { Optional first = equipmentPunchList.stream().filter(equipmentPunch -> Objects.isNull(equipmentPunch.getCheckInTime()) && equipment.equals(equipmentPunch.getEquipmentId())).findFirst(); MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch(); if (first.isPresent()) { equipmentPunch = first.get(); //已存在记录说明已打下班卡,故将是否缺卡置为否 equipmentPunch.setIsAbsent(0); }else { equipmentPunch.setEquipmentId(equipment); equipmentPunch.setPunchUser(userId); equipmentPunch.setRecordDate(currentDate); equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule()); equipmentPunch.setIsEarly(0); //正常打卡时先将是否缺卡置为“是”,防止未打下班卡时无法调整状态 equipmentPunch.setIsAbsent(1); } equipmentPunch.setCheckInTime(mdcEquipmentPunch.getCheckInTime()); //打卡时间大于8:30/17:00时为迟到打卡 equipmentPunch.setIsLate(mdcEquipmentPunch.getCheckInTime().compareTo(DateUtils.getFormatDate(checkInTime, DatePattern.NORM_DATETIME_PATTERN)) == 1 ? 1 : 0); list.add(equipmentPunch); } this.saveOrUpdateBatch(list); } @Override public void workDown(MdcEquipmentPunch mdcEquipmentPunch) { LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); if (StringUtils.isBlank(mdcEquipmentPunch.getEquipmentId())) { throw new JeecgBootException("请选择打卡设备!"); } /** * 校验当前下班卡是否在有效下班打卡范围之内 * 早班下班无效打卡时间范围为00:00:00 ~ 08:30:00 * 晚班下班无效打卡时间范围为00:00:00 ~ 17:00:00 */ Date startDate = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 00:00:00", DatePattern.NORM_DATETIME_PATTERN ); Date endDate = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00", DatePattern.NORM_DATETIME_PATTERN ); Date checkOutTime = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 17:30:00", DatePattern.NORM_DATETIME_PATTERN ); if (mdcEquipmentPunch.getShiftSchedule() == 2) { //晚班无效打卡时间范围 endDate = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00", DatePattern.NORM_DATETIME_PATTERN ); //晚班正常下班最早打卡时间 checkOutTime = DateUtils.getFormatDate( DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.NORM_DATE_PATTERN) + " 23:00:00", DatePattern.NORM_DATETIME_PATTERN ); } if (startDate.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1 || endDate.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1) { throw new JeecgBootException("未在有效下班打卡时间内,不能打卡!"); } //查询当前所选设备是否存在上班打卡记录 List equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA)); String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.PURE_DATE_PATTERN); List equipmentPunchList = this.list(new LambdaQueryWrapper() .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule()) .eq(MdcEquipmentPunch::getRecordDate, currentDate) .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList)); List list = Lists.newArrayList(); for (String equipmentId : equipmentIdList) { Optional mdcEquipmentPunchOptional = equipmentPunchList.stream() .filter(mdcEquipmentPunch1 -> mdcEquipmentPunch1.getEquipmentId().equals(equipmentId)) .findFirst(); MdcEquipmentPunch equipmentPunch = new MdcEquipmentPunch(); if (mdcEquipmentPunchOptional.isPresent()) { equipmentPunch = mdcEquipmentPunchOptional.get(); equipmentPunch.setIsAbsent(0); }else { equipmentPunch.setIsAbsent(1); equipmentPunch.setIsLate(0); equipmentPunch.setEquipmentId(equipmentId); equipmentPunch.setShiftSchedule(mdcEquipmentPunch.getShiftSchedule()); equipmentPunch.setPunchUser(userId); equipmentPunch.setRecordDate(currentDate); } equipmentPunch.setCheckOutTime(mdcEquipmentPunch.getCheckOutTime()); //下班打卡时间早于17:30/23:00则为早退 equipmentPunch.setIsEarly(checkOutTime.compareTo(mdcEquipmentPunch.getCheckOutTime()) == 1 ? 1 : 0); list.add(equipmentPunch); } this.saveOrUpdateBatch(list); } }