yangys
2025-11-21 e8ed1a91c77ab62a924f12acd55777f227bacd7e
smart-man-boot/src/main/java/com/qianwen/smartman/modules/mdc/service/impl/WorkstationFeedbackServiceImpl.java
@@ -37,11 +37,11 @@
import com.qianwen.smartman.common.constant.ExtCacheConstant;
import com.qianwen.smartman.common.enums.GlobalWcsTypeEnum;
import com.qianwen.smartman.common.utils.Lambda;
import com.qianwen.smartman.modules.cps.entity.Employee;
import com.qianwen.smartman.modules.cps.entity.Workstation;
import com.qianwen.smartman.modules.cps.service.IEmployeeService;
import com.qianwen.smartman.modules.cps.service.IGlobalWcsService;
import com.qianwen.smartman.modules.cps.service.IWorkstationService;
import com.qianwen.smartman.modules.smis.entity.Employee;
import com.qianwen.smartman.modules.smis.entity.Workstation;
import com.qianwen.smartman.modules.smis.service.IEmployeeService;
import com.qianwen.smartman.modules.smis.service.IGlobalWcsService;
import com.qianwen.smartman.modules.smis.service.IWorkstationService;
import com.qianwen.smartman.modules.mdc.convert.StatusRecordConvert;
import com.qianwen.smartman.modules.mdc.dto.GroupFeedbackCacheDTO;
import com.qianwen.smartman.modules.mdc.dto.WorkstationEndAndStartImmediateFeedBackDTO;
@@ -130,16 +130,8 @@
    @Override 
    public WorkstationFeedback getImmediateFeedback(Serializable workstationId) {
       return getOne(Lambda.eq(WorkstationFeedback::getWorkstationId, workstationId)
               .eq(WorkstationFeedback::getFeedbackType, Integer.valueOf(FeedbackType.IMMEDIATE.getValue()))
               .eq(WorkstationFeedback::getFeedbackType, FeedbackType.IMMEDIATE.getValue())
               .isNull(WorkstationFeedback::getEndTime));
       /*
        return (WorkstationFeedback) getOne((Wrapper) ((ExtraLambdaQueryWrapper) Lambda.eq((v0) -> {
            return v0.getWorkstationId();
        }, workstationId).eq((v0) -> {
            return v0.getFeedbackType();
        }, Integer.valueOf(FeedbackType.IMMEDIATE.getValue()))).isNull((v0) -> {
            return v0.getEndTime();
        }));*/
    }
    @Override 
@@ -157,7 +149,7 @@
                    updateById(oldFeedback);
                }
                WorkstationFeedback addFeedback = new WorkstationFeedback();
                addFeedback.setWorkstationId(Long.valueOf(Long.parseLong(workstationId)));
                addFeedback.setWorkstationId(Long.parseLong(workstationId));
                addFeedback.setStartTime(now);
                addFeedback.setFeedbackTime(now);
                if (Func.isNotEmpty(dto.getFeedUser())) {
@@ -165,7 +157,7 @@
                } else {
                    addFeedback.setFeedUser(getEmployeeById().getId());
                }
                addFeedback.setFeedbackType(Integer.valueOf(FeedbackType.IMMEDIATE.getValue()));
                addFeedback.setFeedbackType(FeedbackType.IMMEDIATE.getValue());
                addFeedback.setStatus(FeedbackStatus.WAIT_SYNC.getValue());
                addFeedback.setRemark(dto.getDescription());
                addFeedback.setWcs(dto.getWcs());
