home před 2 roky
rodič
revize
8c365f16f2
27 změnil soubory, kde provedl 335 přidání a 107 odebrání
  1. 2 0
      bladex-tool/blade-starter-mybatis/src/main/java/org/springblade/core/mp/config/MybatisPlusConfiguration.java
  2. 23 24
      hx-common/common-client-util/src/main/java/com/fjhx/utils/FileClientUtil.java
  3. 5 5
      hx-common/common-file/src/main/java/com/fjhx/feign/FileClient.java
  4. 3 3
      hx-common/common-file/src/main/java/com/fjhx/service/FileInfoService.java
  5. 8 18
      hx-common/common-file/src/main/java/com/fjhx/service/impl/FileInfoServiceImpl.java
  6. 2 0
      hx-common/common-video/src/main/java/com/fjhx/ServiceVideoApplication.java
  7. 7 8
      hx-common/common-video/src/main/java/com/fjhx/controller/video/VideoInfoController.java
  8. 11 2
      hx-common/common-video/src/main/java/com/fjhx/service/video/VideoClassifyService.java
  9. 1 1
      hx-common/common-video/src/main/java/com/fjhx/service/video/VideoInfoService.java
  10. 58 2
      hx-common/common-video/src/main/java/com/fjhx/service/video/impl/VideoClassifyServiceImpl.java
  11. 139 7
      hx-common/common-video/src/main/java/com/fjhx/service/video/impl/VideoInfoServiceImpl.java
  12. 1 1
      hx-common/common-video/src/main/resources/application-dev.yml
  13. 1 1
      hx-common/common-video/src/main/resources/application-prod.yml
  14. 1 1
      hx-common/common-video/src/main/resources/application-test.yml
  15. 4 3
      hx-service-api/common-file-api/src/main/java/com/fjhx/feign/IFileClient.java
  16. 7 0
      hx-service-api/common-video-api/pom.xml
  17. 12 5
      hx-service-api/common-video-api/src/main/java/com/fjhx/entity/video/VideoInfo.java
  18. 4 0
      hx-service-api/common-video-api/src/main/java/com/fjhx/params/video/VideoInfoVo.java
  19. 2 2
      hx-service-api/iot-management-api/src/main/java/com/fjhx/params/bom/BomEx.java
  20. 2 1
      hx-service-api/iot-management-api/src/main/java/com/fjhx/params/bom/BomVo.java
  21. 2 2
      hx-service-api/iot-management-api/src/main/java/com/fjhx/params/working/WorkingProcedureVo.java
  22. 7 7
      hx-service/iot-management/src/main/java/com/fjhx/service/bom/impl/BomServiceImpl.java
  23. 1 1
      hx-service/iot-management/src/main/java/com/fjhx/service/material/impl/MaterialExServiceImpl.java
  24. 2 2
      hx-service/iot-management/src/main/java/com/fjhx/service/working/impl/WorkingProcedureServiceImpl.java
  25. 3 0
      hx-service/storage/src/main/java/com/fjhx/apply/mapper/ApplyPurchaseMapper.xml
  26. 22 4
      hx-service/storage/src/main/java/com/fjhx/apply/service/impl/ApplyPurchaseServiceImpl.java
  27. 5 7
      hx-service/storage/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java

+ 2 - 0
bladex-tool/blade-starter-mybatis/src/main/java/org/springblade/core/mp/config/MybatisPlusConfiguration.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import lombok.AllArgsConstructor;
 import net.sf.jsqlparser.expression.Expression;
@@ -104,6 +105,7 @@ public class MybatisPlusConfiguration implements WebMvcConfigurer {
         paginationInterceptor.setOverflow(mybatisPlusProperties.getOverflow());
         paginationInterceptor.setOptimizeJoin(mybatisPlusProperties.getOptimizeJoin());
         interceptor.addInnerInterceptor(paginationInterceptor);
+        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
         return interceptor;
     }
 

+ 23 - 24
hx-common/common-client-util/src/main/java/com/fjhx/utils/FileClientUtil.java

@@ -2,8 +2,8 @@ package com.fjhx.utils;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.fjhx.entity.FileInfo;
 import com.fjhx.feign.IFileClient;
-import com.fjhx.params.FileInfoParam;
 import org.springblade.core.tool.api.R;
 
 import java.util.Collections;
