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