Browse Source

更新了用Excel表导入标本

lwh 3 weeks ago
parent
commit
85c0f64903
18 changed files with 368 additions and 47 deletions
  1. 0 2
      yudao-module-museum/yudao-module-museum-api/src/main/java/cn/iocoder/yudao/module/museum/enums/social/LogRecordConstants.java
  2. 12 0
      yudao-module-museum/yudao-module-museum-biz/pom.xml
  3. 48 5
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/MuseumInfoController.java
  4. 1 1
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseumInfoRespVO.java
  5. 1 1
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseumInfoSaveVO.java
  6. 99 0
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseuminfoImportExcelVO.java
  7. 26 0
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseuminfoImportRespVO.java
  8. 0 14
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseuminfoTypeVO.java
  9. 9 9
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museummodel/MuseumModelController.java
  10. 1 2
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/dal/database/museuminfo/MuseumInfoDO.java
  11. 10 0
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/dal/mysql/museuminfo/MuseumInfoMapper.java
  12. 17 2
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museuminfo/MuseumInfoService.java
  13. 134 5
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museuminfo/MuseumInfoServiceImpl.java
  14. 1 1
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museummodel/MuseummodelService.java
  15. 4 4
      yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museummodel/MuseummodelServiceImpl.java
  16. 3 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
  17. 1 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
  18. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

+ 0 - 2
yudao-module-museum/yudao-module-museum-api/src/main/java/cn/iocoder/yudao/module/museum/enums/social/LogRecordConstants.java

@@ -43,6 +43,4 @@ public interface LogRecordConstants {
     String BACK_MUSEUM_SUB_TYPE = "回库记录";
     String BACK_MUSEUM_SUB_TYPE_SUCCESS = "标本【{{#sampleId.chineseName}}】回库成功";
 
-
-
 }

+ 12 - 0
yudao-module-museum/yudao-module-museum-biz/pom.xml

@@ -87,6 +87,18 @@
             <version>2.3.0-jdk8-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-museum-api</artifactId>
+            <version>2.3.0-jdk8-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-system-biz</artifactId>
+            <version>2.3.0-jdk8-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 48 - 5
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/MuseumInfoController.java

@@ -1,26 +1,37 @@
 package cn.iocoder.yudao.module.museum.controller.admin.museuminfo;
 
 import cn.hutool.json.JSONArray;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.museum.controller.admin.museuminfo.vo.*;
 import cn.iocoder.yudao.module.museum.dal.database.museuminfo.MuseumInfoDO;
 import cn.iocoder.yudao.module.museum.service.museuminfo.MuseumInfoService;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
