liding
2026-04-22 c1babcfa8a9cd01dbeb8527a6a95cbcc431957c7
fix:生产模块
已添加2个文件
已重命名8个文件
已修改35个文件
1157 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/dto/ProductModelDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/BomImportDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductStructureDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductInputDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductOutputDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/SalesLedgerProductionAccountingDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/UserAccountDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/UserProductionAccountingDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionPlanController.java 148 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductInputController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductOutputController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionAccountMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionPlanMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductInputMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionProductOutputMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionPlan.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionPlanService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductInputService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionProductOutputService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerProductionAccountingService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java 623 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductOutputServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/bean/dto/BomImportDto.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyBomController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/TechnologyBomService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionAccountMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionPlanMapper.xml 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductInputMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductOutputMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/ProductModelDto.java
@@ -1,7 +1,7 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.bean.dto.ProductStructureDto;
import lombok.Data;
import java.util.List;
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -3,10 +3,9 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.ruoyi.account.mapper.AccountExpenseMapper;
import com.ruoyi.account.mapper.AccountIncomeMapper;
import com.ruoyi.account.pojo.AccountExpense;
import com.ruoyi.home.mapper.HomeMapper;
import com.ruoyi.account.mapper.AccountExpenseMapper;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.basic.mapper.CustomerMapper;
@@ -25,12 +24,10 @@
import com.ruoyi.dto.MapDto;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.home.dto.*;
import com.ruoyi.home.mapper.HomeMapper;
import com.ruoyi.home.service.HomeService;
import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
import com.ruoyi.production.mapper.ProductionAccountMapper;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionProductInputMapper;
import com.ruoyi.production.mapper.ProductionProductOutputMapper;
import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
@@ -1655,7 +1652,7 @@
        List<ProductionTaskStatisticsDto> startList = productionOperationTaskMapper.selectTaskStartStats(startStr, endStr);
        List<com.ruoyi.production.dto.ProductionProductOutputDto> outputList = productionProductOutputMapper
        List<ProductionProductOutputDto> outputList = productionProductOutputMapper
                .selectOutputStats(startStr, endStr);
        Map<String, WorkOrderEfficiencyDto> dateMap = new HashMap<>();
