package com.ruoyi.sales.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.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.other.service.impl.TempFileServiceImpl; import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper; import com.ruoyi.procurementrecord.pojo.ReturnManagement; import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct; import com.ruoyi.procurementrecord.service.impl.ReturnManagementServiceImpl; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.dto.ShippingInfoDto; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.ShippingInfoDetailMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.pojo.ShippingInfoDetail; import com.ruoyi.sales.service.ShippingInfoDetailService; import com.ruoyi.sales.service.ShippingInfoService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/10/22 9:33 */ @Service @Slf4j public class ShippingInfoServiceImpl extends ServiceImpl implements ShippingInfoService { @Autowired private ShippingInfoMapper shippingInfoMapper; @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; @Autowired private StockUtils stockUtils; @Autowired private CommonFileServiceImpl commonFileService; @Autowired private ApproveProcessServiceImpl approveProcessService; @Autowired private ShippingInfoDetailMapper shippingInfoDetailMapper; @Autowired private ShippingInfoDetailService shippingInfoDetailService; @Autowired private ReturnManagementMapper returnManagementMapper; @Autowired private ReturnSaleProductMapper returnSaleProductMapper; @Autowired private ReturnManagementServiceImpl returnManagementService; @Override public List getReturnManagementDtoById(Long shippingId) { return shippingInfoMapper.getReturnManagementDtoById(shippingId ); } /** * 获取销售产品单的已发货数量 */ @Override public Map getNumberOfSalesLedgerProduct(Long salesLedgerProductId) { Map map = new HashMap<>(); map.put("shippingNum",BigDecimal.ZERO); // 发货数量 map.put("returnNum",BigDecimal.ZERO); // 退货数量 List shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper() .eq(ShippingInfo::getSalesLedgerProductId, salesLedgerProductId) // 只筛选“发货中”和“已发货”两种状态 .in(ShippingInfo::getStatus, "发货中", "已发货")); if(CollectionUtils.isEmpty(shippingInfos)){ return map; } List shippingInfoDetails = shippingInfoDetailMapper.selectList(new LambdaQueryWrapper() .in(ShippingInfoDetail::getShippingInfoId, shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()))); if(CollectionUtils.isEmpty(shippingInfoDetails)){ return map; } // 获取发货数量 map.put("shippingNum",shippingInfoDetails.stream().map(ShippingInfoDetail::getShippingNum).reduce(BigDecimal.ZERO, BigDecimal::add)); // 获取退货数量 List returnSaleProducts = returnSaleProductMapper.selectList(new LambdaQueryWrapper() .eq(ReturnSaleProduct::getReturnSaleLedgerProductId, salesLedgerProductId) .eq(ReturnSaleProduct::getStatus,1)); if(CollectionUtils.isEmpty(returnSaleProducts)){ return map; } map.put("returnNum",returnSaleProducts.stream().map(ReturnSaleProduct::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)); return map; } @Override public ShippingInfoDto getDateil(Long id) { ShippingInfoDto shippingInfoDto = shippingInfoMapper.getDateil(id); if(shippingInfoDto != null){ assembleDetails(shippingInfoDto); } return shippingInfoDto; } @Override public List getShippingInfoByCustomerName(String customerName) { return shippingInfoMapper.getShippingInfoByCustomerName(customerName); } @Override public IPage listPage(Page page, ShippingInfo req) { IPage listPage = shippingInfoMapper.listPage(page, req); listPage.getRecords().forEach(this::assembleDetails); return listPage; } /** * 封装详情 * @param item */ public void assembleDetails(ShippingInfoDto item) { item.setCommonFileList(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.SHIP.getValue())); List shippingInfoDetails = shippingInfoDetailMapper.selectList(new LambdaQueryWrapper() .eq(ShippingInfoDetail::getShippingInfoId, item.getId())); // 核心优化:层层防护空指针 + 处理空集合场景 item.setShippingSuccessTotal(Optional.ofNullable(shippingInfoDetails) .orElse(Collections.emptyList()) .stream() .filter(Objects::nonNull) .map(ShippingInfoDetail::getShippingNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add)); // 用Lambda替代方法引用 item.setWaitShippingTotal(item.getShippingTotal().subtract(item.getShippingSuccessTotal())); // 查询退货数量 if(CollectionUtils.isNotEmpty(shippingInfoDetails)){ item.setReturnTotal(returnManagementService.getReturnSaleProductCountByShippingId(shippingInfoDetails .stream() .map(ShippingInfoDetail::getId) .collect(Collectors.toList()))); } } @Override public boolean deductStock(ShippingInfoDto req) throws IOException { ShippingInfo byId = this.getById(req.getId()); if (byId == null) { throw new RuntimeException("发货信息不存在"); } //扣减库存 SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId()); stockUtils.substractStock(salesLedgerProduct.getProductModelId(), req.getShippingTotal(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); byId.setExpressNumber(req.getExpressNumber()); byId.setExpressCompany(req.getExpressCompany()); byId.setStatus(req.getStatus()); byId.setShippingCarNumber(req.getShippingCarNumber()); return this.updateById(byId); } @Override public boolean delete(List ids) { List shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper() .in(ShippingInfo::getId, ids)); if(CollectionUtils.isEmpty(shippingInfos)) return false; // 删除子表 List shippingInfoDetails = shippingInfoDetailMapper.selectList(new LambdaQueryWrapper() .in(ShippingInfoDetail::getShippingInfoId, ids)); if(CollectionUtils.isNotEmpty(shippingInfoDetails)){ shippingInfoDetailService.delete(shippingInfoDetails.stream().map(ShippingInfoDetail::getId).collect(Collectors.toList())); } // 扣已发货库存 for (ShippingInfo shippingInfo : shippingInfos) { if("已发货".equals(shippingInfo.getStatus())) { stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode()); } } // 删除发货审批 if(CollectionUtils.isNotEmpty(shippingInfos)){ for (ShippingInfo shippingInfo : shippingInfos){ ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper() .like(ApproveProcess::getApproveReason, shippingInfo.getShippingNo())); if(one != null){ approveProcessService.delByIds(Collections.singletonList(one.getId())); } } } return this.removeBatchByIds(ids); } }