chenhj
2 天以前 663120b055dfdced4a67ce1d4160ae8ca19b4190
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,11 +5,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
@@ -21,14 +20,13 @@
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
@@ -73,6 +71,8 @@
    private ProductionProductOutputMapper productionProductOutputMapper;
    private ProductionProductInputMapper productionProductInputMapper;
    private QualityInspectMapper qualityInspectMapper;
    private ProductBomMapper productBomMapper;
    private ProductStructureMapper productStructureMapper;
    @Override
    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -216,18 +216,18 @@
        Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
        if (salesLedgerProduct.getId() == null) {
            result = salesLedgerProductMapper.insert(salesLedgerProduct);
            addProductionData(salesLedgerProduct);
//            addProductionData(salesLedgerProduct,2);
        } else {
            //查询原本的产品型号id
            salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
            result = salesLedgerProductMapper.updateById(salesLedgerProduct);
            /*删除对应的生产数据并重新新增*/
            deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
            // 删除生产核算数据
            LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
            reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId);
            salesLedgerProductionAccountingMapper.delete(reportWrapper);
            addProductionData(salesLedgerProduct);
//            deleteProductionData(Arrays.asList(salesLedgerProduct.getId()));
//            // 删除生产核算数据
//            LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>();
//            reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId);
//            salesLedgerProductionAccountingMapper.delete(reportWrapper);
//            addProductionData(salesLedgerProduct,2);
        }
        // 如果插入或更新成功,并且有 salesLedgerId,才继续更新主表金额
@@ -262,6 +262,8 @@
    /**
     * 新增生产数据
     * @param salesLedgerProduct
     * @param type 1=生产 2=销售
     */
    @Transactional(rollbackFor = Exception.class)
    public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
@@ -284,6 +286,13 @@
                .orderByDesc(ProcessRoute::getCreateTime));
        if (processRoutes.size()>0){
            ProcessRoute processRoute = processRoutes.get(0);
            // 获取产品bom信息
            List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId());
            if (salesLedgerProduct.getQuantity() == null) {
                throw new RuntimeException("最终生产数量不存在");
            }
            Map<Long, BigDecimal> quantities = countWorkOrderNum(productStructureDtos, salesLedgerProduct.getQuantity());
            //新增生产订单工艺路线主表
            ProductProcessRoute productProcessRoute = new ProductProcessRoute();
            productProcessRoute.setProductModelId(processRoute.getProductModelId());
@@ -329,7 +338,7 @@
                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                    productWorkOrder.setProductOrderId(productOrder.getId());
                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                    productWorkOrder.setPlanQuantity(quantities.get(processRouteItem.getProcessId()));
                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
                    productWorkOrder.setStatus(1);
@@ -343,6 +352,29 @@
    }
    /**
     * 计算工单数量
     * productStructures bom信息
     * quantity 需求数量
     */
    public Map<Long, BigDecimal> countWorkOrderNum(List<ProductStructureDto> productStructures, BigDecimal quantity) {
        BigDecimal originalQuantity = quantity;
        Map<Long, BigDecimal> resultMap = new HashMap<>();
        resultMap.put(productStructures.get(productStructures.size() - 1).getProcessId(), quantity);
        for (int i = productStructures.size() - 2; i >= 0; i--) {
            ProductStructureDto productStructureDto = productStructures.get(i);
            Assert.notNull(productStructureDto.getUnitQuantity(), "单位产出所需数量不存在");
            if (productStructureDto.getMaterialType().equals("0")) {
                quantity = quantity.multiply(productStructureDto.getUnitQuantity());
                resultMap.put(productStructureDto.getProcessId(), quantity);
            } else {
                resultMap.put(productStructureDto.getProcessId(), originalQuantity.multiply(productStructureDto.getUnitQuantity()));
            }
        }
        return resultMap;
    }
    /**
     * 删除生产数据
     */
    public void deleteProductionData(List<Long> productIds) {