package com.qianwen.smartman.modules.mdc.service.impl; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qianwen.core.cache.utils.CacheUtil; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.tool.utils.Func; import com.qianwen.smartman.common.constant.ExtCacheConstant; import com.qianwen.smartman.common.utils.ExtraLambdaQueryWrapper; import com.qianwen.smartman.common.utils.Lambda; import com.qianwen.smartman.modules.mdc.dto.WorkstationNoImmediateFeedBackDTO; import com.qianwen.smartman.modules.mdc.entity.WorkstationFeedback; import com.qianwen.smartman.modules.mdc.entity.WorkstationFeedbackDetail; import com.qianwen.smartman.modules.mdc.enums.FeedbackDetailStatus; import com.qianwen.smartman.modules.mdc.enums.FeedbackStatus; import com.qianwen.smartman.modules.mdc.mapper.WorkstationFeedbackDetailMapper; import com.qianwen.smartman.modules.mdc.service.IWorkstationFeedbackDetailService; import com.qianwen.smartman.modules.mdc.service.IWorkstationFeedbackService; @Service public class WorkstationFeedbackDetailServiceImpl extends ServiceImpl implements IWorkstationFeedbackDetailService { private final IWorkstationFeedbackService workstationFeedbackService; public WorkstationFeedbackDetailServiceImpl(final IWorkstationFeedbackService workstationFeedbackService) { this.workstationFeedbackService = workstationFeedbackService; } @Override public List cancelFeedback(final LocalDate queryDate, final Long workstationId) { //在接口上,该方法已经被缓存到了redis(具体键值请查看接口方法注解),刚刚添加完数据是不会访问这个方法内部执行查询的,刚添加完返回也不会有WorkstationFeedbackDetail数据 return list(Lambda.eq(WorkstationFeedbackDetail::getWorkstationId, workstationId) .dayBetween(queryDate, WorkstationFeedbackDetail::getStartTime, WorkstationFeedbackDetail::getEndTime) .eq(WorkstationFeedbackDetail::getCancel, true).orderByDesc(WorkstationFeedbackDetail::getStartTime)); /* return list((Wrapper) ((ExtraLambdaQueryWrapper) Lambda.eq((v0) -> { return v0.getWorkstationId(); }, workstationId).dayBetween(queryDate, (v0) -> { return v0.getStartTime(); }, (v0) -> { return v0.getEndTime(); }).eq((v0) -> { return v0.getCancel(); }, true)).orderByDesc((v0) -> { return v0.getStartTime(); }));*/ } @Override @Transactional public boolean cancelWorkstationFeedbacks(final List ids) { List detailList = new ArrayList<>(); boolean match = ids.stream().map(this::getById).peek(detailList::add).map(WorkstationFeedbackDetail::getFeedbackId).map(this.workstationFeedbackService::getById).map(WorkstationFeedback::getStatus).allMatch(FeedbackStatus.SYNCED.getValue()::equals); //final boolean match = ids.stream().map((Function)this::getById).peek(detailList::add).map((Function)WorkstationFeedbackDetail::getFeedbackId).map((Function)this.workstationFeedbackService::getById).map((Function)WorkstationFeedback::getStatus).allMatch(FeedbackStatus.SYNCED.getValue()::equals); if (match) { detailList.forEach(detail -> { //workstationFeedbackService.lambdaUpdate().se this.workstationFeedbackService.lambdaUpdate().set(WorkstationFeedback::getStatus, FeedbackStatus.WAIT_SYNC.getValue()) .eq(WorkstationFeedback::getId, detail.getFeedbackId()).update(); //this.workstationFeedbackService.lambdaUpdate().set(WorkstationFeedback::getStatus, (Object)FeedbackStatus.WAIT_SYNC.getValue())).eq((Object)WorkstationFeedback::getId, (Object)detail.getFeedbackId())).update(); detail.setCancel(true); detail.setCancelTime(new Date()); this.updateById(detail); }); this.evictCancelFeedback(detailList); return true; } /* Stream map = ids.stream().map((v1) -> { return getById(v1); }); detailList.getClass(); Stream map2 = map.peek((v1) -> { r1.add(v1); }).map((v0) -> { return v0.getFeedbackId(); }); IWorkstationFeedbackService iWorkstationFeedbackService = this.workstationFeedbackService; iWorkstationFeedbackService.getClass(); Stream map3 = map2.map((v1) -> { return r1.getById(v1); }).map((v0) -> { return v0.getStatus(); }); Integer value = FeedbackStatus.SYNCED.getValue(); value.getClass(); boolean match = map3.allMatch((v1) -> { return r1.equals(v1); }); if (match) { detailList.forEach(detail -> { ((LambdaUpdateChainWrapper) ((LambdaUpdateChainWrapper) this.workstationFeedbackService.lambdaUpdate().set((v0) -> { return v0.getStatus(); }, FeedbackStatus.WAIT_SYNC.getValue())).eq((v0) -> { return v0.getId(); }, detail.getFeedbackId())).update(); detail.setCancel(true); detail.setCancelTime(new Date()); updateById(detail); }); evictCancelFeedback(detailList); return true; }*/ throw new ServiceException("存在反馈未完成不允许操作"); } private void evictCancelFeedback(final List detailList) { detailList.forEach(feedback -> { LocalDate start = LocalDate.from((TemporalAccessor) feedback.getStartTime().toInstant().atZone(ZoneId.systemDefault())); LocalDate end = LocalDate.from((TemporalAccessor) feedback.getEndTime().toInstant().atZone(ZoneId.systemDefault())); long distance = ChronoUnit.DAYS.between(start, end); Stream.iterate(start, d -> { return d.plusDays(1L); }).limit(distance + 1).forEach(date -> { String key = String.valueOf(feedback.getWorkstationId()).concat(":").concat(Func.formatDate(date)); CacheUtil.evict(ExtCacheConstant.WORK_FEEDBACK_DETAIL, "list:cancel:workstationId:", key, false); }); }); } @Override public long toDayHaveFeedbackCount(final Long workstationId) { return count(todayConditionWrapper(workstationId)); } private Wrapper todayConditionWrapper(final Long workstationId) { return Lambda.create() .dayBetween(LocalDate.now(), WorkstationFeedbackDetail::getStartTime, WorkstationFeedbackDetail::getStartTime) .eq(WorkstationFeedbackDetail::getWorkstationId, workstationId) .orderByDesc(WorkstationFeedbackDetail::getStartTime) .eq(WorkstationFeedbackDetail::getCancel, Boolean.valueOf(false)) .eq(WorkstationFeedbackDetail::getStatus, Integer.valueOf(FeedbackDetailStatus.EFFECTED.getValue())); /* return (Wrapper) ((ExtraLambdaQueryWrapper) ((ExtraLambdaQueryWrapper) ((ExtraLambdaQueryWrapper) Lambda.create().dayBetween(LocalDate.now(), (v0) -> { return v0.getStartTime(); }, (v0) -> { return v0.getStartTime(); }).eq((v0) -> { return v0.getWorkstationId(); }, workstationId)).orderByDesc((v0) -> { return v0.getStartTime(); })).eq((v0) -> { return v0.getCancel(); }, false)).eq((v0) -> { return v0.getStatus(); }, Integer.valueOf(FeedbackDetailStatus.EFFECTED.getValue()));*/ } @Override public List todayFeedback(final Long workstationId) { List list = list(todayConditionWrapper(workstationId)); return list; } @Override public WorkstationFeedbackDetail latestFeedbackByWorkstationId(Long workstationId) { return this.baseMapper.latestFeedbackByWorkstationId(Lambda.eq(WorkstationFeedbackDetail::getWorkstationId, workstationId) .eq(WorkstationFeedbackDetail::getStatus, Integer.valueOf(FeedbackDetailStatus.EFFECTED.getValue()))); /* return ((WorkstationFeedbackDetailMapper) this.baseMapper).latestFeedbackByWorkstationId((Wrapper) Lambda.eq((v0) -> { return v0.getWorkstationId(); }, workstationId).eq((v0) -> { return v0.getStatus(); }, Integer.valueOf(FeedbackDetailStatus.EFFECTED.getValue())));*/ } @Override public boolean overwriteFeedbackCheck(final WorkstationNoImmediateFeedBackDTO noImmediateFeedBackDTO) { /*; return noImmediateFeedBackDTO.getWorkstationIds().stream(). anyMatch(workstationId -> ((Boolean)Optional.ofNullable(this.baseMapper.overwriteFeedbackCheck(Lambda.eq(WorkstationFeedbackDetail::getWorkstationId, workstationId).ne(WorkstationFeedbackDetail::getCancel, true)).ne(WorkstationFeedbackDetail::getStatus, Integer.valueOf(FeedbackDetailStatus.DELETE.getValue()))).nested(()))).map(()).orElse(Boolean.valueOf(false))).booleanValue()); */ //FeedbackDetailStatus.DELETE.getValue() return noImmediateFeedBackDTO.getWorkstationIds().stream().anyMatch(workstationId -> { return Optional.ofNullable(this.baseMapper.overwriteFeedbackCheck(Lambda.eq(WorkstationFeedbackDetail::getWorkstationId, workstationId) .ne(WorkstationFeedbackDetail::getCancel, true) .ne(WorkstationFeedbackDetail::getStatus,FeedbackDetailStatus.DELETE.getValue()) .nested(w -> { ExtraLambdaQueryWrapper extraLambdaQueryWrapper = w.apply("{0} between start_time and end_time", new Object[]{noImmediateFeedBackDTO.getStartTime()}).or().apply("{0} between start_time and end_time", new Object[]{noImmediateFeedBackDTO.getEndTime()}); }))).map(feedback -> { return feedback.getEndTime().compareTo(noImmediateFeedBackDTO.getStartTime()) != 0; }).orElse(false).booleanValue(); }); } }