hyy 1 月之前
父節點
當前提交
b7fc3e4182

+ 212 - 235
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/SpecimenInfoController.java

@@ -106,55 +106,6 @@ public class SpecimenInfoController {
                         BeanUtils.toBean(list, SpecimenInfoExportRespVO.class));
     }
 
-//    @GetMapping("/get-specimen-import-template")
-//    @Operation(summary = "获得导入标本信息模板")
-//    public void getSpecimenImportTemplate(HttpServletResponse response) throws IOException {
-//
-//        // 设置响应类型
-//        response.setContentType("application/vnd.ms-excel");
-//        response.setCharacterEncoding("UTF-8");
-//        // URL 编码文件名
-//        String fileName = URLEncoder.encode("标本导入模板.xls", "UTF-8");
-//        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
-//
-//        // 手动创建导出 demo
-//        List<SpecimenImportExcelVO> list = Arrays.asList(
-//                SpecimenImportExcelVO.builder()
-//                        .specimenNumber("01522")  // 标本编号
-//                        .assetNumber("20129103")  // 资产号
-//                        .chineseName("贵州龙")  // 中文名称
-//                        .englishName("keichousaurus")  // 外文名称
-//                        .specimenType(SpecimenTypeEnum.FOSSIL.getType()) // 使用枚举:标本类型(矿物/矿石/岩石/化石/陨石)
-//                        .storageLocation("临展厅")  // 存放位置
-//                        .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType()) // 使用枚举:保存类型(标本/原石/光片/薄片/切片/模型及其他)
-//                        .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态(完整/受损/严重受损/无实物)
-//                        .specimenAmount(1)  // 数量(件/套)
-//                        .size("1000cm")  // 规格(cm)
-//                        .weight("1.5g")  // 重量(g)
-//                        .composition("硅酸盐")  // 成分/化学式
-//                        .origin("兴义县顶效镇绿荫村")  // 产地/发现地(市级县级产地)
-//                        .economize("贵州省")  // 省
-//                        .country("中国(China)")  // 国家
-//                        .era("晚三叠世(距今2.1亿年)")  // 形成时代
-//                        .preservedLayer("上三叠统竹竿坡组")  // 地质产状或层位(产出状态,化石指产出层位)
-//                        .meteoriteType("脊索动物门鳍龙目肿肋龙亚目贵州龙科")  // 分类(矿物的类型/岩石的类型/化石的类型/陨石的类型)
-//                        .internationalName("Mineral A")  // 国际命名
-//                        .discoveryTime("2024/01/01")  // 发现时间
-//                        .fallTime("2024/01/02")  // 降落时间
-//                        .source(SourceEnum.PURCHASE.getSource()) // 使用枚举:来源(采购/捐赠/采集)
-//                        .provider("天娇雅石居")  // 标本提供者
-//                        .specimenPrice(new BigDecimal("5900.01"))  // 单价
-//                        .acquisitionTime("2012/12/20")  // 入藏时间
-//                        .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途(工业原料/药用/建材/科学研究/观赏/其它)
-//                        .purpose("科学普及;对比研究")  // 具体用途
-//                        .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态(在馆/展陈/借出)
-//                        .imageName("image1.jpg、image2.jpg、image3.jpg")  // 图片资料(图件名称)
-//                        .description("这是一个矿石标本")  // 文献资料
-//                        .notes("备注信息")  // 备注
-//                        .build()
-//        );
-//        ExcelUtils.write(response, "标本导入模板.xls", "标本信息", SpecimenImportExcelVO.class, list);
-//    }
 
     @GetMapping("/get-specimen-import-template")
     @Operation(summary = "获得导入标本信息模板")
