5 天以前 67de53af3d78d28eda960037f39646b6886a9ee8
yys
1.生产修改物料投入逻辑
已修改14个文件
208 ■■■■ 文件已修改
src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductStructureRecordController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductStructureRecordMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductStructureRecord.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductStructureRecordService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductStructureRecordMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductInputMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductOutputMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -6,7 +6,7 @@
@Getter
public enum StockOutQualifiedRecordTypeEnum implements BaseEnum<String> {
    CUSTOMIZATION_STOCK_OUT("1", "合格自定义出库"),
    PRODUCTION_REPORT_STOCK_OUT("3", "生产报工-出库"),
    PRODUCTION_REPORT_STOCK_OUT("3", "生产订单领料-出库"),
    SALE_STOCK_OUT("8", "销售-出库"),
    SALE_SHIP_STOCK_OUT("13", "销售-发货出库");
src/main/java/com/ruoyi/production/controller/ProductStructureRecordController.java
@@ -1,7 +1,21 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.pojo.ProductStructureRecord;
import com.ruoyi.production.pojo.ProductionProductInput;
import com.ruoyi.production.service.ProductStructureRecordService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * <p>
@@ -15,4 +29,22 @@
@RequestMapping("/productStructureRecord")
public class ProductStructureRecordController {
    @Autowired
    private ProductStructureRecordService productStructureRecordService;
    @ApiOperation("分页查询生产订单-物料清单表")
    @RequestMapping("/listPage")
    public AjaxResult listPage(Page page, ProductStructureRecord productStructureRecord) {
        return AjaxResult.success(productStructureRecordService.listPage(page,productStructureRecord));
    }
    @ApiOperation("领料")
    @PostMapping("/pick")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "领料", businessType = BusinessType.INSERT)
    public AjaxResult pick(@RequestBody List<ProductionProductInput> productionProductInput) {
        return AjaxResult.success(productStructureRecordService.pick(productionProductInput));
    }
}
src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -21,5 +21,5 @@
     */
    List<ProductStructureDto> listBybomId(@Param("bomId") Integer bomId,@Param("isParent") boolean isParent);
    List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Integer bomId, @Param("processId") Long processId);
    List<ProductStructureDto> listBybomAndProcess(@Param("processId") Long processId);
}
src/main/java/com/ruoyi/production/mapper/ProductStructureRecordMapper.java
@@ -1,8 +1,12 @@
package com.ruoyi.production.mapper;
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.ruoyi.production.pojo.ProductStructureRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
@@ -15,4 +19,5 @@
@Mapper
public interface ProductStructureRecordMapper extends BaseMapper<ProductStructureRecord> {
    IPage<ProductStructureRecord> listPage(Page page,@Param("req") ProductStructureRecord productStructureRecord);
}
src/main/java/com/ruoyi/production/pojo/ProductStructureRecord.java
@@ -37,6 +37,14 @@
    @ApiModelProperty("产品id")
    private Long productModelId;
    @ApiModelProperty("产品名称")
    @TableField(exist = false)
    private String productName;
    @ApiModelProperty("图纸编号")
    @TableField(exist = false)
    private String model;
    @ApiModelProperty("生产订单id")
    private Long productOrderId;
@@ -49,6 +57,9 @@
    @ApiModelProperty("需求数量")
    private BigDecimal demandedQuantity;
    @ApiModelProperty("已领料数量")
    private BigDecimal completedQuantity;
    @ApiModelProperty("单位")
    private String unit;
src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -14,8 +14,11 @@
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "报工id")
    private Long productMainId;
    @ApiModelProperty(value = "订单id")
    private Long productOrderId;
    @ApiModelProperty(value = "物理清单id")
    private Long productStructureRecordId;
    @ApiModelProperty(value = "产品id")
    private Long productModelId;
src/main/java/com/ruoyi/production/service/ProductStructureRecordService.java
@@ -1,7 +1,12 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.pojo.ProductStructureRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.pojo.ProductionProductInput;
import java.util.List;
/**
 * <p>
@@ -13,4 +18,7 @@
 */
