maven
2025-11-26 da8d45df31aebdf0eda2c57155d1a915e2e1e89f
yys
1.生产管理逻辑修改
已添加6个文件
已修改13个文件
771 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/DaiDto.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionOrderService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.service.ProductionOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/11/26 14:21
 */
@RestController
@Api(tags = "生产订单")
@RequestMapping("/productionOrder")
public class ProductionOrderController extends BaseController {
    @Autowired
    private ProductionOrderService productionOrderService;
    @Autowired
    private ProductionOrderMapper productionOrderMapper;
    @GetMapping("/listPage")
    @Log(title = "生产订单-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("生产订单-分页查询")
    public AjaxResult listPage(Page page, ProductionOrder productionOrder) {
        return AjaxResult.success(productionOrderService.listPage(page, productionOrder));
    }
    @PostMapping("/addProductionOrder")
    @Log(title = "生产订单-新增", businessType = BusinessType.INSERT)
    @ApiOperation("生产订单-新增")
    public AjaxResult addProductionOrder(@RequestBody ProductionOrder productionOrder) {
        String scdd = OrderUtils.countTodayByCreateTime(productionOrderMapper, "SCDD");
        productionOrder.setOrderNo(scdd);
        return AjaxResult.success(productionOrderService.save(productionOrder));
    }
    @PostMapping("/updateProductionOrder")
    @Log(title = "生产订单-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("生产订单-修改")
    public AjaxResult updateProductionOrder(@RequestBody ProductionOrder productionOrder) {
        return AjaxResult.success(productionOrderService.updateById(productionOrder));
    }
    @DeleteMapping("/deleteProductionOrder")
    @Log(title = "生产订单-删除", businessType = BusinessType.DELETE)
    @ApiOperation("生产订单-删除")
    public AjaxResult deleteProductionOrder(@RequestBody List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(productionOrderService.removeBatchByIds(ids));
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    @ApiOperation("生产管理-生产订单-导出")
    @Log(title = "生产订单-导出", businessType = BusinessType.EXPORT)
    public void export(HttpServletResponse response) {
        productionOrderService.export(response);
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/exportOne")
    @ApiOperation("生产管理-生产派工-导出")
    @Log(title = "生产订单-导出", businessType = BusinessType.EXPORT)
    public void exportOne(HttpServletResponse response) {
        productionOrderService.exportOne(response);
    }
}
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
@@ -35,34 +35,25 @@
    private SalesLedgerSchedulingServiceImpl salesLedgerSchedulingService;
    @GetMapping("/listPage")
    @Log(title = "生产管理-生产订单-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("生产管理-生产订单-分页查询")
    public AjaxResult listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
        IPage<SalesLedgerSchedulingDto> result = salesLedgerSchedulingService.listPage(page,salesLedgerSchedulingDto);
        return AjaxResult.success(result);
    }
//    @GetMapping("/listPage")
//    @Log(title = "生产管理-生产订单-分页查询", businessType = BusinessType.OTHER)
//    @ApiOperation("生产管理-生产订单-分页查询")
//    public AjaxResult listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
//        IPage<SalesLedgerSchedulingDto> result = salesLedgerSchedulingService.listPage(page,salesLedgerSchedulingDto);
//        return AjaxResult.success(result);
//    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    @ApiOperation("生产管理-生产订单-导出")
    public void export(HttpServletResponse response) {
        salesLedgerSchedulingService.export(response);
    }
//    /**
//     * å¯¼å‡º
//     * @param response
//     */
//    @PostMapping("/export")
//    @ApiOperation("生产管理-生产订单-导出")
//    public void export(HttpServletResponse response) {
//        salesLedgerSchedulingService.export(response);
//    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/exportOne")
    @ApiOperation("生产管理-生产派工-导出")
    public void exportOne(HttpServletResponse response) {
        salesLedgerSchedulingService.exportOne(response);
    }
    @PostMapping("/productionDispatch")
    @Log(title = "生产管理-生产订单-生产派工", businessType = BusinessType.INSERT)
src/main/java/com/ruoyi/production/dto/DaiDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
@@ -7,6 +8,7 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
/**
@@ -19,92 +21,59 @@
    @Excel(name = "待排数量")
    private BigDecimal daiNum;
    @ApiModelProperty(value = "销售产品ID")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    /**
     * é”€å”®åˆåŒå·
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "录入日期")
    private Date entryDate;
    @ApiModelProperty(value = "录入日期开始")
    private String entryDateStart;
    @ApiModelProperty(value = "录入日期结束")
    private String entryDateEnd;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @Excel(name = "生产订单号")
    private String orderNo;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    /**
     * å•位
     */
    @Excel(name = "单位")
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    /**
     * æŽ’产数量
     * è®¢å•状态
     */
    @Excel(name = "排产数量")
    @ApiModelProperty(value = "排产数量")
    private BigDecimal schedulingNum;
    @Excel(name = "订单状态")
    @TableField(exist = false)
    private String status;
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
    @ApiModelProperty(value = "完工数量")
    @TableField(exist = false)
    private BigDecimal successNum;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDate registerDate;
    /**
     * å½•入人
     */
    @Excel(name = "录入人")
    private String createBy;
}
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
@@ -15,6 +15,26 @@
@ApiModel
public class ProcessSchedulingDto {
    /**
     * å£å‘³åˆ†ç±»
     */
    private String type;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * æŸè€—
     */
    private String loss;
    /**
     * é¢†ç”¨
     */
    private String receive;
    private Long id;
    /**
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -17,7 +17,7 @@
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    @ApiModelProperty(value = "销售产品ID")
    @ApiModelProperty(value = "生产订单ID")
    private Long salesLedgerProductId;
    /**
src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java
@@ -17,34 +17,34 @@
@ApiModel
public class SalesLedgerProductDto {
    /**
     * é”€å”®åˆåŒå·
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
//    /**
//     * é”€å”®åˆåŒå·
//     */
//    @Excel(name = "销售合同号")
//    @ApiModelProperty(value = "销售合同号")
//    private String salesContractNo;
//
//    /**
//     * å®¢æˆ·åˆåŒå·
//     */
//    @Excel(name = "客户合同号")
//    @ApiModelProperty(value = "客户合同号")
//    private String customerContractNo;
//
//    /**
//     * é¡¹ç›®åç§°
//     */
//    @Excel(name = "项目名称")
//    @ApiModelProperty(value = "项目名称")
//    private String projectName;
    /**
     * å®¢æˆ·åç§°
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @Excel(name = "生产订单号")
    @ApiModelProperty(value = "生产订单号")
    private String orderNo;
    /**
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -20,11 +20,8 @@
@ApiModel
public class SalesLedgerSchedulingProcessDto {
    @ApiModelProperty(value = "销售产品ID")
    @ApiModelProperty(value = "生产订单ID")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    @ApiModelProperty(value = "开始时间")
    private String entryDateStart;
@@ -38,38 +35,17 @@
    private Long id;
    /**
     * é”€å”®åˆåŒå·
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    @Excel(name = "生产订单号")
    @ApiModelProperty(value = "生产订单号")
    private String orderNo;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "派工日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "派工日期")
    private Date schedulingDate;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    /**
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
@@ -86,5 +86,29 @@
    @Excel(name = "状态", readConverterExp = "1=待生产,2=生产中,3=已报工")
    private String statusName;
    /**
     * å£å‘³åˆ†ç±»
     */
    @ApiModelProperty(value = "口味分类")
    private String type;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * æŸè€—
     */
    @ApiModelProperty(value = "损耗")
    private String loss;
    /**
     * é¢†ç”¨
     */
    @ApiModelProperty(value = "领用")
    private String receive;
}
src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionOrder;
/**
 * @author :yys
 * @date : 2025/11/26 14:18
 */
public interface ProductionOrderMapper extends BaseMapper<ProductionOrder> {
}
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/11/26 14:15
 */
@Data
@TableName("production_order")
public class ProductionOrder {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "录入日期开始")
    @TableField(exist = false)
    private String entryDateStart;
    @ApiModelProperty(value = "录入日期结束")
    @TableField(exist = false)
    private String entryDateEnd;
    /**
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "生产订单号")
    @ApiModelProperty(value = "生产订单号")
    private String orderNo;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    /**
     * å•位
     */
    @Excel(name = "单位")
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    /**
     * è®¢å•状态
     */
    @Excel(name = "订单状态")
    @TableField(exist = false)
    private String status = "未完成";
    /**
     * æŽ’产数量
     */
    @Excel(name = "排产数量")
    @ApiModelProperty(value = "排产数量")
    @TableField(exist = false)
    private BigDecimal schedulingNum;
    /**
     * å®Œå·¥æ•°é‡
     */
    @Excel(name = "完工数量")
    @ApiModelProperty(value = "完工数量")
    @TableField(exist = false)
    private BigDecimal successNum = BigDecimal.ZERO;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "录入日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate registerDate;
    /**
     * å½•入人
     */
    @Excel(name = "录入人")
    @ApiModelProperty(value = "录入人")
    private String createBy;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
@@ -28,7 +28,7 @@
    private Long salesLedgerId;
    /**
     * é”€å”®äº§å“id
     * ç”Ÿäº§è®¢å•id
     */
    private Long salesLedgerProductId;
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
@@ -33,7 +33,7 @@
    private Long salesLedgerId;
    /**
     * é”€å”®äº§å“id
     * ç”Ÿäº§è®¢å•id
     */
    private Long salesLedgerProductId;
@@ -67,6 +67,26 @@
     * å·¥åº
     */
    private String process;
    /**
     * å£å‘³åˆ†ç±»
     */
    private String type;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * æŸè€—
     */
    private String loss;
    /**
     * é¢†ç”¨
     */
    private String receive;
    /**
     * æŽ’产日期
     */
src/main/java/com/ruoyi/production/service/ProductionOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.pojo.ProductionOrder;
import javax.servlet.http.HttpServletResponse;
/**
 * @author :yys
 * @date : 2025/11/26 14:19
 */
public interface ProductionOrderService extends IService<ProductionOrder> {
    AjaxResult listPage(Page page, ProductionOrder productionOrder);
    void export(HttpServletResponse response);
    void exportOne(HttpServletResponse response);
}
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
@@ -29,6 +29,4 @@
    int productionDispatchDelete(List<Long> ids);
    int processScheduling(List<ProcessSchedulingDto> processSchedulingDto);
    void exportOne(HttpServletResponse response);
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
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.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.DaiDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.ProductionOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * @author :yys
 * @date : 2025/11/26 14:20
 */
@Service
@Slf4j
public class ProductionOrderServiceImpl extends ServiceImpl<ProductionOrderMapper, ProductionOrder> implements ProductionOrderService {
    @Autowired
    private ProductionOrderMapper productionOrderMapper;
    @Autowired
    private SalesLedgerWorkMapper salesLedgerWorkMapper;
    @Autowired
    private SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
    @Override
    public AjaxResult listPage(Page page, ProductionOrder productionOrder) {
        LambdaQueryWrapper<ProductionOrder> productionOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(productionOrder != null){
            if(StringUtils.isNotEmpty(productionOrder.getOrderNo())){
                productionOrderLambdaQueryWrapper.like(ProductionOrder::getOrderNo, productionOrder.getOrderNo());
            }
            if(StringUtils.isNotEmpty(productionOrder.getProductCategory())){
                productionOrderLambdaQueryWrapper.like(ProductionOrder::getProductCategory, productionOrder.getProductCategory());
            }
            if(StringUtils.isNotEmpty(productionOrder.getEntryDateStart()) && StringUtils.isNotEmpty(productionOrder.getEntryDateEnd())){
                productionOrderLambdaQueryWrapper.ge(ProductionOrder::getRegisterDate, productionOrder.getEntryDateStart())
                        .le(ProductionOrder::getRegisterDate, productionOrder.getEntryDateEnd());
            }
        }
        IPage<ProductionOrder> list = productionOrderMapper.selectPage(page,productionOrderLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(list.getRecords())){
            return AjaxResult.success(list);
        }
        Set<Long> collect = list.getRecords().stream().map(ProductionOrder::getId).collect(Collectors.toSet());
        // èŽ·å–æŽ’äº§æ•°é‡
        LambdaQueryWrapper<SalesLedgerScheduling> salesLedgerSchedulingLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerSchedulingLambdaQueryWrapper.in(SalesLedgerScheduling::getSalesLedgerProductId, collect);
        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(salesLedgerSchedulingLambdaQueryWrapper);
        // è®¡ç®—完工数量
        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
                .ne(SalesLedgerWork::getStatus, 1);
        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
        list.getRecords().forEach(i -> {
            // èŽ·å–æŽ’äº§æ•°é‡
            i.setSchedulingNum(salesLedgerSchedulings
                    .stream()
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getId()))
                    .map(SalesLedgerScheduling::getSchedulingNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // èŽ·å–å®Œæˆæ•°é‡
            i.setSuccessNum(salesLedgerWorks
                    .stream()
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getId()))
                    .map(SalesLedgerWork::getFinishedNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // çŠ¶æ€ = æ•°é‡å’Œå®Œå·¥æ•°é‡æ¯”较
            if(i.getSchedulingNum().compareTo(i.getSuccessNum()) == 0){
                i.setStatus("已完成");
            }else{
                i.setStatus("未完成");
            }
        });
        return AjaxResult.success(list);
    }
    @Override
    public void export(HttpServletResponse response) {
        List<ProductionOrder> list = this.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        Set<Long> collect = list.stream().map(ProductionOrder::getId).collect(Collectors.toSet());
        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
                .ne(SalesLedgerWork::getStatus, 1);
        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
        list.forEach(i -> {
            // èŽ·å–å®Œæˆæ•°é‡
            i.setSuccessNum(salesLedgerWorks
                    .stream()
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getId()))
                    .map(SalesLedgerWork::getFinishedNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // çŠ¶æ€ = æ•°é‡å’Œå®Œå·¥æ•°é‡æ¯”较
            if(i.getQuantity().compareTo(i.getSuccessNum()) == 0){
                i.setStatus("已完成");
            }else{
                i.setStatus("未完成");
            }
        });
        ExcelUtil<ProductionOrder> util = new ExcelUtil<>(ProductionOrder.class);
        util.exportExcel(response, list, "生产订单");
    }
    @Override
    public void exportOne(HttpServletResponse response) {
        List<ProductionOrder> list = this.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        List<DaiDto> dais = new ArrayList<>();
        list.forEach(i -> {
            DaiDto daiDto = new DaiDto();
            BeanUtils.copyProperties(i, daiDto);
            // èŽ·å–å¾…æŽ’äº§æ•°é‡
            daiDto.setDaiNum(daiDto.getQuantity().subtract(i.getSuccessNum()));
            dais.add(daiDto);
        });
        ExcelUtil<DaiDto> util = new ExcelUtil<>(DaiDto.class);
        util.exportExcel(response, dais, "生产派工");
    }
}
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -152,10 +152,6 @@
            SysUser sysUser = sysUserMapper.selectUserById(processSchedulingDto.getSchedulingUserId());
            if(sysUser == null) throw new RuntimeException("排产人不存在");
            salesLedgerScheduling.setFinishedNum(salesLedgerScheduling.getFinishedNum().add(processSchedulingDto.getSchedulingNum()));
            LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
            salesLedgerWorkLambdaQueryWrapper.eq(SalesLedgerWork::getSalesLedgerSchedulingId, salesLedgerScheduling.getId())
                    .ne(SalesLedgerWork::getStatus, 1);
            List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
            if(salesLedgerScheduling.getSchedulingNum().compareTo(salesLedgerScheduling.getFinishedNum()) < 0){
                throw new RuntimeException("当前排产数量大于待排产数量,请仔细核对!");
            }
@@ -171,6 +167,10 @@
                    .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId())
                    .schedulingUserId(salesLedgerScheduling.getSchedulingUserId())
                    .schedulingUserName(sysUser.getNickName())
                    .type(processSchedulingDto.getType())
                    .remark(processSchedulingDto.getRemark())
                    .loss(processSchedulingDto.getLoss())
                    .receive(processSchedulingDto.getReceive())
                    .schedulingNum(processSchedulingDto.getSchedulingNum())
                    .workHours(processSchedulingDto.getWorkHours())
                    .process(processSchedulingDto.getProcess())
@@ -181,21 +181,4 @@
        return 0;
    }
    @Override
    public void exportOne(HttpServletResponse response) {
        List<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        List<DaiDto> dais = new ArrayList<>();
        list.forEach(i -> {
            DaiDto daiDto = new DaiDto();
            BeanUtils.copyProperties(i, daiDto);
            // èŽ·å–å¾…æŽ’äº§æ•°é‡
            daiDto.setDaiNum(daiDto.getQuantity().subtract(i.getSchedulingNum()));
            dais.add(daiDto);
        });
        ExcelUtil<DaiDto> util = new ExcelUtil<>(DaiDto.class);
        util.exportExcel(response, dais, "生产派工");
    }
}
src/main/resources/mapper/production/ProductionOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.production.mapper.ProductionOrderMapper">
</mapper>
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
@@ -66,7 +66,6 @@
    <select id="listPageProcess" resultType="com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto">
        SELECT
        t3.id as salesLedgerProductId,
        T1.id as salesLedgerId,
        T2.id,
        T2.status,
        T2.scheduling_user_id,
