gaoluyang
2 天以前 000112976716cb6676e61b35e818481db8eb99a1
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -18,6 +18,8 @@
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.service.IProductService;
import com.ruoyi.basic.utils.FileUtil;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.SaleEnum;
@@ -106,6 +108,7 @@
    private final FileUtil fileUtil;
    private final AccountInvoiceApplicationMapper accountInvoiceApplicationMapper;
    private final AccountSalesCollectionMapper accountSalesCollectionMapper;
    private final IProductService productService;
    @Autowired
    private SysDeptMapper sysDeptMapper;
@@ -327,7 +330,7 @@
                    .in("customer_name", salesLedgerImportDtoList.stream()
                            .map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList()))
                    .and(wrapper -> wrapper.eq("type", 0)
                            .or(wrapper2 -> wrapper2.eq("type", 1).eq("is_assigned", 1)))
                            .or(wrapper2 -> wrapper2.eq("type", 1).eq("usage_status", 1)))
                    .and(wrapper -> wrapper.eq("usage_user", loginUserId)
                            .or(wrapper2 -> wrapper2.eq("create_user", loginUserId)
                                    .or(wrapper3 -> wrapper3.exists("select 1 from customer_user cu where cu.customer_id = customer.id and cu.user_id = " + loginUserId)))));
@@ -385,6 +388,7 @@
                salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
                        .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice)
                        .reduce(BigDecimal.ZERO, BigDecimal::add));
                salesLedger.setNetContractAmount(salesLedger.getContractAmount());
                salesLedgerMapper.insert(salesLedger);
@@ -590,7 +594,18 @@
            );
        }
        // 5. 保存销售台账附件
        // 5. 兜底:确保实际合同金额有初始值等于合同金额
        if (salesLedger.getNetContractAmount() == null) {
            SalesLedger dbLedger = salesLedgerMapper.selectById(salesLedger.getId());
            if (dbLedger != null && dbLedger.getNetContractAmount() == null && dbLedger.getContractAmount() != null) {
                SalesLedger updateEntity = new SalesLedger();
                updateEntity.setId(salesLedger.getId());
                updateEntity.setNetContractAmount(dbLedger.getContractAmount());
                salesLedgerMapper.updateById(updateEntity);
            }
        }
        // 6. 保存销售台账附件
        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.SALES_LEDGER, salesLedger.getId(), salesLedgerDto.getStorageBlobDTOs());
        return 1;
@@ -598,6 +613,13 @@
    @Override
    public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) {
        // 销售台账手工录入「品名+材质+规格型号」时,自动注册到产品维护
        if (SaleEnum.SALE.equals(type)) {
            for (SalesLedgerProduct product : products) {
                registerProductFromLedgerProduct(product);
            }
        }
        // 按ID分组,区分新增和更新的记录
        Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
                .peek(p -> p.setSalesLedgerId(salesLedgerId))
@@ -621,6 +643,28 @@
                // 添加生产数据
                salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
            }
        }
    }
    /**
     * 手工录入「品名+材质+规格型号」时,在产品维护自动注册:
     * 品名=一级大类,材质=大类下的子类,规格型号=子类下的规格
     */
    private void registerProductFromLedgerProduct(SalesLedgerProduct product) {
        String productName = StringUtils.trim(product.getProductCategory());
        String material = StringUtils.trim(product.getMaterial());
        String modelName = StringUtils.trim(product.getSpecificationModel());
        if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(material) || StringUtils.isEmpty(modelName)) {
            return;
        }
        product.setProductCategory(productName);
        product.setMaterial(material);
        product.setSpecificationModel(modelName);
        ProductModel productModel = productService.ensureProductHierarchy(productName, material, modelName, product.getUnit());
        if (productModel != null) {
            product.setProductId(productModel.getProductId());
            product.setProductModelId(productModel.getId());
        }
    }
@@ -728,6 +772,15 @@
            amountField.setAccessible(true);
            amountField.set(entity, totalAmount);
            // 实际合同金额初始值等于合同金额
            try {
                Field netAmountField = mainEntityClass.getDeclaredField("netContractAmount");
                netAmountField.setAccessible(true);
                netAmountField.set(entity, totalAmount);
            } catch (NoSuchFieldException ignored) {
                // 子类可能没有该字段,忽略
            }
            mainMapper.updateById(entity);
        } catch (Exception e) {
            throw new RuntimeException("动态更新主表金额失败", e);