diff --git a/pom.xml b/pom.xml
index b22ba83..578f15c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -110,10 +110,11 @@
test
+
- com.alibaba
- easyexcel
- 4.0.3
+ cn.idev.excel
+ fastexcel
+ 1.1.0
diff --git a/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java b/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java
index 3824555..0365345 100644
--- a/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java
+++ b/src/main/java/tech/riemann/ims/controller/platform/material/MaterialController.java
@@ -10,6 +10,7 @@ import com.google.common.cache.LoadingCache;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -22,6 +23,7 @@ import tech.riemann.ims.entity.material.Material;
import tech.riemann.ims.service.material.IMaterialService;
import tech.riemann.ims.service.material.ITypeService;
import tech.riemann.ims.utils.BarcodeUtil;
+import tech.riemann.ims.utils.ExcelUtil;
import javax.annotation.Nonnull;
import java.util.ArrayList;
@@ -78,6 +80,24 @@ public class MaterialController {
return result;
}
+ @GetMapping("material/download-excel")
+ @Operation(summary = "导出物料列表")
+ public void downloadExcel(@Parameter(description = "类型") @RequestParam(required = false, defaultValue = "") Integer type,
+ @Parameter(description = "搜索关键词") @RequestParam(required = false, defaultValue = "") String key,
+ HttpServletResponse response) {
+ boolean hasLike = Strings.isNotBlank(key);
+ key = String.format("%%%s%%", key);
+ List result = materialService.list(Wrappers.lambdaQuery()
+ .like(hasLike, Material::getName, key)
+ .or()
+ .like(hasLike, Material::getCode, key)
+ .or()
+ .like(hasLike, Material::getType, key)
+ .orderByDesc(Material::getUpdatedTime));
+ result.forEach(item -> item.setTypeName(typeService.getTypeName(item.getType())));
+ ExcelUtil.exportExcel(response, "物料列表-" + System.currentTimeMillis(), "库存", Material.class, result);
+ }
+
@PostMapping("material/list")
@Operation(summary = "查询所有物料列表")
public List all(@Parameter(description = "类型") @RequestParam(required = false, defaultValue = "") String type,
diff --git a/src/main/java/tech/riemann/ims/entity/IdBaseEntity.java b/src/main/java/tech/riemann/ims/entity/IdBaseEntity.java
index 92f2b6d..ceccd26 100644
--- a/src/main/java/tech/riemann/ims/entity/IdBaseEntity.java
+++ b/src/main/java/tech/riemann/ims/entity/IdBaseEntity.java
@@ -1,5 +1,6 @@
package tech.riemann.ims.entity;
+import cn.idev.excel.annotation.ExcelIgnore;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -41,18 +42,21 @@ public class IdBaseEntity extends Entity {
@Id
@TableId(type = IdType.AUTO)
+ @ExcelIgnore
private Long id;
@Column("created_time")
@Comment("创建时间")
@TableField("created_time")
@Default
+ @ExcelIgnore
protected LocalDateTime createdTime = LocalDateTime.now();
@Column("updated_time")
@TableField("updated_time")
@Comment("最后更新时间")
@Default
+ @ExcelIgnore
protected LocalDateTime updatedTime = LocalDateTime.now();
@Schema(description = "创建人")
@@ -60,6 +64,7 @@ public class IdBaseEntity extends Entity {
@TableField("created_by")
@Comment("创建人")
@JsonIgnore
+ @ExcelIgnore
protected String createdBy;
@Schema(description = "更新人")
@@ -67,6 +72,7 @@ public class IdBaseEntity extends Entity {
@TableField("updated_by")
@Comment("更新人")
@JsonIgnore
+ @ExcelIgnore
protected String updatedBy;
}
diff --git a/src/main/java/tech/riemann/ims/entity/material/Material.java b/src/main/java/tech/riemann/ims/entity/material/Material.java
index 49001d7..7ed558f 100644
--- a/src/main/java/tech/riemann/ims/entity/material/Material.java
+++ b/src/main/java/tech/riemann/ims/entity/material/Material.java
@@ -1,5 +1,8 @@
package tech.riemann.ims.entity.material;
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -37,6 +40,8 @@ public class Material extends IdBaseEntity {
@Column("m_code")
@Comment("编码")
@ColDefine(notNull = false, width = 128, precision = 0)
+ @ExcelProperty("物料编码")
+ @ColumnWidth(40)
private String code;
@Schema(description = "名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@@ -44,6 +49,8 @@ public class Material extends IdBaseEntity {
@Column("m_name")
@Comment("名称")
@ColDefine(notNull = false, width = 128, precision = 0)
+ @ExcelProperty("物料名称")
+ @ColumnWidth(60)
private String name;
@Schema(description = "是否赋码", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@@ -51,6 +58,8 @@ public class Material extends IdBaseEntity {
@Column("m_assign_rule")
@Comment("赋码规则")
@ColDefine(notNull = false, type = ColType.INT)
+ @ExcelProperty("是否赋码")
+ @ColumnWidth(40)
private Boolean assignRule; // 0-低值易耗品(不参与赋码) 1-高价值工具类(参与唯一赋码)
@Schema(description = "类型", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@@ -58,9 +67,12 @@ public class Material extends IdBaseEntity {
@Column("m_type")
@Comment("类型")
@ColDefine(notNull = false, width = 128, precision = 0)
+ @ExcelIgnore
private String type;
@TableField(exist = false)
+ @ExcelProperty("物料类型")
+ @ColumnWidth(40)
private String typeName;
@Schema(description = "价格", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@@ -68,6 +80,8 @@ public class Material extends IdBaseEntity {
@Column("m_price")
@Comment("价格")
@ColDefine(notNull = false, width = 18, precision = 0)
+ @ExcelProperty("价格")
+ @ColumnWidth(40)
private BigDecimal price;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@@ -75,6 +89,8 @@ public class Material extends IdBaseEntity {
@Column("m_spec")
@Comment("规格")
@ColDefine(notNull = false, width = 128, precision = 0)
+ @ExcelProperty("物料型号")
+ @ColumnWidth(40)
private String spec;
@@ -83,6 +99,8 @@ public class Material extends IdBaseEntity {
@Column("m_stock")
@Comment("库存数量")
@ColDefine(notNull = false, type = ColType.INT)
+ @ExcelProperty("库存数量")
+ @ColumnWidth(40)
private Integer stock;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
@@ -90,6 +108,7 @@ public class Material extends IdBaseEntity {
@Column("m_description")
@Comment("备注")
@ColDefine(notNull = false, width = 500, precision = 0)
+ @ExcelIgnore
private String description;
diff --git a/src/main/java/tech/riemann/ims/utils/ExcelUtil.java b/src/main/java/tech/riemann/ims/utils/ExcelUtil.java
new file mode 100644
index 0000000..a2b0a5c
--- /dev/null
+++ b/src/main/java/tech/riemann/ims/utils/ExcelUtil.java
@@ -0,0 +1,38 @@
+package tech.riemann.ims.utils;
+
+import club.zhcs.lina.starter.exception.BizException;
+import cn.idev.excel.FastExcel;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.experimental.UtilityClass;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Collection;
+
+/**
+ * @author mayong
+ * @since 2025/3/15 16:17
+ */
+@UtilityClass
+public class ExcelUtil {
+
+
+ public void exportExcel(HttpServletResponse response,
+ String excelName,
+ String sheetName,
+ Class> clazz,
+ Collection> result) {
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+ response.setCharacterEncoding("utf-8");
+ String fileName = URLEncoder.encode(excelName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
+ response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+ try {
+ FastExcel.write(response.getOutputStream(), clazz)
+ .sheet(sheetName)
+ .doWrite(result);
+ } catch (IOException e) {
+ throw BizException.create("导出Excel失败");
+ }
+ }
+}