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>