package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; import com.ruoyi.production.dto.ProcessSchedulingDto; import com.ruoyi.production.dto.ProductionDispatchAddDto; import com.ruoyi.production.dto.SalesLedgerSchedulingDto; import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto; import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper; import com.ruoyi.production.mapper.SalesLedgerWorkMapper; import com.ruoyi.production.pojo.SalesLedgerScheduling; import com.ruoyi.production.pojo.SalesLedgerWork; import com.ruoyi.production.service.SalesLedgerSchedulingService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/7/21 14:41 */ @Service @RequiredArgsConstructor @Slf4j public class SalesLedgerSchedulingServiceImpl extends ServiceImpl implements SalesLedgerSchedulingService { private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper; private final SalesLedgerWorkMapper salesLedgerWorkMapper; @Override public IPage listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) { IPage list = salesLedgerSchedulingMapper.listPage(page, salesLedgerSchedulingDto); if(list.getTotal() == 0){ return list; } Set collect = list.getRecords().stream().map(SalesLedgerSchedulingDto::getSalesLedgerProductId).collect(Collectors.toSet()); LambdaQueryWrapper salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect) .ne(SalesLedgerWork::getStatus, 1); List salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper); list.getRecords().forEach(i -> { // 获取完成数量 i.setSuccessNum(salesLedgerWorks .stream() .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId())) .map(SalesLedgerWork::getFinishedNum) .reduce(BigDecimal.ZERO, BigDecimal::add)); }); return list; } @Override public void export(HttpServletResponse response) { List list = salesLedgerSchedulingMapper.list(); if(CollectionUtils.isEmpty(list)){ throw new RuntimeException("无导出数据"); } Set collect = list.stream().map(SalesLedgerSchedulingDto::getSalesLedgerProductId).collect(Collectors.toSet()); LambdaQueryWrapper salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect) .ne(SalesLedgerWork::getStatus, 1); List salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper); list.forEach(i -> { // 获取完成数量 i.setSuccessNum(salesLedgerWorks .stream() .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId())) .map(SalesLedgerWork::getFinishedNum) .reduce(BigDecimal.ZERO, BigDecimal::add)); }); ExcelUtil util = new ExcelUtil<>(SalesLedgerSchedulingDto.class); util.exportExcel(response, list, "生产订单"); } private final SysUserMapper sysUserMapper; @Override public int productionDispatch(ProductionDispatchAddDto productionDispatchAddDto) { SysUser sysUser = sysUserMapper.selectUserById(productionDispatchAddDto.getSchedulingUserId()); if(sysUser == null) throw new RuntimeException("排产人不存在"); SalesLedgerScheduling salesLedgerScheduling = SalesLedgerScheduling.builder() .salesLedgerId(productionDispatchAddDto.getSalesLedgerId()) .salesLedgerProductId(productionDispatchAddDto.getSalesLedgerProductId()) .schedulingUserId(productionDispatchAddDto.getSchedulingUserId()) .schedulingUserName(sysUser.getNickName()) .schedulingNum(productionDispatchAddDto.getSchedulingNum()) .schedulingDate(LocalDate.parse(productionDispatchAddDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)) .status(1) .build(); return salesLedgerSchedulingMapper.insert(salesLedgerScheduling); } @Override public IPage listPageProcess(Page page, SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto) { IPage list = salesLedgerSchedulingMapper.listPageProcess(page, salesLedgerSchedulingDto); Set collect = list.getRecords().stream().map(SalesLedgerSchedulingProcessDto::getSalesLedgerProductId).collect(Collectors.toSet()); LambdaQueryWrapper salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect) .ne(SalesLedgerWork::getStatus, 1); List salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper); list.getRecords().forEach(i -> { // 获取完成数量 i.setSuccessNum(salesLedgerWorks .stream() .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId())) .map(SalesLedgerWork::getFinishedNum) .reduce(BigDecimal.ZERO, BigDecimal::add)); }); return list; } @Override public int productionDispatchDelete(List ids) { LambdaQueryWrapper salesLedgerSchedulingLambdaQueryWrapper = new LambdaQueryWrapper(); salesLedgerSchedulingLambdaQueryWrapper.in(SalesLedgerScheduling::getId, ids); List salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(salesLedgerSchedulingLambdaQueryWrapper); if(CollectionUtils.isEmpty(salesLedgerSchedulings)) throw new RuntimeException("排产不存在"); List collect = salesLedgerSchedulings.stream().filter(i -> !i.getStatus().equals(1)).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(collect)) throw new RuntimeException("排产已开始,请勿删除"); salesLedgerSchedulingMapper.deleteBatchIds(ids); return 0; } @Override public int processScheduling(List processSchedulingDtos) { for (ProcessSchedulingDto processSchedulingDto : processSchedulingDtos) { SalesLedgerScheduling salesLedgerScheduling = salesLedgerSchedulingMapper.selectById(processSchedulingDto.getId()); if(salesLedgerScheduling == null) throw new RuntimeException("排产不存在"); if(salesLedgerScheduling.getStatus().equals(3)) throw new RuntimeException("排产已完成,请勿重复排产"); SysUser sysUser = sysUserMapper.selectUserById(processSchedulingDto.getSchedulingUserId()); if(sysUser == null) throw new RuntimeException("排产人不存在"); salesLedgerScheduling.setFinishedNum(salesLedgerScheduling.getFinishedNum().add(processSchedulingDto.getSchedulingNum())); if(salesLedgerScheduling.getSchedulingNum().compareTo(salesLedgerScheduling.getFinishedNum()) <= 0){ salesLedgerScheduling.setStatus(3); }else{ salesLedgerScheduling.setStatus(2); } salesLedgerSchedulingMapper.updateById(salesLedgerScheduling); SalesLedgerWork.SalesLedgerWorkBuilder salesLedgerWorkBuilder = SalesLedgerWork.builder() .salesLedgerSchedulingId(salesLedgerScheduling.getId()) .salesLedgerId(salesLedgerScheduling.getSalesLedgerId()) .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId()) .schedulingUserId(salesLedgerScheduling.getSchedulingUserId()) .schedulingUserName(sysUser.getNickName()) .schedulingNum(processSchedulingDto.getSchedulingNum()) .workHours(processSchedulingDto.getWorkHours()) .process(processSchedulingDto.getProcess()) .status(1) .schedulingDate(LocalDate.parse(processSchedulingDto.getSchedulingDate(), DateTimeFormatter.ISO_LOCAL_DATE)); salesLedgerWorkMapper.insert(salesLedgerWorkBuilder.build()); } return 0; } }