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