src/main/java/com/ruoyi/common/enums/StockRecordTypeEnum.java
@@ -15,7 +15,10 @@ PURCHASE_STOCK_IN(7, "采购-入库"), SALE_STOCK_OUT(8, "销售-出库"), CUSTOMIZATION_UNSTOCK_IN(9, "不合格自定义入库"), CUSTOMIZATION_UNSTOCK_OUT(10, "不合格自定义出库"); CUSTOMIZATION_UNSTOCK_OUT(10, "不合格自定义出库"), QUALITYINSPECT_STOCK_IN(11, "质检-合格入库"), QUALITYINSPECT_UNSTOCK_IN(12, "质检-不合格入库"); private final Integer code; private final String value; src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -1,16 +1,21 @@ package com.ruoyi.procurementrecord.utils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.pojo.StockInRecord; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.stock.service.StockInventoryService; import com.ruoyi.stock.service.StockUninventoryService; import com.ruoyi.stock.service.impl.StockInRecordServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -21,6 +26,7 @@ private final ProcurementRecordMapper procurementRecordMapper; private final StockUninventoryService stockUninventoryService; private final StockInventoryService stockInventoryService; private final StockInRecordService stockInRecordService; // 获取商品入库数量,出库数量,剩余库存 public Map<String, BigDecimal> getStockQuantity(Long productModelId) { @@ -100,4 +106,13 @@ stockInventoryDto.setProductModelId(productModelId); stockInventoryService.subtractStockInventory(stockInventoryDto); } //不合格库存删除 public void deleteStockRecord(Long recordId, Integer recordType) { StockInRecord one = stockInRecordService.getOne(new QueryWrapper<StockInRecord>() .lambda().eq(StockInRecord::getRecordId, recordId) .eq(StockInRecord::getRecordType, recordType)); stockInRecordService.batchDelete(Collections.singletonList(one.getId())); } } src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -13,6 +13,7 @@ import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.common.enums.StockRecordTypeEnum; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; @@ -272,6 +273,9 @@ salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting); } //如果报废数量>0,需要进入报废的库存 if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); } return true; } @@ -318,6 +322,8 @@ .eq(ProcurementRecordOut::getSalesLedgerProductId, productionProductMain.getId())); productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())); //删除报废的入库记录 stockUtils.deleteStockRecord(productionProductMain.getId(), StockRecordTypeEnum.PRODUCTION_SCRAP.getCode()); // 删除主表 productionProductMainMapper.deleteById(productionProductMain.getId()); return true; src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.ruoyi.common.enums.StockRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.SecurityUtils; @@ -17,6 +18,7 @@ import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; @@ -49,6 +51,7 @@ @Transactional(rollbackFor = Exception.class) public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService { private final StockUtils stockUtils; private QualityInspectMapper qualityInspectMapper; private IQualityInspectParamService qualityInspectParamService; @@ -98,87 +101,9 @@ qualityUnqualified.setDefectivePhenomena(text+"这些指标中存在不合格");//不合格现象 qualityUnqualified.setInspectId(qualityInspect.getId()); qualityUnqualifiedMapper.insert(qualityUnqualified); } LoginUser loginUser = SecurityUtils.getLoginUser(); if (qualityInspect.getInspectType() == 0) { if ("合格".equals(qualityInspect.getCheckResult())) { ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(1); procurementRecordOutAdd.setTypeName("采购原材料检验合格入库"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); procurementRecordOutAdd.setPurchaseLedgerId(Math.toIntExact(qualityInspect.getPurchaseLedgerId())); if (qualityInspect.getPurchaseLedgerId() == null) { throw new BaseException("请选择采购单"); } SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(qualityInspect.getProductId()); ArrayList<Details> detailss = new ArrayList<>(); Details details = new Details(); details.setId(Math.toIntExact(salesLedgerProduct.getId())); details.setInboundQuantity(qualityInspect.getQuantity()); details.setWarnNum(salesLedgerProduct.getWarnNum()); details.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice()); details.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice()); details.setProductModelId(qualityInspect.getProductModelId()); detailss.add( details); procurementRecordOutAdd.setDetails(detailss); procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId()); procurementRecordService.add(procurementRecordOutAdd); } }else if (qualityInspect.getInspectType() == 1) { //查询UnitPrice/TotalPrice ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("生产过程检验合格入库"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); details1.setInboundQuantity(qualityInspect.getQuantity()); details1.setProductModelId(qualityInspect.getProductModelId()); procurementRecordOutAdd.setDetails(details); ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder() .salesLedgerProductId(0) .inboundBatches( "生产半成品入库") .inboundNum(details1.getInboundQuantity()) .type(2) .warnNum(new BigDecimal(0)) .unitPrice(new BigDecimal(0)) .totalPrice(new BigDecimal(0)) .createTime(LocalDateTime.now()) .createUser(loginUser.getUserId()) .updateTime(LocalDateTime.now()) .updateUser(loginUser.getUserId()) .createBy(procurementRecordOutAdd.getNickName()) .productModelId(details1.getProductModelId()) .qualityInspectId(qualityInspect.getId()); procurementRecordService.save(procurementRecordBuilder.build()); }else if (qualityInspect.getInspectType() == 2) { //查询UnitPrice/TotalPrice if (ObjectUtils.isNull(qualityInspect.getProductMainId())){ //如果是手动新增的出厂检 }else { SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectSalesLedgerProductByMainId(qualityInspect.getProductMainId()); ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("生产出厂检验合格入库"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); details1.setInboundQuantity(qualityInspect.getQuantity()); details1.setId(Math.toIntExact(salesLedgerProduct.getId())); details1.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice()); details1.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice()); details1.setProductModelId(salesLedgerProduct.getProductModelId()); details.add(details1); procurementRecordOutAdd.setDetails(details); procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId()); procurementRecordService.add(procurementRecordOutAdd); } //合格直接入库 stockUtils.addStock(inspect.getProductModelId(), inspect.getQuantity(), StockRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), inspect.getId()); } qualityInspect.setInspectState(1);//已提交 return qualityInspectMapper.updateById(qualityInspect); src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockRecordTypeEnum; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.mapper.ProductProcessRouteItemMapper; import com.ruoyi.production.mapper.ProductProcessRouteMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; @@ -22,6 +24,8 @@ import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.quality.service.IQualityUnqualifiedService; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.service.StockUninventoryService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -35,6 +39,7 @@ @Service public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified> implements IQualityUnqualifiedService { private final StockUtils stockUtils; private QualityUnqualifiedMapper qualityUnqualifiedMapper; private IQualityInspectService qualityInspectService; private ProductOrderService productOrderService; @@ -42,7 +47,7 @@ private ProductProcessRouteMapper productProcessRouteMapper; private ProductProcessRouteItemMapper productProcessRouteItemMapper; private ProductWorkOrderMapper productWorkOrderMapper; private StockUninventoryService stockUninventoryService; @Override public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { @@ -125,9 +130,12 @@ } break; case "报废": //调用不合格库存接口 入不合格库 stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockRecordTypeEnum.DEFECTIVE_SCRAP.getCode(),unqualified.getId()); break; case "让步放行": //调用提交合格的接口 stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockRecordTypeEnum.DEFECTIVE_PASS.getCode(),unqualified.getId()); qualityInspect.setCheckResult("合格"); qualityInspectService.submit(qualityInspect); break; src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -28,10 +28,10 @@ @ApiModelProperty(value = "入库数量") private BigDecimal stockInNum; @ApiModelProperty(value = "记录类型 采购入库/生产入库/质量入库/自定义入库") @ApiModelProperty(value = "记录类型 枚举") private String recordType; @ApiModelProperty(value = "记录ID salesProductId/ProductrMainId/qualityInspectId/0") @ApiModelProperty(value = "记录ID ") private Long recordId; @ApiModelProperty(value = "产品规格ID") src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -62,4 +62,7 @@ @ApiModelProperty("预警数量") private Integer warnNum; @ApiModelProperty("备注") private String remark; } src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -46,4 +46,7 @@ @ApiModelProperty("版本号") private Integer version; @ApiModelProperty("备注") private String remark; } src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -72,6 +72,7 @@ newStockInventory.setProductModelId(stockInventoryDto.getProductModelId()); newStockInventory.setQualitity(stockInventoryDto.getQualitity()); newStockInventory.setVersion(1); newStockInventory.setRemark(stockInventoryDto.getRemark()); stockInventoryMapper.insert(newStockInventory); }else { stockInventoryMapper.updateAddStockInventory(stockInventoryDto); src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -58,6 +58,7 @@ newStockUnInventory.setProductModelId(stockUninventoryDto.getProductModelId()); newStockUnInventory.setQualitity(stockUninventoryDto.getQualitity()); newStockUnInventory.setVersion(1); newStockUnInventory.setRemark(stockUninventoryDto.getRemark()); stockUninventoryMapper.insert(newStockUnInventory); }else { stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto); src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -23,6 +23,9 @@ <if test="params.type != null and params.type != ''"> and sir.type = #{params.type} </if> <if test="params.recordType != null and params.recordType != ''"> and sir.record_type = #{params.recordType} </if> </where> order by sir.id desc </select> src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -22,6 +22,9 @@ <if test="ew.version != null"> version = version + 1, </if> <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId} @@ -35,6 +38,9 @@ <if test="ew.version != null"> version = version + 1, </if> <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity} src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -38,6 +38,9 @@ <if test="params.type != null and params.type != ''"> and sor.type = #{params.type} </if> <if test="params.recordType != null and params.recordType != ''"> and sor.record_type = #{params.recordType} </if> </where> order by sor.id desc </select> src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -20,6 +20,9 @@ <if test="ew.version != null"> version = version + 1, </if> <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity} @@ -33,6 +36,9 @@ <if test="ew.version != null"> version = version + 1, </if> <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId}