فهرست منبع

Merge remote-tracking branch 'origin/main' into main

zhangwei 3 روز پیش
والد
کامیت
8a3ae65ff7
14فایلهای تغییر یافته به همراه324 افزوده شده و 13 حذف شده
  1. 2 1
      edu-travel-adapter/edu-travel-adapter-upload/src/main/java/edu/travel/adapter/service/upload/UploadAdapter.java
  2. 5 0
      edu-travel-common/edu-travel-common-datasource/pom.xml
  3. 42 4
      edu-travel-common/edu-travel-common-datasource/src/main/java/edu/travel/web/BaseController.java
  4. 26 0
      edu-travel-common/edu-travel-common-excel/pom.xml
  5. 1 0
      edu-travel-common/pom.xml
  6. 29 1
      edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/dto/tenant/BannerDto.java
  7. 4 1
      edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/vo/banner/BannerVo.java
  8. 1 1
      edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/UploadRemoteController.java
  9. 6 0
      edu-travel-service/edu-travel-service-tenement/pom.xml
  10. 13 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/entity/ShopBanner.java
  11. 4 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ShopBannerService.java
  12. 150 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ShopBannerServiceImpl.java
  13. 40 4
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/ShopBannerController.java
  14. 1 1
      edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java

+ 2 - 1
edu-travel-adapter/edu-travel-adapter-upload/src/main/java/edu/travel/adapter/service/upload/UploadAdapter.java

@@ -9,6 +9,7 @@ import edu.travel.remote.upload.vo.EduFileVo;
 import edu.travel.rpc.RPCBaseResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
@@ -49,7 +50,7 @@ public class UploadAdapter  {
         return rpcBaseResponse;
     }
     @AdapterAnnotation
-    public RPCBaseResponse<EduFileVo> getFormId(String id) {
+    public RPCBaseResponse<EduFileVo> getFormId(@RequestParam("id") String id) {
         return uploadRemoteController.getFormId(id);
     }
     @AdapterAnnotation

+ 5 - 0
edu-travel-common/edu-travel-common-datasource/pom.xml

@@ -25,6 +25,11 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-common-excel</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <scope>provided</scope>

+ 42 - 4
edu-travel-common/edu-travel-common-datasource/src/main/java/edu/travel/web/BaseController.java

@@ -1,5 +1,8 @@
 package edu.travel.web;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.read.listener.ReadListener;
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.interfaces.InsertGroups;
 import edu.travel.interfaces.UpdateGroups;
@@ -7,6 +10,8 @@ import edu.travel.resp.BaseResponse;
 import edu.travel.resp.PageResponse;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.rpc.RPCPageResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
@@ -14,16 +19,49 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.Errors;
 import org.springframework.validation.ObjectError;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.List;
 
 public class BaseController<T> {
+    Logger logger = LoggerFactory.getLogger(BaseController.class);
     @Autowired
     private IService<T> service;
+    @GetMapping("/download")
+    public void download(T clazz,HttpServletResponse response) throws IOException {
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        String fileName = URLEncoder.encode("导出数据.xlsx", "UTF-8").replaceAll("\\+", "%20");
+        response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+        List<T> list = service.list();
+        EasyExcel.write(response.getOutputStream(), clazz.getClass())
+                .sheet("数据")
+                .doWrite(list);
+    }
+    @PostMapping("/upload/excel")
+    public RPCBaseResponse uploadExcel(@RequestBody T clazz ,@RequestPart("file") MultipartFile file) throws IOException {
+        EasyExcel.read(file.getInputStream(),clazz.getClass(),new ReadListener<T>(){
+
+            @Override
+            public void invoke(T t, AnalysisContext analysisContext) {
+                saveTarget(t);
+            }
+
+            @Override
+            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+                logger.debug("读取完成");
+            }
+        })
+                .sheet()
+                .doRead();
+        return RPCBaseResponse.success();
+    }
+
     @GetMapping("/getById")
     public RPCBaseResponse<T> getId(String id) {
         T byId = service.getById(id);

+ 26 - 0
edu-travel-common/edu-travel-common-excel/pom.xml

@@ -0,0 +1,26 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>edu.travel</groupId>
+        <artifactId>edu-travel-common</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>edu-travel-common-excel</artifactId>
+    <packaging>jar</packaging>
+
+    <name>edu-travel-common-excel</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 1 - 0
edu-travel-common/pom.xml

@@ -28,6 +28,7 @@
         <module>edu-travel-common-adapter</module>
         <module>edu-travel-kafka</module>
         <module>edu-travel-common-guava</module>
+        <module>edu-travel-common-excel</module>
     </modules>
 
     <properties>

+ 29 - 1
edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/dto/tenant/BannerDto.java

@@ -1,7 +1,10 @@
 package edu.travel.remote.feign.mode.dto.tenant;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
+import java.util.Date;
+
 @Data
 public class BannerDto {
     /**
@@ -13,7 +16,10 @@ public class BannerDto {
      * 图片/视频
      */
     private String url;
-
+    /**
+     * 图片id(上传方法返回)
+     */
+    private String imageId;
     /**
      * 判断图片/视频,默认0,0图片,1视频
      */
@@ -36,5 +42,27 @@ public class BannerDto {
      * mode 0 首页轮播图
      */
     private String mode;
+    /**
+     * 是否默认 0 否 1是
+     */
+    private Integer isDefault;
+    /**
+     * 开始时间
+     */
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
 
 }

+ 4 - 1
edu-travel-remote/edu-travel-remote-tenant/src/main/java/edu/travel/remote/feign/mode/vo/banner/BannerVo.java

@@ -27,7 +27,10 @@ public class BannerVo {
      * 国家
      */
     private String countryId;
-
+    /**
+     * 模块
+     */
+    private String mode;
     /**
      * 链接地址
      */

+ 1 - 1
edu-travel-remote/edu-travel-remote-upload/src/main/java/edu/travel/remote/upload/UploadRemoteController.java

@@ -62,5 +62,5 @@ public interface UploadRemoteController extends RemoteBaseController<EduFileVo,
      * 通过id获取文件
      */
     @GetMapping("/getFormId")
-    RPCBaseResponse<EduFileVo> getFormId(String id);
+    RPCBaseResponse<EduFileVo> getFormId(@RequestParam("id")String id);
 }

+ 6 - 0
edu-travel-service/edu-travel-service-tenement/pom.xml

@@ -139,6 +139,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>edu.travel</groupId>
+            <artifactId>edu-travel-adapter-country</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
     <profiles>

+ 13 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/entity/ShopBanner.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import edu.travel.entity.BaseEntity;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -89,5 +90,17 @@ public class ShopBanner extends BaseEntity {
      */
     @TableField(value = "`enable`")
     private Integer enable;
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
 
 }

+ 4 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ShopBannerService.java

@@ -16,4 +16,8 @@ public interface ShopBannerService extends IService<ShopBanner>{
     List<BannerVo> getBanner(BannerDto mode);
 
     RPCBaseResponse<String> uploadBannerImage(MultipartFile file);
+
+    RPCBaseResponse<BannerVo> saveBannerCountry(BannerDto banner);
+
+    RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner);
 }

+ 150 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ShopBannerServiceImpl.java

@@ -8,10 +8,12 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.adapter.service.country.CountryAdapter;
 import edu.travel.adapter.service.upload.UploadAdapter;
 import edu.travel.remote.feign.mode.dto.tenant.BannerDto;
 import edu.travel.remote.feign.mode.vo.banner.BannerVo;
 import edu.travel.remote.upload.dto.EduFileDTO;
+import edu.travel.remote.upload.vo.EduFileVo;
 import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.tenant.constant.BaseConstant;
 import edu.travel.tenant.entity.ShopBanner;
@@ -33,6 +35,8 @@ import static edu.travel.rpc.RPCBaseResponse.success;
 public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBanner> implements ShopBannerService {
     @Autowired
     private UploadAdapter uploadAdapter;
+    @Autowired
+    private CountryAdapter countryAdapter;
     @Override
     public List<BannerVo> getBanner(BannerDto mode) {
        List<BannerVo> list = new ArrayList<>();
@@ -91,4 +95,150 @@ public class ShopBannerServiceImpl extends ServiceImpl<ShopBannerMapper, ShopBan
         }
         return error(); // 如果文件类型不支持,返回错误响应
     }
+
+    /**
+     * 新增轮播图信息
+     * @param banner
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<BannerVo> saveBannerCountry(BannerDto banner) {
+        // 验证输入参数的有效性
+        if (ObjectUtil.isEmpty(banner)) {
+            return error("Banner data cannot be null");
+        }
+
+        // 检查 isDefault 是否被输入
+        if (banner.getIsDefault() == null) {
+            return error("isDefault must be provided");
+        }
+
+        // 如果 isDefault 为 0,检查 startTime 和 endTime
+        if (banner.getIsDefault() == 0) {
+            if (ObjectUtil.isEmpty(banner.getStartTime()) || ObjectUtil.isEmpty(banner.getEndTime())) {
+                return error("startTime and endTime must be provided when isDefault is false");
+            }
+        }
+
+        try {
+            // 使用 uploadAdapter.getFormId 查找出 file_path 和 fileType
+            RPCBaseResponse<EduFileVo> fileResponse = uploadAdapter.getFormId(banner.getImageId());
+            if (fileResponse.getData() == null) {
+                return error("Failed to retrieve file information");
+            }
+            EduFileVo fileData = fileResponse.getData();
+            String filePath = fileData.getFilePath(); // 假设 EduFileDTO 有 getFilePath 方法
+            String fileType = fileData.getFileType(); // 假设 EduFileDTO 有 getFileType 方法
+
+            // 创建新的 BannerVo 对象
+            BannerVo bannerVo = new BannerVo();
+            bannerVo.setUrl(filePath); // 设置文件路径
+            bannerVo.setUrlType("image".equalsIgnoreCase(fileType) ? 0 : 1); // 假设0为图片,1为视频
+            bannerVo.setContent(banner.getContent()); // 设置名称
+            bannerVo.setCountryId(banner.getCountryId()); // 设置国家
+            bannerVo.setLinkUrl(banner.getLinkUrl()); // 设置链接地址
+            bannerVo.setMode(banner.getMode());
+
+            // 这里可以进行其他必要的字段设置,比如与 banner 相关的其他信息
+            bannerVo.setId(banner.getId()); // 如果需要设置ID,可以从DTO中获取
+
+            // 保存横幅信息到数据库,假设我们有一个方法 saveBanner
+            ShopBanner shopBanner = new ShopBanner();
+            // 将 bannerVo 转换为 shopBanner (可以使用 BeanUtil.copyProperties 或自定义转换)
+            BeanUtil.copyProperties(bannerVo, shopBanner);
+            // 设置其他必要字段
+            shopBanner.setEnable(0); // 示例:设置为启用状态
+            shopBanner.setCreateTime(new Date()); // 设置当前时间为创建时间
+
+            // 设置 isDefault、startTime 和 endTime 字段
+            shopBanner.setIsDefault(banner.getIsDefault());
+            if (banner.getIsDefault() == 0) {
+                shopBanner.setStartTime(banner.getStartTime());
+                shopBanner.setEndTime(banner.getEndTime());
+            }
+
+            // 调用 mapper 保存到数据库
+            this.save(shopBanner);
+
+            return success(bannerVo); // 返回成功的响应
+        } catch (Exception e) {
+            e.printStackTrace();
+            return error("Failed to save banner country");
+        }
+    }
+
+    /**
+     * 更新横幅信息
+     * @param banner
+     * @return
+     */
+    @Override
+    public RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner) {
+        // 验证输入参数的有效性
+        if (ObjectUtil.isEmpty(banner) || ObjectUtil.isEmpty(banner.getId())) {
+            return error("Banner data cannot be null and id must be provided");
+        }
+
+        // 检查 isDefault 是否被输入
+        if (banner.getIsDefault() == null) {
+            return error("isDefault must be provided");
+        }
+
+        // 如果 isDefault 为 0,检查 startTime 和 endTime
+        if (banner.getIsDefault() == 0) {
+            if (ObjectUtil.isEmpty(banner.getStartTime()) || ObjectUtil.isEmpty(banner.getEndTime())) {
+                return error("startTime and endTime must be provided when isDefault is 0");
+            }
+        }
+
+        try {
+            // 使用 uploadAdapter.getFormId 查找出 file_path 和 fileType
+            RPCBaseResponse<EduFileVo> fileResponse = uploadAdapter.getFormId(banner.getImageId());
+            if (fileResponse.getData() == null) {
+                return error("Failed to retrieve file information");
+            }
+            EduFileVo fileData = fileResponse.getData();
+            String filePath = fileData.getFilePath(); // 假设 EduFileDTO 有 getFilePath 方法
+            String fileType = fileData.getFileType(); // 假设 EduFileDTO 有 getFileType 方法
+
+            // 查找现有的 ShopBanner 对象进行更新
+            ShopBanner shopBanner = this.getById(banner.getId());
+            if (shopBanner == null) {
+                return error("Banner not found");
+            }
+
+            // 更新 BannerVo 对象
+            BannerVo bannerVo = new BannerVo();
+            bannerVo.setUrl(filePath); // 设置文件路径
+            bannerVo.setUrlType("image".equalsIgnoreCase(fileType) ? 0 : 1); // 假设0为图片,1为视频
+            bannerVo.setContent(banner.getContent()); // 设置名称
+            bannerVo.setCountryId(banner.getCountryId()); // 设置国家
+            bannerVo.setLinkUrl(banner.getLinkUrl()); // 设置链接地址
+            bannerVo.setMode(banner.getMode());
+            bannerVo.setId(banner.getId()); // 保持ID一致
+
+            // 将 bannerVo 转换为 shopBanner,并设置其他字段
+            BeanUtil.copyProperties(bannerVo, shopBanner);
+            shopBanner.setEnable(0); // 示例:设置为启用状态
+            shopBanner.setUpdateTime(new Date()); // 设置当前时间为更新时间
+
+            // 设置 isDefault、startTime 和 endTime 字段
+            shopBanner.setIsDefault(banner.getIsDefault());
+            if (banner.getIsDefault() == 0) {
+                shopBanner.setStartTime(banner.getStartTime());
+                shopBanner.setEndTime(banner.getEndTime());
+            }
+
+            // 调用 mapper 更新到数据库
+            this.updateById(shopBanner);
+
+            return success(bannerVo); // 返回成功的响应
+        } catch (Exception e) {
+            e.printStackTrace();
+            return error("Failed to update banner country");
+        }
+    }
+
+
+
 }

+ 40 - 4
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/ShopBannerController.java

@@ -41,7 +41,20 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
     public RPCBaseResponse<List<BannerVo>> getBanner(BannerDto banner){
         return success(shopBannerService.getBanner(banner));
     }
-
+    /**
+     * 新增轮播图(通过上传返回id自动填充)
+     */
+    @PostMapping("/saveBannerCountry")
+    public RPCBaseResponse<BannerVo> saveBannerCountry (BannerDto banner){
+        return shopBannerService.saveBannerCountry(banner);
+    }
+    /**
+     * 更新轮播图信息(通过上传返回id自动填充)
+     */
+    @PostMapping("/updateBannerCountry")
+    public RPCBaseResponse<BannerVo> updateBannerCountry(BannerDto banner){
+        return shopBannerService.updateBannerCountry(banner);
+    }
     /**
      * 上传banner图片
      * @param
@@ -51,6 +64,12 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
     public RPCBaseResponse<String> uploadBannerImage(MultipartFile file){
         return shopBannerService.uploadBannerImage(file);
     }
+
+    /**
+     * 根据id获取banner
+     * @param id
+     * @return
+     */
     @Override
     @GetMapping("/getFormId")
     public RPCBaseResponse<BannerVo> getFormId(String id) {
@@ -60,8 +79,13 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
+    /**
+     * 更新banner
+     * @param entity
+     * @return
+     */
     @Override
-    @GetMapping("/updateFormTarget")
+    @GetMapping("/updateTargetFormId")
     public RPCBaseResponse<BannerVo> updateTargetFormId(@RequestBody BannerDto entity) {
         ShopBanner shopBanner = new ShopBanner();
         BeanUtils.copyProperties(entity, shopBanner);
@@ -71,6 +95,11 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
+    /**
+     * 新增banner
+     * @param entity
+     * @return
+     */
     @Override
     @GetMapping("/saveFormTarget")
     public RPCBaseResponse<BannerVo> saveFormTarget(BannerDto entity) {
@@ -82,7 +111,11 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
-
+    /**
+     * 删除轮播图
+     * @param ids
+     * @return
+     */
     @Override
     @GetMapping("/deleteFormTarget")
     public RPCBaseResponse<BannerVo> deleteTargetFormId(List<String> ids) {
@@ -92,6 +125,10 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         return shopBannerVoRPCBaseResponse;
     }
 
+    /**
+     * 获取所有轮播图
+     * @return
+     */
     @Override
     @GetMapping("/getAllForm")
     public RPCBaseResponse<List<BannerVo>> getAllForm() {
@@ -100,5 +137,4 @@ public class ShopBannerController extends BaseController<ShopBanner> implements
         BeanUtils.copyProperties(countryRPCBaseResponse, baseCountryVoRPCBaseResponse);
         return baseCountryVoRPCBaseResponse;
     }
-
 }

+ 1 - 1
edu-travel-service/edu-travel-service-upload/src/main/java/edu/travel/upload/web/UploadController.java

@@ -160,7 +160,7 @@ public class UploadController extends BaseController<EduFile> implements UploadR
      */
     @Override
     @GetMapping("/getFormId")
-    public RPCBaseResponse<EduFileVo> getFormId(String id) {
+    public RPCBaseResponse<EduFileVo> getFormId(@RequestParam("id")String id) {
         RPCBaseResponse<EduFile> eduFileRPCBaseResponse = super.getId(id);
         RPCBaseResponse<EduFileVo> eduFileVoRPCBaseResponse = new RPCBaseResponse<>();
         BeanUtils.copyProperties(eduFileRPCBaseResponse, eduFileVoRPCBaseResponse);