@@ -167,196 +118,222 @@ public class SpecimenInfoController {
         String fileName = URLEncoder.encode("标本导入模板.xls", "UTF-8");
         response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
 
-        // 根据 specimen_type 参数选择模板
-        List<SpecimenImportExcelVO> list;
-
-        // 根据标本类型生成不同的模板
-        switch (specimenType) {
-            case 0: // 矿物
-                list = Arrays.asList(
-                        SpecimenImportExcelVO.builder()
-                                .specimenNumber("00716")  // 标本编号
-                                .assetNumber("20121324")  // 资产号
-                                .chineseName("文石晶簇")  // 中文名称
-                                .englishName("Aragonite")  // 外文名称
-                                .specimenType(SpecimenTypeEnum.MINERAL.getType())  // 标本类型:矿物
-                                .storageLocation("奇妙的矿物世界")  // 存放位置
-                                .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
-                                .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
-                                .specimenAmount(1)  // 数量:1件
-                                .size("11000")  // 规格:无
-                                .weight("11220.22")  // 重量:无
-                                .composition("CaCO3")  // 成分/化学式:碳酸钙
-                                .origin("湖北")  // 产地
-                                .economize("湖北省")  // 省
-                                .country("中国(China)")  // 国家
-                                .era("N/A")  // 形成时代:无
-                                .preservedLayer("N/A")  // 地质产状或层位:无
-                                .meteoriteType("碳酸盐")  // 分类:矿物类型
-                                .internationalName("N/A")  // 国际命名:无
-                                .discoveryTime("N/A")  // 发现时间:无
-                                .fallTime("N/A")  // 降落时间:无
-                                .source(SourceEnum.PURCHASE.getSource())  // 来源:采购
-                                .provider("无")  // 标本提供者:无
-                                .specimenPrice(new BigDecimal("56000"))  // 单价:56000元
-                                .acquisitionTime("2012/5/5")  // 入藏时间:2012年5月5日
-                                .mainPurpose(MainPurposeEnum.APPRECIATE.getMainPurpose())  // 主要用途:观赏
-                                .purpose("观赏,品质较佳者,经加工打磨后呈现美丽的同心圆花纹")  // 具体用途
-                                .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
-                                .imageName("P1110890.JPG")  // 图片资料:图件名称
-                                .description("这是一个矿石标本")  // 文献资料
-                                .notes("无")  // 备注
-                                .build()
-                );
-                break;
-            case 1: // 岩石-辉石橄榄岩
-                list = Arrays.asList(
-                        SpecimenImportExcelVO.builder()
-                                .specimenNumber("00881")  // 标本编号
-                                .assetNumber("")  // 资产号(没有提供)
-                                .chineseName("辉石橄榄岩")  // 中文名称
-                                .englishName("Pyroxene peridotite")  // 外文名称
-                                .specimenType(SpecimenTypeEnum.ROCK.getType())  // 标本类型:岩石
-                                .storageLocation("岩石王国")  // 存放位置
-                                .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
-                                .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
-                                .specimenAmount(1)  // 数量:1件
-                                .size("N/A")  // 规格:未提供
-                                .weight("N/A")  // 重量:未提供
-                                .composition("N/A")  // 成分/化学式:未提供
-                                .origin("张家口万全县")  // 产地/发现地:张家口万全县
-                                .economize("河北")  // 省:河北
-                                .country("中国(China)")  // 国家:中国
-                                .preservedLayer("N/A")  // 地质产状或层位:未提供
-                                .meteoriteType("N/A")  // 分类:未提供
-                                .internationalName("N/A")  // 国际命名:未提供
-                                .discoveryTime("N/A")  // 发现时间:未提供
-                                .fallTime("N/A")  // 降落时间:未提供
-                                .source(SourceEnum.DONATION.getSource())  // 来源:捐赠
-                                .provider("化探63级校友")  // 标本提供者:化探63级校友
-                                .specimenPrice(new BigDecimal("0.00"))  // 单价:未提供
-                                .acquisitionTime("2016/11/2")  // 入藏时间:2016年11月2日
-                                .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途:科学研究
-                                .purpose("可作耐火材料原料")  // 具体用途:可作耐火材料原料
-                                .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
-                                .imageName("DSC00183.JPG")  // 图片资料:图件名称
-                                .description("N/A")  // 文献资料:未提供
-                                .notes("N/A")  // 备注:未提供
-                                .build()
-                );
-                break;
-            case 2: // 总表
-                list = Arrays.asList(
-                        SpecimenImportExcelVO.builder()
-                                .specimenNumber("01522")  // 标本编号
-                                .assetNumber("20129103")  // 资产号
-                                .chineseName("贵州龙")  // 中文名称
-                                .englishName("keichousaurus")  // 外文名称
-                                .specimenType(SpecimenTypeEnum.FOSSIL.getType()) // 使用枚举:标本类型(矿物/矿石/岩石/化石/陨石)
-                                .storageLocation("临展厅")  // 存放位置
-                                .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType()) // 使用枚举:保存类型(标本/原石/光片/薄片/切片/模型及其他)
-                                .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态(完整/受损/严重受损/无实物)
-                                .specimenAmount(1)  // 数量(件/套)
-                                .size("1000cm")  // 规格(cm)
-                                .weight("1.5g")  // 重量(g)
-                                .composition("硅酸盐")  // 成分/化学式
-                                .origin("兴义县顶效镇绿荫村")  // 产地/发现地(市级县级产地)
-                                .economize("贵州省")  // 省
-                                .country("中国(China)")  // 国家
-                                .era("晚三叠世(距今2.1亿年)")  // 形成时代
-                                .preservedLayer("上三叠统竹竿坡组")  // 地质产状或层位(产出状态,化石指产出层位)
-                                .meteoriteType("脊索动物门鳍龙目肿肋龙亚目贵州龙科")  // 分类(矿物的类型/岩石的类型/化石的类型/陨石的类型)
-                                .internationalName("Mineral A")  // 国际命名
-                                .discoveryTime("2024/01/01")  // 发现时间
-                                .fallTime("2024/01/02")  // 降落时间
-                                .source(SourceEnum.PURCHASE.getSource()) // 使用枚举:来源(采购/捐赠/采集)
-                                .provider("天娇雅石居")  // 标本提供者
-                                .specimenPrice(new BigDecimal("5900.01"))  // 单价
-                                .acquisitionTime("2012/12/20")  // 入藏时间
-                                .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途(工业原料/药用/建材/科学研究/观赏/其它)
-                                .purpose("科学普及;对比研究")  // 具体用途
-                                .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态(在馆/展陈/借出)
-                                .imageName("image1.jpg、image2.jpg、image3.jpg")  // 图片资料(图件名称)
-                                .description("这是一个矿石标本")  // 文献资料
-                                .notes("备注信息")  // 备注
-                                .build()
-                );
-                break;
-            case 3: // 化石
-                list = Arrays.asList(
-                        SpecimenImportExcelVO.builder()
-                                .specimenNumber("01522")  // 标本编号
-                                .assetNumber("20129103")  // 资产号
-                                .chineseName("贵州龙")  // 中文名称
-                                .englishName("keichousaurus")  // 外文名称
-                                .specimenType(SpecimenTypeEnum.FOSSIL.getType())  // 标本类型:化石
-                                .storageLocation("临展厅")  // 存放位置
-                                .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
-                                .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
-                                .specimenAmount(1)  // 数量(件/套)
-                                .size("")  // 规格(cm) - 未提供,留空
-                                .origin("兴义县顶效镇绿荫村")  // 产地/发现地(市级县级产地)
-                                .economize("贵州省")  // 省
-                                .country("中国(China)")  // 国家
-                                .era("晚三叠世(距今2.1亿年)")  // 形成时代
-                                .preservedLayer("上三叠统竹竿坡组")  // 地质产状或层位
-                                .meteoriteType("脊索动物门鳍龙目肿肋龙亚目贵州龙科")  // 分类(化石的类型)
-                                .source(SourceEnum.PURCHASE.getSource())  // 来源:采购
-                                .provider("天娇雅石居")  // 标本提供者
-                                .specimenPrice(new BigDecimal("5900"))  // 单价(元)
-                                .acquisitionTime("2012/12/20")  // 入藏时间
-                                .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途:科学研究
-                                .purpose("科学普及;对比研究")  // 具体用途
-                                .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
-                                .imageName("1730775369277.JPG")  // 图片资料(图件名称)
-                                .description("贵州龙化石")  // 文献资料
-                                .notes("")  // 备注 - 未提供,留空
-                                .build()
-                );
-                break;
-            case 4: // 陨石
-                list = Arrays.asList(
-                        SpecimenImportExcelVO.builder()
-                                .specimenNumber("00691")  // 标本编号
-                                .assetNumber("")  // 资产号
-                                .chineseName("南丹铁陨石")  // 中文名称
-                                .englishName("Iron meteorite")  // 外文名称
-                                .specimenType(SpecimenTypeEnum.METEORITE.getType())  // 标本类型:陨石
-                                .storageLocation("序厅")  // 存放位置
-                                .preservationType(PreservationTypeEnum.ROUGH_STONE.getPreservationType())  // 保存类型:原石
-                                .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
-                                .specimenAmount(1)  // 数量(件/套)
-                                .size("150*120*90")  // 规格(cm)
-                                .weight("3500000")  // 重量(g)
-                                .composition("铁镍金属")  // 成分/化学式
-                                .origin("南丹")  // 产地/发现地(市级县级产地)
-                                .economize("广西")  // 省
-                                .country("中国(China)")  // 国家
-                                .meteoriteType("Iron, IAB-MG")  // 陨石的类型
-                                .internationalName("Nantan")  // 国际命名
-                                .discoveryTime("1958")  // 发现时间
-                                .fallTime("")  // 降落时间
-                                .source(SourceEnum.DONATION.getSource())  // 来源:捐赠
-                                .provider("化探63级校友")  // 标本提供者
-                                .specimenPrice(new BigDecimal("0"))  // 单价(元)
-                                .acquisitionTime("2016/11/2")  // 入藏时间
-                                .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途:科学研究
-                                .purpose("科学研究")  // 具体用途
-                                .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
-                                .imageName("DSC03583.JPG, DSC01271.JPG")  // 图片资料(图件名称)
-                                .description("南丹铁陨石样本")  // 文献资料
-                                .notes("")  // 备注
-                                .build()
-                );
-                break;
-            default:
-                throw exception(INVALID_SPECIMEN_TYPE);
+        // 定义 list 和 voClass
+        List<?> list = null;
+        Class<?> voClass = null;
+
+        // 使用 if 语句选择不同的模板
+        if (specimenType == 0) { // 矿物
+            voClass = MineralSpecimenImportExcelVO.class;
+            list = getMineralTemplate();
+        } else if (specimenType == 1) { // 岩石-矿石
+            voClass = RockSpecimenImportExcelVO.class;
+            list = getRockTemplate();
+        } else if (specimenType == 2) { // 总表
+            voClass = SpecimenImportExcelVO.class;
+            list = getAllExcel();
+        } else if (specimenType == 3) { // 化石
+            voClass = FossilSpecimenImportExcelVO.class;
+            list = getFossilTemplate();
+        } else if (specimenType == 4) { // 陨石
+            voClass = MeteoriteSpecimenImportExcelVO.class;
+            list = getMeteoriteTemplate();
+        } else {
+            throw exception(INVALID_SPECIMEN_TYPE); // 无效的标本类型
         }
 
-        // 使用 ExcelUtils 写入 Excel 文件
-        ExcelUtils.write(response, "标本导入模板.xls", "标本信息", SpecimenImportExcelVO.class, list);
+        // 强制转换 list 类型为具体类型(例如 MineralSpecimenImportExcelVO)
+        if (list != null && !list.isEmpty()) {
+            if (voClass == MineralSpecimenImportExcelVO.class) {
+                List<MineralSpecimenImportExcelVO> mineralList = (List<MineralSpecimenImportExcelVO>) list;
+                ExcelUtils.write(response, "矿物导入模板.xls", "标本信息", MineralSpecimenImportExcelVO.class, mineralList);
+            } else if (voClass == RockSpecimenImportExcelVO.class) {
+                List<RockSpecimenImportExcelVO> rockList = (List<RockSpecimenImportExcelVO>) list;
+                ExcelUtils.write(response, "岩石-矿石导入模板.xls", "标本信息", RockSpecimenImportExcelVO.class, rockList);
+
+            } else if (voClass == SpecimenImportExcelVO.class) {
+                List<SpecimenImportExcelVO> allList = (List<SpecimenImportExcelVO>) list;
+                ExcelUtils.write(response, "标本导入模板.xls", "标本信息", SpecimenImportExcelVO.class, allList);
+
+            } else if (voClass == FossilSpecimenImportExcelVO.class) {
+                List<FossilSpecimenImportExcelVO> fossilList = (List<FossilSpecimenImportExcelVO>) list;
+                ExcelUtils.write(response, "化石导入模板.xls", "标本信息", FossilSpecimenImportExcelVO.class, fossilList);
+            } else if (voClass == MeteoriteSpecimenImportExcelVO.class) {
+                List<MeteoriteSpecimenImportExcelVO> meteoriteList = (List<MeteoriteSpecimenImportExcelVO>) list;
+                ExcelUtils.write(response, "陨石导入模板.xls", "标本信息", MeteoriteSpecimenImportExcelVO.class, meteoriteList);
+            }
+        }
+    }
+
+    private List<MineralSpecimenImportExcelVO> getMineralTemplate() {
+        return Arrays.asList(
+                MineralSpecimenImportExcelVO.builder()
+                        .specimenNumber("00716")  // 标本编号
+                        .assetNumber("20121324")  // 资产号
+                        .chineseName("文石晶簇")  // 中文名称
+                        .englishName("Aragonite")  // 外文名称
+                        .specimenType(SpecimenTypeEnum.MINERAL.getType())  // 标本类型:矿物
+                        .storageLocation("奇妙的矿物世界")  // 存放位置
+                        .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
+                        .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
+                        .specimenAmount(1)  // 数量:1件
+                        .size("11000")  // 规格:无
+                        .weight("11220.22")  // 重量:无
+                        .composition("CaCO3")  // 成分/化学式:碳酸钙
+                        .origin("湖北")  // 产地
+                        .economize("湖北")  // 省
+                        .country("中国(China)")  // 国家
+                        .era("N/A")  // 形成时代:无
+                        .meteoriteType("碳酸盐")  // 分类:矿物类型
+                        .source(SourceEnum.PURCHASE.getSource())  // 来源:采购
+                        .provider("无")  // 标本提供者:无
+                        .specimenPrice(new BigDecimal("56000"))  // 单价:56000元
+                        .acquisitionTime("2012/5/5")  // 入藏时间:2012年5月5日
+                        .mainPurpose(MainPurposeEnum.APPRECIATE.getMainPurpose())  // 主要用途:观赏
+                        .purpose("观赏,品质较佳者,经加工打磨后呈现美丽的同心圆花纹")  // 具体用途
+                        .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
+                        .imageName("P1110890.JPG")  // 图片资料:图件名称
+                        .description("这是一个矿石标本")  // 文献资料
+                        .notes("无")  // 备注
+                        .build()
+        );
+    }
+
+    private List<RockSpecimenImportExcelVO> getRockTemplate() {
+        return Arrays.asList(
+                RockSpecimenImportExcelVO.builder()
+                        .specimenNumber("00881")  // 标本编号
+                        .assetNumber("")  // 资产号
+                        .chineseName("辉石橄榄岩")  // 中文名称
+                        .englishName("Pyroxene peridotite")  // 外文名称
+                        .specimenType(SpecimenTypeEnum.ROCK.getType())  // 标本类型:岩石
+                        .storageLocation("岩石王国")  // 存放位置
+                        .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
+                        .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
+                        .specimenAmount(1)  // 数量:1件
+                        .size("1000")  // 规格:未提供
+                        .weight("1000.01")  // 重量:未提供
+                        .composition("")  // 成分/化学式:未提供
+                        .origin("张家口万全县")  // 产地/发现地
+                        .economize("河北")  // 省:河北
+                        .country("中国(China)")  // 国家:中国
+                        .preservedLayer("N/A")  // 地质产状或层位:未提供
+                        .meteoriteType("N/A")  // 分类:未提供
+                        .source(SourceEnum.DONATION.getSource())  // 来源:捐赠
+                        .provider("化探63级校友")  // 标本提供者
+                        .specimenPrice(new BigDecimal("0.00"))  // 单价:未提供
+                        .acquisitionTime("2016/11/2")  // 入藏时间
+                        .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途:科学研究
+                        .purpose("可作耐火材料原料")  // 具体用途:可作耐火材料原料
+                        .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
+                        .imageName("DSC00183.JPG")  // 图片资料:图件名称
+                        .description("N/A")  // 文献资料
+                        .notes("N/A")  // 备注
+                        .build()
+        );
+    }
+
+    private List<RockSpecimenImportExcelVO> getAllExcel() {
+        return Arrays.asList(
+                RockSpecimenImportExcelVO.builder()
+                        .specimenNumber("00881")  // 标本编号
+                        .assetNumber("")  // 资产号
+                        .chineseName("辉石橄榄岩")  // 中文名称
+                        .englishName("Pyroxene peridotite")  // 外文名称
+                        .specimenType(SpecimenTypeEnum.ROCK.getType())  // 标本类型:岩石
+                        .storageLocation("岩石王国")  // 存放位置
+                        .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
+                        .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
+                        .specimenAmount(1)  // 数量:1件
+                        .size("1000")  // 规格:未提供
+                        .weight("1000.01")  // 重量:未提供
+                        .composition("")  // 成分/化学式:未提供
+                        .origin("张家口万全县")  // 产地/发现地
+                        .economize("河北")  // 省:河北
+                        .country("中国(China)")  // 国家:中国
+                        .preservedLayer("N/A")  // 地质产状或层位:未提供
+                        .meteoriteType("N/A")  // 分类:未提供
+                        .source(SourceEnum.DONATION.getSource())  // 来源:捐赠
+                        .provider("化探63级校友")  // 标本提供者
+                        .specimenPrice(new BigDecimal("0.00"))  // 单价:未提供
+                        .acquisitionTime("2016/11/2")  // 入藏时间
+                        .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途:科学研究
+                        .purpose("可作耐火材料原料")  // 具体用途:可作耐火材料原料
+                        .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态:展陈
+                        .imageName("DSC00183.JPG")  // 图片资料:图件名称
+                        .description("N/A")  // 文献资料
+                        .notes("N/A")  // 备注
+                        .build()
+        );
+    }
+
+    private List<FossilSpecimenImportExcelVO> getFossilTemplate() {
+        return Arrays.asList(
+                FossilSpecimenImportExcelVO.builder()
+                        .specimenNumber("01522")  // 标本编号
+                        .assetNumber("20129103")  // 资产号
+                        .chineseName("贵州龙")  // 中文名称
+                        .englishName("Keichousaurus")  // 外文名称
+                        .specimenType(SpecimenTypeEnum.FOSSIL.getType())  // 标本类型:化石
+                        .storageLocation("临展厅")  // 存放位置
+                        .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
+                        .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
+                        .specimenAmount(1)  // 数量:1件
+                        .size("1000cm")  // 规格(cm)
+                        .origin("兴义县顶效镇绿荫村")  // 产地/发现地
+                        .economize("贵州省")  // 省
+                        .country("中国(China)")  // 国家
+                        .era("晚三叠世(距今2.1亿年)")  // 形成时代
+                        .preservedLayer("上三叠统竹竿坡组")  // 地质产状或层位
+                        .meteoriteType("脊索动物门鳍龙目肿肋龙亚目贵州龙科")  // 分类
+                        .source(SourceEnum.PURCHASE.getSource())  // 来源
+                        .provider("天娇雅石居")  // 标本提供者
+                        .specimenPrice(new BigDecimal("5900.01"))  // 单价
+                        .acquisitionTime("2012/12/20")  // 入藏时间
+                        .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途
+                        .purpose("科学普及;对比研究")  // 具体用途
+                        .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态
+                        .imageName("image1.jpg、image2.jpg、image3.jpg")  // 图片资料
+                        .description("这是一个化石标本")  // 文献资料
+                        .notes("备注信息")  // 备注
+                        .build()
+        );
     }
 
