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; @@ -47,8 +49,9 @@ @AllArgsConstructor @Service @Transactional(rollbackFor = Exception.class) public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService { public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService { private final StockUtils stockUtils; private QualityInspectMapper qualityInspectMapper; private IQualityInspectParamService qualityInspectParamService; @@ -64,7 +67,7 @@ @Override public int add(QualityInspectDto qualityInspectDto) { QualityInspect qualityInspect = new QualityInspect(); BeanUtils.copyProperties(qualityInspectDto,qualityInspect); BeanUtils.copyProperties(qualityInspectDto, qualityInspect); qualityInspect.setInspectState(0);//默认未提交 qualityInspectMapper.insert(qualityInspect); for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) { @@ -79,7 +82,7 @@ QualityInspect qualityInspect = qualityInspectMapper.selectById(id); List<QualityInspectParam> qualityInspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id)); QualityInspectDto qualityInspectDto = new QualityInspectDto(); BeanUtils.copyProperties(qualityInspect,qualityInspectDto); BeanUtils.copyProperties(qualityInspect, qualityInspectDto); qualityInspectDto.setQualityInspectParams(qualityInspectParams); return qualityInspectDto; } @@ -89,96 +92,18 @@ public int submit(QualityInspect inspect) { QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId()); /*判断不合格*/ if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("不合格")){ if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("不合格")) { QualityUnqualified qualityUnqualified = new QualityUnqualified(); BeanUtils.copyProperties(qualityInspect,qualityUnqualified); BeanUtils.copyProperties(qualityInspect, qualityUnqualified); qualityUnqualified.setInspectState(0);//待处理 List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId())); String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(",")); qualityUnqualified.setDefectivePhenomena(text+"这些指标中存在不合格");//不合格现象 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); } } else { //合格直接入库 stockUtils.addStock(inspect.getProductModelId(), inspect.getQuantity(), StockRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), inspect.getId()); } qualityInspect.setInspectState(1);//已提交 return qualityInspectMapper.updateById(qualityInspect); @@ -188,16 +113,16 @@ @Override public void down(HttpServletResponse response, QualityInspect qualityInspect) { QualityInspect inspect = qualityInspectMapper.selectById(qualityInspect.getId()); String inspectType=""; switch (inspect.getInspectType()){ String inspectType = ""; switch (inspect.getInspectType()) { case 0: inspectType="原材料检验"; inspectType = "原材料检验"; break; case 1: inspectType="过程检验"; inspectType = "过程检验"; break; case 2: inspectType="出厂检验"; inspectType = "出厂检验"; break; } List<QualityInspectParam> paramList = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId())); @@ -239,31 +164,31 @@ @Override public int updateQualityInspect(QualityInspectDto qualityInspectDto) { if (ObjectUtils.isNotNull(qualityInspectDto.getQualityInspectParams())) { qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId,qualityInspectDto.getId())); qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspectDto.getId())); for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) { qualityInspectParam.setInspectId(qualityInspectDto.getId()); } qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams()); } QualityInspect qualityInspect = new QualityInspect(); BeanUtils.copyProperties(qualityInspectDto,qualityInspect); BeanUtils.copyProperties(qualityInspectDto, qualityInspect); return qualityInspectMapper.updateById(qualityInspect); } @Override public IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect) { return qualityInspectMapper.qualityInspectListPage(page,qualityInspect); return qualityInspectMapper.qualityInspectListPage(page, qualityInspect); } @Override public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) { List<QualityInspect> qualityInspects =qualityInspectMapper.qualityInspectExport(qualityInspect); List<QualityInspect> qualityInspects = qualityInspectMapper.qualityInspectExport(qualityInspect); ExcelUtil<QualityInspect> util = new ExcelUtil<QualityInspect>(QualityInspect.class); switch (qualityInspect.getInspectType()){ switch (qualityInspect.getInspectType()) { case 0: util.exportExcel(response, qualityInspects, "原材料检验导出"); break; case 1: case 1: util.exportExcel(response, qualityInspects, "过程检验导出"); break; case 2: 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; @@ -33,8 +37,9 @@ @AllArgsConstructor @Service public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified> implements IQualityUnqualifiedService { public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified> implements IQualityUnqualifiedService { private final StockUtils stockUtils; private QualityUnqualifiedMapper qualityUnqualifiedMapper; private IQualityInspectService qualityInspectService; private ProductOrderService productOrderService; @@ -42,16 +47,16 @@ private ProductProcessRouteMapper productProcessRouteMapper; private ProductProcessRouteItemMapper productProcessRouteItemMapper; private ProductWorkOrderMapper productWorkOrderMapper; private StockUninventoryService stockUninventoryService; @Override public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { return qualityUnqualifiedMapper.qualityUnqualifiedListPage(page,qualityUnqualified); return qualityUnqualifiedMapper.qualityUnqualifiedListPage(page, qualityUnqualified); } @Override public void qualityUnqualifiedExport(HttpServletResponse response, QualityUnqualified qualityUnqualified) { List<QualityUnqualified> qualityUnqualifieds =qualityUnqualifiedMapper.qualityUnqualifiedExport(qualityUnqualified); List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.qualityUnqualifiedExport(qualityUnqualified); ExcelUtil<QualityUnqualified> util = new ExcelUtil<QualityUnqualified>(QualityUnqualified.class); util.exportExcel(response, qualityUnqualifieds, "不合格管理导出"); } @@ -64,7 +69,7 @@ case "返修": case "返工": //判断质检表是否有相关的报工id,如果有报工id,那么返工需要重新创建生产订单重新生产 if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())){ if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) { //返工需要重新创建生产订单重新生产 ProductOrder productOrder = productionProductMainMapper.getOrderByMainId(qualityInspect.getProductMainId()); ProductOrder order = new ProductOrder(); @@ -76,7 +81,7 @@ order.setEndTime(null); productOrderService.save(order); //新增生产订单下的工艺路线主表 ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectList(Wrappers.<ProductProcessRoute>lambdaQuery().eq(ProductProcessRoute::getProductOrderId,productOrder.getId()).orderByDesc(ProductProcessRoute::getId)).get(0); ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectList(Wrappers.<ProductProcessRoute>lambdaQuery().eq(ProductProcessRoute::getProductOrderId, productOrder.getId()).orderByDesc(ProductProcessRoute::getId)).get(0); ProductProcessRoute newProcessRoute = new ProductProcessRoute(); BeanUtils.copyProperties(productProcessRoute, newProcessRoute); newProcessRoute.setId(null); @@ -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}