From c466f4d8c054270821ed0263f390178995621a74 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期一, 03 三月 2025 10:27:08 +0800 Subject: [PATCH] #新增 1. 添加EXcel导入功能模板 --- rsf-server/pom.xml | 7 rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java | 79 +-------- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java | 16 +- rsf-server/src/main/java/com/vincent/rsf/server/system/controller/BaseController.java | 1 rsf-admin/src/page/components/ImportModal.jsx | 38 +++- rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java | 19 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java | 141 +++++++++++++++++ rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx | 8 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelAutoColumnSize.java | 20 ++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelComment.java | 30 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java | 3 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelField.java | 60 +++++++ 12 files changed, 331 insertions(+), 91 deletions(-) diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx index be006b0..5480867 100644 --- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx +++ b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx @@ -43,7 +43,7 @@ import MyField from "@/page/components/MyField"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import * as Common from '@/utils/common'; -import ImportButton from "@/page/components/ImportButton"; +import ImportButton from "../../components/ImportButton"; import MatListAside from './MatnrListAside'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ @@ -228,7 +228,9 @@ <FilterButton /> <MyCreateButton onClick={() => { setCreateDialog(true) }} /> <SelectColumnsButton preferenceKey='matnr' /> - <ImportButton /> + <MatnrList.Context.Provider value={'matnr'}> + <ImportButton /> + </MatnrList.Context.Provider> <MyExportButton /> </TopToolbar> )} @@ -251,4 +253,6 @@ ) } +MatnrList.Context = React.createContext() + export default MatnrList; \ No newline at end of file diff --git a/rsf-admin/src/page/components/ImportModal.jsx b/rsf-admin/src/page/components/ImportModal.jsx index 501cb22..3775169 100644 --- a/rsf-admin/src/page/components/ImportModal.jsx +++ b/rsf-admin/src/page/components/ImportModal.jsx @@ -18,6 +18,7 @@ import { Link } from 'react-router-dom'; import DialogCloseButton from './DialogCloseButton'; import { usePapaParse } from './usePapaParse'; +import MatnrList from '../basicInfo/matnr/MatnrList'; const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10 }) => { const refresh = useRefresh(); @@ -144,22 +145,30 @@ <Alert severity="info" action={ - <Button - component={Link} - label="common.action.import.download" - color="info" - to={importTemp} - download={'import_template.csv'} - /> + <MatnrList.Context.Consumer> + {context => ( + <Button + component={Link} + onClick={() => { + downloadTemplate(context) + }} + label="common.action.import.download" + color="info" + to={importTemp} + download={'import_template.csv'} + /> + )} + + </MatnrList.Context.Consumer> } > {translate('common.action.import.msg')} </Alert> <FileInput - source="csv" - label="CSV File" - accept={{ 'text/csv': ['.csv'] }} + source="xlsx" + label="Xlsx File" + accept={{ 'text/xlsx': ['.xls', '.xlsx'] }} onChange={handleFileChange} > <FileField source="src" title="title" /> @@ -201,6 +210,15 @@ </Dialog> ); } +{/**涓嬭浇鎵撳嵃妯℃澘锛屼紶鍏ype绫诲瀷锛岃皟鐢ㄤ笅杞芥ā鏉挎帴鍙� */} +const downloadTemplate = (type) => { + // 涓嬭浇鐗╂枡妯℃澘 + if (type != undefined && type == 'matnr') { + + } + console.log('======>'); + console.log(type); +} function millisecondsToTime(ms) { var seconds = Math.floor((ms / 1000) % 60); diff --git a/rsf-server/pom.xml b/rsf-server/pom.xml index eb85d00..f3cbdfa 100644 --- a/rsf-server/pom.xml +++ b/rsf-server/pom.xml @@ -137,7 +137,12 @@ <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> - </dependencies> + <dependency> + <groupId>cn.afterturn</groupId> + <artifactId>easypoi-base</artifactId> + <version>4.2.0</version> + </dependency> + </dependencies> <build> <finalName>rsf-server</finalName> diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java index bab11e6..b501bda 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java @@ -1,5 +1,6 @@ package com.vincent.rsf.server.common.utils; +import cn.afterturn.easypoi.excel.entity.ImportParams; import com.vincent.rsf.framework.common.Cools; import io.swagger.annotations.ApiModelProperty; import org.apache.poi.hssf.usermodel.HSSFWorkbook; @@ -64,7 +65,8 @@ continue; } - field.setAccessible(true); // 姝よ寰堥噸瑕侊紝鐗瑰埆鏄瓧娈典负private鏃� + // 姝よ寰堥噸瑕侊紝鐗瑰埆鏄瓧娈典负private鏃� + field.setAccessible(true); Object value = null; try { value = field.get(t); @@ -91,76 +93,13 @@ } /** - * Excel 瀵煎叆 - * @param file 鏂囦欢 - * @param keys 鏁版嵁椤哄簭 + * 娣诲姞瀵煎叆excel閰嶇疆鍙傛暟 + * 娉細榛樿閰嶇疆鍙弧瓒冲綋鍓嶉渶姹� + * @return */ - public static List<Map<String, Object>> importExcel(MultipartFile file, String[] keys) throws Exception{ - Workbook wb = null; - String fileName = file.getOriginalFilename(); - if (fileName.endsWith("xls")) { - POIFSFileSystem pois = new POIFSFileSystem(file.getInputStream()); - wb = new HSSFWorkbook(pois); - } else if (fileName.endsWith("xlsx")) { - wb = new XSSFWorkbook(file.getInputStream()); - } - Sheet sheet = wb.getSheetAt(0); - int rowCount = sheet.getPhysicalNumberOfRows(); - if (sheet.getRow( 1).getPhysicalNumberOfCells() != keys.length){ - throw new RuntimeException("瀵煎叆鐨凟xcel鍜屾ā鏉跨殑鍒椾笉鍖归厤"); - } - List<Map<String,Object>> result = new ArrayList<>(); - for (int i = 0; i < rowCount - 1; i++) { - Row row = sheet.getRow(i + 1); - Map<String,Object> tmp = new HashMap<>(); - for (int j = 0;j < keys.length; j++){ - Cell cell = row.getCell(j); - // 鎶婄被鍨嬭浆琛孲tring -// cell.setCellType(CellType.STRING); - tmp.put(keys[j], cell.getStringCellValue()); - } - result.add(tmp); - } - return result; - } - - /** - * 琛ㄥご鏍峰紡 - */ - private static CellStyle HeaderStyle(Workbook wb){ - Font font = wb.createFont(); - font.setFontName("瀹嬩綋"); - font.setFontHeightInPoints((short) 11); - CellStyle cellStyle = commonStyle(wb); - cellStyle.setFont(font); - return cellStyle; - } - - /** - * 鍐呭鏍峰紡 - */ - private static CellStyle contentStyle(Workbook wb){ - Font font = wb.createFont(); - font.setFontName("瀹嬩綋"); - font.setFontHeightInPoints((short) 10); - CellStyle cellStyle = commonStyle(wb); - cellStyle.setFont(font); - return cellStyle; - } - - /** - * 鍏叡鏍峰紡 - */ - private static CellStyle commonStyle(Workbook wb){ - CellStyle style = wb.createCellStyle(); - style.setAlignment(HorizontalAlignment.CENTER); - style.setVerticalAlignment(VerticalAlignment.CENTER); - style.setBorderBottom(BorderStyle.THIN); - style.setBorderLeft(BorderStyle.THIN); - style.setBorderTop(BorderStyle.THIN); - style.setBorderRight(BorderStyle.THIN); - style.setWrapText(true);// 鑷姩鎹㈣ - return style; + public static ImportParams getDefaultImportParams() { + ImportParams params = new ImportParams(); + return params; } } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java index 47024db..df029e2 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java @@ -1,5 +1,9 @@ package com.vincent.rsf.server.manager.controller; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; +import cn.afterturn.easypoi.excel.imports.ExcelImportService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.framework.common.Cools; @@ -21,6 +25,8 @@ import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + import javax.servlet.http.HttpServletResponse; import java.util.*; @@ -134,4 +140,17 @@ ExcelUtil.build(ExcelUtil.create(matnrService.list(), Matnr.class), response); } + @PreAuthorize("hasAuthority('manager:matnr:save')") + @ApiOperation(value = "excel琛ㄦ牸瀵煎叆鐗╂枡淇℃伅") + @PostMapping("/matnr/import") + public R listImport(MultipartFile file) { + try { + ExcelImportResult<Matnr> objectExcelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), Matnr.class, ExcelUtil.getDefaultImportParams()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return R.ok(); + } + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java index 26d45fe..0775852 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java @@ -109,14 +109,14 @@ @PostMapping("/matnrGroup/tree") public R tree(@RequestBody Map<String, Object> map) { List<MatnrGroup> matnrs = new ArrayList<>(); - if (Objects.isNull(map)) { - matnrs = matnrGroupService.list(new LambdaQueryWrapper<>()); - } else { - if (Objects.isNull(map.get("condition"))) { - return R.ok("condition鍙傛暟涓嶈兘涓虹┖锛侊紒"); - } - matnrs = matnrGroupService.list(new LambdaQueryWrapper<MatnrGroup>().like(MatnrGroup::getName, map.get("condition"))); - } + matnrs = matnrGroupService.list(new LambdaQueryWrapper<>()); +// if (Objects.isNull(map)) { +// } else { +// if (Objects.isNull(map.get("condition"))) { +// return R.ok("condition鍙傛暟涓嶈兘涓虹┖锛侊紒"); +// } +// matnrs = matnrGroupService.list(new LambdaQueryWrapper<MatnrGroup>().like(MatnrGroup::getName, map.get("condition"))); +// } List<MatnrGroup> treeData = Utils.toTreeData(matnrs, 0L, MatnrGroup::getParentId, MatnrGroup::getId, MatnrGroup::setChildren); return R.ok().add(treeData); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java index 99d544c..e2bb486 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Matnr.java @@ -57,6 +57,9 @@ @ApiModelProperty(value= "璐т富ID") private Long shipperId; +// @ApiModelProperty(value = "璐т富缂栫爜") +// private String shipperCode; + /** * 鍒嗙粍ID(*) */ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java new file mode 100644 index 0000000..7ecf8b2 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java @@ -0,0 +1,141 @@ +package com.vincent.rsf.server.manager.entity.excel; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.handler.inter.IExcelDataModel; +import cn.afterturn.easypoi.handler.inter.IExcelModel; +import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelAutoColumnSize; +import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @author Ryan + * @version 1.0 + * @title MatnrsTemplate + * @description + * @create 2025/3/3 08:40 + */ +@Data +@ExcelAutoColumnSize +@Accessors(chain = true) +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = false) +public class MatnrsTemplate implements IExcelModel, IExcelDataModel, Serializable { + + @Excel(name = "鐗╂枡鍚嶇О") + @ExcelComment(example = "鍗庝负鎵嬫満") + private String name; + + @Excel(name = "璐т富缂栫爜") + @ExcelComment(example = "PO12625") + private String shipperCode; + + @Excel(name = "鍒嗙被鍚嶇О") + @ExcelComment(example = "绉诲姩璁惧") + private String groupName; + + @Excel(name = "鐗╂枡鍔╄鐮�") + @ExcelComment(example = "P3528461569") + private String erpCode; + + @Excel(name = "瑙勬牸") + @ExcelComment(example = "HW-148*68*10") + private String spec; + + @Excel(name = "鍨嬪彿") + @ExcelComment(example = "鍗庝负涓夋姌鍙�") + private String model; + + @Excel(name = "閲嶉噺") + @ExcelComment(notNull = false, example = "258g") + private String weight; + + @Excel(name = "棰滆壊") + @ExcelComment(notNull = false, example = "绱孩鑹�") + private String color; + + @Excel(name = "澶у皬") + @ExcelComment(notNull = false, example = "148*68*10") + private String size; + + @Excel(name = "鎻忚堪") + @ExcelComment(notNull = false, example = "鏂颁笂甯備笁鎶樺彔") + private String describle; + + @Excel(name = "鎻忚堪") + @ExcelComment(notNull = false, example = "鏂颁笂甯備笁鎶樺彔") + private String nromNum; + + @Excel(name = "涓诲崟浣�") + @ExcelComment(example = "閮�") + private String unit; + + @Excel(name = "閲囪喘鍗曚綅") + @ExcelComment(example = "閮�") + private String purUnit; + + @Excel(name = "ABC绫�") + @ExcelComment(notNull = false, example = "A") + private String stockLevel; + + @Excel(name = "瀹夊叏搴撳瓨閲�") + @ExcelComment(example = "50") + private String safeQty; + + @Excel(name = "鏈�灏忓簱瀛橀噺") + @ExcelComment(notNull = false, example = "10") + private String minQty; + + @Excel(name = "鏈�澶у簱瀛橀噺") + @ExcelComment(notNull = false, example = "150") + private String maxQty; + + @Excel(name = "鍋滄粸澶╂暟") + @ExcelComment(notNull = false, example = "25") + private String stagn; + + @Excel(name = "鏈夋晥鏈�") + @ExcelComment(notNull = false, example = "25") + private String valid; + + @Excel(name = "鏉″舰鐮�") + @ExcelComment(notNull = false, example = "8001354") + private String barcode; + + @Excel(name = "鏁堟湡棰勮闃堝��") + @ExcelComment(notNull = false, example = "2025-01-25 14:25:36") + private String validWarn; + + @Excel(name = "鏄惁鍏嶆") + @ExcelComment(notNull = false, example = "鍚�") + private String flagCheck; + + private Integer rowNum; + + private String errorMsg; + + + @Override + public Integer getRowNum() { + return this.rowNum; + } + + @Override + public void setRowNum(Integer rowNum) { + this.rowNum = rowNum; + } + + @Override + public String getErrorMsg() { + return this.errorMsg; + } + + @Override + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelAutoColumnSize.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelAutoColumnSize.java new file mode 100644 index 0000000..8d5ce06 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelAutoColumnSize.java @@ -0,0 +1,20 @@ +package com.vincent.rsf.server.manager.entity.excel.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author: Ryan + * @create: 2025/3/01 13:29 + * @version: 1.0 + * @description: excel 鍒楀鑷�傚簲 + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelAutoColumnSize { + + /** 鍚敤 */ + boolean enable() default true; +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelComment.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelComment.java new file mode 100644 index 0000000..fac36fa --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelComment.java @@ -0,0 +1,30 @@ +package com.vincent.rsf.server.manager.entity.excel.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author: Ryan + * @create: 2025/3/01 13:29 + * @version: 1.0 + * @description: excel 娉ㄩ噴 + */ +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelComment { + + /** 澶囨敞淇℃伅 */ + String value() default ""; + + /** 鏄惁闈炵┖銆傝嚜鍔ㄥ湪澶囨敞鍚庨潰鎷兼帴 "蹇呭~椤�"*/ + boolean notNull() default true; + + + /** 瀛楀吀鍊硷紝濡傛灉涓嶄负绌猴紝浼氬湪 {@link #value()} 鐨勫悗闈㈠姞涓� 鍙�夊�硷細label1銆乴abel2 */ + String dict() default ""; + + /** 绀轰緥鍊硷紱璋冪敤{@link ExcelUtils#mockData(Class)} 鏃� 灏嗕粠姝ゅ瓧娈靛彇鍊� */ + String example() default ""; +} \ No newline at end of file diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelField.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelField.java new file mode 100644 index 0000000..a44d94f --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/annotation/ExcelField.java @@ -0,0 +1,60 @@ +/** + * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved. + */ +package com.vincent.rsf.server.manager.entity.excel.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel娉ㄨВ瀹氫箟 + * @author ThinkGem + * @version 2013-03-10 + */ +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelField { + + /** + * 瀵煎嚭瀛楁鍚嶏紙榛樿璋冪敤褰撳墠瀛楁鐨勨�済et鈥濇柟娉曪紝濡傛寚瀹氬鍑哄瓧娈典负瀵硅薄锛岃濉啓鈥滃璞″悕.瀵硅薄灞炴�р�濓紝渚嬶細鈥渁rea.name鈥濄�佲�渙ffice.name鈥濓級 + */ + String value() default ""; + + /** + * 瀵煎嚭瀛楁鏍囬锛堥渶瑕佹坊鍔犳壒娉ㄨ鐢ㄢ��**鈥濆垎闅旓紝鏍囬**鎵规敞锛屼粎瀵瑰鍑烘ā鏉挎湁鏁堬級 + */ + String title(); + + /** + * 瀛楁绫诲瀷锛�0锛氬鍑哄鍏ワ紱1锛氫粎瀵煎嚭锛�2锛氫粎瀵煎叆锛� + */ + int type() default 0; + + /** + * 瀵煎嚭瀛楁瀵归綈鏂瑰紡锛�0锛氳嚜鍔紱1锛氶潬宸︼紱2锛氬眳涓紱3锛氶潬鍙筹級 + */ + int align() default 0; + + /** + * 瀵煎嚭瀛楁瀛楁鎺掑簭锛堝崌搴忥級 + */ + int sort() default 0; + + /** + * 濡傛灉鏄瓧鍏哥被鍨嬶紝璇疯缃瓧鍏哥殑type鍊� + */ + String dictType() default ""; + + /** + * 鍙嶅皠绫诲瀷 + */ + Class<?> fieldType() default Class.class; + + /** + * 瀛楁褰掑睘缁勶紙鏍规嵁鍒嗙粍瀵煎嚭瀵煎叆锛� + */ + int[] groups() default {}; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/BaseController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/BaseController.java index bcb9262..bada2f7 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/BaseController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/BaseController.java @@ -13,6 +13,7 @@ /** * Created by vincent on 1/30/2024 */ + public class BaseController { public User getLoginUser() { -- Gitblit v1.9.1