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.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.procurementrecord.bean.vo.ShippingProductVo; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.dto.ShippingApproveDto; import com.ruoyi.sales.dto.ShippingInfoDto; import com.ruoyi.sales.dto.ShippingProductDetailDto; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.mapper.ShippingProductDetailMapper; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.pojo.ShippingProductDetail; import com.ruoyi.sales.service.ShippingInfoService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import java.util.List; /** * @author :yys * @date : 2025/10/22 9:33 */ @Service @Slf4j @RequiredArgsConstructor public class ShippingInfoServiceImpl extends ServiceImpl implements ShippingInfoService { private final ShippingInfoMapper shippingInfoMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final StockUtils stockUtils; private final CommonFileServiceImpl commonFileService; private final ApproveProcessServiceImpl approveProcessService; private final FileUtil fileUtil; private final ShippingProductDetailMapper shippingProductDetailMapper; @Override public IPage listPage(Page page, ShippingInfo req) { IPage listPage = shippingInfoMapper.listPage(page, req); listPage.getRecords().forEach(item -> { item.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, item.getId())); }); return listPage; } @Override public boolean deductStock(ShippingInfoDto req) { ShippingInfo byId = this.getById(req.getId()); if (byId == null) { throw new RuntimeException("发货信息不存在"); } //扣减库存 if (!"已发货".equals(byId.getStatus())) { List shippingProductDetails = shippingProductDetailMapper.selectList(new LambdaQueryWrapper().eq(ShippingProductDetail::getShippingInfoId, req.getId())); if (CollectionUtils.isEmpty(shippingProductDetails)) { throw new RuntimeException("发货信息不存在"); } for (ShippingProductDetail shippingProductDetail : shippingProductDetails) { stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo()); } } byId.setExpressNumber(req.getExpressNumber()); byId.setExpressCompany(req.getExpressCompany()); byId.setStatus("已发货"); byId.setShippingCarNumber(req.getShippingCarNumber()); byId.setShippingDate(req.getShippingDate()); boolean update = this.updateById(byId); // 保存文件 fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs()); return update; } @Override public boolean delete(List ids) { List shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper() .in(ShippingInfo::getId, ids)); if (CollectionUtils.isEmpty(shippingInfos)) return false; // 删除附件 commonFileService.deleteByBusinessIds(ids, FileNameType.SHIP.getValue()); // 扣已发货库存 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) { List one = approveProcessService.list(new LambdaQueryWrapper() .like(ApproveProcess::getApproveReason, shippingInfo.getShippingNo())); if (one != null) { List list = one.stream().map(ApproveProcess::getId).toList(); approveProcessService.delByIds(list); } } } //删除发货明细 shippingProductDetailMapper.delete(new LambdaQueryWrapper().in(ShippingProductDetail::getShippingInfoId, ids)); return this.removeByIds(ids); } @Override public List getReturnManagementDtoById(Long shippingId) { return shippingInfoMapper.getReturnManagementDtoById(shippingId); } @Override public List getShippingInfoByCustomerName(String customerName) { return shippingInfoMapper.getShippingInfoByCustomerName(customerName); } @Override public boolean add(ShippingInfoDto req) { this.save(req); req.getBatchNoDetailList().forEach(item -> item.setShippingInfoId(req.getId())); shippingProductDetailMapper.insert(req.getBatchNoDetailList()); for (ShippingProductDetail shippingProductDetail : req.getBatchNoDetailList()) { stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo()); } // 保存文件 fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs()); return true; } @Override public List getDetail(Long id) { return shippingProductDetailMapper.getDetail(id); } @Override public ShippingApproveDto getDateilByShippingNo(String shippingNo) { ShippingApproveDto shippingApproveDto = new ShippingApproveDto(); ShippingInfo shippingInfo = new ShippingInfo(); shippingInfo.setShippingNo(shippingNo); shippingApproveDto.setShippingInfo(shippingInfoMapper.listPage(new Page(1, -1), shippingInfo).getRecords().get(0)); List dateilByShippingNo = shippingProductDetailMapper.getDateilByShippingNo(shippingNo); shippingApproveDto.setShippingProductDetailDtoList(dateilByShippingNo); return shippingApproveDto; } }