@@ -28,23 +28,23 @@ public class FileClientUtil {
      * @param businessType 业务类型
      * @param paramList    文件信息
      */
-    public static void bindingFile(Long businessId, Integer businessType, List<FileInfoParam> paramList) {
+    public static void bindingFile(Long businessId, Integer businessType, List<FileInfo> paramList) {
         if (ObjectUtil.isEmpty(paramList)) return;
         R result = fileClient.bindingFile(APPLICATION_NAME, businessId, businessType, paramList);
         Assert.eqTrue(result.isSuccess(), "保存文件信息失败");
     }
 
-    public static void bindingFile(Long businessId, List<FileInfoParam> paramList) {
+    public static void bindingFile(Long businessId, List<FileInfo> paramList) {
         bindingFile(businessId, DEFAULT_TYPE, paramList);
     }
 
-    public static void bindingFile(Long businessId, Integer businessType, FileInfoParam param) {
+    public static void bindingFile(Long businessId, Integer businessType, FileInfo param) {
         if (ObjectUtil.isEmpty(param)) return;
         R result = fileClient.bindingFile(APPLICATION_NAME, businessId, businessType, Collections.singletonList(param));
         Assert.eqTrue(result.isSuccess(), "保存文件信息失败");
     }
 
-    public static void bindingFile(Long businessId, FileInfoParam param) {
+    public static void bindingFile(Long businessId, FileInfo param) {
         bindingFile(businessId, DEFAULT_TYPE, param);
     }
 
@@ -55,23 +55,23 @@ public class FileClientUtil {
      * @param businessType 业务类型
      * @param paramList    文件信息
      */
-    public static void againBindingFile(Long businessId, Integer businessType, List<FileInfoParam> paramList) {
+    public static void againBindingFile(Long businessId, Integer businessType, List<FileInfo> paramList) {
         if (ObjectUtil.isEmpty(paramList)) return;
         R result = fileClient.againBindingFile(APPLICATION_NAME, businessId, businessType, paramList);
         Assert.eqTrue(result.isSuccess(), "保存文件信息失败");
     }
 
-    public static void againBindingFile(Long businessId, List<FileInfoParam> paramList) {
+    public static void againBindingFile(Long businessId, List<FileInfo> paramList) {
         againBindingFile(businessId, DEFAULT_TYPE, paramList);
     }
 
-    public static void againBindingFile(Long businessId, Integer businessType, FileInfoParam param) {
+    public static void againBindingFile(Long businessId, Integer businessType, FileInfo param) {
         if (ObjectUtil.isEmpty(param)) return;
         R result = fileClient.againBindingFile(APPLICATION_NAME, businessId, businessType, Collections.singletonList(param));
         Assert.eqTrue(result.isSuccess(), "保存文件信息失败");
     }
 
-    public static void againBindingFile(Long businessId, FileInfoParam param) {
+    public static void againBindingFile(Long businessId, FileInfo param) {
         againBindingFile(businessId, DEFAULT_TYPE, param);
     }
 
@@ -89,33 +89,32 @@ public class FileClientUtil {
     /**
      * 获取文件信息
      */
-    public static FileInfoParam getFileInfo(Long businessId) {
-        R<List<FileInfoParam>> result = fileClient.getFileInfo(Collections.singletonList(businessId));
-        List<FileInfoParam> data = result.getData();
-        return data.size() == 0 ? null : data.get(data.size() - 1);
+    public static FileInfo getFileInfo(Long businessId) {
+        R<List<FileInfo>> result = fileClient.getFileInfo(Collections.singletonList(businessId));
+        List<FileInfo> data = result.getData();
+        return data.size() == 0 ? null : data.get(0);
     }
 
-    public static List<FileInfoParam> getFileInfoList(Long businessId) {
-        R<List<FileInfoParam>> result = fileClient.getFileInfo(Collections.singletonList(businessId));
+    public static List<FileInfo> getFileInfoList(Long businessId) {
+        R<List<FileInfo>> result = fileClient.getFileInfo(Collections.singletonList(businessId));
         return result.getData();
     }
 
-    public static Map<Long, FileInfoParam> getFileInfoMap(List<Long> businessId) {
-        if (ObjectUtil.isEmpty(businessId)){
+    public static Map<Long, FileInfo> getFileInfoMap(List<Long> businessId) {
+        if (ObjectUtil.isEmpty(businessId)) {
             return new HashMap<>();
         }
-        R<List<FileInfoParam>> result = fileClient.getFileInfo(businessId);
+        R<List<FileInfo>> result = fileClient.getFileInfo(businessId);
         return result.getData().stream().collect(Collectors.toMap(
-                FileInfoParam::getBusinessId,
+                FileInfo::getBusinessId,
                 item -> item,
-                (v1, v2) -> v2
+                (v1, v2) -> v1
         ));
     }
 
-    public static Map<Long, List<FileInfoParam>> getFileInfoListMap(List<Long> businessId) {
-        R<List<FileInfoParam>> result = fileClient.getFileInfo(businessId);
-        return result.getData().stream().collect(Collectors.groupingBy(
-                FileInfoParam::getBusinessId));
+    public static Map<Long, List<FileInfo>> getFileInfoListMap(List<Long> businessId) {
+        R<List<FileInfo>> result = fileClient.getFileInfo(businessId);
+        return result.getData().stream().collect(Collectors.groupingBy(FileInfo::getBusinessId));
     }
 
 }

+ 5 - 5
hx-common/common-file/src/main/java/com/fjhx/feign/FileClient.java

@@ -1,6 +1,6 @@
 package com.fjhx.feign;
 
-import com.fjhx.params.FileInfoParam;
+import com.fjhx.entity.FileInfo;
 import com.fjhx.service.FileInfoService;
 import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,14 +17,14 @@ public class FileClient implements IFileClient {
 
     @PostMapping(BINDING_FILE)
     @Override
-    public R bindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfoParam> paramList) {
+    public R bindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfo> paramList) {
         fileInfoService.bindingFile(applicationName, businessId, businessType, paramList);
         return R.success();
     }
 
     @PostMapping(AGAIN_BINDING_FILE)
     @Override
-    public R againBindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfoParam> paramList) {
+    public R againBindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfo> paramList) {
         fileInfoService.againBindingFile(applicationName, businessId, businessType, paramList);
         return R.success();
     }
@@ -38,8 +38,8 @@ public class FileClient implements IFileClient {
 
     @PostMapping(GET_FILE_INFO)
     @Override
-    public R<List<FileInfoParam>> getFileInfo(List<Long> businessIdList) {
-        List<FileInfoParam> list = fileInfoService.getFileInfo(businessIdList);
+    public R<List<FileInfo>> getFileInfo(List<Long> businessIdList) {
+        List<FileInfo> list = fileInfoService.getFileInfo(businessIdList);
         return R.success(list);
     }
 

+ 3 - 3
hx-common/common-file/src/main/java/com/fjhx/service/FileInfoService.java

@@ -31,12 +31,12 @@ public interface FileInfoService extends BaseService<FileInfo> {
     /**
      * 绑定文件
      */
-    void bindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfoParam> paramList);
+    void bindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfo> paramList);
 
     /**
      * 重新绑定文件
      */
-    void againBindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfoParam> paramList);
+    void againBindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfo> paramList);
 
     /**
      * 解除绑定文件
@@ -48,6 +48,6 @@ public interface FileInfoService extends BaseService<FileInfo> {
      *
      * @param businessIdList 业务id list
      */
-    List<FileInfoParam> getFileInfo(List<Long> businessIdList);
+    List<FileInfo> getFileInfo(List<Long> businessIdList);
 
 }

+ 8 - 18
hx-common/common-file/src/main/java/com/fjhx/service/impl/FileInfoServiceImpl.java

@@ -1,6 +1,5 @@
 package com.fjhx.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.ObjectUtil;
@@ -9,7 +8,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.base.BaseEntity;
 import com.fjhx.entity.FileInfo;
 import com.fjhx.mapper.FileInfoMapper;
-import com.fjhx.params.FileInfoParam;
 import com.fjhx.service.FileInfoService;
 import com.fjhx.utils.Assert;
 import org.springblade.core.launch.BladeApplication;
@@ -25,7 +23,6 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -111,29 +108,26 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         );
     }
 
-    public void bindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfoParam> paramList) {
+    public void bindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfo> paramList) {
         if (paramList.size() == 0) {
             return;
         }
 
-        List<FileInfo> fileInfoList = new ArrayList<>();
         for (int i = 0; i < paramList.size(); i++) {
-            FileInfoParam fileInfoParam = paramList.get(i);
-            FileInfo fileInfo = new FileInfo();
-            fileInfo.setId(fileInfoParam.getId());
+            FileInfo fileInfo = paramList.get(i);
             fileInfo.setBusinessId(businessId);
             fileInfo.setBusinessType(businessType);
             fileInfo.setApplicationName(applicationName);
             fileInfo.setSort(i);
-            fileInfoList.add(fileInfo);
         }
 
-        updateBatchById(fileInfoList);
+
+        updateBatchById(paramList);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void againBindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfoParam> paramList) {
+    public void againBindingFile(String applicationName, Long businessId, Integer businessType, List<FileInfo> paramList) {
 
         if (paramList.size() == 0) {
             return;
@@ -141,7 +135,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
 
         bindingFile(applicationName, businessId, businessType, paramList);
 
-        List<Long> id = paramList.stream().map(FileInfoParam::getId).collect(Collectors.toList());
+        List<Long> id = paramList.stream().map(FileInfo::getId).collect(Collectors.toList());
 
         // 删除其他文件
         remove(Wrappers.<FileInfo>lambdaQuery()
@@ -158,12 +152,8 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     }
 
     @Override
-    public List<FileInfoParam> getFileInfo(List<Long> businessIdList) {
-        if (businessIdList.size() == 0) {
-            return new ArrayList<>();
-        }
-        List<FileInfo> list = lambdaQuery().in(FileInfo::getBusinessId, businessIdList).orderByAsc(FileInfo::getSort).list();
-        return list.stream().map(item -> BeanUtil.toBean(item, FileInfoParam.class)).collect(Collectors.toList());
+    public List<FileInfo> getFileInfo(List<Long> businessIdList) {
+        return lambdaQuery().in(FileInfo::getBusinessId, businessIdList).orderByAsc(FileInfo::getSort).list();
     }
 
     /**

+ 2 - 0
hx-common/common-video/src/main/java/com/fjhx/ServiceVideoApplication.java

@@ -3,12 +3,14 @@ package com.fjhx;
 import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.launch.BladeApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 /**
  * 针筒物联网管理模块启动器
  */
 @EnableBladeFeign
 @SpringCloudApplication
+@EnableAsync
 public class ServiceVideoApplication {
 
     private static final String APP_NAME = "service-video";

+ 7 - 8
hx-common/common-video/src/main/java/com/fjhx/controller/video/VideoInfoController.java

@@ -1,10 +1,9 @@
 package com.fjhx.controller.video;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springblade.core.tool.api.R;
-import com.fjhx.entity.video.VideoInfo;
 import com.fjhx.params.video.VideoInfoVo;
 import com.fjhx.service.video.VideoInfoService;
+import org.springblade.core.tool.api.R;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -15,7 +14,7 @@ import java.util.Map;
 
 /**
  * <p>
- *  前端控制器
+ * 前端控制器
  * </p>
  *
  * @author ${author}
@@ -29,25 +28,25 @@ public class VideoInfoController {
     private VideoInfoService videoInfoService;
 
     @PostMapping("/page")
-    public R page(@RequestBody Map<String, String> condition){
-        Page<VideoInfo> result = videoInfoService.getPage(condition);
+    public R page(@RequestBody Map<String, String> condition) {
+        Page<Map<String, Object>> result = videoInfoService.getPage(condition);
         return R.success(result);
     }
 
     @PostMapping("/add")
-    public R add(@RequestBody VideoInfoVo videoInfoVo){
+    public R add(@RequestBody VideoInfoVo videoInfoVo) {
         videoInfoService.add(videoInfoVo);
         return R.success();
     }
 
     @PostMapping("/edit")
-    public R edit(@RequestBody VideoInfoVo videoInfoVo){
+    public R edit(@RequestBody VideoInfoVo videoInfoVo) {
         videoInfoService.edit(videoInfoVo);
         return R.success();
     }
 
     @PostMapping("/delete")
-    public R delete(@RequestBody VideoInfoVo videoInfoVo){
+    public R delete(@RequestBody VideoInfoVo videoInfoVo) {
         videoInfoService.delete(videoInfoVo);
         return R.success();
     }

+ 11 - 2
hx-common/common-video/src/main/java/com/fjhx/service/video/VideoClassifyService.java

@@ -1,9 +1,8 @@
 package com.fjhx.service.video;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.BaseService;
 import com.fjhx.entity.video.VideoClassify;
 import com.fjhx.params.video.VideoClassifyVo;
-import com.fjhx.base.BaseService;
 
 import java.util.List;
 import java.util.Map;
@@ -34,4 +33,14 @@ public interface VideoClassifyService extends BaseService<VideoClassify> {
      */
     List<Long> getChildrenIdList(Long classifyId);
 
+    /**
+     * 改变分类视频数量
+     *
+     * @param oldClassifyId 原分类id
+     * @param oldVideoNum   原视频数量
+     * @param newClassifyId 现分类id
+     * @param newVideoNum   现视频数量
+     */
+    void updateVideoNum(Long oldClassifyId, Integer oldVideoNum, Long newClassifyId, Integer newVideoNum);
+
 }

+ 1 - 1
hx-common/common-video/src/main/java/com/fjhx/service/video/VideoInfoService.java

@@ -17,7 +17,7 @@ import java.util.Map;
  */
 public interface VideoInfoService extends BaseService<VideoInfo> {
 
-    Page<VideoInfo> getPage(Map<String, String> condition);
+    Page<Map<String, Object>> getPage(Map<String, String> condition);
 
     void add(VideoInfoVo videoInfoVo);
 

+ 58 - 2
hx-common/common-video/src/main/java/com/fjhx/service/video/impl/VideoClassifyServiceImpl.java

@@ -12,8 +12,10 @@ import com.fjhx.utils.TreeUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -34,7 +36,7 @@ public class VideoClassifyServiceImpl extends ServiceImpl<VideoClassifyMapper, V
         String name = condition.get("name");
 
         List<VideoClassify> list = lambdaQuery()
-                .select(VideoClassify::getId, VideoClassify::getName, VideoClassify::getParentId)
+                .select(VideoClassify::getId, VideoClassify::getName, VideoClassify::getParentId, VideoClassify::getVideoNum)
                 .like(ObjectUtil.isNotEmpty(name), VideoClassify::getName, name)
                 .list();
 
@@ -65,6 +67,9 @@ public class VideoClassifyServiceImpl extends ServiceImpl<VideoClassifyMapper, V
         }
 
         peerNameOnly(classifyVo.getParentId(), classifyVo.getName(), null);
+
+        classifyVo.setVideoNum(0);
+
         save(classifyVo);
     }
 
@@ -103,7 +108,6 @@ public class VideoClassifyServiceImpl extends ServiceImpl<VideoClassifyMapper, V
 
         List<VideoClassify> list = lambdaQuery()
                 .select(BaseEntity::getId)
-                .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
                 .like(VideoClassify::getParentIdSet, classifyId)
                 .list();
 
@@ -114,6 +118,58 @@ public class VideoClassifyServiceImpl extends ServiceImpl<VideoClassifyMapper, V
         return result;
     }
 
+
+    @Override
+    public void updateVideoNum(Long oldClassifyId, Integer oldVideoNum, Long newClassifyId, Integer newVideoNum) {
+        if (ObjectUtil.equals(oldVideoNum, newVideoNum) && ObjectUtil.equals(oldClassifyId, newClassifyId)) return;
+
+        synchronized (this) {
+            Map<Long, VideoClassify> videoClassifyMap = list().stream().collect(Collectors.toMap(BaseEntity::getId, item -> item));
+
+            Set<VideoClassify> videoClassifies = new HashSet<>();
+
+            // 分类相同,变更改变量即可
+
+            if (ObjectUtil.equals(oldClassifyId, newClassifyId)) {
+                // 递归寻找所有父级节点
+                recursion(videoClassifies, videoClassifyMap, oldClassifyId, newVideoNum - oldVideoNum);
+            }
+            // 分类不相同,减去旧的数量,加上新的数量
+            else {
+                if (oldVideoNum != 0)
+                    recursion(videoClassifies, videoClassifyMap, oldClassifyId, -oldVideoNum);
+
+                if (newVideoNum != 0)
+                    recursion(videoClassifies, videoClassifyMap, newClassifyId, newVideoNum);
+            }
+
+            boolean b = updateBatchById(videoClassifies);
+
+            Assert.eqTrue(b, "更新分类视频数量失败");
+        }
+    }
+
+    /**
+     * 递归出所有需要变更数量的分类
+     *
+     * @param videoClassifies  需要更新视频数量的分类
+     * @param videoClassifyMap key classifyId;value VideoClassify
+     * @param classifyId       父级id
+     * @param changeNum        变更数量
+     */
+    private void recursion(Set<VideoClassify> videoClassifies, Map<Long, VideoClassify> videoClassifyMap, Long classifyId, Integer changeNum) {
+        VideoClassify videoClassify = videoClassifyMap.get(classifyId);
+        videoClassify.setVideoNum(videoClassify.getVideoNum() + changeNum);
+        videoClassifies.add(videoClassify);
+
+        Long parentId = videoClassify.getParentId();
+        if (parentId != 0) {
+            recursion(videoClassifies, videoClassifyMap, parentId, changeNum);
+        }
+
+    }
+
+
     /**
      * 保证同级名称不重复
      */

+ 139 - 7
hx-common/common-video/src/main/java/com/fjhx/service/video/impl/VideoInfoServiceImpl.java

@@ -1,21 +1,30 @@
 package com.fjhx.service.video.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.utils.WrapperUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.video.VideoInfo;
-import com.fjhx.params.video.VideoInfoVo;
 import com.fjhx.mapper.video.VideoInfoMapper;
+import com.fjhx.params.video.VideoInfoVo;
+import com.fjhx.service.video.VideoClassifyService;
 import com.fjhx.service.video.VideoInfoService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.utils.FileClientUtil;
+import com.fjhx.utils.WrapperUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
- *  服务实现类
+ * 服务实现类
  * </p>
  *
  * @author ${author}
@@ -24,31 +33,154 @@ import java.util.Map;
 @Service
 public class VideoInfoServiceImpl extends ServiceImpl<VideoInfoMapper, VideoInfo> implements VideoInfoService {
 
+    @Autowired
+    private VideoClassifyService videoClassifyService;
+
     @Override
-    public Page<VideoInfo> getPage(Map<String, String> condition) {
+    public Page<Map<String, Object>> getPage(Map<String, String> condition) {
 
         QueryWrapper<VideoInfo> wrapper = Wrappers.query();
 
         WrapperUtil.init(condition, wrapper)
+                .keyword("title")
                 .createTimeDesc();
 
-        Page<VideoInfo> page = page(condition, wrapper);
+        wrapper.lambda().select(
+                BaseEntity::getId, VideoInfo::getTitle, VideoInfo::getStatus, VideoInfo::getDuration
+                , VideoInfo::getSize, BaseEntity::getCreateTime, BaseEntity::getUpdateTime
+        );
+
+        // 赋值视频地址
+        Page<Map<String, Object>> page = pageMaps(createPageMap(condition), wrapper);
+        List<Map<String, Object>> records = page.getRecords();
+
+        if (records.size() == 0) {
+            return page;
+        }
+
+        List<Long> idList = records.stream().map(item -> (Long) item.get("id")).collect(Collectors.toList());
+
+        Map<Long, FileInfo> fileInfoMap = FileClientUtil.getFileInfoMap(idList);
+
+        for (Map<String, Object> record : records) {
+            Long id = (Long) record.get("id");
+
+            FileInfo fileInfo = fileInfoMap.get(id);
+            if (fileInfo != null) {
+                record.put("videoUrl", fileInfo.getFilePath());
+            }
+
+            // kb转m
+            Long size = (Long) record.get("size");
+            record.put("size", size / 1024 + "M");
+
+            // 秒转时分秒
+            Long duration = (Long) record.get("duration");
+            StringBuilder durationSB = new StringBuilder();
+            long h = duration / 60 / 60;
+            if (h > 0) {
+                durationSB.append(h).append("时");
+            }
+            long m = duration / 60 % 60;
+            if (h > 0 || m > 0) {
+                durationSB.append(m).append("分");
+            }
+            long s = duration % 60;
+            durationSB.append(s).append("秒");
+
+            record.put("duration", durationSB.toString());
+
+        }
+
         return page;
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(VideoInfoVo videoInfoVo) {
+
+        setVideo(videoInfoVo);
+
+        // TODO 类型未定,目前先赋值已发布
+        videoInfoVo.setStatus(2);
+
+        // 变更分类视频数量
+        updateClassifyVideoNum(null, videoInfoVo.getVideoClassifyId(), videoInfoVo.getVideoNum());
+
         save(videoInfoVo);
+
+        // 添加文件
+        FileClientUtil.bindingFile(videoInfoVo.getId(), videoInfoVo.getFileInfoList());
+
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(VideoInfoVo videoInfoVo) {
+
+        setVideo(videoInfoVo);
+
+        // 变更分类视频数量
+        updateClassifyVideoNum(videoInfoVo.getId(), videoInfoVo.getVideoClassifyId(), videoInfoVo.getVideoNum());
+
         updateById(videoInfoVo);
+
+        // 编辑文件
+        FileClientUtil.againBindingFile(videoInfoVo.getId(), videoInfoVo.getFileInfoList());
+
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(VideoInfoVo videoInfoVo) {
-        removeById(videoInfoVo.getId());
+        Long id = videoInfoVo.getId();
+
+        // 变更分类视频数量
+        updateClassifyVideoNum(videoInfoVo.getId(), null, 0);
+
+        removeById(id);
+
+        // 删除文件
+        FileClientUtil.relieveBindingFile(id);
+
+    }
+
+    /**
+     * 保存视频信息
+     */
+    private void setVideo(VideoInfoVo videoInfoVo) {
+        List<FileInfo> fileInfoList = videoInfoVo.getFileInfoList();
+
+        if (ObjectUtil.isEmpty(fileInfoList)) {
+            videoInfoVo.setSize(0L);
+            videoInfoVo.setDuration(0L);
+            videoInfoVo.setVideoNum(0);
+            return;
+        }
+
+        // 视频大小
+        Long size = fileInfoList.stream().mapToLong(FileInfo::getFileSize).sum();
+        videoInfoVo.setSize(size);
+
+        // 视频时长
+        Long duration = fileInfoList.stream().mapToLong(FileInfo::getDuration).sum();
+        videoInfoVo.setDuration(duration);
+
+        // 视频数量
+        videoInfoVo.setVideoNum(fileInfoList.size());
+    }
+
+    /**
+     * 修改分类保存的视频数量
+     */
+    private void updateClassifyVideoNum(Long id, Long classifyId, Integer videoNum) {
+        if (id == null) {
+            videoClassifyService.updateVideoNum(classifyId, 0, classifyId, videoNum);
+            return;
+        }
+
+        VideoInfo byId = getById(id);
+        videoClassifyService.updateVideoNum(byId.getVideoClassifyId(), byId.getVideoNum(), classifyId, videoNum);
     }
 
 }

+ 1 - 1
hx-common/common-video/src/main/resources/application-dev.yml

@@ -1,6 +1,6 @@
 # 服务器端口
 server:
-  port: 8200
+  port: 8002
 logging:
   level:
     org.springframework.data.mongodb.core: DEBUG

+ 1 - 1
hx-common/common-video/src/main/resources/application-prod.yml

@@ -1,6 +1,6 @@
 # 服务器端口
 server:
-  port: 8200
+  port: 8002
 
 # 数据源配置
 spring:

+ 1 - 1
hx-common/common-video/src/main/resources/application-test.yml

@@ -1,6 +1,6 @@
 # 服务器端口
 server:
-  port: 8200
+  port: 8002
 
 # 数据源配置
 spring:

+ 4 - 3
hx-service-api/common-file-api/src/main/java/com/fjhx/feign/IFileClient.java

@@ -1,6 +1,7 @@
 package com.fjhx.feign;
 
 import com.fjhx.constants.ClientConstant;
+import com.fjhx.entity.FileInfo;
 import com.fjhx.params.FileInfoParam;
 import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -35,7 +36,7 @@ public interface IFileClient {
     R bindingFile(@RequestParam("applicationName") String applicationName,
                   @RequestParam("businessId") Long businessId,
                   @RequestParam("businessType") Integer businessType,
-                  @RequestBody List<FileInfoParam> paramList);
+                  @RequestBody List<FileInfo> paramList);
 
     /**
      * 修改文件绑定信息
@@ -48,7 +49,7 @@ public interface IFileClient {
     R againBindingFile(@RequestParam("applicationName") String applicationName,
                        @RequestParam("businessId") Long businessId,
                        @RequestParam("businessType") Integer businessType,
-                       @RequestBody List<FileInfoParam> paramList);
+                       @RequestBody List<FileInfo> paramList);
 
     /**
      * 删除文件绑定信息
@@ -64,6 +65,6 @@ public interface IFileClient {
      * @param businessIdList 业务id集合
      */
     @PostMapping(GET_FILE_INFO)
-    R<List<FileInfoParam>> getFileInfo(@RequestBody List<Long> businessIdList);
+    R<List<FileInfo>> getFileInfo(@RequestBody List<Long> businessIdList);
 
 }

+ 7 - 0
hx-service-api/common-video-api/pom.xml

@@ -11,4 +11,11 @@
 
     <artifactId>common-video-api</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.fjhx</groupId>
+            <artifactId>common-file-api</artifactId>
+        </dependency>
+    </dependencies>
+
 </project>

+ 12 - 5
hx-service-api/common-video-api/src/main/java/com/fjhx/entity/video/VideoInfo.java

@@ -1,18 +1,15 @@
 package com.fjhx.entity.video;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 /**
  * <p>
- * 
+ *
  * </p>
  *
  * @author ${author}
@@ -54,6 +51,16 @@ public class VideoInfo extends BaseEntity {
     private String richText;
 
     /**
+     * 视频播放量
+     */
+    private Long playbackVolume;
+
+    /**
+     * 视频数量
+     */
+    private Integer videoNum;
+
+    /**
      * 逻辑删除 0未删除 1已删除
      */
     @TableField(fill = FieldFill.INSERT)

+ 4 - 0
hx-service-api/common-video-api/src/main/java/com/fjhx/params/video/VideoInfoVo.java

@@ -1,9 +1,12 @@
 package com.fjhx.params.video;
 
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.video.VideoInfo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * @author ${author}
  * @since 2022-08-08
@@ -12,6 +15,7 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class VideoInfoVo extends VideoInfo {
 
+    private List<FileInfo> fileInfoList;
 
 
 }

+ 2 - 2
hx-service-api/iot-management-api/src/main/java/com/fjhx/params/bom/BomEx.java

@@ -1,7 +1,7 @@
 package com.fjhx.params.bom;
 
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.bom.Bom;
-import com.fjhx.params.FileInfoParam;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -28,6 +28,6 @@ public class BomEx extends Bom {
     /**
      * 文件信息
      */
-    private FileInfoParam fileInfoParam;
+    private FileInfo fileInfo;
 
 }

+ 2 - 1
hx-service-api/iot-management-api/src/main/java/com/fjhx/params/bom/BomVo.java

@@ -1,5 +1,6 @@
 package com.fjhx.params.bom;
 
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.bom.Bom;
 import com.fjhx.params.FileInfoParam;
 import lombok.Data;
@@ -18,6 +19,6 @@ public class BomVo extends Bom {
     /**
      * 文件信息
      */
-    private FileInfoParam fileInfoParam;
+    private FileInfo fileInfo;
 
 }

+ 2 - 2
hx-service-api/iot-management-api/src/main/java/com/fjhx/params/working/WorkingProcedureVo.java

@@ -1,7 +1,7 @@
 package com.fjhx.params.working;
 
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.working.WorkingProcedure;
-import com.fjhx.params.FileInfoParam;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -15,6 +15,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class WorkingProcedureVo extends WorkingProcedure {
 
-    private FileInfoParam fileInfoParam;
+    private FileInfo fileInfo;
 
 }

+ 7 - 7
hx-service/iot-management/src/main/java/com/fjhx/service/bom/impl/BomServiceImpl.java

@@ -5,16 +5,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.base.BaseEntity;
-import com.fjhx.mapper.bom.BomMapper;
-import com.fjhx.service.bom.BomService;
 import com.fjhx.constant.IotManagementLockConstant;
 import com.fjhx.constants.ErrorMsgConstant;
 import com.fjhx.constants.StatusConstant;
+import com.fjhx.entity.FileInfo;
 import com.fjhx.entity.bom.Bom;
 import com.fjhx.enums.bom.BomTypeEnum;
-import com.fjhx.params.FileInfoParam;
+import com.fjhx.mapper.bom.BomMapper;
 import com.fjhx.params.bom.BomEx;
 import com.fjhx.params.bom.BomVo;
+import com.fjhx.service.bom.BomService;
 import com.fjhx.utils.Assert;
 import com.fjhx.utils.FileClientUtil;
 import com.fjhx.utils.UserClientUtil;
@@ -63,12 +63,12 @@ public class BomServiceImpl extends ServiceImpl<BomMapper, Bom> implements BomSe
         Map<Long, String> userNameMap = UserClientUtil.getUserNameMapFunctionLong(records, Bom::getUpdateUser);
 
         // 文件信息
-        Map<Long, FileInfoParam> fileInfoMap = FileClientUtil.getFileInfoMap(
+        Map<Long, FileInfo> fileInfoMap = FileClientUtil.getFileInfoMap(
                 records.stream().map(BaseEntity::getId).collect(Collectors.toList()));
 
         records.forEach(item -> {
             item.setUpdateUserName(userNameMap.get(item.getUpdateUser()));
-            item.setFileInfoParam(fileInfoMap.get(item.getId()));
+            item.setFileInfo(fileInfoMap.get(item.getId()));
         });
 
         return result;
@@ -94,7 +94,7 @@ public class BomServiceImpl extends ServiceImpl<BomMapper, Bom> implements BomSe
         Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
 
         // 绑定文件
-        FileClientUtil.bindingFile(bomVo.getId(), bomVo.getFileInfoParam());
+        FileClientUtil.bindingFile(bomVo.getId(), bomVo.getFileInfo());
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -119,7 +119,7 @@ public class BomServiceImpl extends ServiceImpl<BomMapper, Bom> implements BomSe
         }
 
         // 重新绑定
-        FileClientUtil.againBindingFile(bomVo.getId(), bomVo.getFileInfoParam());
+        FileClientUtil.againBindingFile(bomVo.getId(), bomVo.getFileInfo());
     }
 
     @Transactional(rollbackFor = Exception.class)

+ 1 - 1
hx-service/iot-management/src/main/java/com/fjhx/service/material/impl/MaterialExServiceImpl.java

@@ -8,10 +8,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.constants.StatusConstant;
 import com.fjhx.entity.material.MaterialEx;
 import com.fjhx.mapper.material.MaterialExMapper;
-import com.fjhx.service.material.MaterialExService;
 import com.fjhx.params.MaterialVo;
 import com.fjhx.service.ClassifyService;
 import com.fjhx.service.MaterialService;
+import com.fjhx.service.material.MaterialExService;
 import com.fjhx.utils.Assert;
 import com.fjhx.utils.WrapperUtil;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 2
hx-service/iot-management/src/main/java/com/fjhx/service/working/impl/WorkingProcedureServiceImpl.java

@@ -47,14 +47,14 @@ public class WorkingProcedureServiceImpl extends ServiceImpl<WorkingProcedureMap
     @Override
     public void add(WorkingProcedureVo workingProcedureVo) {
         save(workingProcedureVo);
-        FileClientUtil.bindingFile(workingProcedureVo.getId(), workingProcedureVo.getFileInfoParam());
+        FileClientUtil.bindingFile(workingProcedureVo.getId(), workingProcedureVo.getFileInfo());
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(WorkingProcedureVo workingProcedureVo) {
         updateById(workingProcedureVo);
-        FileClientUtil.againBindingFile(workingProcedureVo.getId(), workingProcedureVo.getFileInfoParam());
+        FileClientUtil.againBindingFile(workingProcedureVo.getId(), workingProcedureVo.getFileInfo());
     }
 
     @Transactional(rollbackFor = Exception.class)

+ 3 - 0
hx-service/storage/src/main/java/com/fjhx/apply/mapper/ApplyPurchaseMapper.xml

@@ -20,6 +20,8 @@
         from apply_purchase ap
                  inner join apply_purchasedetail apd on ap.ApplyBillNo = apd.ApplyBillNo
                  left join material m on apd.MaterialCode = m.Code
+                 LEFT JOIN purchase_contract pc
+                           ON pc.ApplyBillNo = apd.ApplyBillNo AND pc.MaterialCode = apd.MaterialCode
             ${ew.customSqlSegment}
     </select>
 
@@ -31,6 +33,7 @@
                         IF(pc.PurContractState = 3, apd.PurchaseQty, sum(st.Quantity)) AS arrived
                  FROM apply_purchase ap
                           INNER JOIN apply_purchasedetail apd ON ap.ApplyBillNo = apd.ApplyBillNo
+                          LEFT JOIN material m on m.Code = apd.MaterialCode
                           LEFT JOIN purchase_contract pc
                                     ON pc.ApplyBillNo = apd.ApplyBillNo AND pc.MaterialCode = apd.MaterialCode
                           LEFT JOIN stock_tag st ON st.PurchaseBillNo = pc.PurchaseBillNo AND st.RfidCode IS NOT NULL

+ 22 - 4
hx-service/storage/src/main/java/com/fjhx/apply/service/impl/ApplyPurchaseServiceImpl.java

@@ -133,7 +133,13 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
             wrapper.and(q -> q.like("m.Code", keyword).or().like("m.Name", keyword));
         }
 
-        wrapper.eq(ObjectUtil.isNotEmpty(technologyType), "m.TechnologyType", technologyType);
+        if (ObjectUtil.isNotEmpty(technologyType) && technologyType.equals("5")) {
+            wrapper.in("m.TechnologyType", 0, 1, 2, 4);
+        } else {
+            wrapper.eq(ObjectUtil.isNotEmpty(technologyType), "m.TechnologyType", technologyType);
+        }
+
+        wrapper.isNotNull("pc.PurContractState");
 
         wrapper.groupBy("ap.ApproveBillState");
 
@@ -180,7 +186,12 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
             wrapper.and(q -> q.like("m.Code", keyword).or().like("m.Name", keyword));
         }
 
-        wrapper.eq(ObjectUtil.isNotEmpty(technologyType), "m.TechnologyType", technologyType);
+        if (ObjectUtil.isNotEmpty(technologyType) && technologyType.equals("5")) {
+            wrapper.in("m.TechnologyType", 0, 1, 2, 4);
+        } else {
+            wrapper.eq(ObjectUtil.isNotEmpty(technologyType), "m.TechnologyType", technologyType);
+        }
+
         if (ObjectUtil.isNotEmpty(status)) {
             if (Objects.equals(status, "1")) {
                 wrapper.in("ap.ApproveBillState", 0, 1);
@@ -212,7 +223,14 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
         if (ObjectUtil.isNotEmpty(keyword)) {
             wrapper.and(q -> q.like("m.Code", keyword).or().like("m.Name", keyword));
         }
-        wrapper.eq(ObjectUtil.isNotEmpty(technologyType), "m.TechnologyType", technologyType);
+        if (ObjectUtil.isNotEmpty(technologyType) && technologyType.equals("5")) {
+            wrapper.in("m.TechnologyType", 0, 1, 2, 4);
+        } else {
+            wrapper.eq(ObjectUtil.isNotEmpty(technologyType), "m.TechnologyType", technologyType);
+        }
+
+        wrapper.isNotNull("pc.PurContractState");
+
         wrapper.eq(ObjectUtil.isNotEmpty(status), "ap.ApproveBillState", status);
         wrapper.orderByAsc("pc.PurContractState");
         wrapper.orderByDesc("ap.CreatedTime");
@@ -267,7 +285,7 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
             record.put("purchaseQty", BigDecimalUtil.keepDecimals(record.get("purchaseQty")));
             record.put("onWayQuantity", BigDecimalUtil.keepDecimals(record.get("onWayQuantity")));
 
-            Integer purContractState = (Integer) record.get("purContractState");
+            int purContractState = Integer.parseInt(record.get("purContractState").toString());
             switch (purContractState) {
                 case 0:
                     record.put("purContractState", "待确认");

+ 5 - 7
hx-service/storage/src/main/java/com/fjhx/material/service/impl/MaterialServiceImpl.java

@@ -1,14 +1,11 @@
 package com.fjhx.material.service.impl;
 
-
 import com.alibaba.cloud.commons.lang.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.entity.material.Material;
 import com.fjhx.material.mapper.MaterialSMapper;
 import com.fjhx.material.service.MaterialService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -25,9 +22,9 @@ import java.util.Map;
 @Service
 public class MaterialServiceImpl extends ServiceImpl<MaterialSMapper, Material> implements MaterialService {
 
-
     /**
      * 下拉列表
+     *
      * @param condition
      * @return
      */
@@ -39,14 +36,15 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialSMapper, Material>
 
     /**
      * 下拉用途
+     *
      * @return
      */
     @Override
     public List<Material> selectPurpose(String purpose) {
         QueryWrapper<Material> queryWrapper = new QueryWrapper<>();
         queryWrapper.select("Purpose").groupBy("Purpose");
-        if(StringUtils.isNotEmpty(purpose)){
-            queryWrapper.like("Purpose",purpose);
+        if (StringUtils.isNotEmpty(purpose)) {
+            queryWrapper.like("Purpose", purpose);
         }
         return this.list(queryWrapper);
     }