gongchunyi
3 天以前 d1439e537a47804c7c78e3e78ccd1aa24e2fdd23
feat: 生产计划数据的导入、导出、模板下载
已添加1个文件
已修改4个文件
302 ■■■■■ 文件已修改
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanImportDto.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
@@ -1,18 +1,21 @@
package com.ruoyi.productionPlan.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.dto.ProductionPlanImportDto;
import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto;
import com.ruoyi.productionPlan.service.ProductionPlanService;
import com.ruoyi.staff.dto.StaffLeaveDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -67,4 +70,28 @@
        List<ProductionPlanSummaryDto> list = productionPlanService.summaryByProductType(query);
        return AjaxResult.success(list);
    }
    @GetMapping("/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 AjaxResult importProdData(@RequestParam("file") MultipartFile file) {
        productionPlanService.importProdData(file);
        return AjaxResult.success("导入成功");
    }
    @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/productionPlan/dto/ProductionPlanImportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
package com.ruoyi.productionPlan.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <br>
 * é”€å”®ç”Ÿäº§éœ€æ±‚ Excel导入导出DTO
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/11 11:28
 */
@Data
@ApiModel("销售生产需求 Excel导入导出DTO")
public class ProductionPlanImportDto {
    /**
     * ç”³è¯·å•编号
     */
    @ApiModelProperty("申请单编号")
    @Excel(name = "申请单编号")
    private String applyNo;
    /**
     * å®¢æˆ·åç§°
     */
    @ApiModelProperty("客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * ç‰©æ–™ç¼–码
     */
    @ApiModelProperty("物料编码")
    @Excel(name = "物料编码")
    private String materialCode;
    /**
     * äº§å“åç§°
     */
    @ApiModelProperty("产品名称")
    @Excel(name = "产品名称")
    private String productName;
    /**
     * äº§å“è§„æ ¼
     */
    @ApiModelProperty("产品规格")
    @Excel(name = "产品规格")
    private String productSpec;
    /**
     * é•¿
     */
    @ApiModelProperty("长")
    @Excel(name = "长")
    private Integer length;
    /**
     * å®½
     */
    @ApiModelProperty("宽")
    @Excel(name = "宽")
    private Integer width;
    /**
     * é«˜
     */
    @ApiModelProperty("高")
    @Excel(name = "高")
    private Integer height;
    /**
     * å—æ•°
     */
    @ApiModelProperty("块数")
    @Excel(name = "块数")
    private Integer quantity;
    /**
     * æ–¹æ•°
     */
    @ApiModelProperty("方数")
    @Excel(name = "方数")
    private BigDecimal volume;
    /**
     * å¼ºåº¦
     */
    @ApiModelProperty("强度")
    @Excel(name = "强度")
    private String strength;
    /**
     * å¼€å§‹æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty("开始日期")
    @Excel(name = "开始日期", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startDate;
    /**
     * ç»“束日期
     */
    @ApiModelProperty("结束日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Excel(name = "结束日期", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endDate;
    /**
     * æäº¤äºº
     */
    @ApiModelProperty("提交人")
    @Excel(name = "提交人")
    private String submitter;
    /**
     * æäº¤äººç»„织
     */
    @ApiModelProperty("提交人组织")
    @Excel(name = "提交人组织")
    private String submitOrg;
    /**
     * å¤‡æ³¨1
     */
    @ApiModelProperty("备注1")
    @Excel(name = "备注1")
    private String remarkOne;
    /**
     * å¤‡æ³¨2
     */
    @ApiModelProperty("备注2")
    @Excel(name = "备注2")
    private String remarkTwo;
    /**
     * åˆ›å»ºäºº
     */
    @ApiModelProperty("创建人")
    @Excel(name = "创建人", type = Excel.Type.EXPORT)
    private String creatorName;
    /**
     * ä¿®æ”¹äºº
     */
    @ApiModelProperty("修改人")
    @Excel(name = "修改人", type = Excel.Type.EXPORT)
    private String modifierName;
    /**
     * æ•°æ®åŒæ­¥ç±»åž‹ï¼š1=手动 2=定时任务
     */
    @ApiModelProperty("数据同步类型:1=手动 2=定时任务")
    private Integer dataSyncType;
    /**
     * æ•°æ®æ¥æºç±»åž‹ï¼š1=同步 2=新增
     */
    @ApiModelProperty("数据来源类型:1=同步 2=新增")
    private Integer dataSourceType;
    /**
     * ä¸‹å‘数量
     */
    @ApiModelProperty("下发数量")
    @Excel(name = "下发数量", type = Excel.Type.EXPORT)
    private BigDecimal assignedQuantity;
}
src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -45,66 +46,77 @@
     * ç”³è¯·å•编号
     */
    @ApiModelProperty("申请单编号")
    @Excel(name = "申请单编号")
    private String applyNo;
    /**
     * å®¢æˆ·åç§°
     */
    @ApiModelProperty("客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * ç‰©æ–™ç¼–码
     */
    @ApiModelProperty("物料编码")
    @Excel(name = "物料编码")
    private String materialCode;
    /**
     * äº§å“åç§°
     */
    @ApiModelProperty("产品名称")
    @Excel(name = "产品名称")
    private String productName;
    /**
     * äº§å“è§„æ ¼
     */
    @ApiModelProperty("产品规格")
    @Excel(name = "产品规格")
    private String productSpec;
    /**
     * é•¿
     */
    @ApiModelProperty("长")
    @Excel(name = "长")
    private Integer length;
    /**
     * å®½
     */
    @ApiModelProperty("宽")
    @Excel(name = "宽")
    private Integer width;
    /**
     * é«˜
     */
    @ApiModelProperty("高")
    @Excel(name = "高")
    private Integer height;
    /**
     * å—æ•°
     */
    @ApiModelProperty("块数")
    @Excel(name = "块数")
    private Integer quantity;
    /**
     * æ–¹æ•°
     */
    @ApiModelProperty("方数")
    @Excel(name = "方数")
    private BigDecimal volume;
    /**
     * å¼ºåº¦
     */
    @ApiModelProperty("强度")
    @Excel(name = "强度")
    private String strength;
    /**
@@ -112,6 +124,7 @@
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty("开始日期")
    @Excel(name = "开始日期", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startDate;
    /**
@@ -119,42 +132,49 @@
     */
    @ApiModelProperty("结束日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Excel(name = "结束日期", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endDate;
    /**
     * æäº¤äºº
     */
    @ApiModelProperty("提交人")
    @Excel(name = "提交人")
    private String submitter;
    /**
     * æäº¤äººç»„织
     */
    @ApiModelProperty("提交人组织")
    @Excel(name = "提交人组织")
    private String submitOrg;
    /**
     * å¤‡æ³¨1
     */
    @ApiModelProperty("备注1")
    @Excel(name = "备注1")
    private String remarkOne;
    /**
     * å¤‡æ³¨2
     */
    @ApiModelProperty("备注2")
    @Excel(name = "备注2")
    private String remarkTwo;
    /**
     * åˆ›å»ºäºº
     */
    @ApiModelProperty("创建人")
    @Excel(name = "创建人")
    private String creatorName;
    /**
     * ä¿®æ”¹äºº
     */
    @ApiModelProperty("修改人")
    @Excel(name = "修改人")
    private String modifierName;
    /**
@@ -204,5 +224,6 @@
    private Integer totalCount;
    @ApiModelProperty(value = "下发数量")
    @Excel(name = "下发数量")
    private BigDecimal assignedQuantity;
}
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
@@ -6,7 +6,9 @@
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -31,7 +33,7 @@
     */
    void syncProdDataJob();
     /**
    /**
     * åˆå¹¶ç”Ÿäº§è®¡åˆ’
     */
    boolean combine(ProductionPlanDto productionPlanDto);
@@ -45,4 +47,14 @@
     * æŒ‰ç…§äº§å“ç±»åˆ«æ±‡æ€»ç»Ÿè®¡éœ€æ±‚量
     */
    List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query);
    /**
     * å¯¼å…¥æ•°æ®
     */
    void importProdData(MultipartFile file);
    /**
     * å¯¼å‡ºæ•°æ®
     */
    void exportProdData(HttpServletResponse response, List<Long> ids);
}
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -7,13 +7,16 @@
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.basic.pojo.Product;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.config.AliDingConfig;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProductOrderService;
import com.ruoyi.productionPlan.dto.ProductionPlanDto;
import com.ruoyi.productionPlan.dto.ProductionPlanImportDto;
import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto;
import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
import com.ruoyi.productionPlan.pojo.ProductionPlan;
@@ -22,7 +25,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
@@ -425,4 +430,56 @@
    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没有数据");
        }
        List<ProductionPlan> entityList = new ArrayList<>(list.size());
        ProductionPlan entity;
        for (ProductionPlanImportDto dto : list) {
            entity = new ProductionPlan();
            BeanUtils.copyProperties(dto, entity);
            entity.setCreateTime(LocalDateTime.now());
            entity.setUpdateTime(LocalDateTime.now());
            entity.setDataSourceType(2);
            entity.setDataSyncType(1);
            entityList.add(entity);
        }
        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, "销售生产需求数据");
    }
}