From 23855599412c4d61b38d78f0f3abd3430a48b5b1 Mon Sep 17 00:00:00 2001 From: zhangherong <571457620@qq.com> Date: 星期三, 25 六月 2025 11:51:38 +0800 Subject: [PATCH] Merge branch 'mdc_hyjs_master' --- lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 299 insertions(+), 0 deletions(-) diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java new file mode 100644 index 0000000..31517e7 --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentPunchServiceImpl.java @@ -0,0 +1,299 @@ +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.conditions.query.QueryWrapper; +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.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +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<MdcEquipmentPunchMapper, MdcEquipmentPunch> implements IMdcEquipmentPunchService { + @Resource + private MdcEquipmentPunchMapper mdcEquipmentPunchMapper; + @Resource + private IMdcEquipmentService mdcEquipmentService; + + /** + * 鏌ヨ褰撳墠鐧诲綍浜烘墍璐熻矗璁惧鎵撳崱鎯呭喌 + * @return + */ + @Override + public List<MdcEquipmentPunch> queryList() { + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = user.getId(); + List<String> 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<MdcEquipmentPunch> 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<String> equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA)); + String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.PURE_DATE_PATTERN); + + //鏃╃彮涓婄彮姝e父鏈�鏅氭墦鍗℃椂闂� + String checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 08:30:00"; + + //鏌ヨ褰撳墠璁惧銆佸綋鍓嶆墦鍗$被鍨嬫墦鍗¤褰� + List<MdcEquipmentPunch> equipmentPunchList = this.list(new LambdaQueryWrapper<MdcEquipmentPunch>() + .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule()) + .eq(MdcEquipmentPunch::getRecordDate, currentDate) + .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList)); + List<MdcEquipmentPunch> mdcEquipmentPunchList = equipmentPunchList.stream().filter(equipmentPunch -> Objects.nonNull(equipmentPunch.getCheckInTime())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(mdcEquipmentPunchList)) { + List<String> 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<MdcEquipmentPunch> list = Lists.newArrayList(); + + //鐗规畩澶勭悊鏅氱彮涓婄彮鍗� + if (mdcEquipmentPunch.getShiftSchedule() == 2) { + //鏅氱彮姝e父涓婄彮鍗℃渶鏅氭墦鍗℃椂闂� + checkInTime = DateUtils.format(mdcEquipmentPunch.getCheckInTime(), DatePattern.NORM_DATE_PATTERN) + " 17:00:00"; + } + + + for (String equipment : equipmentIdList) { + Optional<MdcEquipmentPunch> 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); + //姝e父鎵撳崱鏃跺厛灏嗘槸鍚︾己鍗$疆涓衡�滄槸鈥濓紝闃叉鏈墦涓嬬彮鍗℃椂鏃犳硶璋冩暣鐘舵�� + 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 + ); + //鏅氱彮姝e父涓嬬彮鏈�鏃╂墦鍗℃椂闂� + 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<String> equipmentIdList = Arrays.asList(mdcEquipmentPunch.getEquipmentId().split(StringPool.COMMA)); + String currentDate = DateUtils.format(mdcEquipmentPunch.getCheckOutTime(), DatePattern.PURE_DATE_PATTERN); + List<MdcEquipmentPunch> equipmentPunchList = this.list(new LambdaQueryWrapper<MdcEquipmentPunch>() + .eq(MdcEquipmentPunch::getShiftSchedule, mdcEquipmentPunch.getShiftSchedule()) + .eq(MdcEquipmentPunch::getRecordDate, currentDate) + .in(MdcEquipmentPunch::getEquipmentId, equipmentIdList)); + + List<MdcEquipmentPunch> list = Lists.newArrayList(); + + for (String equipmentId : equipmentIdList) { + Optional<MdcEquipmentPunch> 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); + } + + @Override + public void fillPunchRates(List<MdcEquipmentPunch> punchList) { + + // 鑾峰彇鏄ㄥぉ鏃ユ湡 + LocalDate yesterday = LocalDate.now().minusDays(1); + String yesterdayStr = yesterday.format(DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN)); // 鏍煎紡鍖栦负 "yyyy-MM-dd" + + + // 鑾峰彇鎬昏澶囨暟 + int totalDevices = mdcEquipmentPunchMapper.getTotalDeviceCount(); + if (totalDevices == 0) return; + + // 缁熻鍚勭被鍨嬫墦鍗′汉鏁� + int morningIn = mdcEquipmentPunchMapper.countMorningShiftIn(yesterdayStr); + int eveningIn = mdcEquipmentPunchMapper.countEveningShiftIn(yesterdayStr); + int morningOut = mdcEquipmentPunchMapper.countMorningShiftOut(yesterdayStr); + int eveningOut = mdcEquipmentPunchMapper.countEveningShiftOut(yesterdayStr); + + + // 璁剧疆鎵撳崱鐜囧埌姣忎釜 DTO + for (MdcEquipmentPunch dto : punchList) { + dto.setMorningShiftInRate(calculateRate(morningIn, totalDevices)); + dto.setEveningShiftInRate(calculateRate(eveningIn, totalDevices)); + dto.setMorningShiftOutRate(calculateRate(morningOut, totalDevices)); + dto.setEveningShiftOutRate(calculateRate(eveningOut, totalDevices)); + + // 璁剧疆鎵撳崱璁惧鏁伴噺瀛楁 + dto.setMorningShiftInDeviceNum(morningIn); + dto.setMorningShiftOutDeviceNum(morningOut); + dto.setEveningShiftInDeviceNum(eveningIn); + dto.setEveningShiftOutDeviceNum(eveningOut); + dto.setDeviceCountNum(totalDevices); + } + } + + // 璁$畻鐧惧垎姣斿苟淇濈暀涓や綅灏忔暟 + private BigDecimal calculateRate(int actual, int total) { + if (total == 0) return BigDecimal.ZERO; + return new BigDecimal(actual) + .divide(new BigDecimal(total), 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)) + .setScale(2, RoundingMode.HALF_UP); // 淇濈暀涓や綅灏忔暟 + } + + @Override + public List<MdcEquipmentPunch> getYesterdayRecords(String targetDate) { + // 鏋勯�犳煡璇㈡潯浠讹細record_date = targetDate.toString() + QueryWrapper<MdcEquipmentPunch> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("record_date", targetDate); + + // 鎵ц鏌ヨ骞惰繑鍥炵粨鏋� + return baseMapper.selectList(queryWrapper); + } + +} -- Gitblit v1.9.3