8 小时以前 7bf754a7835d06f26240c4ca15bc5f83650de377
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -25,6 +25,7 @@
import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedger;
@@ -58,6 +59,16 @@
    private ShippingInfoMapper shippingInfoMapper;
    private SalesLedgerMapper salesLedgerMapper;
    /**
     * 入库类别:代储入库。只有这个类别要求绑定销售订单
     */
    private static final String INBOUND_CATEGORY_DEPOSIT = "代储入库";
    /**
     * 销售台账的销售类型:代储。代储入库只能绑这个类型的台账
     */
    private static final String LEDGER_TYPE_DEPOSIT = "代储";
    @Override
    public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
        return stockInRecordMapper.listPage(page, stockInRecordDto);
@@ -67,6 +78,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int add(StockInRecordDto stockInRecordDto) {
        resolveDepositSalesLedger(stockInRecordDto);
        LocalDateTime createTime = stockInRecordDto.getCreateTime();
        if (createTime == null) {
            createTime = LocalDateTime.now();
@@ -79,6 +91,38 @@
        return stockInRecordMapper.insert(stockInRecord);
    }
    /**
     * 代储入库(inboundCategory=代储入库)必须绑定一张「代储」类型的销售台账(销售订单)。
     * 只做校验与落库,**不用台账覆盖**入库单上的客户/油库/储罐 —— 那几项仍以现场填写为准。
     * 非代储入库不绑台账,即使前端传了也置空,避免落下无意义的关联。
     */
    private void resolveDepositSalesLedger(StockInRecordDto stockInRecordDto) {
        if (!INBOUND_CATEGORY_DEPOSIT.equals(stockInRecordDto.getInboundCategory())) {
            stockInRecordDto.setSalesLedgerId(null);
            return;
        }
        Long salesLedgerId = stockInRecordDto.getSalesLedgerId();
        if (salesLedgerId == null) {
            throw new BaseException("代储入库必须绑定销售订单");
        }
        SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId);
        if (salesLedger == null) {
            throw new BaseException("所选销售订单不存在,销售订单id:" + salesLedgerId);
        }
        if (!LEDGER_TYPE_DEPOSIT.equals(salesLedger.getLedgerType())) {
            throw new BaseException("代储入库只能绑定代储类型的销售订单,销售合同号:" + salesLedger.getSalesContractNo());
        }
    }
    @Override
    public IPage<SalesLedger> listBindableSalesLedger(Page page, SalesLedgerDto salesLedgerDto) {
        // 该查询用 /*data_scope*/ 跳过数据权限,而 MP 默认会把 count 语句优化成「SELECT COUNT(*) FROM sales_ledger
        // WHERE ...」,优化后标记丢失,count 反而被追加权限条件,total 会比实际记录少。关掉 count 优化后
        // count 退化成「SELECT COUNT(*) FROM (原句) TOTAL」,标记原样保留
        page.setOptimizeCountSql(false);
        return stockInRecordMapper.bindableSalesLedgerPage(page, salesLedgerDto);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int update(Long id, StockInRecordDto stockInRecordDto) {