¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | |
| | | //æ©çä¸çæ£å¸¸æææå¡æ¶é´ |
| | | 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) { |
| | | //æçæ£å¸¸ä¸ç塿ææå¡æ¶é´ |
| | | 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); |
| | | //æ£å¸¸æå¡æ¶å
å°æ¯å¦ç¼ºå¡ç½®ä¸ºâæ¯âï¼é²æ¢æªæä¸ç塿¶æ æ³è°æ´ç¶æ |
| | | 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<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); |
| | | } |
| | | |
| | | } |