he2802 2 years ago
parent
commit
6c13037b9c
31 changed files with 617 additions and 625 deletions
  1. 4 0
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  2. 4 0
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  3. 4 0
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  4. 78 202
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  5. 8 19
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java
  6. 4 0
      zhongzheng-admin/src/main/resources/application-dev.yml
  7. 4 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  8. 4 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  9. 31 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  10. 7 9
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java
  11. 4 0
      zhongzheng-api/src/main/resources/application-dev.yml
  12. 4 0
      zhongzheng-api/src/main/resources/application-pre.yml
  13. 4 0
      zhongzheng-api/src/main/resources/application-prod.yml
  14. 4 0
      zhongzheng-api/src/main/resources/application-trial.yml
  15. 156 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUploadUtils.java
  16. 41 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java
  17. 30 22
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java
  18. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  19. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/bo/FileHandleBo.java
  20. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java
  21. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsEditBo.java
  22. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsFileQueryBo.java
  23. 2 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseFileService.java
  24. 2 5
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java
  25. 29 94
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java
  26. 56 261
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java
  27. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseFileVo.java
  28. 35 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/domain/TopSysRoleBusiness.java
  29. 1 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/domain/TopSysRoleMenu.java
  30. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/mapper/TopSysRoleBusinessMapper.java
  31. 14 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/service/impl/TopSysRoleServiceImpl.java

+ 4 - 0
zhongzheng-admin-saas/src/main/resources/application-dev.yml

@@ -176,3 +176,7 @@ officialPush:
 
 distributionOldPay:
     host: http://gdxypx.xy.com/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: http://192.168.1.7:9090/course/handouts/save
+    updatePath: http://192.168.1.7:9090/course/handouts/edit

+ 4 - 0
zhongzheng-admin-saas/src/main/resources/application-pre.yml

@@ -176,3 +176,7 @@ officialPush:
 
 distributionOldPay:
     host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 4 - 0
zhongzheng-admin-saas/src/main/resources/application-prod.yml

@@ -176,3 +176,7 @@ officialPush:
 
 distributionOldPay:
     host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 78 - 202
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -14,9 +14,7 @@ import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
-import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
-import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUploadUtils;
@@ -26,9 +24,6 @@ import com.zhongzheng.framework.config.ServerConfig;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.activity.vo.ActivityGoodsPriceVo;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
-import com.zhongzheng.modules.course.domain.CourseFile;
-import com.zhongzheng.modules.course.service.ICourseFileService;
-import com.zhongzheng.modules.course.service.ICourseHandoutsService;
 import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsQueryBo;
 import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalPayBo;
 import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
@@ -76,17 +71,11 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
 
 /**
  * 通用请求处理
@@ -94,8 +83,7 @@ import java.util.zip.ZipInputStream;
  * @author zhongzheng
  */
 @RestController
-public class CommonController extends BaseController
-{
+public class CommonController extends BaseController {
     private static final Logger log = LoggerFactory.getLogger(CommonController.class);
 
     @Autowired
@@ -117,40 +105,34 @@ public class CommonController extends BaseController
     @Autowired
     private IWxPayService iWxPayService;
     @Autowired
-    private  IClassGradeService iClassGradeService;
+    private IClassGradeService iClassGradeService;
     @Autowired
     private ISysTenantService iSysTenantService;
     @Autowired
     private IUserService iUserService;
     @Autowired
-    private  ITopSysTenantRegisterService iTopSysTenantRegisterService;
+    private ITopSysTenantRegisterService iTopSysTenantRegisterService;
     @Autowired
-    private  ISysWebService webService;
+    private ISysWebService webService;
     @Autowired
     private ISysConfigService configService;
     @Autowired
     private IDistributionCashWithdrawalService iDistributionCashWithdrawalService;
     @Autowired
-    private  IDistributionSellerService iDistributionSellerService;
+    private IDistributionSellerService iDistributionSellerService;
     @Autowired
-    private  IDistributionActivityGoodsService iDistributionActivityGoodsService;
-    @Autowired
-    private ICourseHandoutsService iCourseHandoutsService;
-    @Autowired
-    private ICourseFileService iCourseFileService;
+    private IDistributionActivityGoodsService iDistributionActivityGoodsService;
+
     /**
      * 通用下载请求
      *
      * @param fileName 文件名称
-     * @param delete 是否删除
+     * @param delete   是否删除
      */
     @GetMapping("common/download")
-    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
-    {
-        try
-        {
-            if (!FileUtils.checkAllowDownload(fileName))
-            {
+    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {
+        try {
+            if (!FileUtils.checkAllowDownload(fileName)) {
                 throw new Exception(StrUtil.format("文件名称({})非法,不允许下载。 ", fileName));
             }
             String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
@@ -164,9 +146,7 @@ public class CommonController extends BaseController
                 FileUtils.deleteFile(filePath);
             }*/
             FileUtils.deleteFile(filePath);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("下载文件失败", e);
         }
     }
@@ -175,10 +155,8 @@ public class CommonController extends BaseController
      * 通用上传请求
      */
     @PostMapping("/common/upload")
-    public AjaxResult uploadFile(MultipartFile file) throws Exception
-    {
-        try
-        {
+    public AjaxResult uploadFile(MultipartFile file) throws Exception {
+        try {
             // 上传文件路径
             String filePath = RuoYiConfig.getUploadPath();
             // 上传并返回新文件名称
@@ -188,143 +166,50 @@ public class CommonController extends BaseController
             ajax.put("fileName", fileName);
             ajax.put("url", url);
             return ajax;
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             return AjaxResult.error(e.getMessage());
         }
     }
 
 
-    /**
-     * 通用上传请求
-     */
-    @PostMapping("/common/decompression")
-    public AjaxResult uploadDecompression(MultipartFile file) throws Exception {
-        String destDirPath = "D:/workpro/saas_entrepot/zhongzheng-admin/src/main/resources/cesz";
-        ZipInputStream zipIn = new ZipInputStream(file.getInputStream(),Charset.forName("GBK"));
-        ZipEntry entry = zipIn.getNextEntry();
-        while (entry != null) {
-            String entryName = entry.getName();
-            String filePath = destDirPath + File.separator + entryName;
-            if (entry.isDirectory()) {
-                File dir = new File(filePath);
-                dir.mkdirs();
-            } else {
-                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
-                byte[] bytesIn = new byte[4096];
-                int read = 0;
-                while ((read = zipIn.read(bytesIn)) != -1) {
-                    bos.write(bytesIn, 0, read);
-                }
-                bos.close();
-            }
-            zipIn.closeEntry();
-            entry = zipIn.getNextEntry();
-        }
-        zipIn.close();
-        //处理讲义文件
-        getFileNames(new File(destDirPath),0L,999L);
-        return AjaxResult.success();
-    }
-
-    /**
-     * 得到文件名称
-     *
-     * @param file      文件
-     * @param parentId 父ID
-     * @return {@link List}<{@link String}>
-     */
-    private void getFileNames(File file,Long parentId,Long handoutsId) {
-        File[] files = file.listFiles();
-        for (File f : files) {
-            if (f.isDirectory()) {
-                //文件夹
-                CourseFile courseFile = new CourseFile();
-                courseFile.setUrlName(f.getName());
-                courseFile.setStatus(1);
-                courseFile.setSort(1);
-                courseFile.setCreateTime(DateUtils.getNowTime());
-                courseFile.setUpdateTime(DateUtils.getNowTime());
-                courseFile.setHandoutsId(handoutsId);
-                courseFile.setType(2);//文件夹
-                courseFile.setParentId(parentId);
-                iCourseFileService.save(courseFile);
-                getFileNames(f, courseFile.getFileId(),handoutsId);
-            } else {
-                try {
-                    //文件
-                    CourseFile courseFile = new CourseFile();
-                    //上传oss
-                    // 上传文件路径
-                    String filePath = RuoYiConfig.getUploadPath();
-                    String fileName = FileUploadUtils.upload(filePath, FileUtils.getMultipartFile(f));
-                    String url = serverConfig.getUrl() + fileName;
-                    courseFile.setUrlName(f.getName());
-                    courseFile.setUrl(url);
-                    courseFile.setStatus(1);
-                    courseFile.setSort(1);
-                    courseFile.setCreateTime(DateUtils.getNowTime());
-                    courseFile.setUpdateTime(DateUtils.getNowTime());
-                    courseFile.setHandoutsId(handoutsId);
-                    courseFile.setType(1);//文件
-                    courseFile.setParentId(parentId);
-                    iCourseFileService.save(courseFile);
-                }catch (Exception e){
-                    e.printStackTrace();
-                    throw new CustomException("上传文件失败");
-                }
-            }
-        }
-    }
-
-
     /**
      * 本地资源通用下载
      */
     @GetMapping("/common/download/resource")
     public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
-            throws Exception
-    {
-        try
-        {
-            if (!FileUtils.checkAllowDownload(resource))
-            {
+            throws Exception {
+        try {
+            if (!FileUtils.checkAllowDownload(resource)) {
                 throw new Exception(StrUtil.format("资源文件({})非法,不允许下载。 ", resource));
             }
             // 本地资源路径
             String localPath = RuoYiConfig.getProfile();
             // 数据库资源地址
-            String downloadPath = localPath + StrUtil.subAfter(resource, Constants.RESOURCE_PREFIX,false);
+            String downloadPath = localPath + StrUtil.subAfter(resource, Constants.RESOURCE_PREFIX, false);
             // 下载名称
-            String downloadName = StrUtil.subAfter(downloadPath, "/",true);
+            String downloadName = StrUtil.subAfter(downloadPath, "/", true);
             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
             FileUtils.setAttachmentResponseHeader(response, downloadName);
             FileUtils.writeBytes(downloadPath, response.getOutputStream());
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("下载文件失败", e);
         }
     }
 
     @ApiOperation("获取继教二建的商品结构列表")
     @GetMapping("common/jzs/goodsList")
-    public AjaxResult<GoodsJzsVo> goodsList()
-    {
+    public AjaxResult<GoodsJzsVo> goodsList() {
         GoodsQueryBo queryBo = new GoodsQueryBo();
         List<SyncGoodsExport> goodsJzsVoList = iGoodsService.selectRjJzsList(queryBo);
         ExcelUtil<SyncGoodsExport> util = new ExcelUtil<SyncGoodsExport>(SyncGoodsExport.class);
-  //      ExcelUtil<SyncGoodsExport> util = new ExcelUtil<>(SyncGoodsExport.class);
+        //      ExcelUtil<SyncGoodsExport> util = new ExcelUtil<>(SyncGoodsExport.class);
         return util.exportEasyExcel(util.exportEasyData(goodsJzsVoList), "继建商品");
     }
 
 
-
     @ApiOperation("测试列表")
     @PostMapping("common/jzs/test")
-    public AjaxResult<Void> testList(@RequestBody UserPeriodEditBo bo)
-    {
+    public AjaxResult<Void> testList(@RequestBody UserPeriodEditBo bo) {
         UserPeriodEditBo queryBo = new UserPeriodEditBo();
         queryBo.setGoodsId(1085L);
         queryBo.setGradeId(978L);
@@ -335,9 +220,8 @@ public class CommonController extends BaseController
 
     @ApiOperation("旧系统打回重审")
     @PostMapping("common/rollback/period")
-    public AjaxResult<Void> rollbackPeriod(@RequestBody RollBackPeriodBo bo)
-    {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+    public AjaxResult<Void> rollbackPeriod(@RequestBody RollBackPeriodBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         UserPeriodEditBo queryBo = new UserPeriodEditBo();
@@ -349,9 +233,8 @@ public class CommonController extends BaseController
 
     @ApiOperation("旧系统获取用户商品信息")
     @PostMapping("common/get/goods")
-    public AjaxResult getUserGoodsList(@RequestBody UserGoodsListBo bo)
-    {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+    public AjaxResult getUserGoodsList(@RequestBody UserGoodsListBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         List<UserGoodsListVo> voList = iGoodsService.getUserGoodsList(bo);
@@ -361,9 +244,8 @@ public class CommonController extends BaseController
 
     @ApiOperation("旧系统获取商品学习中心路径")
     @PostMapping("common/get/goods/studyUrl")
-    public AjaxResult getGoodsStudyUrl(@RequestBody GoodsStudyUrlBo bo)
-    {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+    public AjaxResult getGoodsStudyUrl(@RequestBody GoodsStudyUrlBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         String studyUrl = iGoodsService.getGoodsStudyUrl(bo);
@@ -372,20 +254,19 @@ public class CommonController extends BaseController
 
     @ApiOperation("批量查询官方班级人数")
     @PostMapping("common/free/batch/officialGradeCount")
-    public AjaxResult batchOfficialGradeCount(@RequestBody ClassGradeBatchQueryBo bo)
-    {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+    public AjaxResult batchOfficialGradeCount(@RequestBody ClassGradeBatchQueryBo bo) {
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         String[] list = bo.getOfficialNameStr().split(",");
-        List<Map<String,Object>> numList = new ArrayList<>();
-        for(String officialName : list){
-            Map<String,Object> map = new HashMap<>();
+        List<Map<String, Object>> numList = new ArrayList<>();
+        for (String officialName : list) {
+            Map<String, Object> map = new HashMap<>();
             ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
             queryBo.setOfficialName(officialName);
-            map.put("officialName",officialName);
+            map.put("officialName", officialName);
             Integer num = iClassGradeService.queryOfficialGradeCount(queryBo);
-            map.put("num",num);
+            map.put("num", num);
             numList.add(map);
         }
         return AjaxResult.success(numList);
@@ -394,7 +275,7 @@ public class CommonController extends BaseController
     @ApiOperation("查询官方班级详情")
     @PostMapping("common/free/officialGradeDetail")
     public AjaxResult officialGradeDetail(@RequestBody ClassNpUserInfoBo bo) {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         return AjaxResult.success(iClassGradeService.officialGradeDetail(bo));
@@ -403,7 +284,7 @@ public class CommonController extends BaseController
     @ApiOperation("查询预开班官方班级编号")
     @PostMapping("common/free/officialGrade/num")
     public AjaxResult getOfficialGradeNum(@RequestBody ClassOfficialNumBo bo) {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         return AjaxResult.success(iClassGradeService.getOfficialGradeNum(bo));
@@ -412,7 +293,7 @@ public class CommonController extends BaseController
     @ApiOperation("预报名班级开班")
     @PostMapping("common/free/open/class")
     public AjaxResult openOfficialGrade(@RequestBody ClassGradeOpenBo bo) {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         iClassGradeService.openOfficialGrade(bo);
@@ -421,32 +302,29 @@ public class CommonController extends BaseController
 
     @ApiOperation("测试分班")
     @GetMapping("common/jzs/grade")
-    public AjaxResult<Void> testGrade()
-    {
-     //   iClassGradeService.checkEjjjPeopleNumLimit(195L,984L);
-     //   iUserService.batchUpdateTelId();
+    public AjaxResult<Void> testGrade() {
+        //   iClassGradeService.checkEjjjPeopleNumLimit(195L,984L);
+        //   iUserService.batchUpdateTelId();
         return AjaxResult.success();
     }
 
 
     @ApiOperation("获取商品分享码")
     @PostMapping("/shareGoodsCode")
-    public AjaxResult getWxSmallAccessToken(@RequestBody WxShareGoodsBo bo)
-    {
+    public AjaxResult getWxSmallAccessToken(@RequestBody WxShareGoodsBo bo) {
         String token = wxLoginService.shareGoodsCode(bo);
         return AjaxResult.success(token);
     }
 
     @ApiOperation("推送分销商品")
     @PostMapping("/toshareGoods")
-    public AjaxResult toshareGoods(@RequestBody WxShareGoodsBo bo)
-    {
+    public AjaxResult toshareGoods(@RequestBody WxShareGoodsBo bo) {
         String out_trade_no = "22110210122554298238";
         Map<String, Object> map = new HashMap<>();
         map.put("order_sn", out_trade_no);
         List<OrderGoods> goodsList = iOrderGoodsService.listByMap(map);
         Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, out_trade_no));
-        iWxPayService.shareToOldSys(order,goodsList);
+        iWxPayService.shareToOldSys(order, goodsList);
         return AjaxResult.success();
     }
 
@@ -483,7 +361,7 @@ public class CommonController extends BaseController
     public AjaxResult<List<SysTenantVo>> getTenantList() {
         String tenant = ServletUtils.getRequest().getHeader("TenantId");
         List<SysTenant> list = iSysTenantService.list();
-        if (CollectionUtils.isEmpty(list)){
+        if (CollectionUtils.isEmpty(list)) {
             return AjaxResult.success(new ArrayList<>());
         }
         List<SysTenantVo> collect = list.stream().filter(x -> !x.getTenantId().equals(Long.valueOf(tenant)))
@@ -494,16 +372,16 @@ public class CommonController extends BaseController
     @ApiOperation("机构注册开通")
     @PostMapping("common/free/tenant/register")
     public AjaxResult tenantRegister(@RequestBody TopSysTenantRegisterAddBo bo) {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
-        return AjaxResult.success("成功",iTopSysTenantRegisterService.insertByAddBo(bo) ? 1 : 0);
+        return AjaxResult.success("成功", iTopSysTenantRegisterService.insertByAddBo(bo) ? 1 : 0);
     }
 
     @ApiOperation("重启服务restart")
     @PostMapping("common/free/webRestart")
     public AjaxResult<Void> webRestart(@RequestBody ConfigQueryBo bo) {
-        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+        if (!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         webService.restartWebService();
@@ -521,7 +399,7 @@ public class CommonController extends BaseController
     @GetMapping("common/free/dual_auth")
     public AjaxResult<String> dual_auth() {
         String dualAuth = configService.selectConfigByKey("login.dual.auth");
-        return AjaxResult.success("成功",dualAuth);
+        return AjaxResult.success("成功", dualAuth);
     }
 
     @ApiOperation("decodeTel")
@@ -535,7 +413,7 @@ public class CommonController extends BaseController
     @Log(title = "打款", businessType = BusinessType.INSERT)
     @PostMapping("/common/free/payCashCallBack")
     public AjaxResult payCashCallBack(@RequestBody DistributionCashWithdrawalPayBo bo) {
-        if(!ToolsUtils.checkSignCwSnFromOldSys(bo.getCwSn(),bo.getStamp().toString(),bo.getSign())){
+        if (!ToolsUtils.checkSignCwSnFromOldSys(bo.getCwSn(), bo.getStamp().toString(), bo.getSign())) {
             return AjaxResult.error("签名错误");
         }
         return AjaxResult.success("成功", iDistributionCashWithdrawalService.payCashCallBack(bo) ? 1 : 0);
@@ -548,25 +426,25 @@ public class CommonController extends BaseController
     @GetMapping("common/free/findTenantId")
     public AjaxResult<String> findTenantId(SysTenantQueryBo bo) {
         Long tenantId = iSysTenantService.findTenantId(bo);
-        if(Validator.isNotEmpty(tenantId)){
-            return AjaxResult.success("成功",tenantId.toString());
-        }else{
-            if(Validator.isNotEmpty(bo.getHostH5())&&bo.getHostH5().equals("120.79.166.78:19012")){
-                return AjaxResult.success("成功","867735392558919680");
+        if (Validator.isNotEmpty(tenantId)) {
+            return AjaxResult.success("成功", tenantId.toString());
+        } else {
+            if (Validator.isNotEmpty(bo.getHostH5()) && bo.getHostH5().equals("120.79.166.78:19012")) {
+                return AjaxResult.success("成功", "867735392558919680");
             }
-            if(Validator.isNotEmpty(bo.getHostLive())&&bo.getHostLive().equals("120.79.166.78:19012")){
-                return AjaxResult.success("成功","867735392558919680");
+            if (Validator.isNotEmpty(bo.getHostLive()) && bo.getHostLive().equals("120.79.166.78:19012")) {
+                return AjaxResult.success("成功", "867735392558919680");
             }
-            if(Validator.isNotEmpty(bo.getHostPc())&&bo.getHostPc().equals("120.79.166.78:19012")){
-                return AjaxResult.success("成功","867735392558919680");
+            if (Validator.isNotEmpty(bo.getHostPc()) && bo.getHostPc().equals("120.79.166.78:19012")) {
+                return AjaxResult.success("成功", "867735392558919680");
             }
-            if(Validator.isNotEmpty(bo.getHostAdmin())&&bo.getHostAdmin().equals("120.79.166.78:19012")){
-                return AjaxResult.success("成功","867735392558919680");
+            if (Validator.isNotEmpty(bo.getHostAdmin()) && bo.getHostAdmin().equals("120.79.166.78:19012")) {
+                return AjaxResult.success("成功", "867735392558919680");
             }
-            if(Validator.isNotEmpty(bo.getHostH5Seller())&&bo.getHostH5Seller().equals("120.79.166.78:19012")){
-                return AjaxResult.success("成功","867735392558919680");
+            if (Validator.isNotEmpty(bo.getHostH5Seller()) && bo.getHostH5Seller().equals("120.79.166.78:19012")) {
+                return AjaxResult.success("成功", "867735392558919680");
             }
-            return AjaxResult.error(511,"失败",null);
+            return AjaxResult.error(511, "失败", null);
         }
     }
 
@@ -575,39 +453,38 @@ public class CommonController extends BaseController
      */
     @ApiOperation("获取系统配置")
     @GetMapping("common/free/config")
-    public AjaxResult<Map<String,Object>> findConfig(SysTenantQueryBo bo) {
-        Map<String,Object> map = new HashMap<>();
+    public AjaxResult<Map<String, Object>> findConfig(SysTenantQueryBo bo) {
+        Map<String, Object> map = new HashMap<>();
         String jsonStr = configService.selectConfigByKey("home.header");
         JSONObject objectJson = JSON.parseObject(jsonStr);
-        map.put("companyName",String.valueOf(objectJson.get("companyName")));
+        map.put("companyName", String.valueOf(objectJson.get("companyName")));
         return AjaxResult.success(map);
     }
 
     @ApiOperation("获取微信参数")
     @GetMapping("app/common/wx/config")
-    public AjaxResult<Map<String,Object>> wxConfig() {
-        Map<String,Object> map = new HashMap<>();
+    public AjaxResult<Map<String, Object>> wxConfig() {
+        Map<String, Object> map = new HashMap<>();
         String smallAppId = configService.selectConfigByKey("wx.small.appid");
         String gzhAppId = configService.selectConfigByKey("wx.gzh.appid");
-        map.put("smallAppId",smallAppId);
-        map.put("gzhAppId",gzhAppId);
+        map.put("smallAppId", smallAppId);
+        map.put("gzhAppId", gzhAppId);
         return AjaxResult.success(map);
     }
 
     @ApiOperation("移动端配置参数")
     @GetMapping("app/common/mobileConfig")
-    public AjaxResult<Map<String,Object>> mobileConfig(ConfigQueryBo bo) {
-        Map<String,Object> map = new HashMap<>();
+    public AjaxResult<Map<String, Object>> mobileConfig(ConfigQueryBo bo) {
+        Map<String, Object> map = new HashMap<>();
         String json = configService.selectConfigByKey("home.mobile");
-        map.put("mobileConfig",json);
+        map.put("mobileConfig", json);
         return AjaxResult.success(map);
     }
 
 
     @ApiOperation("通过分享code查询业务员用户信息")
     @GetMapping("app/common/distribution/getInfoByShareCode")
-    public AjaxResult<DistributionSellerVo> getInfoByShareCode(String shareCode)
-    {
+    public AjaxResult<DistributionSellerVo> getInfoByShareCode(String shareCode) {
         DistributionSellerVo vo = iDistributionSellerService.queryByShareCode(shareCode);
         vo.setNull();
         String jsonStr = configService.selectConfigByKey("home.header");
@@ -619,8 +496,7 @@ public class CommonController extends BaseController
 
     @ApiOperation("获取分销活动商品列表")
     @GetMapping("app/common/distribution/getGoodsList")
-    public TableDataInfo<ActivityGoodsPriceVo> distributionGoodsList(DistributionActivityGoodsQueryBo bo)
-    {
+    public TableDataInfo<ActivityGoodsPriceVo> distributionGoodsList(DistributionActivityGoodsQueryBo bo) {
         startPage();
         List<ActivityGoodsPriceVo> list = iDistributionActivityGoodsService.getGoodsList(bo);
         return getDataTable(list);

+ 8 - 19
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java

@@ -1,7 +1,5 @@
 package com.zhongzheng.controller.course;
 
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -9,6 +7,7 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.modules.course.bo.CourseHandoutsAddBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsEditBo;
+import com.zhongzheng.modules.course.bo.CourseHandoutsFileQueryBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
 import com.zhongzheng.modules.course.service.ICourseFileService;
 import com.zhongzheng.modules.course.service.ICourseHandoutsService;
@@ -19,7 +18,6 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -69,9 +67,9 @@ public class CourseHandoutsController extends BaseController {
      */
     @ApiOperation("获取讲义列详细信息")
     @PreAuthorize("@ss.hasPermi('course:handouts:query')")
-    @GetMapping("/{handoutsId}")
-    public AjaxResult<CourseHandoutsVo> getInfo(@PathVariable("handoutsId" ) Long handoutsId) {
-        return AjaxResult.success(iCourseHandoutsService.queryById(handoutsId));
+    @GetMapping("/file/detail")
+    public AjaxResult<CourseHandoutsVo> getInfo(CourseHandoutsFileQueryBo queryBo) {
+        return AjaxResult.success(iCourseHandoutsService.queryById(queryBo));
     }
 
     /**
@@ -90,13 +88,8 @@ public class CourseHandoutsController extends BaseController {
      */
     @ApiOperation("新增讲义列")
     @PostMapping("/save")
-    public AjaxResult<Void> addHandouts(MultipartFile[] files, String param) {
-
-        if (ObjectUtils.isNull(param) || ObjectUtils.isNull(files)){
-            return toAjax(0);
-        }
-        CourseHandoutsAddBo bo = JSONObject.parseObject(param, CourseHandoutsAddBo.class);
-        return toAjax(iCourseFileService.addHandouts(files,bo) ? 1 : 0);
+    public AjaxResult<Void> addHandouts(@RequestBody CourseHandoutsAddBo bo) {
+        return toAjax(iCourseFileService.addHandouts(bo) ? 1 : 0);
     }
 
     /**
@@ -113,12 +106,8 @@ public class CourseHandoutsController extends BaseController {
      */
     @ApiOperation("修改讲义列")
     @PostMapping("edit/handouts")
-    public AjaxResult<Void> editHandouts(MultipartFile[] files, String param) {
-        if (ObjectUtils.isNull(param)){
-            return toAjax(0);
-        }
-        CourseHandoutsEditBo bo = JSONObject.parseObject(param, CourseHandoutsEditBo.class);
-        return toAjax(iCourseFileService.editHandouts(files,bo) ? 1 : 0);
+    public AjaxResult<Void> editHandouts(@RequestBody CourseHandoutsEditBo bo) {
+        return toAjax(iCourseFileService.editHandouts(bo) ? 1 : 0);
     }
 
     /**

+ 4 - 0
zhongzheng-admin/src/main/resources/application-dev.yml

@@ -177,3 +177,7 @@ officialPush:
 
 distributionOldPay:
     host: http://gdxypx.xy.com/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: http://192.168.1.7:9090/course/handouts/save
+    updatePath: http://192.168.1.7:9090/course/handouts/edit

+ 4 - 0
zhongzheng-admin/src/main/resources/application-pre.yml

@@ -176,3 +176,7 @@ officialPush:
 
 distributionOldPay:
     host: http://test.jqbao.net/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 4 - 0
zhongzheng-admin/src/main/resources/application-prod.yml

@@ -176,3 +176,7 @@ officialPush:
 
 distributionOldPay:
     host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 31 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -44,7 +44,13 @@ import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.text.ParseException;
 import java.util.HashMap;
 import java.util.List;
@@ -83,6 +89,31 @@ public class CommonController extends BaseController {
 
     private final IDistributionActivityGoodsService iDistributionActivityGoodsService;
 
+    @PostMapping("/returnStream")
+    public AjaxResult returnStream(MultipartFile file, HttpServletResponse response) throws IOException {
+        ServletOutputStream out = null;
+        ByteArrayOutputStream baos = null;
+        try {
+            InputStream inStream = file.getInputStream();
+            byte[] buffer = new byte[1024];
+            int len;
+            baos = new ByteArrayOutputStream();
+            while ((len = inStream.read(buffer)) != -1) {
+                baos.write(buffer, 0, len);
+            }
+            out = response.getOutputStream();
+            out.write(baos.toByteArray());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            baos.flush();
+            baos.close();
+//            out.flush();
+//            out.close();
+        }
+        return AjaxResult.success();
+    }
+
     /**
      * 获取微信小程序信息(网页跳转小程序)
      */

+ 7 - 9
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java

@@ -1,12 +1,9 @@
 package com.zhongzheng.controller.course;
 
-import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.TableDataInfo;
-import com.zhongzheng.common.enums.BusinessType;
-import com.zhongzheng.modules.course.bo.CourseHandoutsAddBo;
-import com.zhongzheng.modules.course.bo.CourseHandoutsEditBo;
+import com.zhongzheng.modules.course.bo.CourseHandoutsFileQueryBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
 import com.zhongzheng.modules.course.service.ICourseHandoutsService;
 import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
@@ -14,8 +11,9 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
@@ -59,8 +57,8 @@ public class CourseHandoutsController extends BaseController {
      * 获取讲义列详细信息
      */
     @ApiOperation("获取讲义列详细信息")
-    @GetMapping("/{handoutsId}")
-    public AjaxResult<CourseHandoutsVo> getInfo(@PathVariable("handoutsId" ) Long handoutsId) {
-        return AjaxResult.success(iCourseHandoutsService.queryById(handoutsId));
+    @GetMapping("/file/detail")
+    public AjaxResult<CourseHandoutsVo> getInfo(CourseHandoutsFileQueryBo queryBo) {
+        return AjaxResult.success(iCourseHandoutsService.queryById(queryBo));
     }
 }

+ 4 - 0
zhongzheng-api/src/main/resources/application-dev.yml

@@ -180,3 +180,7 @@ officialPush:
 
 distributionOldPay:
     host: http://gdxypx.xy.com/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: http://192.168.1.7:9090/course/handouts/save
+    updatePath: http://192.168.1.7:9090/course/handouts/edit

+ 4 - 0
zhongzheng-api/src/main/resources/application-pre.yml

@@ -151,3 +151,7 @@ officialPush:
 
 distributionOldPay:
     host: http://test.jqbao.net/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 4 - 0
zhongzheng-api/src/main/resources/application-prod.yml

@@ -188,3 +188,7 @@ officialPush:
 
 distributionOldPay:
     host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 4 - 0
zhongzheng-api/src/main/resources/application-trial.yml

@@ -160,3 +160,7 @@ officialPush:
     periodPath: https://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: GDSXY
     token: 01b5d9833987efdff54483cdc9720da6
+
+handouts:
+    savePath: https://attach.xyyxt.net/course/handouts/save
+    updatePath: https://attach.xyyxt.net/course/handouts/edit

+ 156 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUploadUtils.java

@@ -13,7 +13,14 @@ import org.apache.commons.io.FilenameUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.channels.FileChannel;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 文件上传工具类
@@ -118,6 +125,56 @@ public class FileUploadUtils
         return pathFileName;
     }
 
+
+    /**
+     * 根据文件路径上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @return 文件名称
+     * @throws IOException
+     */
+    public static final String uploadFragment(String baseDir, MultipartFile file,String fileName) throws IOException
+    {
+        try
+        {
+            return uploadFragment(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION,fileName);
+        }
+        catch (Exception e)
+        {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @param allowedExtension 上传文件类型
+     * @return 返回上传成功的文件名
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws FileNameLengthLimitExceededException 文件名太长
+     * @throws IOException 比如读写文件出错时
+     * @throws InvalidExtensionException 文件校验异常
+     */
+    public static final String uploadFragment(String baseDir, MultipartFile file, String[] allowedExtension,String fileName)
+            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+            InvalidExtensionException
+    {
+        int fileNamelength = file.getOriginalFilename().length();
+        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+        {
+            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+        }
+
+        assertAllowedFragment(file, allowedExtension,fileName);
+        File desc = getAbsoluteFile(baseDir, fileName);
+        file.transferTo(desc);
+        String pathFileName = getPathFileName(baseDir, fileName);
+        return pathFileName;
+    }
+
     /**
      * 编码文件名
      */
@@ -197,6 +254,49 @@ public class FileUploadUtils
 
     }
 
+    /**
+     * 文件大小校验
+     *
+     * @param file 上传的文件
+     * @return
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws InvalidExtensionException
+     */
+    public static final void assertAllowedFragment(MultipartFile file, String[] allowedExtension,String fileName)
+            throws FileSizeLimitExceededException, InvalidExtensionException
+    {
+        long size = file.getSize();
+        if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
+        {
+            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
+        }
+
+        String extension = getExtensionFragment(fileName);
+        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
+        {
+            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else
+            {
+                throw new InvalidExtensionException(allowedExtension, extension, fileName);
+            }
+        }
+
+    }
+
     /**
      * 判断MIME类型是否是允许的MIME类型
      *
@@ -216,6 +316,22 @@ public class FileUploadUtils
         return false;
     }
 
+    /**
+     * 获取文件名的后缀
+     *
+     * @param fileName 表单文件
+     * @return 后缀名
+     */
+    public static final String getExtensionFragment(String fileName)
+    {
+        String extension = FilenameUtils.getExtension(fileName);
+        if (Validator.isEmpty(extension))
+        {
+            extension = MimeTypeUtils.getExtension(fileName);
+        }
+        return extension;
+    }
+
     /**
      * 获取文件名的后缀
      *
@@ -231,4 +347,44 @@ public class FileUploadUtils
         }
         return extension;
     }
+
+    public static void merge(String fromSign,String from, String to) throws IOException {
+        File t = new File(to);
+        FileInputStream in = null;
+        FileChannel inChannel = null;
+
+        FileOutputStream out = new FileOutputStream(t, true);
+        FileChannel outChannel = out.getChannel();
+
+        File f = new File(from);
+        // 获取目录下的每一个文件名,再将每个文件一次写入目标文件
+        if (f.isDirectory()) {
+            List<File> list = getAllFileAndSort(from,fromSign);
+            // 记录新文件最后一个数据的位置
+            long start = 0;
+            for (File file : list) {
+
+                in = new FileInputStream(file);
+                inChannel = in.getChannel();
+
+                // 从inChannel中读取file.length()长度的数据,写入outChannel的start处
+                outChannel.transferFrom(inChannel, start, file.length());
+                start += file.length();
+                in.close();
+                inChannel.close();
+            }
+        }
+        out.close();
+        outChannel.close();
+    }
+
+    private static List<File> getAllFileAndSort(String dirPath,String fromSign) {
+        File dirFile = new File(dirPath);
+        List<File> list =  Arrays.stream(dirFile.listFiles()).filter(item -> item.getName().contains(fromSign)).collect(Collectors.toList());
+        Collections.sort(list, (o1, o2) -> {
+            return Integer.parseInt(o1.getName().substring(o1.getName().indexOf("_")+1,o1.getName().indexOf(".")))
+                    - Integer.parseInt(o2.getName().substring(o2.getName().indexOf("_")+1,o2.getName().indexOf(".")));
+        });
+        return list;
+    }
 }

+ 41 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/file/FileUtils.java

@@ -3,6 +3,7 @@ package com.zhongzheng.common.utils.file;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import com.zhongzheng.common.config.RuoYiConfig;
+import com.zhongzheng.common.exception.CustomException;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.io.IOUtils;
@@ -13,11 +14,16 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.math.BigInteger;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.MessageDigest;
+import java.util.Comparator;
 import java.util.UUID;
+import java.util.stream.Stream;
 
 /**
  * 文件处理工具类
@@ -256,4 +262,39 @@ public class FileUtils extends org.apache.commons.io.FileUtils
 
         return new CommonsMultipartFile(item);
     }
+
+    /**
+     * 获取文件md5值
+     */
+    public static String md5HashCode(String filePath) {
+        try {
+            InputStream fis = new FileInputStream(filePath);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] buffer = new byte[1024];
+            int length = -1;
+            while ((length = fis.read(buffer, 0, 1024)) != -1) {
+                md.update(buffer, 0, length);
+            }
+            fis.close();
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            byte[] md5Bytes = md.digest();
+            BigInteger bigInt = new BigInteger(1, md5Bytes);
+            return bigInt.toString(16);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    public static void deleteFilePackage(String path){
+        //删除本地资源
+        Path pathStr = Paths.get(path);
+        try (Stream<Path> walk = Files.walk(pathStr)) {
+            walk.sorted(Comparator.reverseOrder())
+                    .forEach(FileUtils::deleteDirectoryStream);
+        }catch (IOException e) {
+            e.printStackTrace();
+            throw new CustomException(e.getMessage());
+        }
+    }
 }

+ 30 - 22
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java

@@ -1,23 +1,7 @@
 package com.zhongzheng.common.utils.http;
 
-import java.io.*;
-import java.net.*;
-import java.security.cert.X509Certificate;
-import java.util.*;
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
-
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import org.apache.http.Consts;
-import org.apache.http.Header;
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.http.*;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.config.RequestConfig;
@@ -25,8 +9,6 @@ import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.params.AllClientPNames;
-import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
@@ -35,8 +17,12 @@ import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.http.HttpEntity;
-import sun.misc.BASE64Encoder;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.*;
+import java.security.cert.X509Certificate;
+import java.util.*;
 
 
 /**
@@ -171,7 +157,7 @@ public class HttpUtils
 
     public static String sendPostJsonHeader(String url, String json, Map<String, String> headersMap)
     {
-        HttpClient client = HttpClients.createDefault();
+        HttpClient client =  HttpClients.createDefault();
         HttpPost post = new HttpPost(url);
         try {
             //此处应设定参数的编码格式,不然中文会变乱码
@@ -209,6 +195,28 @@ public class HttpUtils
         return null;
     }
 
+    public static String sendPostJsonHeaderAsync(String url, String json, Map<String, String> headersMap)
+    {
+        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5*1000).setConnectTimeout(5*1000).build();
+        HttpClient client =  HttpClients.createDefault();
+        HttpPost post = new HttpPost(url);
+        post.setConfig(requestConfig);
+        try {
+            //此处应设定参数的编码格式,不然中文会变乱码
+            StringEntity s = new StringEntity(json, "UTF-8");
+            s.setContentEncoding("UTF-8");
+            s.setContentType("application/json");
+            post.setEntity(s);
+            post.addHeader("content-type", "application/json");
+            headersMap.forEach(post::setHeader);
+            client.execute(post);
+        } catch (Exception e) {
+            e.printStackTrace();
+//            throw new RuntimeException(e);
+        }
+        return null;
+    }
+
     public static String sendPostHeader(String url, JSONObject param, Map<String, String> headersMap)
     {
         HttpClient client = HttpClients.createDefault();

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -136,6 +136,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/common/jzs/**").anonymous()
                 .antMatchers("/common/rollback/period").anonymous()
                 .antMatchers("/common/decompression").anonymous()
+                .antMatchers("/common/merge/file").anonymous()
                 .antMatchers("/common/get/goods").anonymous()
                 .antMatchers("/common/get/goods/studyUrl").anonymous()
                 .antMatchers("/common/create/tenant/admin").anonymous()

+ 30 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alioss/bo/FileHandleBo.java

@@ -0,0 +1,30 @@
+package com.zhongzheng.modules.alioss.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年04月17日 9:33
+ */
+@Data
+public class FileHandleBo implements Serializable {
+
+    @ApiModelProperty("总片数")
+    private Integer shardCount;
+
+    @ApiModelProperty("序号")
+    private Integer index;
+
+    @ApiModelProperty("文件名称")
+    private String name;
+
+    @ApiModelProperty("文件标识")
+    private String fileSign;
+
+    @ApiModelProperty("完整文件的MD5值")
+    private String fileMd5;
+
+}

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsAddBo.java

@@ -17,6 +17,11 @@ import java.util.List;
 @ApiModel("讲义列添加对象")
 public class CourseHandoutsAddBo {
 
+    @ApiModelProperty("当前时间戳")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    private String sign;
     /** 标题 */
     @ApiModelProperty("标题")
     private String handoutsName;

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsEditBo.java

@@ -17,6 +17,12 @@ import java.util.List;
 @ApiModel("讲义列编辑对象")
 public class CourseHandoutsEditBo {
 
+    @ApiModelProperty("当前时间戳")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    private String sign;
+
     /** $column.columnComment */
     @ApiModelProperty("$column.columnComment")
     private Long handoutsId;

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseHandoutsFileQueryBo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.course.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 讲义列分页查询对象 course_handouts
+ *
+ * @author ruoyi
+ * @date 2021-11-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("讲义列分页查询对象")
+public class CourseHandoutsFileQueryBo extends BaseEntity {
+
+	/** 讲义id */
+	@ApiModelProperty("讲义id")
+	private Long handoutsId;
+
+	/** 标题 */
+	@ApiModelProperty("标题")
+	private String fileName;
+
+}

+ 2 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseFileService.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseFile;
 import com.zhongzheng.modules.course.vo.CourseFileVo;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
@@ -49,7 +48,7 @@ public interface ICourseFileService extends IService<CourseFile> {
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
-	boolean editHandouts(MultipartFile[] files, CourseHandoutsEditBo bo);
+	boolean editHandouts(CourseHandoutsEditBo bo);
 
-    boolean addHandouts(MultipartFile[] files, CourseHandoutsAddBo bo);
+    boolean addHandouts(CourseHandoutsAddBo bo);
 }

+ 2 - 5
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseHandoutsService.java

@@ -3,10 +3,10 @@ package com.zhongzheng.modules.course.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.course.bo.CourseHandoutsAddBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsEditBo;
+import com.zhongzheng.modules.course.bo.CourseHandoutsFileQueryBo;
 import com.zhongzheng.modules.course.bo.CourseHandoutsQueryBo;
 import com.zhongzheng.modules.course.domain.CourseHandouts;
 import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
@@ -22,7 +22,7 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 	 * 查询单个
 	 * @return
 	 */
-	CourseHandoutsVo queryById(Long handoutsId);
+	CourseHandoutsVo queryById(CourseHandoutsFileQueryBo queryBo);
 
 	/**
 	 * 查询列表
@@ -55,7 +55,4 @@ public interface ICourseHandoutsService extends IService<CourseHandouts> {
 
     CourseHandouts getHandoutsByTenant(String encoder, Long newTenantId);
 
-	boolean addHandouts(MultipartFile[] files,CourseHandoutsAddBo bo);
-
-	boolean updateHandouts(MultipartFile[] files, CourseHandoutsEditBo bo);
 }

+ 29 - 94
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseFileServiceImpl.java

@@ -2,14 +2,16 @@ package com.zhongzheng.modules.course.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
-import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.common.utils.file.FileUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseFile;
 import com.zhongzheng.modules.course.domain.CourseHandouts;
@@ -18,26 +20,14 @@ import com.zhongzheng.modules.course.service.ICourseFileService;
 import com.zhongzheng.modules.course.service.ICourseHandoutsService;
 import com.zhongzheng.modules.course.vo.CourseFileVo;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.multipart.MultipartFile;
 
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
 
 /**
  * 文件Service业务层处理
@@ -50,6 +40,10 @@ public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseF
 
     @Autowired
     private ICourseHandoutsService iCourseHandoutsService;
+    @Value("${handouts.savePath}")
+    private String SAVE_HANDOUTS;
+    @Value("${handouts.updatePath}")
+    private String UPDATE_HANDOUTS;
 
     @Override
     public CourseFileVo queryById(Long fileId){
@@ -124,90 +118,31 @@ public class CourseFileServiceImpl extends ServiceImpl<CourseFileMapper, CourseF
     }
 
     @Override
-    public boolean editHandouts(MultipartFile[] files,  CourseHandoutsEditBo bo) {
+    public boolean editHandouts(CourseHandoutsEditBo bo) {
         iCourseHandoutsService.update(new LambdaUpdateWrapper<CourseHandouts>().set(CourseHandouts::getUpdateStatus,0).eq(CourseHandouts::getHandoutsId,bo.getHandoutsId()));
-        //解压压缩包
-        List<MultipartFile> collect = Arrays.stream(files).filter(x -> x.getOriginalFilename().contains(".zip")).collect(Collectors.toList());
-        if (!CollectionUtils.isEmpty(collect)){
-            decompressingFiles(collect);
-        }
-        iCourseHandoutsService.updateHandouts(files,bo);
-        //删除本地资源
-        String zhiyuan = System.getProperty("user.dir");
-        Path path = Paths.get(zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan");
-        try (Stream<Path> walk = Files.walk(path)) {
-            walk.sorted(Comparator.reverseOrder())
-                    .forEach(FileUtils::deleteDirectoryStream);
-        }catch (IOException e) {
-            log.error("讲义删除本地资源失败:"+DateUtils.getNowTime());
-        }
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
+        bo.setSign(sign);
+        bo.setStamp(nowTime);
+        String param = JSONObject.toJSONString(bo);
+        Map<String, String> headersMap = new HashMap<>();
+        headersMap.put("TenantId", ServletUtils.getRequest().getHeader("TenantId"));
+        HttpUtils.sendPostJsonHeaderAsync(UPDATE_HANDOUTS, param,headersMap);
         return true;
     }
 
 
     @Override
-    public boolean addHandouts(MultipartFile[] files, CourseHandoutsAddBo bo) {
-        //解压压缩包
-        List<MultipartFile> collect = Arrays.stream(files).filter(x -> x.getOriginalFilename().contains(".zip")).collect(Collectors.toList());
-        if (!CollectionUtils.isEmpty(collect)){
-            decompressingFiles(collect);
-        }
-        iCourseHandoutsService.addHandouts(files,bo);
-        //删除本地资源
-        String zhiyuan = System.getProperty("user.dir");
-        Path path = Paths.get(zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan");
-        try (Stream<Path> walk = Files.walk(path)) {
-            walk.sorted(Comparator.reverseOrder())
-                    .forEach(FileUtils::deleteDirectoryStream);
-        }catch (IOException e) {
-            log.error("讲义删除本地资源失败:"+DateUtils.getNowTime());
-        }
+    public boolean addHandouts(CourseHandoutsAddBo bo) {
+        Long nowTime = DateUtils.getNowTime();
+        String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
+        bo.setSign(sign);
+        bo.setStamp(nowTime);
+        String param = JSONObject.toJSONString(bo);
+        Map<String, String> headersMap = new HashMap<>();
+        headersMap.put("TenantId", ServletUtils.getRequest().getHeader("TenantId"));
+        HttpUtils.sendPostJsonHeaderAsync(SAVE_HANDOUTS, param,headersMap);
         return true;
     }
 
-    private void decompressingFiles(List<MultipartFile> files){
-        String zhiyuan = System.getProperty("user.dir");
-        files.forEach(file -> {
-            try {
-                String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan";
-                String substring = file.getOriginalFilename().substring(0, file.getOriginalFilename().indexOf("."));
-                File dirw = new File(destDirPath+"/"+substring);
-                if (!dirw.exists()){
-                    dirw.mkdirs();
-                }
-                ZipInputStream zipIn = new ZipInputStream(file.getInputStream(), Charset.forName("GBK"));
-                ZipEntry entry = zipIn.getNextEntry();
-                while (entry != null) {
-                    String entryName = entry.getName();
-                    String filePath = destDirPath + File.separator + entryName;
-                    if (entry.isDirectory()) {
-                        File dir = new File(filePath);
-                        if (!dir.exists()){
-                            dir.mkdirs();
-                        }
-                    } else {
-                        if (!entryName.contains("/")){
-                            //根目录
-                            filePath = dirw + File.separator + entryName;
-                        }
-                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
-                        byte[] bytesIn = new byte[4096];
-                        int read = 0;
-                        while ((read = zipIn.read(bytesIn)) != -1) {
-                            bos.write(bytesIn, 0, read);
-                        }
-                        bos.close();
-                    }
-                    zipIn.closeEntry();
-                    entry = zipIn.getNextEntry();
-                }
-                zipIn.close();
-
-            }catch (IOException e) {
-                e.printStackTrace();
-                throw new CustomException("解压压缩文件错误!");
-            }
-        });
-
-    }
 }

+ 56 - 261
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseHandoutsServiceImpl.java

@@ -4,14 +4,12 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CourseFile;
@@ -26,22 +24,15 @@ import com.zhongzheng.modules.course.vo.CourseHandoutsBusinessVo;
 import com.zhongzheng.modules.course.vo.CourseHandoutsVo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -65,8 +56,8 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
 
 
     @Override
-    public CourseHandoutsVo queryById(Long handoutsId) {
-        CourseHandouts db = this.baseMapper.selectById(handoutsId);
+    public CourseHandoutsVo queryById(CourseHandoutsFileQueryBo queryBo) {
+        CourseHandouts db = this.baseMapper.selectById(queryBo.getHandoutsId());
         if (Validator.isEmpty(db)) {
             throw new CustomException("查无数据");
         }
@@ -75,34 +66,70 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         List<CourseHandoutsBusinessVo> courseHandoutsBusinessVos = baseMapper.selectEntity(courseHandoutsVo.getHandoutsId());
         courseHandoutsVo.setCourseHandoutsBusinessVo(courseHandoutsBusinessVos);
 
-        CourseFileQueryBo queryBo = new CourseFileQueryBo();
-        queryBo.setHandoutsId(courseHandoutsVo.getHandoutsId());
-        List<CourseFileVo> courseFileVos = iCourseFileService.queryList(queryBo);
-        if (CollectionUtils.isEmpty(courseFileVos)){
+        CourseFileQueryBo bo = new CourseFileQueryBo();
+        bo.setHandoutsId(courseHandoutsVo.getHandoutsId());
+        bo.setUrlName(queryBo.getFileName());
+        List<CourseFileVo> courseFileVos = iCourseFileService.queryList(bo);
+        if (CollectionUtils.isEmpty(courseFileVos)) {
             courseHandoutsVo.setFileList(new ArrayList<>());
             return courseHandoutsVo;
         }
-        List<CourseFileVo> fileVos = courseFileVos.stream().filter(item -> item.getParentId() == 0L).collect(Collectors.toList());
-        if (!CollectionUtils.isEmpty(fileVos)){
-            fileVos.forEach(file -> {
-                assembleFile(file,courseFileVos);
+        if (StringUtils.isNotBlank(queryBo.getFileName())) {
+            courseFileVos.forEach(file -> {
+                //获取路径
+                String path = file.getUrlName();
+                file.setFilePath(getFilePath(file, path));
+                if (file.getType() == 2) {
+                    handleCourseFile(file);
+                }
             });
-            courseHandoutsVo.setFileList(fileVos);
+            courseHandoutsVo.setFileList(courseFileVos);
+        } else {
+            List<CourseFileVo> fileVos = courseFileVos.stream().filter(item -> item.getParentId() == 0L).collect(Collectors.toList());
+            if (!CollectionUtils.isEmpty(fileVos)) {
+                fileVos.forEach(file -> {
+                    assembleFile(file, courseFileVos);
+                });
+                courseHandoutsVo.setFileList(fileVos);
+            }
         }
         return courseHandoutsVo;
     }
 
-    private void assembleFile(CourseFileVo parent,List<CourseFileVo> childs){
-        if (CollectionUtils.isEmpty(childs)){
+    private String getFilePath(CourseFileVo file, String urlName) {
+        if (file.getParentId() == 0) {
+            return urlName;
+        }
+        CourseFile courseFile = iCourseFileService.getById(file.getParentId());
+        urlName = courseFile.getUrlName() + "/" + urlName;
+        return getFilePath(BeanUtil.toBean(courseFile, CourseFileVo.class), urlName);
+    }
+
+    private void handleCourseFile(CourseFileVo file) {
+        List<CourseFile> list = iCourseFileService
+                .list(new LambdaQueryWrapper<CourseFile>()
+                        .eq(CourseFile::getParentId, file.getFileId())
+                        .eq(CourseFile::getStatus, 1));
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+        list.forEach(item -> {
+            handleCourseFile(BeanUtil.toBean(item, CourseFileVo.class));
+        });
+        file.setChildren(list.stream().map(x -> BeanUtil.toBean(x, CourseFileVo.class)).collect(Collectors.toList()));
+    }
+
+    private void assembleFile(CourseFileVo parent, List<CourseFileVo> childs) {
+        if (CollectionUtils.isEmpty(childs)) {
             return;
         }
         List<CourseFileVo> collect = childs.stream().filter(x -> x.getParentId().equals(parent.getFileId())).collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(collect)){
+        if (CollectionUtils.isEmpty(collect)) {
             return;
         }
         parent.setChildren(collect);
         collect.forEach(item -> {
-            assembleFile(item,childs);
+            assembleFile(item, childs);
         });
     }
 
@@ -252,237 +279,5 @@ public class CourseHandoutsServiceImpl extends ServiceImpl<CourseHandoutsMapper,
         return baseMapper.getHandoutsByTenant(encoder, newTenantId);
     }
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean addHandouts(MultipartFile[] files, CourseHandoutsAddBo bo) {
-        CourseHandouts add = BeanUtil.toBean(bo, CourseHandouts.class);
-        validEntityBeforeSave(add);
-        add.setCreateTime(DateUtils.getNowTime());
-        add.setUpdateTime(DateUtils.getNowTime());
-        add.setEncoder(ServletUtils.getEncoded("JYLB"));
-        boolean save = this.save(add);
-        //添加讲义绑定的业务层次
-        for (CourseHandoutsBusinessAddBo courseHandoutsBusinessAddBo : bo.getCourseHandoutsBusinessAddBos()) {
-            CourseHandoutsBusiness addBusiness = BeanUtil.toBean(courseHandoutsBusinessAddBo, CourseHandoutsBusiness.class);
-            addBusiness.setHandoutsId(add.getHandoutsId());
-            addBusiness.setCreateTime(DateUtils.getNowTime());
-            addBusiness.setUpdateTime(DateUtils.getNowTime());
-            courseHandoutsBusinessService.save(addBusiness);
-        }
-        for (MultipartFile multipartFile : files) {
-            if (multipartFile.getOriginalFilename().contains(".zip")) {
-                try {
-                    matchingFile(multipartFile.getOriginalFilename(),add.getHandoutsId(),0L);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    throw new CustomException("解压/上传zip包失败");
-                }
-            }else {
-                try {
-                    //文件
-                    CourseFile courseFile = new CourseFile();
-                    //上传阿里云
-                    OssRequest ossRequest = new OssRequest();
-                    ossRequest.setFile(multipartFile);
-                    ossRequest.setImageStatus(17);
-                    String upload = ossService.upload(ossRequest);
-                    courseFile.setUrlName(multipartFile.getOriginalFilename());
-                    courseFile.setUrl(upload);
-                    courseFile.setStatus(1);
-                    courseFile.setSort(1);
-                    courseFile.setCreateTime(DateUtils.getNowTime());
-                    courseFile.setUpdateTime(DateUtils.getNowTime());
-                    courseFile.setHandoutsId(add.getHandoutsId());
-                    courseFile.setType(1);//文件
-                    courseFile.setParentId(0L);
-                    iCourseFileService.save(courseFile);
-                }catch (Exception e){
-                    e.printStackTrace();
-                    throw new CustomException("上传文件失败");
-                }
-            }
-        }
-        return true;
-    }
-
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean updateHandouts(MultipartFile[] files, CourseHandoutsEditBo bo) {
-        CourseHandouts update = BeanUtil.toBean(bo, CourseHandouts.class);
-        validEntityBeforeSave(update);
-        update.setUpdateTime(DateUtils.getNowTime());
-        LambdaQueryWrapper<CourseHandoutsBusiness> lqw = Wrappers.lambdaQuery();
-        lqw.eq(CourseHandoutsBusiness::getHandoutsId, bo.getHandoutsId());
-        courseHandoutsBusinessService.remove(lqw);
-        //添加讲义绑定的业务层次
-        if (!CollectionUtils.isEmpty(bo.getCourseHandoutsBusinessAddBos())) {
-            for (CourseHandoutsBusinessAddBo courseHandoutsBusinessAddBo : bo.getCourseHandoutsBusinessAddBos()) {
-                CourseHandoutsBusiness addBusiness = BeanUtil.toBean(courseHandoutsBusinessAddBo, CourseHandoutsBusiness.class);
-                addBusiness.setHandoutsId(bo.getHandoutsId());
-                addBusiness.setCreateTime(DateUtils.getNowTime());
-                addBusiness.setUpdateTime(DateUtils.getNowTime());
-                courseHandoutsBusinessService.save(addBusiness);
-            }
-        }
-        //删除原有的关联重新绑定
-        iCourseFileService.remove(new LambdaQueryWrapper<CourseFile>().eq(CourseFile::getHandoutsId, update.getHandoutsId()));
-        if (!CollectionUtils.isEmpty(bo.getFileList())){
-            handleFile(bo.getFileList(),update.getHandoutsId(),files,0L);
-        }
-        //修改完成
-        update.setUpdateStatus(1);
-        return this.updateById(update);
-    }
-
-
-    private void handleFile(List<CourseFileAddBo> fileList,Long handoutsId,MultipartFile[] files,Long parentId){
-        fileList.forEach(bo -> {
-            Long fileId = 0L;
-            if (ObjectUtils.isNull(bo.getFileId())){
-                //新增讲义
-                fileId = handleAddFile(files,bo.getUrlName(),parentId,handoutsId);
-            }else {
-                bo.setFileId(null);
-                bo.setParentId(parentId);
-                bo.setHandoutsId(handoutsId);
-                CourseFile courseFile = BeanUtil.toBean(bo, CourseFile.class);
-                courseFile.setCreateTime(DateUtils.getNowTime());
-                courseFile.setUpdateTime(DateUtils.getNowTime());
-                iCourseFileService.save(courseFile);
-                fileId = courseFile.getFileId();
-            }
-            if (!CollectionUtils.isEmpty(bo.getChildren())){
-                handleFile(bo.getChildren(),handoutsId,files,fileId);
-            }
-        });
-    }
-
-    private Long handleAddFile(MultipartFile[] files, String addFileName, Long fileId, Long handoutsId) {
-        //新增文件资源
-        MultipartFile multipartFile = Arrays.stream(files).filter(item -> item.getOriginalFilename().equals(addFileName)).findFirst().orElse(null);
-        if (ObjectUtils.isNotNull(multipartFile)){
-            if (multipartFile.getOriginalFilename().contains(".zip")) {
-                try {
-                    return matchingFile(addFileName,handoutsId,fileId);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    throw new CustomException("解压/上传zip包失败");
-                }
-            }else {
-                try {
-                    //文件
-                    CourseFile file = new CourseFile();
-
-                    //上传阿里云
-                    OssRequest ossRequest = new OssRequest();
-                    ossRequest.setFile(multipartFile);
-                    ossRequest.setImageStatus(17);
-                    String upload = ossService.upload(ossRequest);
-//                    String ossPath = ossService.uploadInputStream(multipartFile.getInputStream(), 17);
-                    file.setUrlName(multipartFile.getOriginalFilename());
-                    file.setUrl(upload);
-                    file.setStatus(1);
-                    file.setSort(1);
-                    file.setCreateTime(DateUtils.getNowTime());
-                    file.setUpdateTime(DateUtils.getNowTime());
-                    file.setHandoutsId(handoutsId);
-                    file.setType(1);//文件
-                    file.setParentId(fileId);
-                    iCourseFileService.save(file);
-                    return file.getFileId();
-                }catch (Exception e){
-                    e.printStackTrace();
-                    throw new CustomException("上传文件失败");
-                }
-            }
-        }
-        return 0L;
-    }
-
-    private Long matchingFile(String addFileName, Long handoutsId, Long fileId) throws Exception {
-        String zhiyuan = System.getProperty("user.dir");
-        String destDirPath = zhiyuan+"/zhongzheng-admin/src/main/resources/zhiyuan";
-        String substring = addFileName.substring(0, addFileName.indexOf("."));
-        String path =  destDirPath+"/"+ substring;
-        //文件夹
-        CourseFile courseFile = new CourseFile();
-        courseFile.setUrlName(substring);
-        courseFile.setStatus(1);
-        courseFile.setSort(1);
-        courseFile.setCreateTime(DateUtils.getNowTime());
-        courseFile.setUpdateTime(DateUtils.getNowTime());
-        courseFile.setHandoutsId(handoutsId);
-        courseFile.setType(2);//文件夹
-        courseFile.setParentId(fileId);
-        iCourseFileService.save(courseFile);
-        //处理讲义文件
-        getFileNames(new File(path), courseFile.getFileId(), handoutsId);
-        return courseFile.getFileId();
-    }
-
-
-    /**
-     * 得到文件名称
-     *
-     * @param file     文件
-     * @param parentId 父ID
-     * @return {@link List}<{@link String}>
-     */
-    private void getFileNames(File file, Long parentId, Long handoutsId) throws Exception {
-        File[] files = file.listFiles();
-        for (File f : files) {
-            if (f.isDirectory()) {
-                //文件夹
-                CourseFile courseFile = new CourseFile();
-                courseFile.setUrlName(f.getName());
-                courseFile.setStatus(1);
-                courseFile.setSort(1);
-                courseFile.setCreateTime(DateUtils.getNowTime());
-                courseFile.setUpdateTime(DateUtils.getNowTime());
-                courseFile.setHandoutsId(handoutsId);
-                courseFile.setType(2);//文件夹
-                courseFile.setParentId(parentId);
-                iCourseFileService.save(courseFile);
-                getFileNames(f, courseFile.getFileId(), handoutsId);
-            } else {
-                //文件
-                CourseFile courseFile = new CourseFile();
-                //上传阿里云
-                OssRequest ossRequest = new OssRequest();
-                ossRequest.setFile(getMultipartFile(f));
-                ossRequest.setImageStatus(17);
-                String upload = ossService.upload(ossRequest);
-//                //上传oss
-//                String ossPath = ossService.uploadInputStream(new FileInputStream(f), 17);
-                courseFile.setUrlName(f.getName());
-                courseFile.setUrl(upload);
-                courseFile.setStatus(1);
-                courseFile.setSort(1);
-                courseFile.setCreateTime(DateUtils.getNowTime());
-                courseFile.setUpdateTime(DateUtils.getNowTime());
-                courseFile.setHandoutsId(handoutsId);
-                courseFile.setType(1);//文件
-                courseFile.setParentId(parentId);
-                iCourseFileService.save(courseFile);
-            }
-        }
-    }
-
-    public static MultipartFile getMultipartFile(File file) {
-        FileItem item = new DiskFileItemFactory().createItem("file"
-                , MediaType.MULTIPART_FORM_DATA_VALUE
-                , true
-                , file.getName());
-        try (InputStream input = new FileInputStream(file);
-             OutputStream os = item.getOutputStream()) {
-            // 流转移
-            IOUtils.copy(input, os);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("Invalid file: " + e, e);
-        }
-
-        return new CommonsMultipartFile(item);
-    }
 
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseFileVo.java

@@ -40,6 +40,7 @@ public class CourseFileVo {
 	@ApiModelProperty("讲义")
 	private Integer handoutsId;
 	/** 排序 */
+
 	@Excel(name = "排序")
 	@ApiModelProperty("排序")
 	private Integer sort;
@@ -47,6 +48,8 @@ public class CourseFileVo {
 	@ApiModelProperty("类型:1文件 2文件夹")
 	private Integer type;
 
+	private String filePath;
+
 	private Long parentId;
 
 	private List<CourseFileVo> children;

+ 35 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/domain/TopSysRoleBusiness.java

@@ -0,0 +1,35 @@
+package com.zhongzheng.modules.top.user.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 【请填写功能名称】对象 top_sys_role_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_role_business")
+public class TopSysRoleBusiness implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 角色ID */
+    @TableId(value = "id")
+    private Long id;
+    /** 角色ID */
+    @TableField(value = "role_id")
+    private Long roleId;
+    /** 菜单ID */
+    @TableField(value = "business_id")
+    private Long businessId;
+}

+ 1 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/domain/TopSysRoleMenu.java

@@ -1,7 +1,6 @@
 package com.zhongzheng.modules.top.user.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -24,7 +23,7 @@ public class TopSysRoleMenu implements Serializable {
 private static final long serialVersionUID=1L;
 
     /** 角色ID */
-    @TableId(value = "role_id")
+    @TableField(value = "role_id")
     private Long roleId;
     /** 菜单ID */
     @TableField(value = "menu_id")

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/mapper/TopSysRoleBusinessMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.user.domain.TopSysRoleBusiness;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysRoleBusinessMapper extends BaseMapper<TopSysRoleBusiness> {
+
+}

+ 14 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/user/service/impl/TopSysRoleServiceImpl.java

@@ -8,14 +8,8 @@ import com.zhongzheng.common.annotation.DataScope;
 import com.zhongzheng.common.constant.UserConstants;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.spring.SpringUtils;
-import com.zhongzheng.modules.top.user.domain.TopSysRole;
-import com.zhongzheng.modules.top.user.domain.TopSysRoleDept;
-import com.zhongzheng.modules.top.user.domain.TopSysRoleMenu;
-import com.zhongzheng.modules.top.user.domain.TopSysUserRole;
-import com.zhongzheng.modules.top.user.mapper.TopSysRoleDeptMapper;
-import com.zhongzheng.modules.top.user.mapper.TopSysRoleMapper;
-import com.zhongzheng.modules.top.user.mapper.TopSysRoleMenuMapper;
-import com.zhongzheng.modules.top.user.mapper.TopSysUserRoleMapper;
+import com.zhongzheng.modules.top.user.domain.*;
+import com.zhongzheng.modules.top.user.mapper.*;
 import com.zhongzheng.modules.top.user.service.ITopSysRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,6 +34,9 @@ public class TopSysRoleServiceImpl extends ServiceImpl<TopSysRoleMapper, TopSysR
 
     @Autowired
     private TopSysRoleDeptMapper topSysRoleDeptMapper;
+
+    @Autowired
+    private TopSysRoleBusinessMapper topSysRoleBusinessMapper;
     
 
     /**
@@ -187,6 +184,15 @@ public class TopSysRoleServiceImpl extends ServiceImpl<TopSysRoleMapper, TopSysR
     public int insertRole(TopSysRole role) {
         // 新增角色信息
         baseMapper.insert(role);
+        if(role.getBusinessIds()!=null&&role.getBusinessIds().size()>0){
+            boolean result = false;
+            for (Long businessId : role.getBusinessIds()) {
+                TopSysRoleBusiness add = new TopSysRoleBusiness();
+                add.setBusinessId(businessId);
+                add.setRoleId(role.getRoleId());
+                topSysRoleBusinessMapper.insert(add);
+            }
+        }
         return insertRoleMenu(role);
     }