liding
2026-04-23 b2a081508aca058c075a7e6dcf980c52451093b6
fix:1.生产部分完善 2.生产计划部分更改
已添加1个文件
已修改28个文件
476 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/bean/dto/BomImportDto.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductStructureDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderRoutingOperationParamDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderRoutingOperationParamSyncDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanSummaryDto.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductInputDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductOutputDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/SalesLedgerProductionAccountingDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/UserAccountDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/UserProductionAccountingDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionPlanController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionAccount.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOperationMainParam.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOperationTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderBom.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderPick.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderPickRecord.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRouting.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionPlan.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionPlanService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/BomImportDto.java
@@ -1,30 +1,38 @@
package com.ruoyi.production.bean.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BomImportDto {
    @ApiModelProperty("父产品名称")
    @Excel(name = "父产品名称")
    private String parentName;
    @ApiModelProperty("父产品规格")
    @Excel(name = "父产品规格")
    private String parentSpec;
    @ApiModelProperty("子产品名称")
    @Excel(name = "子产品名称")
    private String childName;
    @ApiModelProperty("子产品规格")
    @Excel(name = "子产品规格")
    private String childSpec;
    @ApiModelProperty("单位用量")
    @Excel(name = "单位用量")
    private BigDecimal unitQty;
    @ApiModelProperty("工序")
    @Excel(name = "工序")
    private String process;
    @ApiModelProperty("备注")
    @Excel(name = "备注")
    private String remark;
}
src/main/java/com/ruoyi/production/bean/dto/ProductStructureDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -7,15 +8,26 @@
@Data
public class ProductStructureDto {
    @ApiModelProperty("主键ID")
    private Long id;
    @ApiModelProperty("BOM主键ID")
    private Long bomId;
    @ApiModelProperty("父级ID")
    private Long parentId;
    @ApiModelProperty("产品型号ID")
    private Long productModelId;
    @ApiModelProperty("单位用量")
    private BigDecimal unitQuantity;
    @ApiModelProperty("单位")
    private String unit;
    @ApiModelProperty("工序ID")
    private Long processId;
    @ApiModelProperty("工序名称")
    private String processName;
    @ApiModelProperty("产品名称")
    private String productName;
    @ApiModelProperty("规格型号")
    private String model;
    @ApiModelProperty("子节点")
    private List<ProductStructureDto> children;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java
@@ -2,7 +2,9 @@
import com.ruoyi.production.pojo.ProductionOperationTask;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ProductionOperationTaskDto extends ProductionOperationTask {
}
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
@@ -2,7 +2,9 @@
import com.ruoyi.production.pojo.ProductionOrder;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ProductionOrderDto extends ProductionOrder {
}
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderRoutingOperationParamDto.java
@@ -2,7 +2,9 @@
import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ProductionOrderRoutingOperationParamDto extends ProductionOrderRoutingOperationParam {
}
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderRoutingOperationParamSyncDto.java
@@ -1,11 +1,14 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProductionOrderRoutingOperationParamSyncDto {
    @ApiModelProperty("生产订单工序参数ID")
    private Long productionOrderRoutingOperationId;
    @ApiModelProperty("是否替换已有参数")
    private Boolean replaceExisting;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanSummaryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚ - äº§å“ç±»åž‹æ±‡æ€»DTO
 * </br>
 */
@Data
@ApiModel("生产需求产品汇总")
public class ProductionPlanSummaryDto {
    /**
     * ç‰©æ–™ç¼–码
     */
    @ApiModelProperty("物料编码")
    private String materialCode;
    /**
     * äº§å“åç§°
     */
    @ApiModelProperty("产品名称")
    private String productName;
    /**
     * äº§å“è§„æ ¼
     */
    @ApiModelProperty("产品规格")
    private String model;
    /**
     * äº§å“é•¿åº¦
     */
    @ApiModelProperty("产品长度")
    private Integer length;
    /**
     * äº§å“å®½åº¦
     */
    @ApiModelProperty("产品宽度")
    private Integer width;
    /**
     * äº§å“é«˜åº¦
     */
    @ApiModelProperty("产品高度")
    private Integer height;
    /**
     * æ±‡æ€»å—æ•°
     */
    @ApiModelProperty("汇总块数")
    private Integer quantity;
    /**
     * æ±‡æ€»æ–¹æ•°
     */
    @ApiModelProperty("汇总方数")
    private BigDecimal volume;
    /**
     * åŸºæœ¬å•位
     */
    @ApiModelProperty("基本单位")
    private String unit;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionProductInputDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -7,21 +8,37 @@
@Data
public class ProductionProductInputDto {
    @ApiModelProperty("主键ID")
    private Long id;
    @ApiModelProperty("产品主表ID")
    private Long productMainId;
    @ApiModelProperty("生产产品主表ID")
    private Long productionProductMainId;
    @ApiModelProperty("产品型号ID")
    private Long productModelId;
    @ApiModelProperty("数量")
    private BigDecimal quantity;
    @ApiModelProperty("投入数量")
    private BigDecimal inputQuantity;
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;
    @ApiModelProperty("租户ID")
    private Long tenantId;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ApiModelProperty("更新人")
    private Integer updateUser;
    @ApiModelProperty("部门ID")
    private Long deptId;
    @ApiModelProperty("产品编号")
    private String productNo;
    @ApiModelProperty("规格型号")
    private String model;
    @ApiModelProperty("产品名称")
    private String productName;
    @ApiModelProperty("单位")
    private String unit;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -8,32 +9,59 @@
@Data
public class ProductionProductMainDto {
    @ApiModelProperty("主键ID")
    private Long id;
    @ApiModelProperty("产品编号")
    private String productNo;
    @ApiModelProperty("用户ID")
    private Long userId;
    @ApiModelProperty("用户名称")
    private String userName;
    @ApiModelProperty("产品工艺路线明细ID")
    private Long productProcessRouteItemId;
    @ApiModelProperty("工单ID")
    private Long workOrderId;
    @ApiModelProperty("生产工序任务ID")
    private Long productionOperationTaskId;
    @ApiModelProperty("状态")
    private Integer status;
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;
    @ApiModelProperty("租户ID")
    private Long tenantId;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ApiModelProperty("更新人")
    private Integer updateUser;
    @ApiModelProperty("部门ID")
    private Long deptId;
    @ApiModelProperty("工单编号")
    private String workOrderNo;
    @ApiModelProperty("工单状态")
    private String workOrderStatus;
    @ApiModelProperty("昵称")
    private String nickName;
    @ApiModelProperty("数量")
    private BigDecimal quantity;
    @ApiModelProperty("报废数量")
    private BigDecimal scrapQty;
    @ApiModelProperty("产品名称")
    private String productName;
    @ApiModelProperty("产品型号名称")
    private String productModelName;
    @ApiModelProperty("单位")
    private String unit;
    @ApiModelProperty("销售合同编号")
    private String salesContractNo;
    @ApiModelProperty("排产日期")
    private LocalDate schedulingDate;
    @ApiModelProperty("排产人员名称")
    private String schedulingUserName;
    @ApiModelProperty("客户名称")
    private String customerName;
    @ApiModelProperty("工序")
    private String process;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionProductOutputDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -7,19 +8,33 @@
@Data
public class ProductionProductOutputDto {
    @ApiModelProperty("主键ID")
    private Long id;
    @ApiModelProperty("产品主表ID")
    private Long productMainId;
    @ApiModelProperty("生产产品主表ID")
    private Long productionProductMainId;
    @ApiModelProperty("产品型号ID")
    private Long productModelId;
    @ApiModelProperty("数量")
    private BigDecimal quantity;
    @ApiModelProperty("报废数量")
    private BigDecimal scrapQty;
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;
    @ApiModelProperty("租户ID")
    private Long tenantId;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ApiModelProperty("更新人")
    private Integer updateUser;
    @ApiModelProperty("部门ID")
    private Long deptId;
    @ApiModelProperty("产品编号")
    private String productNo;
    @ApiModelProperty("规格型号")
    private String model;
}
src/main/java/com/ruoyi/production/bean/dto/SalesLedgerProductionAccountingDto.java
@@ -1,14 +1,20 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
@Data
public class SalesLedgerProductionAccountingDto {
    @ApiModelProperty("用户ID")
    private Long userId;
    @ApiModelProperty("用户名称")
    private String userName;
    @ApiModelProperty("工序")
    private String process;
    @ApiModelProperty("开始日期")
    private LocalDate startDate;
    @ApiModelProperty("结束日期")
    private LocalDate endDate;
}
src/main/java/com/ruoyi/production/bean/dto/UserAccountDto.java
@@ -1,11 +1,14 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class UserAccountDto {
    @ApiModelProperty("金额")
    private BigDecimal account = BigDecimal.ZERO;
    @ApiModelProperty("账户余额")
    private BigDecimal accountBalance = BigDecimal.ZERO;
}
src/main/java/com/ruoyi/production/bean/dto/UserProductionAccountingDto.java
@@ -1,9 +1,12 @@
package com.ruoyi.production.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class UserProductionAccountingDto {
    @ApiModelProperty("用户ID")
    private Long userId;
    @ApiModelProperty("日期")
    private String date;
}
src/main/java/com/ruoyi/production/controller/ProductionPlanController.java
@@ -42,14 +42,6 @@
        return R.ok(productionPlanService.listPage(page, productionPlanDto));
    }
    @GetMapping("/loadProdData")
    @ApiOperation("拉取销售生产计划")
    @Log(title = "拉取销售生产计划", businessType = BusinessType.INSERT)
    public R loadProdData() {
        productionPlanService.loadProdData();
        return R.ok();
    }
    @PostMapping("/combine")
    @Log(title = "合并生产计划", businessType = BusinessType.INSERT)
    @ApiOperation("合并生产计划")
@@ -64,21 +56,21 @@
        return R.ok(productionPlanService.combine(productionPlanDto));
    }
    @PostMapping("")
    @PostMapping("addProductionPlan")
    @Log(title = "创建生产计划", businessType = BusinessType.INSERT)
    @ApiOperation("创建生产计划")
    public R add(@RequestBody ProductionPlanDto productionPlanDto) {
        return R.ok(productionPlanService.add(productionPlanDto));
    }
    @PutMapping("")
    @PutMapping("updateProductionPlan")
    @Log(title = "更新生产计划", businessType = BusinessType.UPDATE)
    @ApiOperation("更新生产计划")
    public R update(@RequestBody ProductionPlanDto productionPlanDto) {
        return R.ok(productionPlanService.update(productionPlanDto));
    }
    @DeleteMapping("")
    @DeleteMapping("deleteProductionPlan")
    @Log(title = "删除生产计划", businessType = BusinessType.DELETE)
    @ApiOperation("删除生产计划")
    public R delete(@RequestBody List<Long> ids) {
src/main/java/com/ruoyi/production/pojo/ProductionAccount.java
@@ -3,8 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@@ -18,8 +17,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_account")
@ApiModel(value = "ProductionAccount对象", description = "生产核算表")
public class ProductionAccount implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionBomStructure.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -17,8 +18,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_bom_structure")
@ApiModel(value = "ProductionBomStructure对象", description = "生产订单BOM产品结构")
public class ProductionBomStructure implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOperationMainParam.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -17,8 +18,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_operation_main_param")
@ApiModel(value = "ProductionOperationMainParam对象", description = "生产工单报工参数表")
public class ProductionOperationMainParam implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOperationTask.java
@@ -3,8 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@@ -19,8 +18,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_operation_task")
@ApiModel(value = "ProductionOperationTask对象", description = "生产工单表")
public class ProductionOperationTask implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -4,8 +4,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@@ -21,8 +20,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order")
@ApiModel(value = "ProductionOrder对象", description = "生产订单表")
public class ProductionOrder implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrderBom.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -17,8 +18,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order_bom")
@ApiModel(value = "ProductionOrderBom对象", description = "生产订单BOM")
public class ProductionOrderBom implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrderPick.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -18,8 +19,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order_pick")
@ApiModel(value = "ProductionOrderPick对象", description = "订单领料线边仓")
public class ProductionOrderPick implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrderPickRecord.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -18,8 +19,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order_pick_record")
@ApiModel(value = "ProductionOrderPickRecord对象", description = "线边仓出入库记录")
public class ProductionOrderPickRecord implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrderRouting.java
@@ -3,8 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -17,8 +16,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order_routing")
@ApiModel(value = "ProductionOrderRouting对象", description = "生产订单工艺路线表")
public class ProductionOrderRouting implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -17,8 +18,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order_routing_operation")
@ApiModel(value = "ProductionOrderRoutingOperation对象", description = "生产订单工艺路线工序表")
public class ProductionOrderRoutingOperation implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -17,8 +18,7 @@
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-21 03:55:52
 */
@Getter
@Setter
@Data
@TableName("production_order_routing_operation_param")
@ApiModel(value = "ProductionOrderRoutingOperationParam对象", description = "生产订单工艺路线工序参数表")
public class ProductionOrderRoutingOperationParam implements Serializable {
src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
@@ -1,12 +1,12 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@@ -25,7 +25,6 @@
@ApiModel(value = "ProductionPlan对象", description = "生产计划表")
public class ProductionPlan implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("id")
@@ -78,4 +77,10 @@
    @ApiModelProperty("承诺日期")
    private LocalDateTime promisedDeliveryDate;
    @ApiModelProperty("申请单编号")
    private String applyNo;
    @ApiModelProperty("状态 0未下发 1部分下发 2已下发")
    private Integer status;
}
src/main/java/com/ruoyi/production/service/ProductionPlanService.java
@@ -24,16 +24,6 @@
    IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto);
    /**
     * æ‰‹åŠ¨åŒæ­¥
     */
    void loadProdData();
    /**
     * å®šæ—¶åŒæ­¥
     */
    void syncProdDataJob();
    /**
     * åˆå¹¶ç”Ÿäº§è®¡åˆ’
     */
    boolean combine(ProductionPlanDto productionPlanDto);
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -1,65 +1,246 @@
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.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.production.bean.dto.ProductionPlanDto;
import com.ruoyi.production.bean.dto.ProductionPlanImportDto;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionPlanMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.ProductionPlan;
import com.ruoyi.production.service.ProductionPlanService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
    private final ProductionPlanMapper productionPlanMapper;
    private final ProductionOrderMapper productionOrderMapper;
    @Override
    public IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) {
        return null;
        IPage<ProductionPlanVo> planVoIPage = productionPlanMapper.listPage(page, productionPlanDto)
                .convert(dto -> {
                    ProductionPlanVo vo = new ProductionPlanVo();
                    BeanUtils.copyProperties(dto, vo);
                    return vo;
                });
        return planVoIPage;
    }
    /**
     * åˆå¹¶ç”Ÿäº§è®¡åˆ’
     */
    @Override
    public void loadProdData() {
    }
    @Override
    public void syncProdDataJob() {
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean combine(ProductionPlanDto productionPlanDto) {
        if (productionPlanDto.getIds() == null || productionPlanDto.getIds().isEmpty()) {
        return false;
    }
    @Override
    public boolean add(ProductionPlanDto productionPlanDto) {
        return false;
        //  æŸ¥è¯¢ä¸»ç”Ÿäº§è®¡åˆ’
        List<ProductionPlanDto> plans = productionPlanMapper.selectWithMaterialByIds(productionPlanDto.getIds());
        if (plans == null || plans.isEmpty()) {
            throw new ServiceException("下发失败,生产计划不存在");
        }
        //  æ ¡éªŒæ˜¯å¦å­˜åœ¨ä¸åŒçš„产品名称
        String firstProductName = plans.get(0).getProductName();
        if (plans.stream().anyMatch(p -> p.getProductName() == null || !p.getProductName().equals(firstProductName))) {
            throw new BaseException("合并失败,存在不同的产品名称");
        }
        // æ ¡éªŒæ˜¯å¦å­˜åœ¨ä¸åŒçš„产品规格
        String firstProductSpec = plans.get(0).getModel();
        if (plans.stream().anyMatch(p -> p.getModel() == null || !p.getModel().equals(firstProductSpec))) {
            throw new BaseException("合并失败,存在不同的产品规格");
        }
        // åˆ›å»ºç”Ÿäº§è®¢å•
        ProductionOrder productionOrder = new ProductionOrder();
        productionOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity());
        productionOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
        productionOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
        productionOrder.setStrength(productionPlanDto.getStrength());
        return true;
    }
    @Override
    public boolean update(ProductionPlanDto productionPlanDto) {
        return false;
    @Transactional(rollbackFor = Exception.class)
    public boolean add(ProductionPlanDto dto) {
        if (StringUtils.isBlank(dto.getApplyNo())) {
            throw new ServiceException("新增失败,申请单编号不能为空");
        }
        checkApplyNoUnique(dto.getApplyNo(), null);
        dto.setStatus(0);
        return productionPlanMapper.insert(dto) > 0;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean update(ProductionPlanDto dto) {
        if (dto == null || dto.getId() == null) {
            throw new ServiceException("编辑失败,数据不能为空");
        }
        ProductionPlan old = getById(dto.getId());
        if (old == null) {
            throw new ServiceException("编辑失败,主生产计划不存在");
        }
        // çŠ¶æ€æ ¡éªŒ
        if (old.getStatus() != 0) {
            throw new BaseException("编辑失败,该生产计划已下发或部分下发状态,禁止编辑");
        }
        // applyNo变更才校验
        if (StringUtils.isNotBlank(dto.getApplyNo())
                && !dto.getApplyNo().equals(old.getApplyNo())) {
            checkApplyNoUnique(dto.getApplyNo(), dto.getId());
        }
        return productionPlanMapper.updateById(dto) > 0;
    }
    private void checkApplyNoUnique(String applyNo, Long excludeId) {
        LambdaQueryWrapper<ProductionPlan> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(ProductionPlan::getApplyNo, applyNo);
        if (excludeId != null) {
            wrapper.ne(ProductionPlan::getId, excludeId);
        }
        if (productionPlanMapper.selectCount(wrapper) > 0) {
            throw new ServiceException("申请单编号 " + applyNo + " å·²å­˜åœ¨");
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean delete(List<Long> ids) {
        return false;
        // å¦‚果存在已下发的计划,则不能删除
        if (productionPlanMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery().in(ProductionPlan::getId, ids)).stream().anyMatch(p -> p.getStatus() == 1 || p.getStatus() == 2)) {
            throw new BaseException("删除失败,存在已下发或部分下发的计划");
        }
        // å¦‚果有关联订单,则不能删除
        if (productionOrderMapper.selectList(Wrappers.<ProductionOrder>lambdaQuery().in(ProductionOrder::getProductionPlanIds, ids)).stream().anyMatch(p -> p.getId() != null)) {
            throw new BaseException("删除失败,存在关联订单");
        }
        return productionPlanMapper.deleteBatchIds(ids) > 0;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void importProdData(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            throw new ServiceException("导入数据不能为空");
        }
        ExcelUtil<ProductionPlanImportDto> excelUtil = new ExcelUtil<>(ProductionPlanImportDto.class);
        List<ProductionPlanImportDto> list;
        try {
            list = excelUtil.importExcel(file.getInputStream());
        } catch (Exception e) {
            log.error("生产需求Excel导入失败", e);
            throw new ServiceException("Excel解析失败");
        }
        if (list == null || list.isEmpty()) {
            throw new ServiceException("Excel没有数据");
        }
        Set<String> applyNos = new HashSet<>();
        Set<String> materialCodes = new HashSet<>();
        for (int i = 0; i < list.size(); i++) {
            ProductionPlanImportDto dto = list.get(i);
            String applyNo = dto.getApplyNo();
            String materialCode = dto.getMaterialCode();
            if (StringUtils.isEmpty(applyNo)) {
                throw new ServiceException("导入失败:第 " + (i + 2) + " è¡Œç”³è¯·å•编号不能为空");
            }
            if (!applyNos.add(applyNo)) {
                throw new ServiceException("导入失败:Excel ä¸­å­˜åœ¨é‡å¤çš„申请单编号: " + applyNo);
            }
            if (StringUtils.isEmpty(materialCode)) {
                throw new ServiceException("导入失败:第 " + (i + 2) + " è¡Œç‰©æ–™ç¼–码不能为空");
            }
            String strength = dto.getStrength();
            if (StringUtils.isNotEmpty(strength)) {
                if (!"A3.5".equals(strength) && !"A5.0".equals(strength)) {
                    throw new ServiceException("导入失败:第 " + (i + 2) + " è¡Œå¼ºåº¦åªèƒ½æ˜¯ A3.5 æˆ– A5.0");
                }
            }
            materialCodes.add(materialCode);
        }
        //  ç”³è¯·å•编号是否已存在
        Long existApplyNoCount = baseMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery()
                .in(ProductionPlan::getApplyNo, applyNos));
        if (existApplyNoCount > 0) {
            List<String> existApplyNos = baseMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery()
                            .in(ProductionPlan::getApplyNo, applyNos))
                    .stream().map(ProductionPlan::getApplyNo).collect(Collectors.toList());
            throw new ServiceException("导入失败,申请单编号已存在: " + String.join(", ", existApplyNos));
        }
        LocalDateTime now = LocalDateTime.now();
        List<ProductionPlan> entityList = list.stream().map(dto -> {
            ProductionPlan entity = new ProductionPlan();
            BeanUtils.copyProperties(dto, entity);
            entity.setStatus(0);
            entity.setCreateTime(now);
            entity.setUpdateTime(now);
            return entity;
        }).collect(Collectors.toList());
        this.saveBatch(entityList);
    }
    @Override
    public void exportProdData(HttpServletResponse response, List<Long> ids) {
        List<ProductionPlan> list;
        if (ids != null && !ids.isEmpty()) {
            list = baseMapper.selectBatchIds(ids);
        } else {
            list = baseMapper.selectList(null);
        }
        List<ProductionPlanImportDto> exportList = new ArrayList<>();
        for (ProductionPlan entity : list) {
            ProductionPlanImportDto dto = new ProductionPlanImportDto();
            BeanUtils.copyProperties(entity, dto);
            exportList.add(dto);
        }
        ExcelUtil<ProductionPlanImportDto> util = new ExcelUtil<>(ProductionPlanImportDto.class);
        util.exportExcel(response, exportList, "销售生产需求数据");
    }
}
src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderDto.java
@@ -1,11 +1,12 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class PurchaseReturnOrderDto extends PurchaseReturnOrders {
    // æ˜¯å¦ä½¿ç”¨ç³»ç»Ÿå•号