@@ -188,28 +180,34 @@
            this.redisLockClient.lockFair(ExtCacheConstant.WORK_FEEDBACK.concat(":").concat(workstationId), 30L, 100L, () -> {
                existTimeOverImmediateFeedbackException(dto);
                WorkstationFeedback addFeedback = new WorkstationFeedback();
                addFeedback.setWorkstationId(Long.valueOf(Long.parseLong(workstationId)));
                addFeedback.setWorkstationId(Long.parseLong(workstationId));
                addFeedback.setStartTime(dto.getStartTime());
                addFeedback.setEndTime(dto.getEndTime());
                addFeedback.setFeedbackTime(new Date());
                if (Func.isNotEmpty(dto.getFeedUser())) {
                    addFeedback.setFeedUser(Long.valueOf(Long.parseLong(dto.getFeedUser())));
                    addFeedback.setEndFeedUser(Long.valueOf(Long.parseLong(dto.getFeedUser())));
                    addFeedback.setFeedUser(Long.parseLong(dto.getFeedUser()));
                    addFeedback.setEndFeedUser(Long.parseLong(dto.getFeedUser()));
                } else {
                    addFeedback.setFeedUser(getEmployeeById().getId());
                    addFeedback.setEndFeedUser(getEmployeeById().getId());
                }
                addFeedback.setFeedbackType(Integer.valueOf(FeedbackType.TIME_RANGE.getValue()));
                addFeedback.setFeedbackType(FeedbackType.TIME_RANGE.getValue());
                addFeedback.setStatus(FeedbackStatus.WAIT_SYNC.getValue());
                addFeedback.setRemark(dto.getDescription());
                addFeedback.setWcs(dto.getWcs());
                return Boolean.valueOf(save(addFeedback));
                return save(addFeedback);//保存到mysql
            });
        }
        evictFeedback(dto.getStartTime(), dto.getEndTime(), dto.getWorkstationIds());
        return true;
    }
    /**
     * 批量清除反馈的缓存,主要用于刷新前端的显示数据
     * @param startTime
     * @param endTime
     * @param workstationIds
     */
    private void evictFeedback(final Date startTime, final Date endTime, List<String> workstationIds) {
        LocalDate start = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate end = endTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
@@ -218,16 +216,26 @@
        });
    }
    private void evictFeedback(final LocalDate start, final LocalDate end, final Serializable workstationId) {
        long distance = ChronoUnit.DAYS.between(start, end);
    /**
     * 单个清楚缓存中的反馈,从catcheName=WORK_FEEDBACK_EXP3缓存中删除 实际key为 blade:feedback:group:feedback:list:blade:feedback#259200${workstationId}:yyyy-MM-dd HH:mm:ss
     * @param start
     * @param end
     * @param workstationId
     */
    private void evictFeedback(final LocalDate start, final LocalDate end, final String workstationId) {
        long distance = ChronoUnit.DAYS.between(start, end);//一共limit几天(就是取几个数)
        Stream.iterate(start, d -> {
            return d.plusDays(1L);
        }).limit(distance + 1).forEach(date -> {
            String key = String.valueOf(workstationId).concat(":").concat(Func.formatDate(date));
            String key = workstationId.concat(":").concat(Func.formatDate(date));
            CacheUtil.evict(IWorkstationFeedbackService.WORK_FEEDBACK_EXP3, GROUP_FEEDBACK_CACHE_KEY, key, false);
        });
    }
    /**
     * 检查是否有正在进行中的状态反馈
     * @param dto
     */
    private void existTimeOverImmediateFeedbackException(WorkstationNoImmediateFeedBackDTO dto) {
       if (dto.getWorkstationIds().stream().map(this.selfService::getImmediateFeedback).filter(Objects::nonNull).anyMatch(feedback -> 
        (dto.getStartTime().getTime() >= feedback.getStartTime().getTime() || dto.getEndTime().getTime() >= feedback.getStartTime().getTime())))
@@ -345,6 +353,7 @@
            t.setWcs(-1);
            return t;
        }).collect(Collectors.toList());
        String key = String.join(":", workstationId + "", statusTime.toString());
        if (statusTime.compareTo((ChronoLocalDate) LocalDate.now()) == 0) {
            List<StatusRecordVO> statusRecordVOList = groupStatusRecordWithFeedback(statusTime, workstationId, statusRecordList, cancelList);