+    private List<MeteoriteSpecimenImportExcelVO> getMeteoriteTemplate() {
+        return Arrays.asList(
+                MeteoriteSpecimenImportExcelVO.builder()
+                        .specimenNumber("0011")  // 标本编号
+                        .assetNumber("M1001")  // 资产号
+                        .chineseName("月球陨石")  // 中文名称
+                        .englishName("Lunar Meteorite")  // 外文名称
+                        .specimenType(SpecimenTypeEnum.METEORITE.getType())  // 标本类型:陨石
+                        .storageLocation("太空博物馆")  // 存放位置
+                        .preservationType(PreservationTypeEnum.SPECIMEN.getPreservationType())  // 保存类型:标本
+                        .saveStatus(SaveStatusEnum.COMPLETE.getSaveStatus())  // 保存状态:完整
+                        .specimenAmount(1)  // 数量:1件
+                        .size("8cm x 5cm x 4cm")  // 规格
+                        .weight("250g")  // 重量
+                        .composition("岩石和矿物的复合物")  // 成分/化学式
+                        .origin("月球")  // 产地
+                        .economize("外太空")  // 省
+                        .country("中国(China)")  // 国家
+                        .source(SourceEnum.PURCHASE.getSource())  // 来源
+                        .provider("NASA")  // 标本提供者
+                        .specimenPrice(new BigDecimal("120000"))  // 单价:120000元
+                        .acquisitionTime("2015/3/5")  // 入藏时间
+                        .mainPurpose(MainPurposeEnum.RESERECH.getMainPurpose())  // 主要用途:科学研究
+                        .purpose("研究月球成分,开发太空技术")  // 具体用途
+                        .collectionStatus(CollectionStatusEnum.EXHIBITION.getStatus())  // 馆藏状态
+                        .imageName("moonrock.jpg")  // 图片资料
+                        .description("这是一块来自月球的陨石")  // 文献资料
+                        .notes("极其珍贵的标本")  // 备注
+                        .build()
+        );
+    }
+
+
+
 
     @PostMapping("/import-specimen-with-images")
     @Operation(summary = "导入标本及其图片")