@@ -1675,7 +1672,7 @@
        // å®Œå·¥æ•°é‡å’Œè‰¯å“çއ
        if (!CollectionUtils.isEmpty(outputList)) {
            for (com.ruoyi.production.dto.ProductionProductOutputDto item : outputList) {
            for (ProductionProductOutputDto item : outputList) {
                if (item.getCreateTime() != null) {
                    String date = item.getCreateTime().toLocalDate().toString();
                    WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
src/main/java/com/ruoyi/production/bean/dto/BomImportDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/BomImportDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/ProductStructureDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/ProductStructureDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -58,4 +58,11 @@
    @ApiModelProperty("关联物料信息表ID")
    private Long productMaterialId;
    /**
     * å¼ºåº¦
     */
    @ApiModelProperty("强度")
    @Excel(name = "强度")
    private String strength;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionProductInputDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/ProductionProductInputDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/ProductionProductOutputDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/ProductionProductOutputDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/SalesLedgerProductionAccountingDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/UserAccountDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/UserAccountDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/bean/dto/UserProductionAccountingDto.java
ÎļþÃû´Ó src/main/java/com/ruoyi/production/dto/UserProductionAccountingDto.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.production.dto;
package com.ruoyi.production.bean.dto;
import lombok.Data;
src/main/java/com/ruoyi/production/controller/ProductionPlanController.java
@@ -12,11 +12,11 @@
import com.ruoyi.production.service.ProductionPlanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
@@ -34,78 +34,78 @@
@Api(tags = "主生产计划")
public class ProductionPlanController {
//    private final ProductionPlanService productionPlanService;
//
//    @GetMapping("/listPage")
//    @ApiOperation("获取生产计划列表")
//    public R<IPage<ProductionPlanVo>> productionPlanListPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) {
//        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("合并生产计划")
//    public R combine(@RequestBody ProductionPlanDto productionPlanDto) {
//        if (productionPlanDto.getIds() == null || productionPlanDto.getIds().isEmpty()) {
//            return R.fail("请选择要下发的生产计划");
//        }
//
//        if (productionPlanDto.getTotalAssignedQuantity() == null || productionPlanDto.getTotalAssignedQuantity().compareTo(BigDecimal.ZERO) <= 0) {
//            return R.fail("请输入下发数量");
//        }
//        return R.ok(productionPlanService.combine(productionPlanDto));
//    }
//
//    @PostMapping("")
//    @Log(title = "创建生产计划", businessType = BusinessType.INSERT)
//    @ApiOperation("创建生产计划")
//    public R add(@RequestBody ProductionPlanDto productionPlanDto) {
//        return R.ok(productionPlanService.add(productionPlanDto));
//    }
//
//    @PutMapping("")
//    @Log(title = "更新生产计划", businessType = BusinessType.UPDATE)
//    @ApiOperation("更新生产计划")
//    public R update(@RequestBody ProductionPlanDto productionPlanDto) {
//        return R.ok(productionPlanService.update(productionPlanDto));
//    }
//
//    @DeleteMapping("")
//    @Log(title = "删除生产计划", businessType = BusinessType.DELETE)
//    @ApiOperation("删除生产计划")
//    public R delete(@RequestBody List<Long> ids) {
//        return R.ok(productionPlanService.removeByIds(ids));
//    }
//
//    @PostMapping("/downloadTemplate")
//    @Log(title = "下载主生产计划导入模板", businessType = BusinessType.EXPORT)
//    @ApiOperation("下载主生产计划导入模板")
//    public void importTemplate(HttpServletResponse response) {
//        ExcelUtil<ProductionPlanImportDto> excelUtil = new ExcelUtil<>(ProductionPlanImportDto.class);
//        excelUtil.importTemplateExcel(response, "主生产计划导入模板");
//    }
//
//    @PostMapping("/import")
//    @ApiOperation("主生产计划数据导入")
//    @Log(title = "主生产计划数据导入", businessType = BusinessType.IMPORT)
//    public R importProdData(@RequestParam("file") MultipartFile file) {
//        productionPlanService.importProdData(file);
//        return R.ok("导入成功");
//    }
//
//    @PostMapping("/export")
//    @ApiOperation("主生产计划数据导出")
//    @Log(title = "主生产计划数据导出", businessType = BusinessType.EXPORT)
//    public void exportProdData(HttpServletResponse response, @RequestBody(required = false) List<Long> ids) {
//        productionPlanService.exportProdData(response, ids);
//    }
    private final ProductionPlanService productionPlanService;
    @GetMapping("/listPage")
    @ApiOperation("获取生产计划列表")
    public R<IPage<ProductionPlanVo>> productionPlanListPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) {
        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("合并生产计划")
    public R combine(@RequestBody ProductionPlanDto productionPlanDto) {
        if (productionPlanDto.getIds() == null || productionPlanDto.getIds().isEmpty()) {
            return R.fail("请选择要下发的生产计划");
        }
        if (productionPlanDto.getTotalAssignedQuantity() == null || productionPlanDto.getTotalAssignedQuantity().compareTo(BigDecimal.ZERO) <= 0) {
            return R.fail("请输入下发数量");
        }
        return R.ok(productionPlanService.combine(productionPlanDto));
    }
    @PostMapping("")
    @Log(title = "创建生产计划", businessType = BusinessType.INSERT)
    @ApiOperation("创建生产计划")
    public R add(@RequestBody ProductionPlanDto productionPlanDto) {
        return R.ok(productionPlanService.add(productionPlanDto));
    }
    @PutMapping("")
    @Log(title = "更新生产计划", businessType = BusinessType.UPDATE)
    @ApiOperation("更新生产计划")
    public R update(@RequestBody ProductionPlanDto productionPlanDto) {
        return R.ok(productionPlanService.update(productionPlanDto));
    }
    @DeleteMapping("")
    @Log(title = "删除生产计划", businessType = BusinessType.DELETE)
    @ApiOperation("删除生产计划")
    public R delete(@RequestBody List<Long> ids) {
        return R.ok(productionPlanService.removeByIds(ids));
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "下载主生产计划导入模板", businessType = BusinessType.EXPORT)
    @ApiOperation("下载主生产计划导入模板")
    public void importTemplate(HttpServletResponse response) {
        ExcelUtil<ProductionPlanImportDto> excelUtil = new ExcelUtil<>(ProductionPlanImportDto.class);
        excelUtil.importTemplateExcel(response, "主生产计划导入模板");
    }
    @PostMapping("/import")
    @ApiOperation("主生产计划数据导入")
    @Log(title = "主生产计划数据导入", businessType = BusinessType.IMPORT)
    public R importProdData(@RequestParam("file") MultipartFile file) {
        productionPlanService.importProdData(file);
        return R.ok("导入成功");
    }
    @PostMapping("/export")
    @ApiOperation("主生产计划数据导出")
    @Log(title = "主生产计划数据导出", businessType = BusinessType.EXPORT)
    public void exportProdData(HttpServletResponse response, @RequestBody(required = false) List<Long> ids) {
        productionPlanService.exportProdData(response, ids);
    }
}
src/main/java/com/ruoyi/production/controller/ProductionProductInputController.java
@@ -2,7 +2,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductionProductInputDto;
import com.ruoyi.production.bean.dto.ProductionProductInputDto;
import com.ruoyi.production.service.ProductionProductInputService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -3,7 +3,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.service.ProductionProductMainService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
src/main/java/com/ruoyi/production/controller/ProductionProductOutputController.java
@@ -2,7 +2,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
import com.ruoyi.production.service.ProductionProductOutputService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.production.enums;
import lombok.Getter;
/**
 * <br>
 * ç”Ÿäº§è®¢å•状态枚举类
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/18 14:18
 */
@Getter
public enum ProductOrderStatusEnum {
    WAIT(1, "待开始"),
    RUNNING(2, "进行中"),
    FINISHED(3, "已完成"),
    CANCEL(4, "已取消");
    private final Integer code;
    private final String desc;
    ProductOrderStatusEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * æ ¹æ®code获取枚举
     */
    public static ProductOrderStatusEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (ProductOrderStatusEnum item : values()) {
            if (item.getCode().equals(code)) {
                return item;
            }
        }
        return null;
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å…è®¸åˆ é™¤ï¼ˆ4)
     */
    public static boolean canDelete(Integer code) {
        return WAIT.getCode().equals(code) || CANCEL.getCode().equals(code);
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å…è®¸æ’¤å›žï¼ˆ1)
     */
    public static boolean canRevoke(Integer code) {
        return WAIT.getCode().equals(code);
    }
    /**
     * åˆ¤æ–­æ˜¯å¦å·²å¼€å§‹ç”Ÿäº§ï¼ˆ2、3)
     */
    public static boolean isStarted(Integer code) {
        return RUNNING.getCode().equals(code) || FINISHED.getCode().equals(code);
    }
}
src/main/java/com/ruoyi/production/mapper/ProductionAccountMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.dto.UserAccountDto;
import com.ruoyi.production.bean.dto.UserAccountDto;
import com.ruoyi.production.pojo.ProductionAccount;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
src/main/java/com/ruoyi/production/mapper/ProductionPlanMapper.java
@@ -1,8 +1,14 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.bean.dto.ProductionPlanDto;
import com.ruoyi.production.pojo.ProductionPlan;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -15,4 +21,10 @@
@Mapper
public interface ProductionPlanMapper extends BaseMapper<ProductionPlan> {
    IPage<ProductionPlanDto> listPage(Page page, @Param("c") ProductionPlanDto productionPlanDto);
    List<ProductionPlanDto> selectWithMaterialByIds(@Param("ids") List<Long> ids);
    ProductionPlanDto selectProductionPlanDtoById(@Param("productionPlanId") Long productionPlanId);
}
src/main/java/com/ruoyi/production/mapper/ProductionProductInputMapper.java
@@ -3,7 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductionProductInputDto;
import com.ruoyi.production.bean.dto.ProductionProductInputDto;
import com.ruoyi.production.pojo.ProductionProductInput;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
src/main/java/com/ruoyi/production/mapper/ProductionProductMainMapper.java
@@ -3,8 +3,8 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.bean.dto.SalesLedgerProductionAccountingDto;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.ProductionProductMain;
import org.apache.ibatis.annotations.Mapper;
src/main/java/com/ruoyi/production/mapper/ProductionProductOutputMapper.java
@@ -3,7 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
import com.ruoyi.production.pojo.ProductionProductOutput;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -1,13 +1,16 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -74,4 +77,15 @@
    @ApiModelProperty("部门ID")
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
    @ApiModelProperty(value = "计划完成时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planCompleteTime;
    @ApiModelProperty(value = "状态(1.待开始、2.进行中、3.已完成、4.已取消)")
    private Integer status;
    @ApiModelProperty("强度")
    private String strength;
}
src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
@@ -6,6 +6,7 @@
import lombok.Getter;
import lombok.Setter;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@@ -24,6 +25,7 @@
@ApiModel(value = "ProductionPlan对象", description = "生产计划表")
public class ProductionPlan implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("id")
src/main/java/com/ruoyi/production/service/ProductionPlanService.java
@@ -6,10 +6,9 @@
import com.ruoyi.production.bean.dto.ProductionPlanDto;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.pojo.ProductionPlan;
import org.springframework.stereotype.Service;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -22,7 +21,7 @@
 */
public interface ProductionPlanService extends IService<ProductionPlan> {
    IPage<ProductionPlanVo> listPage(Page page, ProductionPlanDto productionPlanDto);
    IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto);
    /**
     * æ‰‹åŠ¨åŒæ­¥
src/main/java/com/ruoyi/production/service/ProductionProductInputService.java
@@ -3,7 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductionProductInputDto;
import com.ruoyi.production.bean.dto.ProductionProductInputDto;
import com.ruoyi.production.pojo.ProductionProductInput;
public interface ProductionProductInputService extends IService<ProductionProductInput> {
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -3,7 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.pojo.ProductionProductMain;
import java.util.ArrayList;
src/main/java/com/ruoyi/production/service/ProductionProductOutputService.java
@@ -3,7 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
import com.ruoyi.production.pojo.ProductionProductOutput;
public interface ProductionProductOutputService extends IService<ProductionProductOutput> {
src/main/java/com/ruoyi/production/service/SalesLedgerProductionAccountingService.java
@@ -1,7 +1,7 @@
package com.ruoyi.production.service;
import com.ruoyi.production.dto.UserAccountDto;
import com.ruoyi.production.dto.UserProductionAccountingDto;
import com.ruoyi.production.bean.dto.UserAccountDto;
import com.ruoyi.production.bean.dto.UserProductionAccountingDto;
public interface SalesLedgerProductionAccountingService {
    UserAccountDto getByUserId(UserProductionAccountingDto dto);
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -1,558 +1,65 @@
//package com.ruoyi.production.service.impl;
//
//import com.alibaba.fastjson2.JSONArray;
//import com.alibaba.fastjson2.JSONObject;
//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.mapper.ProductionPlanMapper;
//import com.ruoyi.production.pojo.ProductionPlan;
//import com.ruoyi.production.service.ProductionPlanService;
//import lombok.RequiredArgsConstructor;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.multipart.MultipartFile;
//
//import jakarta.servlet.http.HttpServletResponse;
//import java.math.BigDecimal;
//import java.time.Instant;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.util.*;
//import java.util.concurrent.locks.ReentrantLock;
//import java.util.stream.Collectors;
//
///**
// * <p>
// * ç”Ÿäº§è®¡åˆ’表 æœåŠ¡å®žçŽ°ç±»
// * </p>
// *
// * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
// * @since 2026-04-21 02:11:10
// */
//@Service
//@RequiredArgsConstructor
//public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
//
//    private ProductionPlanMapper productionPlanMapper;
//
//
//    /**
//     * åŒæ­¥é”ï¼Œç¡®ä¿æ‰‹åŠ¨å’Œå®šæ—¶ä»»åŠ¡ä¸åŒæ—¶æ‰§è¡Œ
//     */
//    private final ReentrantLock syncLock = new ReentrantLock();
//
//    @Override
//    public IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) {
//
//        return productionPlanMapper.selectPage(page, null);
//    }
//
//    /**
//     * é¡µé¢æ‰‹åŠ¨åŒæ­¥
//     */
//    @Override
//    public void loadProdData() {
//        syncProdData(1);
//    }
//
//    /**
//     * å®šæ—¶ä»»åŠ¡åŒæ­¥
//     */
//    @Override
//    public void syncProdDataJob() {
//        syncProdData(2);
//    }
//
//    /**
//     * åˆå¹¶ç”Ÿäº§è®¡åˆ’
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean combine(ProductionPlanDto productionPlanDto) {
//        if (productionPlanDto.getIds() == null || productionPlanDto.getIds().isEmpty()) {
//            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("合并失败,存在不同的产品规格");
//        }
//
//        // å åŠ å‰©ä½™æ–¹æ•°
//        BigDecimal totalRemainingVolume = plans.stream()
//                .map(ProductionPlan::getRemainingVolume)
//                .filter(Objects::nonNull)
//                .reduce(BigDecimal.ZERO, BigDecimal::add);
//        // åˆ¤æ–­ä¸‹å‘数量是否大于等于剩余方数
//        if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalRemainingVolume) > 0) {
//            throw new BaseException("操作失败,下发数量不能大于剩余方数");
//        }
//
//        // åˆ›å»ºç”Ÿäº§è®¢å•
//        ProductOrder productOrder = new ProductOrder();
//        productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity());
//        productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
//        productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
//        productOrder.setStrength(productionPlanDto.getStrength());
//        productOrder.setProductMaterialSkuId(plans.get(0).getProductMaterialSkuId());
//
//        Long orderId = productOrderService.insertProductOrder(productOrder);
//
//        //  å½“下发的产品为砌块或板材,就拉取BOM子集与工艺路线子集数据存入到附表中
//        if ("砌块".equals(productionPlanDto.getProductName())) {
//            productOrder.setRouteId(productionOrderAppendixService.populateBlocks(orderId, productionPlanDto));
//        }
//        if ("板材".equals(productionPlanDto.getProductName())) {
//            productOrder.setRouteId(productionOrderAppendixService.populatePlates(orderId, productionPlanDto));
//        }
//        //  æ›´æ–°ç»‘定的工艺路线
//        productOrderService.updateById(productOrder);
//
//        // æ ¹æ®ä¸‹å‘数量,从第一个生产计划开始分配方数
//        BigDecimal assignedVolume = BigDecimal.ZERO;
//        for (ProductionPlan plan : plans) {
//            BigDecimal volume = plan.getVolume();
//            if (volume == null) {
//                continue;
//            }
//            // è®¡ç®—剩余方数
//            BigDecimal remainingVolume = plan.getRemainingVolume();
//            if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) {
//                continue;
//            }
//
//            ProductOrderPlan productOrderPlan = new ProductOrderPlan();
//            productOrderPlan.setProductOrderId(productOrder.getId());
//            productOrderPlan.setProductionPlanId(plan.getId());
//
//            if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) {
//                // æœ€åŽä¸€ä¸ªè®¡åˆ’,分配剩余方数
//                BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume);
//                BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(lastRemainingVolume);
//                plan.setAssignedQuantity(assignedQuantity);
//                plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1);
//                productOrderPlan.setAssignedQuantity(lastRemainingVolume);
//                productionPlanMapper.updateById(plan);
//                productOrderPlanMapper.insert(productOrderPlan);
//                break;
//            }
//
//            // åˆ†é…å½“前计划方数
//            BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(remainingVolume);
//            plan.setAssignedQuantity(assignedQuantity);
//            plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1);
//            productOrderPlan.setAssignedQuantity(remainingVolume);
//            // æ›´æ–°ç”Ÿäº§è®¡åˆ’
//            productionPlanMapper.updateById(plan);
//            // åˆ›å»ºå…³è”关系
//            productOrderPlanMapper.insert(productOrderPlan);
//            assignedVolume = assignedVolume.add(remainingVolume);
//        }
//
//        for (ProductionPlan plan : plans) {
//            BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO);
//            BigDecimal volume = Optional.ofNullable(plan.getVolume()).orElse(BigDecimal.ZERO);
//            if (assignedQuantity.compareTo(BigDecimal.ZERO) <= 0) {
//                plan.setStatus(0);
//            } else if (assignedQuantity.compareTo(volume) >= 0) {
//                plan.setStatus(2);
//            } else {
//                plan.setStatus(1);
//            }
//            productionPlanMapper.updateById(plan);
//        }
//        return true;
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean add(ProductionPlanDto productionPlanDto) {
//        if (StringUtils.isEmpty(productionPlanDto.getApplyNo())) {
//            throw new ServiceException("新增失败,申请单编号不能为空");
//        }
//        Long count = productionPlanMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery()
//                .eq(ProductionPlan::getApplyNo, productionPlanDto.getApplyNo()));
//        if (count > 0) {
//            throw new ServiceException("新增失败,申请单编号 " + productionPlanDto.getApplyNo() + " å·²å­˜åœ¨");
//        }
//        productionPlanDto.setDataSourceType(DataSourceTypeEnum.MANUAL.getCode());
//        productionPlanDto.setStatus(0);
//        productionPlanMapper.insert(productionPlanDto);
//        return true;
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean update(ProductionPlanDto productionPlanDto) {
//        if (productionPlanDto == null || productionPlanDto.getId() == null) {
//            throw new ServiceException("编辑失败,数据不能为空");
//        }
//        ProductionPlan productionPlan = getById(productionPlanDto.getId());
//        if (productionPlan == null) {
//            throw new ServiceException("编辑失败,主生产计划不存在");
//        }
//
//        if (StringUtils.isNotEmpty(productionPlanDto.getApplyNo())
//                && !productionPlanDto.getApplyNo().equals(productionPlan.getApplyNo())) {
//
//            Long count = productionPlanMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery()
//                    .eq(ProductionPlan::getApplyNo, productionPlanDto.getApplyNo())
//                    .ne(ProductionPlan::getId, productionPlanDto.getId())); // æŽ’除自身
//
//            if (count > 0) {
//                throw new ServiceException("编辑失败,申请单编号 " + productionPlanDto.getApplyNo() + " å·²è¢«å ç”¨");
//            }
//        }
//        // å·²ä¸‹å‘状态,不能编辑
//        if (productionPlan.getStatus() != 0) {
//            throw new BaseException("编辑失败,该生产计划已下发或部分下发状态,禁止编辑");
//        }
//
//        // æŸ¥è¯¢æ˜¯å¦æœ‰å…³è”订单
//        boolean hasProductOrderPlan = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery()
//                        .eq(ProductOrderPlan::getProductionPlanId, productionPlanDto.getId()))
//                .stream().anyMatch(p -> p.getProductOrderId() != null);
//
//        if (hasProductOrderPlan) {
//            if (productionPlanDto.getVolume().compareTo(productionPlan.getVolume()) < 0) {
//                throw new BaseException("方数不能递减");
//            }
//        }
//
//        return productionPlanMapper.updateById(productionPlanDto) > 0;
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean delete(List<Long> ids) {
//        // å¦‚果存在已下发的计划,则不能删除
//        if (productionPlanMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery().in(ProductionPlan::getId, ids)).stream().anyMatch(p -> p.getStatus() == 1 || p.getStatus() == 2)) {
//            throw new BaseException("删除失败,存在已下发或部分下发的计划");
//        }
//        // å¦‚果有关联订单,则不能删除
//        if (productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductionPlanId, ids)).stream().anyMatch(p -> p.getProductOrderId() != null)) {
//            throw new BaseException("删除失败,存在关联订单");
//        }
//
//        return productionPlanMapper.deleteBatchIds(ids) > 0;
//    }
//
//    /**
//     * åŒæ­¥æ•°æ®
//     */
//    @Transactional(rollbackFor = Exception.class)
//    public void syncProdData(Integer dataSyncType) {
//        if (!syncLock.tryLock()) {
//            log.warn("同步正在进行中,本次 {} åŒæ­¥è¯·æ±‚被跳过", dataSyncType == 1 ? "手动同步" : "定时任务同步");
//            return;
//        }
//
//        try {
//            JSONArray searchConditions = new JSONArray();
//            JSONObject condition = new JSONObject();
//            condition.put("key", "processApprovedResult");
//            JSONArray valueArray = new JSONArray();
//            valueArray.add("agree");
//
//            condition.put("value", valueArray);
//            condition.put("type", "ARRAY");
//            condition.put("operator", "in");
//            condition.put("componentName", "SelectField");
//            searchConditions.add(condition);
//
//            String searchFieldJson = searchConditions.toJSONString();
//
//            JSONArray dataArr = AliDingUtils.getFormDataList(aliDingConfig, aliDingConfig.getProducePlanFormUuid(), searchFieldJson, this, ProductionPlan::getFormModifiedTime);
//
//            if (dataArr.isEmpty()) {
//                log.info("没有更多新数据需要同步");
//                return;
//            }
//
//            //  è§£æžå¹¶ä¿å­˜æ•°æ®
//            List<ProductionPlan> list = parseProductionPlans(dataArr, dataSyncType, dataArr.size());
//            if (!list.isEmpty()) {
//                //  å¤„理更新或新增
//                int affected = processSaveOrUpdate(list);
//                log.info("数据同步完成,共同步 {} æ¡æ•°æ®", affected);
//            }
//
//        } catch (Exception e) {
//            log.error("同步生产计划异常", e);
//        } finally {
//            // é‡Šæ”¾é”
//            syncLock.unlock();
//        }
//    }
//
//    private List<ProductionPlan> parseProductionPlans(JSONArray dataArr, Integer dataSyncType, Integer totalCount) {
//        List<ProductionPlan> list = new ArrayList<>();
//        LocalDateTime now = LocalDateTime.now();
//
//        for (int i = 0; i < dataArr.size(); i++) {
//            JSONObject item = dataArr.getJSONObject(i);
//            String formInstanceId = item.getString("formInstanceId");
//            String serialNo = item.getString("serialNo");
//
//            JSONObject originator = item.getJSONObject("originator");
//            String originatorName = originator != null && originator.containsKey("userName")
//                    ? originator.getJSONObject("userName").getString("nameInChinese") : "未知";
//
//            JSONObject formData = item.getJSONObject("formData");
//            JSONArray tableArr = formData.getJSONArray("tableField_l7fytfcn");
//            if (tableArr == null || tableArr.isEmpty()) {
//                continue;
//            }
//
//            for (int j = 0; j < tableArr.size(); j++) {
//                JSONObject row = tableArr.getJSONObject(j);
//                ProductionPlan plan = new ProductionPlan();
//
//                plan.setFormInstanceId(formInstanceId);
//                plan.setSerialNo(serialNo);
//                plan.setApplyNo(formData.getString("textField_l7fytfco"));
//                plan.setCustomerName(formData.getString("textField_lbkozohg"));
//
//                String materialCode = row.getString("textField_l9xo62q5");
//                // æ ¹æ®ç‰©æ–™ç¼–码查询物料信息表,关联物料ID
//                if (StringUtils.isNotEmpty(materialCode)) {
//                    LambdaQueryWrapper<ProductMaterialSku> skuQueryWrapper = new LambdaQueryWrapper<>();
//                    skuQueryWrapper.eq(ProductMaterialSku::getMaterialCode, materialCode);
//                    ProductMaterialSku sku = productMaterialSkuService.getOne(skuQueryWrapper);
//                    if (sku != null) {
//                        plan.setProductMaterialSkuId(sku.getId());
//                    }
//                }
//
//                plan.setLength(row.getInteger("numberField_lb7lgatg_value"));
//                plan.setWidth(row.getInteger("numberField_lb7lgath_value"));
//                plan.setHeight(row.getInteger("numberField_lb7lgati_value"));
//                plan.setQuantity(row.getInteger("numberField_lb7lgatj_value"));
//                plan.setVolume(row.getBigDecimal("numberField_l7fytfd3_value"));
//                plan.setStrength(row.getString("radioField_m9urarr2_id"));
//
//                JSONArray dateArr = row.getJSONArray("cascadeDateField_lfxqqluw");
//                if (dateArr != null && dateArr.size() == 2) {
//                    try {
//                        long start = Long.parseLong(dateArr.getString(0));
//                        long end = Long.parseLong(dateArr.getString(1));
//
//                        Date startDate = Date.from(Instant.ofEpochMilli(start)
//                                .atZone(ZoneId.systemDefault())
//                                .toLocalDate()
//                                .atStartOfDay(ZoneId.systemDefault())
//                                .toInstant());
//                        Date endDate = Date.from(Instant.ofEpochMilli(end)
//                                .atZone(ZoneId.systemDefault())
//                                .toLocalDate()
//                                .atStartOfDay(ZoneId.systemDefault())
//                                .toInstant());
//
//                        plan.setStartDate(startDate);
//                        plan.setEndDate(endDate);
//                    } catch (Exception e) {
//                        log.warn("解析日期失败: {}", dateArr);
//                    }
//                }
//
//                plan.setSubmitter(originatorName);
//                plan.setSubmitOrg("宁夏中创绿能实业集团有限公司");
//                plan.setRemarkOne(formData.getString("textareaField_l7fytfcy"));
//                plan.setRemarkTwo(formData.getString("textField_l7fytfcx"));
//                plan.setCreatorName(originatorName);
//
//                JSONObject modifyUser = item.getJSONObject("modifyUser");
//                if (modifyUser != null && modifyUser.containsKey("userName")) {
//                    plan.setModifierName(modifyUser.getJSONObject("userName").getString("nameInChinese"));
//                }
//
//                plan.setFormCreatedTime(AliDingUtils.parseUtcTime(item.getString("createdTimeGMT")));
//                plan.setFormModifiedTime(AliDingUtils.parseUtcTime(item.getString("modifiedTimeGMT")));
//                plan.setDataSourceType(DataSourceTypeEnum.DING_TALK.getCode());
//                plan.setCreateTime(now);
//                plan.setUpdateTime(now);
//                plan.setTotalCount(totalCount);
//
//                list.add(plan);
//            }
//        }
//        return list;
//    }
//
//    private int processSaveOrUpdate(List<ProductionPlan> list) {
//        if (list == null || list.isEmpty()) {
//            return 0;
//        }
//        int affected = 0;
//
//        //  åŽ»é‡ formInstanceId
//        Set<String> formIds = list.stream()
//                .map(ProductionPlan::getFormInstanceId)
//                .collect(Collectors.toSet());
//
//        //  æŸ¥è¯¢æ•°æ®åº“已有数据
//        List<ProductionPlan> existList = this.list(new LambdaQueryWrapper<ProductionPlan>().in(ProductionPlan::getFormInstanceId, formIds));
//
//        //  Map (formInstanceId + materialCode)
//        Map<String, ProductionPlan> existMap = new HashMap<>();
//        for (ProductionPlan p : existList) {
//            String key = p.getFormInstanceId() + "_" + p.getProductMaterialSkuId();
//            existMap.put(key, p);
//        }
//
//        //  éåŽ†åŒæ­¥æ•°æ®
//        for (ProductionPlan plan : list) {
//            String key = plan.getFormInstanceId() + "_" + plan.getProductMaterialSkuId();
//            ProductionPlan exist = existMap.get(key);
//            if (exist == null) {
//                // æ–°å¢ž
//                this.save(plan);
//                affected++;
//                log.info("新增数据 formInstanceId={}, materialCode={}", plan.getFormInstanceId(), plan.getProductMaterialSkuId());
//            } else {
//                // åˆ¤æ–­æ˜¯å¦éœ€è¦æ›´æ–°
//                if (exist.getFormModifiedTime() == null || !exist.getFormModifiedTime().equals(plan.getFormModifiedTime())) {
//                    plan.setId(exist.getId());
//                    plan.setCreateTime(exist.getCreateTime());
//                    this.updateById(plan);
//                    affected++;
//                    log.info("更新数据 formInstanceId={}, materialCode={}", plan.getFormInstanceId(), plan.getProductMaterialSkuId());
//                }
//            }
//        }
//        return affected;
//    }
//
//    @Override
//    public List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query) {
//        return baseMapper.selectSummaryByProductType(query);
//    }
//
//    @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));
//        }
//
//        Map<String, Long> skuMap = productMaterialSkuService.list(Wrappers.<ProductMaterialSku>lambdaQuery()
//                        .in(ProductMaterialSku::getMaterialCode, materialCodes))
//                .stream().collect(Collectors.toMap(ProductMaterialSku::getMaterialCode, ProductMaterialSku::getId, (k1, k2) -> k1));
//
//        List<String> missingCodes = materialCodes.stream()
//                .filter(code -> !skuMap.containsKey(code))
//                .collect(Collectors.toList());
//        if (!missingCodes.isEmpty()) {
//            throw new ServiceException("导入失败,以下物料编码不存在: " + String.join(", ", missingCodes));
//        }
//
//        LocalDateTime now = LocalDateTime.now();
//        List<ProductionPlan> entityList = list.stream().map(dto -> {
//            ProductionPlan entity = new ProductionPlan();
//            BeanUtils.copyProperties(dto, entity);
//            entity.setProductMaterialSkuId(skuMap.get(dto.getMaterialCode()));
//            entity.setAssignedQuantity(BigDecimal.ZERO);
//            entity.setDataSourceType(DataSourceTypeEnum.MANUAL.getCode());
//            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, "销售生产需求数据");
//    }
//
//}
package com.ruoyi.production.service.impl;
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.production.bean.dto.ProductionPlanDto;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.mapper.ProductionPlanMapper;
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.web.multipart.MultipartFile;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
    @Override
    public IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) {
        return null;
    }
    @Override
    public void loadProdData() {
    }
    @Override
    public void syncProdDataJob() {
    }
    @Override
    public boolean combine(ProductionPlanDto productionPlanDto) {
        return false;
    }
    @Override
    public boolean add(ProductionPlanDto productionPlanDto) {
        return false;
    }
    @Override
    public boolean update(ProductionPlanDto productionPlanDto) {
        return false;
    }
    @Override
    public boolean delete(List<Long> ids) {
        return false;
    }
    @Override
    public void importProdData(MultipartFile file) {
    }
    @Override
    public void exportProdData(HttpServletResponse response, List<Long> ids) {
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductInputServiceImpl.java
@@ -3,7 +3,7 @@
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.production.dto.ProductionProductInputDto;
import com.ruoyi.production.bean.dto.ProductionProductInputDto;
import com.ruoyi.production.mapper.ProductionProductInputMapper;
import com.ruoyi.production.pojo.ProductionProductInput;
import com.ruoyi.production.service.ProductionProductInputService;
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -17,35 +17,15 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.mapper.ProductionAccountMapper;
import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
import com.ruoyi.production.mapper.ProductionProductInputMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import com.ruoyi.production.mapper.ProductionProductOutputMapper;
import com.ruoyi.production.pojo.ProductionAccount;
import com.ruoyi.production.pojo.ProductionOperationTask;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
import com.ruoyi.production.pojo.ProductionProductInput;
import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.production.pojo.ProductionProductOutput;
import com.ruoyi.production.bean.dto.ProductStructureDto;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityInspectParamMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.mapper.QualityTestStandardParamMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityTestStandard;
import com.ruoyi.quality.pojo.QualityTestStandardParam;
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
import com.ruoyi.technology.mapper.TechnologyOperationMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
import com.ruoyi.technology.pojo.TechnologyOperation;
src/main/java/com/ruoyi/production/service/impl/ProductionProductOutputServiceImpl.java
@@ -3,7 +3,7 @@
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.production.dto.ProductionProductOutputDto;
import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
import com.ruoyi.production.mapper.ProductionProductOutputMapper;
import com.ruoyi.production.pojo.ProductionProductOutput;
import com.ruoyi.production.service.ProductionProductOutputService;
src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java
@@ -1,7 +1,7 @@
package com.ruoyi.production.service.impl;
import com.ruoyi.production.dto.UserAccountDto;
import com.ruoyi.production.dto.UserProductionAccountingDto;
import com.ruoyi.production.bean.dto.UserAccountDto;
import com.ruoyi.production.bean.dto.UserProductionAccountingDto;
import com.ruoyi.production.mapper.ProductionAccountMapper;
import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
import lombok.RequiredArgsConstructor;
src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java
@@ -7,10 +7,10 @@
import com.ruoyi.safe.service.SafeCertificationFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.annotation.Resource;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import java.util.List;
/**
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.config.MyBaseMapper;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
import com.ruoyi.sales.dto.LossProductModelDto;
import com.ruoyi.sales.dto.SalesLedgerProductDto;
src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -2,10 +2,11 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.UserAccountDto;
import com.ruoyi.production.dto.UserProductionAccountingDto;
import com.ruoyi.production.bean.dto.UserAccountDto;
import com.ruoyi.production.bean.dto.UserProductionAccountingDto;
import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
@@ -13,21 +14,22 @@
import com.ruoyi.project.system.mapper.SysUserDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.staff.controller.TaxCalculator;
import com.ruoyi.staff.mapper.SchemeApplicableStaffMapper;
import com.ruoyi.staff.mapper.SchemeInsuranceDetailMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.SchemeApplicableStaff;
import com.ruoyi.staff.mapper.SchemeApplicableStaffMapper;
import com.ruoyi.staff.pojo.SchemeInsuranceDetail;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.SchemeApplicableStaffService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
src/main/java/com/ruoyi/technology/bean/dto/BomImportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.technology.bean.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class BomImportDto {
    @Excel(name = "父项产品编号")
    private String parentCode;
    @Excel(name = "父项产品名称")
    private String parentName;
    @Excel(name = "父项产品规格")
    private String parentSpec;
    @Excel(name = "子项产品编号")
    private String childCode;
    @Excel(name = "子项产品名称")
    private String childName;
    @Excel(name = "子项产品规格")
    private String childSpec;
    @Excel(name = "单位用量")
    private BigDecimal unitQty;
    @Excel(name = "投料工序")
    private String process;
    @Excel(name = "备注")
    private String remark;
}
src/main/java/com/ruoyi/technology/controller/TechnologyBomController.java
@@ -6,19 +6,19 @@
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.BomImportDto;
import com.ruoyi.technology.bean.dto.BomImportDto;
import com.ruoyi.technology.bean.dto.TechnologyBomDto;
import com.ruoyi.technology.bean.vo.TechnologyBomVo;
import com.ruoyi.technology.pojo.TechnologyBom;
import com.ruoyi.technology.service.TechnologyBomService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@@ -53,7 +53,7 @@
    @DeleteMapping("/batchDelete")
    @Log(title = "Delete technology BOM", businessType = BusinessType.DELETE)
    @ApiOperation("批量删除BOM")
    public R batchDelete(@RequestBody List<Integer> ids) {
    public R batchDelete(@RequestBody List<Long> ids) {
        return R.ok(technologyBomService.batchDelete(ids));
    }
src/main/java/com/ruoyi/technology/service/TechnologyBomService.java
@@ -7,9 +7,9 @@
import com.ruoyi.technology.bean.dto.TechnologyBomDto;
import com.ruoyi.technology.bean.vo.TechnologyBomVo;
import com.ruoyi.technology.pojo.TechnologyBom;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
public interface TechnologyBomService extends IService<TechnologyBom> {
@@ -22,7 +22,7 @@
    R update(TechnologyBom technologyBom);
    boolean batchDelete(List<Integer> ids);
    boolean batchDelete(List<Long> ids);
    R uploadBom(MultipartFile file);
src/main/java/com/ruoyi/technology/service/impl/TechnologyBomServiceImpl.java
@@ -13,8 +13,8 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.BomImportDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.bean.dto.BomImportDto;
import com.ruoyi.production.bean.dto.ProductStructureDto;
import com.ruoyi.technology.bean.dto.TechnologyBomDto;
import com.ruoyi.technology.bean.vo.TechnologyBomVo;
import com.ruoyi.technology.mapper.TechnologyBomMapper;
@@ -24,12 +24,12 @@
import com.ruoyi.technology.pojo.TechnologyRouting;
import com.ruoyi.technology.service.TechnologyBomService;
import com.ruoyi.technology.service.TechnologyBomStructureService;
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 jakarta.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -126,7 +126,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean batchDelete(List<Integer> ids) {
    public boolean batchDelete(List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            throw new ServiceException("Select at least one BOM");
        }
src/main/resources/mapper/production/ProductionAccountMapper.xml
@@ -21,7 +21,7 @@
        <result column="dept_id" property="deptId" />
    </resultMap>
    <select id="selectUserAccount" resultType="com.ruoyi.production.dto.UserAccountDto">
    <select id="selectUserAccount" resultType="com.ruoyi.production.bean.dto.UserAccountDto">
        select ifnull(sum(finished_num), 0) as accountBalance,
               ifnull(sum(work_hours), 0) as account
        from production_account
src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -4,21 +4,89 @@
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionPlan">
        <id column="id" property="id" />
        <result column="mps_no" property="mpsNo" />
        <result column="required_date" property="requiredDate" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
        <result column="product_model_id" property="productModelId" />
        <result column="qty_required" property="qtyRequired" />
        <result column="state" property="state" />
        <result column="issued" property="issued" />
        <result column="source" property="source" />
        <result column="is_audit" property="isAudit" />
        <result column="promised_delivery_date" property="promisedDeliveryDate" />
        <id column="id" property="id"/>
        <result column="mps_no" property="mpsNo"/>
        <result column="required_date" property="requiredDate"/>
        <result column="remark" property="remark"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="qty_required" property="qtyRequired"/>
        <result column="state" property="state"/>
        <result column="issued" property="issued"/>
        <result column="source" property="source"/>
        <result column="is_audit" property="isAudit"/>
        <result column="promised_delivery_date" property="promisedDeliveryDate"/>
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto">
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.model,
        pms.product_id AS productMaterialId,
        pm.product_name AS productName,
        pm.unit
        FROM production_plan pp
        left join product_material_sku pms on pp.product_material_sku_id = pms.id
        left join product_material pm on pms.product_id = pm.id
        WHERE 1 = 1
        <if test="c.customerName != null and c.customerName != '' ">
            AND pp.customer_name LIKE CONCAT('%',#{c.customerName},'%')
        </if>
        <if test="c.productName != null and c.productName != '' ">
            AND pm.product_name LIKE CONCAT('%',#{c.productName},'%')
        </if>
        <if test="c.materialCode != null and c.materialCode != '' ">
            AND pms.material_code LIKE CONCAT('%',#{c.materialCode},'%')
        </if>
        <if test="c.model != null and c.model != '' ">
            AND pms.model LIKE CONCAT('%',#{c.model},'%')
        </if>
        <if test="c.status != null">
            AND pp.status =#{c.status}
        </if>
        <if test="c.applyNo != null and c.applyNo != '' ">
            AND pp.apply_no LIKE CONCAT('%',#{c.applyNo},'%')
        </if>
        <if test="c.startDate != null">
            AND pp.start_date &gt;= DATE_FORMAT(#{c.startDate},'%Y-%m-%d')
        </if>
        <if test="c.endDate != null">
            AND pp.end_date &lt;= DATE_FORMAT(#{c.endDate},'%Y-%m-%d')
        </if>
        ORDER BY COALESCE(pp.form_modified_time, pp.id) DESC
    </select>
    <select id="selectWithMaterialByIds" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto">
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.model,
        pm.product_name AS productName,
        pm.unit
        FROM production_plan pp
        LEFT JOIN product_material_sku pms ON pp.product_material_sku_id = pms.id
        LEFT JOIN product_material pm ON pms.product_id = pm.id
        WHERE pp.id IN
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
        ORDER BY pp.id ASC
    </select>
    <select id="selectProductionPlanDtoById" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto">
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.model,
        pms.product_id AS productMaterialId,
        pm.product_name AS productName,
        pm.unit
        FROM production_plan pp
        left join product_material_sku pms on pp.product_material_sku_id = pms.id
        left join product_material pm on pms.product_id = pm.id
        WHERE pp.id = #{productionPlanId}
    </select>
</mapper>
src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -14,7 +14,7 @@
        <result column="update_user" property="updateUser" />
    </resultMap>
    <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.dto.ProductionProductInputDto">
    <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.bean.dto.ProductionProductInputDto">
        select ppi.*,
               ppm.product_no as productNo,
               pm.model,
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -14,7 +14,7 @@
        <result column="update_user" property="updateUser" />
    </resultMap>
    <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
    <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.bean.dto.ProductionProductMainDto">
        select ppm.*,
               pot.work_order_no as workOrderNo,
               case pot.status
@@ -78,7 +78,7 @@
        select null
    </select>
    <select id="listProductionDetails" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
    <select id="listProductionDetails" resultType="com.ruoyi.production.bean.dto.ProductionProductMainDto">
        select ppm.*,
               pot.work_order_no as workOrderNo,
               p.product_name as productName,
src/main/resources/mapper/production/ProductionProductOutputMapper.xml
@@ -15,7 +15,7 @@
        <result column="update_user" property="updateUser" />
    </resultMap>
    <select id="listPageProductionProductOutputDto" resultType="com.ruoyi.production.dto.ProductionProductOutputDto">
    <select id="listPageProductionProductOutputDto" resultType="com.ruoyi.production.bean.dto.ProductionProductOutputDto">
        select ppo.*,
               ppm.product_no as productNo,
               pm.model
@@ -35,7 +35,7 @@
        order by ppo.create_time desc
    </select>
    <select id="selectOutputStats" resultType="com.ruoyi.production.dto.ProductionProductOutputDto">
    <select id="selectOutputStats" resultType="com.ruoyi.production.bean.dto.ProductionProductOutputDto">
        select id,
               production_product_main_id as productionProductMainId,
               product_model_id as productModelId,