@@ -74,33 +73,22 @@
        T2.scheduling_date,
        ifNull(T2.scheduling_num,0) AS schedulingNum,
        ifNull(T2.finished_num,0) AS successNum,
        T1.sales_contract_no,
        T1.customer_contract_no,
        T1.project_name,
        T1.customer_name,
        t3.product_category,
        t3.specification_model,
        t3.unit
        t3.unit,
        t3.order_no
        FROM
        sales_ledger_scheduling T2
        LEFT JOIN sales_ledger T1 ON T1.id = T2.sales_ledger_id
        left join sales_ledger_product t3 on T2.sales_ledger_product_id = t3.id
        LEFT JOIN production_order t3 on t3.id = T2.sales_ledger_product_id
        <where>
            t3.type = 1
            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
                AND  T2.status = #{salesLedgerDto.status}
            </if>
            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
            <if test="salesLedgerDto.orderNo != null and salesLedgerDto.orderNo != '' ">
                AND  T1.order_no LIKE CONCAT('%',#{salesLedgerDto.orderNo},'%')
            </if>
            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
            </if>
            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
            </if>
            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
            <if test="salesLedgerDto.productCategory != null and salesLedgerDto.productCategory !='' ">
                AND  t3.productCategory LIKE CONCAT('%',#{salesLedgerDto.productCategory},'%')
            </if>
            <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' ">
                AND T2.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
@@ -13,33 +13,26 @@
        t4.finished_num,
        t4.work_hours,
        t4.process,
        T1.sales_contract_no,
        T1.customer_contract_no,
        T1.project_name,
        T1.customer_name,
        t4.type,
        t4.receive,
        t4.loss,
        t4.remark,
        t3.product_category,
        t3.specification_model,
        t3.unit
        t3.unit,
        t3.order_no
        FROM
        sales_ledger_work t4
        LEFT JOIN sales_ledger T1 ON T1.id = t4.sales_ledger_id
        left join sales_ledger_product t3 on t4.sales_ledger_product_id = t3.id
        LEFT JOIN production_order t3 on t3.id = t4.sales_ledger_product_id
        <where>
            t3.type = 1
            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
                AND  t4.status = #{salesLedgerDto.status}
            </if>
            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
            <if test="salesLedgerDto.orderNo != null and salesLedgerDto.orderNo != '' ">
                AND  t3.order_no LIKE CONCAT('%',#{salesLedgerDto.orderNo},'%')
            </if>
            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
            </if>
            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
            </if>
            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
            <if test="salesLedgerDto.productCategory != null and salesLedgerDto.productCategory !='' ">
                AND  t3.productCategory LIKE CONCAT('%',#{salesLedgerDto.productCategory},'%')
            </if>
            <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' ">
                AND t4.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')