+ 105 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/vo/FossilSpecimenImportExcelVO.java

@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.module.museums.controller.admin.specimeninfo.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.museums.enums.DictTypeConstants;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class FossilSpecimenImportExcelVO {
+
+    @ExcelProperty("标本编号")
+    private String specimenNumber;
+
+    @ExcelProperty("资产号")
+    private String assetNumber;
+
+    @ExcelProperty("中文名称")
+    private String chineseName;
+
+    @ExcelProperty("外文名称")
+    private String englishName;
+
+    @ExcelProperty(value = "标本类型(矿物/矿石/岩石/化石/陨石)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_TYPE)
+    private Integer specimenType;
+
+    @ExcelProperty("存放位置")
+    private String storageLocation;
+
+    @ExcelProperty(value = "保存类型(标本/原石/光片/薄片/切片/模型及其他)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_INFO)
+    private Integer preservationType;
+
+    @ExcelProperty(value = "保存状态(完整/受损/严重受损/无实物)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_PRESERVATION_STATUS)
+    private Integer saveStatus;
+
+    @ExcelProperty("数量(件/套)")
+    private Integer specimenAmount;
+
+    @ExcelProperty("规格(cm)")
+    private String size;
+
+    @ExcelProperty("产地/发现地(市级县级产地)")
+    private String origin;
+
+    @ExcelProperty("省")
+    private String economize;
+
+    @ExcelProperty("国家")
+    private String country;
+
+    @ExcelProperty("形成时代")
+    private String era;
+
+    @ExcelProperty("地质产状或层位(产出状态,化石指产出层位)")
+    private String preservedLayer;
+
+    @ExcelProperty("分类(矿物的类型/岩石的类型/化石的类型/陨石的类型)")
+    private String meteoriteType;
+
+    @ExcelProperty(value = "来源(采购/捐赠/采集)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SOURCE)
+    private Integer source;
+
+    @ExcelProperty("标本提供者")
+    private String provider;
+
+    @ExcelProperty("单价")
+    private BigDecimal specimenPrice;
+
+    @ExcelProperty("入藏时间")
+    private String acquisitionTime;
+
+    @ExcelProperty(value = "主要用途(工业原料/药用/建材/科学研究/观赏/其它)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_MAIN_USES)
+    private Integer mainPurpose;
+
+    @ExcelProperty("具体用途")
+    private String purpose;
+
+    @ExcelProperty(value = "馆藏状态(在馆/展陈/借出)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_COLLECTION_STATUS)
+    private Integer collectionStatus;
+
+    @ExcelProperty("图片资料(图件名称)")
+    private String imageName;
+
+    @ExcelProperty("文献资料")
+    private String description;
+
+    @ExcelProperty("备注")
+    private String notes;
+}

+ 114 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/vo/MeteoriteSpecimenImportExcelVO.java

@@ -0,0 +1,114 @@
+package cn.iocoder.yudao.module.museums.controller.admin.specimeninfo.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.museums.enums.DictTypeConstants;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class MeteoriteSpecimenImportExcelVO {
+
+    @ExcelProperty("标本编号")
+    private String specimenNumber;
+
+    @ExcelProperty("资产号")
+    private String assetNumber;
+
+    @ExcelProperty("中文名称")
+    private String chineseName;
+
+    @ExcelProperty("外文名称")
+    private String englishName;
+
+    @ExcelProperty(value = "标本类型(矿物/矿石/岩石/化石/陨石)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_TYPE)
+    private Integer specimenType;
+
+    @ExcelProperty("存放位置")
+    private String storageLocation;
+
+    @ExcelProperty(value = "保存类型(标本/原石/光片/薄片/切片/模型及其他)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_INFO)
+    private Integer preservationType;
+
+    @ExcelProperty(value = "保存状态(完整/受损/严重受损/无实物)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_PRESERVATION_STATUS)
+    private Integer saveStatus;
+
+    @ExcelProperty("数量(件/套)")
+    private Integer specimenAmount;
+
+    @ExcelProperty("规格(cm)")
+    private String size;
+
+    @ExcelProperty("重量(g)")
+    private String weight;
+
+    @ExcelProperty("成分/化学式")
+    private String composition;
+
+    @ExcelProperty("产地/发现地(市级县级产地)")
+    private String origin;
+
+    @ExcelProperty("省")
+    private String economize;
+
+    @ExcelProperty("国家")
+    private String country;
+
+    @ExcelProperty("分类(矿物的类型/岩石的类型/化石的类型/陨石的类型)")
+    private String meteoriteType;
+
+    @ExcelProperty("国际命名")
+    private String internationalName;
+
+    @ExcelProperty("发现时间")
+    private String discoveryTime;
+
+    @ExcelProperty("降落时间")
+    private String fallTime;
+
+    @ExcelProperty(value = "来源(采购/捐赠/采集)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SOURCE)
+    private Integer source;
+
+    @ExcelProperty("标本提供者")
+    private String provider;
+
+    @ExcelProperty("单价")
+    private BigDecimal specimenPrice;
+
+    @ExcelProperty("入藏时间")
+    private String acquisitionTime;
+
+    @ExcelProperty(value = "主要用途(工业原料/药用/建材/科学研究/观赏/其它)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_MAIN_USES)
+    private Integer mainPurpose;
+
+    @ExcelProperty("具体用途")
+    private String purpose;
+
+    @ExcelProperty(value = "馆藏状态(在馆/展陈/借出)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_COLLECTION_STATUS)
+    private Integer collectionStatus;
+
+    @ExcelProperty("图片资料(图件名称)")
+    private String imageName;
+
+    @ExcelProperty("文献资料")
+    private String description;
+
+    @ExcelProperty("备注")
+    private String notes;
+}

+ 107 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/vo/MineralSpecimenImportExcelVO.java

@@ -0,0 +1,107 @@
+package cn.iocoder.yudao.module.museums.controller.admin.specimeninfo.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.museums.enums.DictTypeConstants;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class MineralSpecimenImportExcelVO {
+    @ExcelProperty("标本编号")
+    private String specimenNumber;
+
+    @ExcelProperty("资产号")
+    private String assetNumber;
+
+    @ExcelProperty("中文名称")
+    private String chineseName;
+
+    @ExcelProperty("外文名称")
+    private String englishName;
+
+    @ExcelProperty(value = "标本类型(矿物/矿石/岩石/化石/陨石)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_TYPE)
+    private Integer specimenType;
+
+    @ExcelProperty("存放位置")
+    private String storageLocation;
+
+    @ExcelProperty(value = "保存类型(标本/原石/光片/薄片/切片/模型及其他)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_INFO)
+    private Integer preservationType;
+
+    @ExcelProperty(value = "保存状态(完整/受损/严重受损/无实物)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_PRESERVATION_STATUS)
+    private Integer saveStatus;
+
+    @ExcelProperty("数量(件/套)")
+    private Integer specimenAmount;
+
+    @ExcelProperty("规格(cm)")
+    private String size;
+
+    @ExcelProperty("重量(g)")
+    private String weight;
+
+    @ExcelProperty("成分/化学式")
+    private String composition;
+
+    @ExcelProperty("产地/发现地(市级县级产地)")
+    private String origin;
+
+    @ExcelProperty("省")
+    private String economize;
+
+    @ExcelProperty("国家")
+    private String country;
+
+    @ExcelProperty("形成时代")
+    private String era;
+
+    @ExcelProperty("分类(矿物的类型/岩石的类型/化石的类型/陨石的类型)")
+    private String meteoriteType;
+
+    @ExcelProperty(value = "来源(采购/捐赠/采集)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SOURCE)
+    private Integer source;
+
+    @ExcelProperty("标本提供者")
+    private String provider;
+
+    @ExcelProperty("单价")
+    private BigDecimal specimenPrice;
+
+    @ExcelProperty("入藏时间")
+    private String acquisitionTime;
+
+    @ExcelProperty(value = "主要用途(工业原料/药用/建材/科学研究/观赏/其它)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_MAIN_USES)
+    private Integer mainPurpose;
+
+    @ExcelProperty("具体用途")
+    private String purpose;
+
+    @ExcelProperty(value = "馆藏状态(在馆/展陈/借出)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_COLLECTION_STATUS)
+    private Integer collectionStatus;
+
+    @ExcelProperty("图片资料(图件名称)")
+    private String imageName;
+
+    @ExcelProperty("文献资料")
+    private String description;
+
+    @ExcelProperty("备注")
+    private String notes;
+}

+ 111 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/vo/RockSpecimenImportExcelVO.java

@@ -0,0 +1,111 @@
+package cn.iocoder.yudao.module.museums.controller.admin.specimeninfo.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.module.museums.enums.DictTypeConstants;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class RockSpecimenImportExcelVO {
+
+    @ExcelProperty("标本编号")
+    private String specimenNumber;
+
+    @ExcelProperty("资产号")
+    private String assetNumber;
+
+    @ExcelProperty("中文名称")
+    private String chineseName;
+
+    @ExcelProperty("外文名称")
+    private String englishName;
+
+    @ExcelProperty(value = "标本类型(矿物/矿石/岩石/化石/陨石)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_TYPE)
+    private Integer specimenType;
+
+    @ExcelProperty("存放位置")
+    private String storageLocation;
+
+    @ExcelProperty(value = "保存类型(标本/原石/光片/薄片/切片/模型及其他)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_INFO)
+    private Integer preservationType;
+
+    @ExcelProperty(value = "保存状态(完整/受损/严重受损/无实物)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_PRESERVATION_STATUS)
+    private Integer saveStatus;
+
+    @ExcelProperty("数量(件/套)")
+    private Integer specimenAmount;
+
+    @ExcelProperty("规格(cm)")
+    private String size;
+
+    @ExcelProperty("重量(g)")
+    private String weight;
+
+    @ExcelProperty("成分/化学式")
+    private String composition;
+
+    @ExcelProperty("产地/发现地(市级县级产地)")
+    private String origin;
+
+    @ExcelProperty("省")
+    private String economize;
+
+    @ExcelProperty("国家")
+    private String country;
+
+    @ExcelProperty("形成时代")
+    private String era;
+
+    @ExcelProperty("地质产状或层位(产出状态,化石指产出层位)")
+    private String preservedLayer;
+
+    @ExcelProperty("分类(矿物的类型/岩石的类型/化石的类型/陨石的类型)")
+    private String meteoriteType;
+
+    @ExcelProperty(value = "来源(采购/捐赠/采集)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SOURCE)
+    private Integer source;
+
+    @ExcelProperty("标本提供者")
+    private String provider;
+
+    @ExcelProperty("单价")
+    private BigDecimal specimenPrice;
+
+    @ExcelProperty("入藏时间")
+    private String acquisitionTime;
+
+    @ExcelProperty(value = "主要用途(工业原料/药用/建材/科学研究/观赏/其它)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_SPECIMEN_MAIN_USES)
+    private Integer mainPurpose;
+
+    @ExcelProperty("具体用途")
+    private String purpose;
+
+    @ExcelProperty(value = "馆藏状态(在馆/展陈/借出)", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.MUSEUMS_COLLECTION_STATUS)
+    private Integer collectionStatus;
+
+    @ExcelProperty("图片资料(图件名称)")
+    private String imageName;
+
+    @ExcelProperty("文献资料")
+    private String description;
+
+    @ExcelProperty("备注")
+    private String notes;
+}