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.utils.StockUtils; import com.ruoyi.sales.dto.SalesLedgerProductDto; 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())){ // SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId()); 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()); return true; } @Override public List getDetail(Long id) { return shippingProductDetailMapper.getDetail(id); } }