public interface ProductStructureRecordService extends IService<ProductStructureRecord> {
    IPage<ProductStructureRecord> listPage(Page page, ProductStructureRecord productStructureRecord);
    String pick(List<ProductionProductInput> productionProductInput);
}
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -33,6 +33,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -197,14 +198,14 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean delete(Long[] ids) {
    public Boolean delete(Long[] idList) {
        //批量查询productOrder
        List<ProductOrder> productOrders = productOrderMapper.selectList(
                new LambdaQueryWrapper<ProductOrder>()
                        .in(ProductOrder::getId, ids)
                        .in(ProductOrder::getId, Arrays.asList(idList))
        );
        if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
            List<Long> ids = productOrders.stream().map(ProductOrder::getId).collect(Collectors.toList());
            // 批量查询processRouteItems
            List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
@@ -239,8 +240,8 @@
                    // 删除产出表、投入表数据
                    if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
                        productionProductOutputMapper.deleteByProductMainIds(productMainIds);
                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
                        productionProductOutputMapper.deleteByProductMainIds(ids);
                        productionProductInputMapper.deleteByProductMainIds(ids);
                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
                                new LambdaQueryWrapper<QualityInspect>()
                                        .in(QualityInspect::getProductMainId, productMainIds)
@@ -283,7 +284,7 @@
            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                    .in(ProductOrder::getId, ids));
            // 删除附件
            commonFileService.deleteByBusinessIds(Arrays.asList(ids), FileNameType.PRODUCT_ORDER.getValue());
            commonFileService.deleteByBusinessIds(ids, FileNameType.PRODUCT_ORDER.getValue());
            // 删除生产订单-物料清单
            productStructureRecordMapper.delete(new LambdaQueryWrapper<ProductStructureRecord>()
                    .in(ProductStructureRecord::getProductOrderId, ids));
src/main/java/com/ruoyi/production/service/impl/ProductStructureRecordServiceImpl.java
@@ -1,10 +1,25 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProductStructureMapper;
import com.ruoyi.production.mapper.ProductionProductInputMapper;
import com.ruoyi.production.pojo.ProductStructureRecord;
import com.ruoyi.production.mapper.ProductStructureRecordMapper;
import com.ruoyi.production.pojo.ProductionProductInput;
import com.ruoyi.production.service.ProductStructureRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
@@ -17,4 +32,38 @@
@Service
public class ProductStructureRecordServiceImpl extends ServiceImpl<ProductStructureRecordMapper, ProductStructureRecord> implements ProductStructureRecordService {
    @Autowired
    private ProductStructureRecordMapper productStructureRecordMapper;
    @Autowired
    private ProductStructureMapper productStructureMapper;
    @Autowired
    private StockUtils stockUtils;
    @Autowired
    private ProductionProductInputMapper productionProductInputMapper;
    @Override
    public IPage<ProductStructureRecord> listPage(Page page, ProductStructureRecord productStructureRecord) {
        return productStructureRecordMapper.listPage(page,productStructureRecord);
    }
    @Override
    public String pick(List<ProductionProductInput> productionProductInputs) {
        if (CollectionUtils.isEmpty(productionProductInputs)) {
            return "请选择要领的料";
        }
        for (ProductionProductInput productionProductInput : productionProductInputs) {
            productionProductInputMapper.insert(productionProductInput);
            stockUtils.substractStock(productionProductInput.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductInput.getProductOrderId());
            // 扣除物料清单
            ProductStructureRecord productStructureRecord = productStructureRecordMapper.selectById(productionProductInput.getProductStructureRecordId());
            if(productStructureRecord != null){
                productStructureRecord.setCompletedQuantity(productStructureRecord.getCompletedQuantity().add(productionProductInput.getQuantity()));
                productStructureRecordMapper.updateById(productStructureRecord);
            }
        }
        return "领料成功";
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -145,25 +145,25 @@
        productionProductMain.setWorkOrderId(dto.getWorkOrderId());
        productionProductMain.setStatus(0);
        productionProductMainMapper.insert(productionProductMain);
        /*新增报工投入表*/
        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
        if (productStructureDtos.size() == 0) {
            //如果该工序没有产品结构的投入品,那这个投入品和产出品是同一个
            ProductStructureDto productStructureDto = new ProductStructureDto();
            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
            productStructureDto.setUnitQuantity(BigDecimal.ONE);
            productStructureDtos.add(productStructureDto);
        }
        for (ProductStructureDto productStructureDto : productStructureDtos) {
            ProductionProductInput productionProductInput = new ProductionProductInput();
            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
            productionProductInput.setQuantity(dto.getQuantity());
            productionProductInput.setProductMainId(productionProductMain.getId());
            productionProductInputMapper.insert(productionProductInput);
            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
        }
        /*新增报工投入表(逻辑改为手动领料)*/
//        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcess.getId());
//        if (productStructureDtos.size() == 0) {
//            //如果该工序没有产品结构的投入品,那这个投入品和产出品是同一个
//            ProductStructureDto productStructureDto = new ProductStructureDto();
//            productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
//            productStructureDto.setUnitQuantity(BigDecimal.ONE);
//            productStructureDtos.add(productStructureDto);
//        }
//        for (ProductStructureDto productStructureDto : productStructureDtos) {
//
//            ProductionProductInput productionProductInput = new ProductionProductInput();
//            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
//            productionProductInput.setQuantity(dto.getQuantity());
//            productionProductInput.setProductMainId(productionProductMain.getId());
//            productionProductInputMapper.insert(productionProductInput);
//            stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
//
//        }
        /*新增报工产出表*/
        ProductionProductOutput productionProductOutput = new ProductionProductOutput();
        productionProductOutput.setProductMainId(productionProductMain.getId());
@@ -332,8 +332,8 @@
        productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
        //删除投入记录
        productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
//        productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
//                .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
        //删除报废的入库记录
        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
        //删除不需要质检的合格入库
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,6 +6,7 @@
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.common.enums.FileNameType;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.framework.web.domain.R;
@@ -66,8 +67,11 @@
    private SalesLedgerMapper salesLedgerMapper;
    private PurchaseLedgerMapper purchaseLedgerMapper;
    private ProductStructureRecordMapper productStructureRecordMapper;
    private ProductOrderMapper productOrderMapper;
    private CommonFileServiceImpl commonFileService;
    private ProcessRouteItemMapper processRouteItemMapper;
@@ -384,8 +388,8 @@
                    // 删除产出表、投入表数据
                    if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) {
                        productionProductOutputMapper.deleteByProductMainIds(productMainIds);
                        productionProductInputMapper.deleteByProductMainIds(productMainIds);
                        productionProductOutputMapper.deleteByProductMainIds(orderIds);
                        productionProductInputMapper.deleteByProductMainIds(orderIds);
                        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
                                new LambdaQueryWrapper<QualityInspect>()
                                        .in(QualityInspect::getProductMainId, productMainIds)
@@ -427,6 +431,11 @@
            // 批量删除productOrder
            productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
                    .in(ProductOrder::getSaleLedgerProductId, productIds));
            // 删除附件
            commonFileService.deleteByBusinessIds(productIds, FileNameType.PRODUCT_ORDER.getValue());
            // 删除生产订单-物料清单
            productStructureRecordMapper.delete(new LambdaQueryWrapper<ProductStructureRecord>()
                    .in(ProductStructureRecord::getProductOrderId, productIds));
        }
    }
