src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -54,7 +54,7 @@ @Excel(name = "客户名称") private String customerName; private String salesLedgerProductId; private Long salesLedgerProductId; /** * 出入库数量 @@ -120,6 +120,11 @@ */ @Excel(name = "产品大类") private String productCategory; /** * 产品id */ @Excel(name = "产品id") private Long productId; /** * 规格型号 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -131,6 +131,11 @@ */ @Excel(name = "产品大类") private String productCategory; /** * 产品id */ @Excel(name = "产品id") private Long productId; /** * 规格型号 src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
@@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductProcessRouteItemDto; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcessRouteItem; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductProcessRouteItemService; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedger; @@ -43,6 +42,16 @@ private ProductWorkOrderMapper productWorkOrderMapper; private SalesLedgerProductMapper salesLedgerProductMapper; private ProductionProductMainMapper productionProductMainMapper; private ProductionProductInputMapper productionProductInputMapper; private ProductionProductOutputMapper productionProductOutputMapper; private QualityInspectMapper qualityInspectMapper; private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; @GetMapping("list") @ApiOperation("根据Id查询工艺项目") @@ -130,22 +139,70 @@ @ApiOperation("删除生产工艺路线") @Transactional(rollbackFor = Exception.class) public R deleteRouteItem(@RequestBody ProductProcessRouteItemDto processRouteItemDto) { if (processRouteItemDto == null || processRouteItemDto.getId() == null) { return R.fail("参数错误,ID不能为空"); return R.fail("删除失败:工艺路线项ID不能为空"); } Long routeItemId = processRouteItemDto.getId(); try { // 先删除关联的工单数据 LambdaQueryWrapper<ProductWorkOrder> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ProductWorkOrder::getProductProcessRouteItemId, processRouteItemDto.getId()); productWorkOrderMapper.delete(wrapper); // 查询工单 ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectOne( new LambdaQueryWrapper<ProductWorkOrder>() .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId) .last("LIMIT 1") ); if (productWorkOrder == null) { return R.fail("删除失败:未找到关联的生产工单"); } Long workOrderId = productWorkOrder.getId(); Long productOrderId = productWorkOrder.getProductOrderId(); // 查询生产主表 List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .eq(ProductionProductMain::getWorkOrderId, workOrderId) ); if (!productionProductMains.isEmpty()) { // 批量删除子表 for (ProductionProductMain main : productionProductMains) { Long mainId = main.getId(); // 删除投入 productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() .eq(ProductionProductInput::getProductMainId, mainId)); // 删除产出 productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() .eq(ProductionProductOutput::getProductMainId, mainId)); // 删除质检 qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getProductMainId, mainId)); } } // 删除报工(生产主表) productionProductMainMapper.delete(new LambdaQueryWrapper<ProductionProductMain>() .eq(ProductionProductMain::getWorkOrderId, workOrderId)); // 查询订单 + 删除核算 ProductOrder productOrder = productOrderMapper.selectById(productOrderId); if (productOrder != null && productOrder.getSalesLedgerId() != null) { salesLedgerProductionAccountingMapper.delete(new LambdaQueryWrapper<SalesLedgerProductionAccounting>() .eq(SalesLedgerProductionAccounting::getSalesLedgerId, productOrder.getSalesLedgerId())); } // 删除关联工单 productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .eq(ProductWorkOrder::getProductProcessRouteItemId, routeItemId)); // 删除主表数据 productProcessRouteItemService.removeById(processRouteItemDto.getId()); boolean removeFlag = productProcessRouteItemService.removeById(routeItemId); if (!removeFlag) { return R.fail("删除失败:工艺路线项主表数据不存在"); } return R.ok(); } catch (Exception e) { throw new RuntimeException("删除失败:" + e.getMessage()); return R.fail("删除生产工艺路线失败:" + e.getMessage()); } } } src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -185,7 +185,7 @@ for (ProductStructureDto productStructureDto : productStructureDtos) { ProductionProductInput productionProductInput = new ProductionProductInput(); productionProductInput.setProductModelId(productStructureDto.getProductModelId()); productionProductInput.setQuantity(productStructureDto.getUnitQuantity()); productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())); productionProductInput.setProductMainId(productionProductMain.getId()); productionProductInputMapper.insert(productionProductInput); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -236,7 +236,7 @@ qualityInspect.setInspectType(0); qualityInspect.setSupplier(purchaseLedger.getSupplierName()); qualityInspect.setPurchaseLedgerId(purchaseLedger.getId()); qualityInspect.setProductId(saleProduct.getProductId()); qualityInspect.setProductId(saleProduct.getId()); qualityInspect.setProductName(saleProduct.getProductCategory()); qualityInspect.setModel(saleProduct.getSpecificationModel()); qualityInspect.setUnit(saleProduct.getUnit()); src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -144,6 +144,7 @@ * 报工id */ private Long productMainId; //不合格现象 private String defectivePhenomena; } src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -11,7 +11,12 @@ import com.deepoove.poi.config.Configure; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.procurementrecord.dto.Details; import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; @@ -23,6 +28,8 @@ import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; @@ -37,6 +44,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -53,6 +61,10 @@ private QualityTestStandardMapper qualityTestStandardMapper; private QualityUnqualifiedMapper qualityUnqualifiedMapper; private SalesLedgerProductMapper salesLedgerProductMapper; private ProcurementRecordService procurementRecordService; @Override public int add(QualityInspectDto qualityInspectDto) { @@ -91,6 +103,50 @@ qualityUnqualified.setDefectivePhenomena(text+"这些指标中存在不合格");//不合格现象 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(qualityInspect.getProductId())); details.setInboundQuantity(qualityInspect.getQuantity()); details.setWarnNum(salesLedgerProduct.getWarnNum()); details.setUnitPrice(salesLedgerProduct.getTaxInclusiveUnitPrice()); details.setTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice()); detailss.add( details); procurementRecordOutAdd.setDetails(detailss); procurementRecordService.add(procurementRecordOutAdd); } }else if (qualityInspect.getInspectType() == 1) { }else if (qualityInspect.getInspectType() == 2) { //查询UnitPrice/TotalPrice 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()); details.add(details1); procurementRecordOutAdd.setDetails(details); procurementRecordService.add(procurementRecordOutAdd); } qualityInspect.setInspectState(1);//已提交 return qualityInspectMapper.updateById(qualityInspect); } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -2,7 +2,12 @@ import javax.servlet.http.HttpServletResponse; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +38,8 @@ { @Autowired private ISalesLedgerProductService salesLedgerProductService; @Autowired private ProcurementRecordService procurementRecordService; /** * 查询产品信息列表 */ @@ -41,6 +47,17 @@ public AjaxResult list(SalesLedgerProduct salesLedgerProduct) { List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct); list.forEach(item -> { ProcurementPageDto procurementDto = new ProcurementPageDto(); procurementDto.setSalesLedgerProductId(item.getId()); procurementDto.setProductCategory(item.getProductCategory()); IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto); ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0); if(item.getQuantity().compareTo(procurementDtoCopy.getInboundNum0())>=0){ item.setApproveStatus(1); salesLedgerProductService.addOrUpdateSalesLedgerProduct(item); } }); return AjaxResult.success(list); } src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -6,6 +6,10 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.dto.ProcurementAddDto; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; import com.ruoyi.sales.mapper.ShipmentApprovalMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; @@ -21,6 +25,8 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @RestController @@ -35,6 +41,8 @@ @Autowired private ISalesLedgerProductService salesLedgerProductService; @Autowired private ProcurementRecordOutService procurementRecordOutService; @GetMapping("/listPage") @ApiOperation("发货审批列表") @@ -58,6 +66,18 @@ SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(shipmentApproval.getSalesLedgerProductId()); salesLedgerProduct.setApproveStatus(req.getApproveStatus()); salesLedgerProductService.updateById(salesLedgerProduct); if(req.getApproveStatus()==3){ //发货审批通过,生产该订单出库记录 ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd(); procurementRecordOutAdd.setSalesLedgerProductId(Math.toIntExact(salesLedgerProduct.getId())); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId())); procurementRecordOutAdd.setQuantity(String.valueOf(salesLedgerProduct.getQuantity())); //获取当前时间 LocalDateTime now = LocalDateTime.now(); procurementRecordOutAdd.setTime(now.toString()); procurementRecordOutService.stockout(procurementRecordOutAdd); } } return update ? AjaxResult.success() : AjaxResult.error(); } src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -14,4 +14,7 @@ */ public interface SalesLedgerProductMapper extends MyBaseMapper<SalesLedgerProduct> { List<SalesLedgerProduct> selectSalesLedgerProductList(@Param("salesLedgerProduct") SalesLedgerProduct salesLedgerProduct); SalesLedgerProduct selectSalesLedgerProductByMainId(@Param("productMainId") Long productMainId); } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -200,13 +200,13 @@ @JsonFormat(pattern = "yyyy-MM-dd") private Date shippingDate; @TableField(exist = false) @ApiModelProperty(value = "生产状态") private String productionStatus = "未开始"; // @TableField(exist = false) // @ApiModelProperty(value = "生产状态") // private String productionStatus = "未开始"; /** * 发货审批状态 */ // @TableField(exist = false) @ApiModelProperty(value = "审批状态") @ApiModelProperty(value = "审批状态:0未生产,1已生产,2待审核(审核中),3审核完成,4审核失败") private Integer approveStatus; } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -24,6 +24,7 @@ import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.dto.MonthlyAmountDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.*; @@ -431,6 +432,16 @@ if (!CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 已提交 不能删除 if(qualityInspect.getInspectState() == 1){ throw new RuntimeException("已提交的检验单不能删除"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -255,7 +255,8 @@ t1.create_time, t1.update_time, t1.create_by, t2.warn_num t2.warn_num, t2.product_id from procurement_record_storage t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1 left join sales_ledger t3 on t3.id = t2.sales_ledger_id @@ -297,7 +298,8 @@ t1.create_time, t1.update_time, t1.create_by, t2.warn_num t2.warn_num, t2.product_id from procurement_record_storage t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1 left join sales_ledger t3 on t3.id = t2.sales_ledger_id @@ -312,6 +314,9 @@ <if test="req.timeStr != null and req.timeStr != ''"> and t1.create_time like concat('%',#{req.timeStr},'%') </if> <if test="req.salesLedgerProductId != null and req.salesLedgerProductId != ''"> and t1.sales_ledger_product_id = #{req.salesLedgerProductId} </if> <if test="req.reportDate != null"> and t1.create_time >= #{req.reportDate} and t1.create_time < DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY) </if> src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -22,4 +22,15 @@ </if> </where> </select> <select id="selectSalesLedgerProductByMainId" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct"> select slp.* from quality_inspect qi left join production_product_main ppm on qi.product_main_id = ppm.id left join product_work_order pwo on ppm.work_order_id = pwo.id left join product_order po on pwo.product_order_id = po.id left join sales_ledger_product slp on po.product_model_id = slp.id where qi.product_main_id = #{productMainId} </select> </mapper>