+import cn.iocoder.yudao.module.system.enums.common.SexEnum;
+import com.alibaba.druid.filter.logging.Log4j2Filter;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "博物馆-标本库")
@@ -35,7 +46,7 @@ public class MuseumInfoController {
     //TODO 判断标本编号是否重复
     @PostMapping("/create")
     @Operation(summary = "新增标本")
-    public CommonResult<Long> createMuseumInfo(@RequestBody MuseumInfoSaveVO saveVO) {
+    public CommonResult<Integer> createMuseumInfo(@RequestBody MuseumInfoSaveVO saveVO) {
         String sampleId = saveVO.getSampleId();
         String result = museumInfoService.getMuseumInfoBySampleId(sampleId);
         if (result != null) {
@@ -87,6 +98,14 @@ public class MuseumInfoController {
         return CommonResult.success(result1);
     }
 
+    @GetMapping("/getSample")
+    @Operation(summary = "所有标本查寻")
+    public CommonResult<List<MuseumInfoRespVO>>selectMuseumInfo(){
+        List<MuseumInfoDO> result = museumInfoService.selectMuseumInfo();
+        List<MuseumInfoRespVO> result1 = BeanUtils.toBean(result,MuseumInfoRespVO.class);
+        return CommonResult.success(result1);
+    }
+
     @GetMapping("/getSampleType")
     @Operation(summary = "标本类型查寻")
     public CommonResult<List<MuseumInfoRespVO>> selectMuseumInfoBySampleType(@RequestParam("sampleType") Integer sampleType){
@@ -265,6 +284,30 @@ public class MuseumInfoController {
         }
         return CommonResult.success(result);
     }
+    @GetMapping("/get-import-sample")
+    @Operation(summary = "获得导入标本模板")
+    public void importSample(HttpServletResponse response) throws IOException {
+        List<MuseuminfoImportExcelVO> list = Arrays.asList(
+                MuseuminfoImportExcelVO.builder().sampleId("1111").sampleTypeC("陨石").place("1C").chineseName("15601691300")
+                        .build(),
+                MuseuminfoImportExcelVO.builder().sampleId("1112").sampleTypeC("矿石").place("2C").chineseName("15601701300")
+                        .build()
+        );
+
+        ExcelUtils.write(response, "标本导入模板.xls", "标本列表", MuseuminfoImportExcelVO.class, list);
+    }
+
+    @PostMapping("/import")
+    @Operation(summary = "导入标本")
+    @Parameters({
+            @Parameter(name = "file", description = "Excel 文件", required = true),
+            @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
+    })
+    public CommonResult<MuseuminfoImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
+                                                             @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
+        List<MuseuminfoImportExcelVO> list = ExcelUtils.read(file, MuseuminfoImportExcelVO.class);
+        return success(museumInfoService.importSampleList(list, updateSupport));
+    }
 
 
 

+ 1 - 1
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseumInfoRespVO.java

@@ -14,7 +14,7 @@ public class MuseumInfoRespVO {
 //private Integer Ynumber;
 
     @Schema(description = "标本id")
-    private Long id;
+    private Integer id;
 
     @Schema(description = "标本编号")
     private String sampleId;

+ 1 - 1
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseumInfoSaveVO.java

@@ -11,7 +11,7 @@ import java.time.LocalDateTime;
 public class MuseumInfoSaveVO {
 
     @Schema(description = "标本id")
-    private Long id;
+    private Integer id;
 
     @Schema(description = "标本编号")
     private String sampleId;

+ 99 - 0
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseuminfoImportExcelVO.java

@@ -0,0 +1,99 @@
+package cn.iocoder.yudao.module.museum.controller.admin.museuminfo.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jdk.nashorn.internal.ir.annotations.Ignore;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 标本 Excel 导入 VO
+ */
+@Schema(description = "博物馆-标本信息 ExcelVO")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class MuseuminfoImportExcelVO {
+    @ExcelProperty("标本编号")
+    private String sampleId;
+
+    @ExcelProperty("标本类型")
+    private String sampleTypeC;
+
+    @ExcelProperty("存放位置")
+    private String place;
+
+    @ExcelProperty("中文名称")
+    private String chineseName;
+
+    @Ignore
+    private Integer sampleType;
+
+
+
+//    @Schema(description = "英文名称")
+//    private String englishName;
+//
+//    @Schema(description = "国际名称")
+//    private String internationName;
+//
+//    @Schema(description = "保存类型")
+//    private Integer keepType;
+//
+//    @Schema(description = "成份")
+//    private String element;
+//
+//    @Schema(description = "产地")
+//    private String  local;
+//
+//    @Schema(description = "时代")
+//    private LocalDateTime bronTime ;
+//
+//    @Schema(description = "保存地层")
+//    private String stratum;
+//
+//    @Schema(description = "发现时间")
+//    private LocalDateTime findTime;
+//
+//    @Schema(description = "尺寸")
+//    private String size;
+//
+//    @Schema(description = "重量")
+//    private Long weight;
+//
+//    @Schema(description = "来源")
+//    private String origin;
+//
+//    @Schema(description = "描述")
+//    private String character;
+//
+//    @Schema(description = "馆藏状态")
+//    private Integer save;
+//
+//    @Schema(description = "入库时间")
+//    private LocalDateTime sampleSaveTime;
+//
+//    @Schema(description = "用途")
+//    private String Use;
+//
+//    @Schema(description = "资产号")
+//    private String fundId;
+//
+//    @Schema(description = "删除原因")
+//    private String reason;
+//
+//    @Schema(description = "标本图片")
+//    private List<String> picture;
+//
+//    @Schema(description = "备注")
+//    private String sampleTip;
+}
+

+ 26 - 0
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseuminfoImportRespVO.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.museum.controller.admin.museuminfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Schema(description = "管理后台 - 用户导入 Resp VO")
+@Data
+@Builder
+public class MuseuminfoImportRespVO {
+    @Schema(description = "创建成功的标本名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> createSampleIds;
+
+    @Schema(description = "更新成功的标本名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> updateSampleIds;
+
+    @Schema(description = "导入失败的标本集合,key 为标本名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Map<String, String> failureSampleIds;
+}

+ 0 - 14
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museuminfo/vo/MuseuminfoTypeVO.java

@@ -1,14 +0,0 @@
-package cn.iocoder.yudao.module.museum.controller.admin.museuminfo.vo;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "博物馆-标本信息 type VO")
-@Data
-public class MuseuminfoTypeVO {
-    private Integer sampleType;
-    private Integer count;
-}

+ 9 - 9
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museummodel/MuseumModelController.java

@@ -82,15 +82,15 @@ public class MuseumModelController {
         return CommonResult.success(result1);
     }
 
-    @GetMapping("/getBySpecimenType")
-    @Operation(summary = "通过标本类型返回所有标本模型")
-    public CommonResult<Map<Integer, MuseummodelRespVO>> getMuseumModelBySpecimenType(@RequestParam("specimenType") String specimenType) {
-        List<MuseummodelDO> result = museumModelService.getMuseumModelBySpecimenType(specimenType);
-        List<MuseummodelRespVO> respVOs = BeanUtils.toBean(result, MuseummodelRespVO.class);
-        Map<Integer, MuseummodelRespVO> map = respVOs.stream()
-                .collect(Collectors.toMap(MuseummodelRespVO::getId, vo -> vo));
-        return CommonResult.success(map);
-    }
+//    @GetMapping("/getBySpecimenType")
+//    @Operation(summary = "通过标本类型返回所有标本模型")
+//    public CommonResult<Map<Integer, MuseummodelRespVO>> getMuseumModelBySpecimenType(@RequestParam("specimenType") String specimenType) {
+//        List<MuseummodelDO> result = museumModelService.getMuseumModelBySpecimenType(specimenType);
+//        List<MuseummodelRespVO> respVOs = BeanUtils.toBean(result, MuseummodelRespVO.class);
+//        Map<Integer, MuseummodelRespVO> map = respVOs.stream()
+//                .collect(Collectors.toMap(MuseummodelRespVO::getId, vo -> vo));
+//        return CommonResult.success(map);
+//    }
 
     @GetMapping("/page")
     @Operation(summary = "获得模型分页")

+ 1 - 2
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/dal/database/museuminfo/MuseumInfoDO.java

@@ -19,12 +19,11 @@ import java.time.LocalDateTime;
 @NoArgsConstructor
 @AllArgsConstructor
 public class MuseumInfoDO extends BaseDO {
-
     /**
      * 标本ID
      */
     @TableId
-    private Long id;
+    private Integer id;
     /**
      * 标本编号
      */

+ 10 - 0
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/dal/mysql/museuminfo/MuseumInfoMapper.java

@@ -49,8 +49,16 @@ public interface MuseumInfoMapper extends BaseMapperX<MuseumInfoDO> {
      */
     @Select("SELECT * FROM museum_info WHERE sample_id =#{sampleId} AND deleted =0")
     String getMuseumInfoBySampleId(@Param("sampleId") String sampleId);
+
+    @Select("SELECT * FROM museum_info WHERE sample_id =#{sampleId} AND deleted =0")
     MuseumInfoDO selectMuseumInfoBySampleId(@Param("sampleId") String sampleId);
 
+    /**
+     * 查询所有标本
+     */
+    @Select("SELECT * FROM museum_info WHERE deleted =0")
+    List<MuseumInfoDO> selectMuseumInfo();
+
     /**
      * 查询标本类型
      */
@@ -125,6 +133,8 @@ public interface MuseumInfoMapper extends BaseMapperX<MuseumInfoDO> {
     Integer countMuseumInfoByOrigin(@Param("year") Integer year, @Param("origin") Integer origin);
 
 
+
+
     /**
      * 分页
      */

+ 17 - 2
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museuminfo/MuseumInfoService.java

@@ -3,6 +3,9 @@ package cn.iocoder.yudao.module.museum.service.museuminfo;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.museum.controller.admin.museuminfo.vo.*;
 import cn.iocoder.yudao.module.museum.dal.database.museuminfo.MuseumInfoDO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 
@@ -16,7 +19,7 @@ public interface MuseumInfoService {
    /**
     * 创建标本
    * */
-   Long createMuseumInfo(MuseumInfoSaveVO saveVO);
+   Integer createMuseumInfo(MuseumInfoSaveVO saveVO);
 
    /**
     * 更新标本
@@ -38,7 +41,6 @@ public interface MuseumInfoService {
     * 查询标本
     * */
    MuseumInfoDO selectMuseumInfo (Integer id);
-
    /**
     * 查询标本编号
     * */
@@ -47,6 +49,10 @@ public interface MuseumInfoService {
     * 查询标本编号1
     * */
    MuseumInfoDO selectMuseumInfoBySampleId(String sampleId);
+   /**
+    * 查询所有标本
+    */
+   List<MuseumInfoDO> selectMuseumInfo();
    /**
    * 查询标本类型
    * */
@@ -83,4 +89,13 @@ public interface MuseumInfoService {
     * 标本来源计数(年)
     * */
    Integer MuseumInfoByOrigin(Integer year, Integer origin);
+   /**
+    * 批量导入用户
+    *
+    * @param importSamples    导入用户列表
+    * @param isUpdateSupport 是否支持更新
+    * @return 导入结果
+    */
+   MuseuminfoImportRespVO importSampleList(List<MuseuminfoImportExcelVO> importSamples,boolean isUpdateSupport);
+
 }

+ 134 - 5
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museuminfo/MuseumInfoServiceImpl.java

@@ -1,26 +1,36 @@
 package cn.iocoder.yudao.module.museum.service.museuminfo;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.module.museum.controller.admin.museuminfo.vo.*;
 import cn.iocoder.yudao.module.museum.dal.database.museuminfo.MuseumInfoDO;
 import cn.iocoder.yudao.module.museum.dal.mysql.museuminfo.MuseumInfoMapper;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportRespVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import com.google.common.annotations.VisibleForTesting;
 import com.mzt.logapi.context.LogRecordContext;
 import com.mzt.logapi.service.impl.DiffParseFunction;
 import com.mzt.logapi.starter.annotation.LogRecord;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.singleton;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
 import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*;
 import static cn.iocoder.yudao.module.museum.enums.social.LogRecordConstants.*;
 
+
 @Service
 public  class  MuseumInfoServiceImpl implements MuseumInfoService {
 
@@ -34,7 +44,7 @@ public  class  MuseumInfoServiceImpl implements MuseumInfoService {
    @Override
    @LogRecord(type = MUSEUM_TYPE, subType = CREATE_SUB_TYPE, bizNo = "{{#sampleId.id}}",
            success =  CREATE_SUB_TYPE_SUCCESS)
-   public Long createMuseumInfo(MuseumInfoSaveVO saveVO) {
+   public Integer createMuseumInfo(MuseumInfoSaveVO saveVO) {
       MuseumInfoDO sampleId = BeanUtils.toBean(saveVO, MuseumInfoDO.class);
       museumInfoMapper.insert(sampleId);
       LogRecordContext.putVariable("sampleId", sampleId );
@@ -109,6 +119,13 @@ public  class  MuseumInfoServiceImpl implements MuseumInfoService {
    public  MuseumInfoDO selectMuseumInfoBySampleId (String sampleId) {
       return museumInfoMapper.selectMuseumInfoBySampleId(sampleId);
    }
+   /**
+    * 查询所有标本
+    */
+   @Override
+   public  List<MuseumInfoDO> selectMuseumInfo () {
+      return museumInfoMapper.selectMuseumInfo();
+   }
    /**
     * 查询标本类型
     */
@@ -169,6 +186,118 @@ public  class  MuseumInfoServiceImpl implements MuseumInfoService {
    public Integer MuseumInfoByOrigin(Integer year, Integer origin) {
       return museumInfoMapper.countMuseumInfoByOrigin(year,origin);
    }
+   /**
+    * 批量导入用户
+    *
+    * @param importSamples    导入用户列表
+    * @param isUpdateSupport 是否支持更新
+    * @return 导入结果
+    */
+   @Override
+   @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
+   public MuseuminfoImportRespVO importSampleList(List<MuseuminfoImportExcelVO> importSamples, boolean isUpdateSupport) {
+      // 2. 遍历,逐个创建 or 更新
+      MuseuminfoImportRespVO respVO = MuseuminfoImportRespVO.builder().createSampleIds(new ArrayList<>())
+              .updateSampleIds(new ArrayList<>()).failureSampleIds(new LinkedHashMap<>()).build();
+      importSamples.forEach(importSample -> {
+
+         try {// 2.1.2 校验,判断是否有不符合的原因
+            museumInfoForCreateOrUpdate(null,importSample.getSampleId() );
+         } catch (ServiceException ex) {
+            respVO.getFailureSampleIds().put(importSample.getSampleId(), ex.getMessage());
+         }
+               // 2.2.1 判断如果不存在,在进行插入
+               MuseumInfoDO existSample = museumInfoMapper.selectMuseumInfoBySampleId(importSample.getSampleId());
+               if (existSample == null) {
+                  Integer SampleType = transformSampleType(importSample.getSampleTypeC());
+                  importSample.setSampleType(SampleType);
+                  MuseumInfoDO newSample = BeanUtils.toBean(importSample, MuseumInfoDO.class);
+                  museumInfoMapper.insert(newSample);
+                  respVO.getCreateSampleIds().add(importSample.getSampleId());
+                  return;
+               }
+               // 2.2.2 如果存在,判断是否允许更新
+               if (!isUpdateSupport) {
+                  respVO.getFailureSampleIds().put(importSample.getSampleId(), SAMPLE_ID_EXISTS.getMsg());
+                  return;
+               }
+
+               //todo允许更新
+//               try {// 2.1.2 校验,判断是否有不符合的原因
+//                  MuseuminfoForCreateOrUpdate(existSample.getId(),importSample.getSampleId() );
+//               } catch (ServiceException ex) {
+//                  respVO.getFailureSampleIds().put(importSample.getSampleId(), ex.getMessage());
+//               }
+
+               Integer SampleType = transformSampleType(importSample.getSampleTypeC());
+               importSample.setSampleType(SampleType);
+               MuseumInfoDO updateSample = BeanUtils.toBean(importSample, MuseumInfoDO.class);
+               updateSample.setId(existSample.getId());
+               updateSample.setSampleType(SampleType);
+               museumInfoMapper.updateById(updateSample);
+               respVO.getUpdateSampleIds().add(importSample.getSampleId());
+      });
+
+      return respVO;
+   }
+
+   private MuseumInfoDO museumInfoForCreateOrUpdate(Integer id, String sampleId) {
+      // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确
+      return DataPermissionUtils.executeIgnore(() -> {
+         // 校验标本存在
+         MuseumInfoDO sample = museumInfoExists(id);
+         // 校验标本编号唯一
+         museumInfoSampleIdUnique(id, sampleId);
+         // 转换标本类型
+         return sample;
+      });
+   }
+
+   private Integer  transformSampleType(String sampleType) {
+     if (sampleType==null){
+        return null;
+     }else if (sampleType.equals("矿石")){
+        return 1;
+     }else if (sampleType.equals("岩石")){
+        return 2;
+     }else if (sampleType.equals("矿物")){
+        return 3;
+     }else if (sampleType.equals("陨石")){
+      return 4;
+   }
+      throw new IllegalArgumentException("无效的标本类型: " + sampleType);
+   }
+
+      MuseumInfoDO museumInfoExists(Integer id) {
+         if (id == null) {
+            return null;
+         }
+         MuseumInfoDO sample = museumInfoMapper.selectMuseumInfoById(id);
+         if (sample == null) {
+            throw exception(SAMPLE_NOT_EXISTS);
+         }
+         return sample;
+      }
+
+      void museumInfoSampleIdUnique(Integer id, String sampleId) {
+         if (sampleId==null) {
+            return;
+         }
+         MuseumInfoDO sample = museumInfoMapper.selectMuseumInfoBySampleId(sampleId);
+         //todo 正常
+         if (sample == null) {
+            return;
+         }
+         // TODO sample不为空
+         if (id == null) {
+            throw exception(SAMPLE_ID_EXISTS);
+         }
+         if (!sample.getId().equals(Integer.valueOf(id))) {
+            throw exception(SAMPLE_ID_EXISTS);
+         }
+      }
+
 }
 
 
+

+ 1 - 1
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museummodel/MuseummodelService.java

@@ -41,7 +41,7 @@ public interface MuseummodelService {
    /**
     * 通过标本类型返回所有标本模型
     * */
-   List<MuseummodelDO> getMuseumModelBySpecimenType(String specimenType);
+//   List<MuseummodelDO> getMuseumModelBySpecimenType(String specimenType);
 
    /**
     * 获得分页

+ 4 - 4
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museummodel/MuseummodelServiceImpl.java

@@ -56,10 +56,10 @@ public  class MuseummodelServiceImpl implements MuseummodelService {
       return museumModelMapper.getMuseumModelBySpecimenNumber(specimenNumber);
    }
 
-   @Override
-   public List<MuseummodelDO> getMuseumModelBySpecimenType(String specimenType) {
-      return List.of();
-   }
+//   @Override
+//   public List<MuseummodelDO> getMuseumModelBySpecimenType(String specimenType) {
+//      return List.of();
+//   }
 
 //     @Override
 //      public  PageResult<MuseummodelDO> getPage (MuseummodelPageReqVO pageReqVO){

+ 3 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java

@@ -163,4 +163,7 @@ public interface ErrorCodeConstants {
     // ========== 站内信发送 1-002-028-000 ==========
     ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失");
 
+    // ========== 博物馆 1-002-029-000 ==========
+    ErrorCode SAMPLE_ID_EXISTS = new ErrorCode(1_002_029_000, "标本已经存在");
+    ErrorCode SAMPLE_NOT_EXISTS = new ErrorCode(1_002_029_001, "标本不存在");
 }

+ 1 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java

@@ -167,6 +167,7 @@ public class UserController {
     public CommonResult<UserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
                                                       @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
         List<UserImportExcelVO> list = ExcelUtils.read(file, UserImportExcelVO.class);
+        userService.importUserList(list, updateSupport);
         return success(userService.importUserList(list, updateSupport));
     }
 

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

@@ -468,7 +468,7 @@ public class AdminUserServiceImpl implements AdminUserService {
         }
 
         // 2. 遍历,逐个创建 or 更新
-        UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
+           UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
                 .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
         importUsers.forEach(importUser -> {
             // 2.1.1 校验字段是否符合要求