From d1439e537a47804c7c78e3e78ccd1aa24e2fdd23 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 11 三月 2026 13:18:43 +0800
Subject: [PATCH] feat: 生产计划数据的导入、导出、模板下载

---
 src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java                    |   21 +++
 src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java    |   29 ++++
 src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java |   59 +++++++++
 src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanImportDto.java            |  179 +++++++++++++++++++++++++++++
 src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java          |   14 ++
 5 files changed, 299 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java b/src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
index 5f655c9..eb0e179 100644
--- a/src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
+++ b/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);
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanImportDto.java b/src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanImportDto.java
new file mode 100644
index 0000000..d43ab8f
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java b/src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
index 1bd9b0c..c06cdfb 100644
--- a/src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
+++ b/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;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java b/src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
index 069c0c3..d67e5b7 100644
--- a/src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
index 994e8c0..a93d311 100644
--- a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
+++ b/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("鐢熶骇闇�姹侲xcel瀵煎叆澶辫触", e);
+            throw new ServiceException("Excel瑙f瀽澶辫触");
+        }
+
+        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, "閿�鍞敓浜ч渶姹傛暟鎹�");
+    }
 }

--
Gitblit v1.9.3