src/main/resources/mapper/production/ProductStructureRecordMapper.xml
@@ -15,5 +15,18 @@
        <result column="tenant_id" property="tenantId" />
        <result column="bom_id" property="bomId" />
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.production.pojo.ProductStructureRecord">
        select psr.*,
               pm.model,
               p.product_name
            from product_structure_record psr
        left join product_model pm on pm.id = psr.product_model_id
        left join product p on p.id = pm.product_id
        <where>
            <if test="req.productOrderId != null">
                and psr.product_order_id = #{req.productOrderId}
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -13,18 +13,17 @@
    <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.dto.ProductionProductInputDto">
        select ppi.*,
        pm.model as model,
        ppm.product_no as productNo,
        p.product_name,
        pm.drawing_number,
        pm.unit
        from
        production_product_input ppi
        left join production_product_main ppm on ppm.id = ppi.product_main_id
        left join product_order ppm on ppm.id = ppi.product_order_id
        left join product_model pm on pm.id = ppi.product_model_id
        left join product p on p.id = pm.product_id
        <where>
            <if test="c.productMainId != null and c.productMainId > 0">
                and ppm.id = #{c.productMainId}
            <if test="c.productOrderId != null and c.productOrderId > 0">
                and ppm.id = #{c.productOrderId}
            </if>
        </where>
        order by ppi.id
@@ -32,7 +31,7 @@
    <delete id="deleteByProductMainIds" parameterType="java.util.List">
        DELETE FROM production_product_input
        WHERE product_main_id IN
        WHERE product_order_id IN
        <foreach collection="productMainIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
src/main/resources/mapper/production/ProductionProductOutputMapper.xml
@@ -30,7 +30,7 @@
    <delete id="deleteByProductMainIds" parameterType="java.util.List">
        DELETE FROM production_product_output
        WHERE product_main_id IN
        WHERE product_order_id IN
        <foreach collection="productMainIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>