Quellcode durchsuchen

Merge remote-tracking branch 'origin/V0.0.8' into V0.0.8

# Conflicts:
#	project_data/sql/0.0.8/soc/soc.sql
jingyuanchao vor 1 Jahr
Ursprung
Commit
0404b821ef
32 geänderte Dateien mit 1349 neuen und 66 gelöschten Zeilen
  1. 7 0
      pom.xml
  2. 0 0
      project_data/sql/0.0.8/quartz/quartz.sql
  3. 35 0
      project_data/sql/0.0.8/soc/soc.sql
  4. 8 0
      project_data/sql/0.0.8/升级说明
  5. 2 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java
  6. 44 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysVersion.java
  7. 46 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/enums/AppType.java
  8. 5 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java
  9. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/mapper/AppCockpitMapper.java
  10. 24 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/impl/AppCockpitServiceImpl.java
  11. 12 12
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/controller/CoreDrillTaskController.java
  12. 8 8
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java
  13. 84 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/controller/CoreSafetyWorkSummaryController.java
  14. 132 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/domain/CoreSafetyWorkSummary.java
  15. 26 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/dto/CoreSafetyWorkSummaryRequestDto.java
  16. 71 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/mapper/CoreSafetyWorkSummaryMapper.java
  17. 73 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/service/ICoreSafetyWorkSummaryService.java
  18. 146 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/service/impl/CoreSafetyWorkSummaryServiceImpl.java
  19. 32 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/vo/CoreSafetyWorkSummaryVo.java
  20. 31 29
      soc-modules/soc-modules-core/src/main/resources/mapper/board/AppCockpitMapper.xml
  21. 19 7
      soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml
  22. 168 0
      soc-modules/soc-modules-core/src/main/resources/mapper/safetybook/CoreSafetyWorkSummaryMapper.xml
  23. 14 2
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java
  24. 1 1
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java
  25. 4 1
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java
  26. 6 0
      soc-modules/soc-modules-system/pom.xml
  27. 67 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysVersionController.java
  28. 29 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/dto/SysCheckUpdateDto.java
  29. 11 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysVersionMapper.java
  30. 31 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysVersionService.java
  31. 201 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysVersionServiceImpl.java
  32. 10 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysVersionMapper.xml

+ 7 - 0
pom.xml

@@ -43,6 +43,7 @@
         <freemarker.version>2.7.2</freemarker.version>
         <velocity.version>2.3</velocity.version>
         <knife4j.version>3.0.3</knife4j.version>
+        <zafarkhaja.version>0.9.0</zafarkhaja.version>
     </properties>
     <dependencyManagement>
         <dependencies>
@@ -242,6 +243,12 @@
                 <artifactId>lombok</artifactId>
                 <version>${lombok.version}</version>
             </dependency>
+
+            <dependency>
+                <groupId>com.github.zafarkhaja</groupId>
+                <artifactId>java-semver</artifactId>
+                <version>${zafarkhaja.version}</version>
+            </dependency>
 <!--                    <dependency>-->
 <!--                        <groupId>log4j</groupId>-->
 <!--                        <artifactId>log4j</artifactId>-->

+ 0 - 0
project_data/sql/0.0.8/quartz/quartz.sql


+ 35 - 0
project_data/sql/0.0.8/soc/soc.sql

@@ -92,3 +92,38 @@ INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_cla
 INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark) VALUES (3, '预案演练', 'drill', 'reminder_business_type', null, 'default', 'N', '0', '超级管理员', now(), null, null, null);
 INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, update_by, update_time, remark) VALUES (4, '监控调阅', 'monitoringRetrieval', 'reminder_business_type', null, 'default', 'N', '0', '超级管理员', now(), null, null, null);
 
+DROP TABLE IF EXISTS `core_safety_work_summary`;
+CREATE TABLE `core_safety_work_summary` (
+                                            `id` bigint NOT NULL,
+                                            `title` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '工作主题',
+                                            `date` datetime DEFAULT NULL COMMENT '记录日期',
+                                            `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '内容',
+                                            `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+                                            `update_time` datetime DEFAULT NULL COMMENT '修改时间',
+                                            `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+                                            `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+                                            `images` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '照片',
+                                            `org_id` bigint DEFAULT NULL COMMENT '机构id',
+                                            `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文件种类',
+                                            `year` int DEFAULT NULL COMMENT '工作年度',
+                                            `files` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '总结文件',
+                                            PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='安全保卫部年度工作总结';
+
+DELIMITER ??
+DROP PROCEDURE IF EXISTS schema_change ??
+CREATE PROCEDURE schema_change () BEGIN
+
+
+END ??
+DELIMITER ;
+CALL schema_change ();
+
+-- 新增菜单 年度工作总结
+DELETE from `sys_menu` where id in(01774689203604049922,01774690857464254465,01774691065061330945,01774691126533050369,01774691223434055681);
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774689203604049922, '年度工作总结', 1711912586825461761, 4, 'worksummary', 'safetyBook/workSummary/index', NULL, 1, 0, 'C', '0', '0', 'core:worksummary:query', '1', 'documentation', NULL, '超级管理员', '2024-04-01 14:44:12', '超级管理员', '2024-04-01 14:51:17', '');
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774690857464254465, '查询', 1774689203604049922, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:worksummary:query', '1', NULL, NULL, '超级管理员', '2024-04-01 14:50:47', '', NULL, '');
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774691065061330945, '新增', 1774689203604049922, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:worksummary:add', '1', NULL, NULL, '超级管理员', '2024-04-01 14:51:36', '', NULL, '');
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774691126533050369, '编辑', 1774689203604049922, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:worksummary:edit', '1', NULL, NULL, '超级管理员', '2024-04-01 14:51:51', '', NULL, '');
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774691223434055681, '删除', 1774689203604049922, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:worksummary:delete', '1', NULL, NULL, '超级管理员', '2024-04-01 14:52:14', '', NULL, '');
+

+ 8 - 0
project_data/sql/0.0.8/升级说明

@@ -0,0 +1,8 @@
+需要在nacos
+soc-gateway-dev.yml 配置文件添加配置
+  # 防止XSS攻击
+  xss:
+    enabled: true
+    excludeUrls:
+      - /system/notice
+      - /system/config

+ 2 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java

@@ -98,4 +98,6 @@ public interface RemoteFileService {
 
     @PostMapping(value = "/file/readFile")
     byte[] readFile(@RequestBody Map<String, String> data);
+    @PostMapping(value = "/file/downloadFile/realName", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Response downloadFileRealName(@RequestBody SysFile sysFile);
 }

+ 44 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/SysVersion.java

@@ -0,0 +1,44 @@
+package com.xunmei.system.api.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xunmei.common.core.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 版本管理表 sys_version
+ *
+ * @author xunmei
+ */
+@Data
+@TableName("sys_version")
+@ApiModel(value = "SysVersion对象", description = "【请填写功能名称】")
+public class SysVersion extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键id")
+    private Long id;
+
+    @ApiModelProperty(value = "版本号")
+    private String version;
+
+    @ApiModelProperty(value = "版本说明")
+    private String note;
+
+    @ApiModelProperty(value = "下载地址")
+    private String path;
+
+    @ApiModelProperty(value = "文件名称")
+    private String packageName;
+
+    @ApiModelProperty(value = "是否使用")
+    private Boolean isUse;
+
+    @ApiModelProperty(value = "是否强制更新")
+    private Boolean isForce;
+
+    @ApiModelProperty(value = "版本类型 0.安卓 1.PC 2.挂墙终端 3.IOS")
+    private Integer type;
+}

+ 46 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/enums/AppType.java

@@ -0,0 +1,46 @@
+package com.xunmei.system.api.enums;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.xunmei.system.api.enums.serializer.EnumSerializer;
+import lombok.Getter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 应用类型
+ */
+@JsonSerialize(using = EnumSerializer.class)
+@Getter
+public enum AppType {
+    APP(0,"安卓","APP"),
+    PC(1,"PC","PC"),
+    HANG_WALL(2,"挂墙终端","HANG_WALL"),
+    IOS(3,"IOS","IOS"),
+    ;
+
+    private final Integer index;
+    private final String text;
+    private final String typeDesc;
+
+    AppType(Integer index, String text, String typeDesc) {
+        this.index = index;
+        this.text = text;
+        this.typeDesc = typeDesc;
+    }
+
+    public static AppType getEnumByIndex(Integer index) {
+        return enumMap.get(index);
+    }
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, AppType> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (AppType typeEnum : AppType.values()) {
+            enumMap.put(typeEnum.index, typeEnum);
+        }
+    }
+}

+ 5 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java

@@ -96,6 +96,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             public byte[] readFile(Map<String, String> data) {
                 throw new RuntimeException("读取文件超时,请稍后重试!");
             }
+
+            @Override
+            public Response downloadFileRealName(SysFile sysFile) {
+                return null;
+            }
         };
     }
 }

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/mapper/AppCockpitMapper.java

@@ -35,7 +35,7 @@ public interface AppCockpitMapper extends BaseMapper {
      * @param prevDate
      * @return
      */
-    AppOverviewTaskInfoDto selectOverViewResumptionTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date, @Param("prevdate") Date prevDate);
+    AppOverviewTaskInfoDto selectOverViewResumptionTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("end") Date end, @Param("prevdate") Date prevDate);
 
     /**
      * 安全检查本周期、上周期完成情况
@@ -45,7 +45,7 @@ public interface AppCockpitMapper extends BaseMapper {
      * @param prevDate
      * @return
      */
-    AppOverviewTaskInfoDto selectOverViewSafetyCheckTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date, @Param("prevdate") Date prevDate);
+    AppOverviewTaskInfoDto selectOverViewSafetyCheckTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("end") Date end, @Param("prevdate") Date prevDate);
 
     /**
      * 教育本周期、上周期完成情况

+ 24 - 4
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/impl/AppCockpitServiceImpl.java

@@ -207,6 +207,8 @@ public class AppCockpitServiceImpl implements AppCockpitService {
         Date currentMonthEnd = DateUtil.endOfMonth(new Date());
         Date prevMonth = DateUtil.beginOfMonth(new Date()).offset(DateField.MONTH, -1);
 
+
+
         CompletableFuture<AppOverviewVo> orgOverview = CompletableFuture.supplyAsync(() -> {
                     AppOverviewVo result = appCockpitMapper.selectOrgOverview(org.getPath());
                     if (ObjectUtil.isNull(result)) {
@@ -229,7 +231,11 @@ public class AppCockpitServiceImpl implements AppCockpitService {
 
         CompletableFuture<AppOverviewTaskInfoDto> resumption = CompletableFuture.supplyAsync(() ->
                 {
-                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewResumptionTaskInfo(org.getPath(), currentMonth, prevMonth);
+                    Date currentDay = DateUtil.beginOfDay(new Date());
+                    Date currentDayEnd = DateUtil.endOfDay(new Date());
+                    Date prevDay = DateUtil.beginOfDay(new Date()).offset(DateField.DAY_OF_YEAR, -1);
+
+                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewResumptionTaskInfo(org.getPath(),currentDay, currentDayEnd, prevDay);
                     if (ObjectUtil.isNull(result)) {
                         result = new AppOverviewTaskInfoDto();
                     }
@@ -240,7 +246,7 @@ public class AppCockpitServiceImpl implements AppCockpitService {
 
         CompletableFuture<AppOverviewTaskInfoDto> safetyCheck = CompletableFuture.supplyAsync(() ->
                 {
-                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewSafetyCheckTaskInfo(org.getPath(), currentMonth, prevMonth);
+                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewSafetyCheckTaskInfo(org.getPath(), currentMonth,currentMonthEnd, prevMonth);
                     if (ObjectUtil.isNull(result)) {
                         result = new AppOverviewTaskInfoDto();
                     }
@@ -251,7 +257,11 @@ public class AppCockpitServiceImpl implements AppCockpitService {
 
         CompletableFuture<AppOverviewTaskInfoDto> edu = CompletableFuture.supplyAsync(() ->
                 {
-                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewEduTaskInfo(org.getPath(), currentMonth, currentMonthEnd, prevMonth);
+                    Date currentQuarter = DateUtil.beginOfQuarter(new Date());
+                    Date currentQuarterEnd = DateUtil.endOfQuarter(new Date());
+                    Date prevQuarter = DateUtil.beginOfQuarter(new Date()).offset(DateField.MONTH, -3);
+
+                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewEduTaskInfo(org.getPath(), currentQuarter, currentQuarterEnd, prevQuarter);
                     if (ObjectUtil.isNull(result)) {
                         result = new AppOverviewTaskInfoDto();
                     }
@@ -262,7 +272,11 @@ public class AppCockpitServiceImpl implements AppCockpitService {
 
         CompletableFuture<AppOverviewTaskInfoDto> monitor = CompletableFuture.supplyAsync(() ->
                 {
-                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewMonitorTaskInfo(org.getPath(), currentMonth, currentMonthEnd, prevMonth);
+                    Date currentWeek = DateUtil.beginOfWeek(new Date(),true);
+                    Date currentWeekEnd = DateUtil.endOfWeek(new Date(),true);
+                    Date prevWeek = DateUtil.beginOfWeek(new Date()).offset(DateField.DAY_OF_WEEK, -7);
+
+                    AppOverviewTaskInfoDto result = appCockpitMapper.selectOverViewMonitorTaskInfo(org.getPath(), currentWeek, currentWeekEnd, prevWeek);
                     if (ObjectUtil.isNull(result)) {
                         result = new AppOverviewTaskInfoDto();
                     }
@@ -309,6 +323,7 @@ public class AppCockpitServiceImpl implements AppCockpitService {
         vo.setGa38(new LinkedHashMap<>());
         vo.getGa38().put("GA382021", computeGa38(orgga38.get().getTotal(), orgga38.get().getGa382021(), orgga38.get().getGa382021current(), orgga38.get().getGa382021prev()));
         vo.getGa38().put("GA382015", computeGa38(orgga38.get().getTotal(), orgga38.get().getGa382015(), orgga38.get().getGa382015current(), orgga38.get().getGa382015prev()));
+        vo.getGa38().put("GA38Total", computeGa38Total(orgga38.get().getTotal(),orgga38.get().getGa382021(),orgga38.get().getGa382015()));
 
         vo.setTaskInfo(new LinkedHashMap<>());
         vo.getTaskInfo().put("日常履职", computeOverviewItem(resumption.get()));
@@ -594,4 +609,9 @@ public class AppCockpitServiceImpl implements AppCockpitService {
         vo.setCurrentCompletedCount(currentCompleted);
         return vo;
     }
+    private AppOverviewItemVo computeGa38Total(int total, int ga382021, int ga382015) {
+        AppOverviewItemVo vo = new AppOverviewItemVo();
+        vo.setCurrentCompletedRate(NumberUtils.computeRate(total, ga382021+ga382015));
+        return vo;
+    }
 }

+ 12 - 12
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/controller/CoreDrillTaskController.java

@@ -127,19 +127,19 @@ public class CoreDrillTaskController extends BaseController {
         return success(coreDrillTaskService.evaluate(request));
     }
 
-    @ApiOperation(value = "优秀案例管理分页",notes = "需要被确认的优秀案例")
-    @RequiresPermissions("core:drillTask:list")
-    @PostMapping("/recList")
-    public TableDataInfo<CoreDrillTaskRecPageVo> recList(@RequestBody @Validated CoreDrillTaskRecPageDto request) {
-        return coreDrillTaskService.recList(request);
-    }
-
-    @ApiOperation(value = "优秀案例分页",notes = "已经被确认的优秀案例")
+//    @ApiOperation(value = "优秀案例管理分页",notes = "需要被确认的优秀案例")
 //    @RequiresPermissions("core:drillTask:list")
-    @PostMapping("/recTaskList")
-    public TableDataInfo<CoreDrillTaskRecTaskPageVo> recTaskList(@RequestBody @Validated CoreDrillTaskRecPageDto request) {
-        return coreDrillTaskService.recTaskList(request);
-    }
+//    @PostMapping("/recList")
+//    public TableDataInfo<CoreDrillTaskRecPageVo> recList(@RequestBody @Validated CoreDrillTaskRecPageDto request) {
+//        return coreDrillTaskService.recList(request);
+//    }
+
+//    @ApiOperation(value = "优秀案例分页",notes = "已经被确认的优秀案例")
+////    @RequiresPermissions("core:drillTask:list")
+//    @PostMapping("/recTaskList")
+//    public TableDataInfo<CoreDrillTaskRecTaskPageVo> recTaskList(@RequestBody @Validated CoreDrillTaskRecPageDto request) {
+//        return coreDrillTaskService.recTaskList(request);
+//    }
 
     @ApiOperation(value = "优秀案例推荐",notes = "推荐优秀案例")
     //@RequiresPermissions("core:drillTask:edit")

+ 8 - 8
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java

@@ -984,14 +984,14 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
 
         //App的查询, App 默认下穿
         request.setCheckSub(true);
-        if (ObjectUtil.isNotEmpty(request.getRecStatus())) {
-            if (isUnRecStatus(request.getRecStatus())) {
-                request.setUnRecStatus(request.getRecStatus());
-                request.setRecStatus(null);
-            } else {
-                request.setUnRecStatus(null);
-            }
-        }
+//        if (ObjectUtil.isNotEmpty(request.getRecStatus())) {
+//            if (isUnRecStatus(request.getRecStatus())) {
+//                request.setUnRecStatus(request.getRecStatus());
+//                request.setRecStatus(null);
+//            } else {
+//                request.setUnRecStatus(null);
+//            }
+//        }
         //App端的时间按季度查询
         request.setStartTime(DateUtil.beginOfMonth(request.getStartTime()));
         request.setEndTime(DateUtil.endOfMonth(request.getEndTime()));

+ 84 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/controller/CoreSafetyWorkSummaryController.java

@@ -0,0 +1,84 @@
+package com.xunmei.core.safetybook.controller;
+
+import com.xunmei.common.core.web.controller.BaseController;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.log.annotation.Log;
+import com.xunmei.common.log.enums.BusinessType;
+import com.xunmei.common.security.annotation.RequiresPermissions;
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import com.xunmei.core.safetybook.dto.CoreSafetyWorkSummaryRequestDto;
+import com.xunmei.core.safetybook.service.ICoreSafetyWorkSummaryService;
+import com.xunmei.core.safetybook.vo.CoreSafetyWorkSummaryVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 安全保卫部年度工作总结Controller
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+@Api(tags = {"CoreSafetyWorkSummary"})
+@RestController
+@RequestMapping("/worksummary")
+public class CoreSafetyWorkSummaryController extends BaseController {
+    @Autowired
+    private ICoreSafetyWorkSummaryService CoreSafetyWorkSummaryService;
+
+    /**
+     * 查询安全保卫部年度工作总结列表
+     */
+    @ApiOperation(value = "查询CoreSafetyWorkSummary列表")
+    @RequiresPermissions("core:aqbwbndjh:list")
+    @PostMapping("/list")
+    public TableDataInfo<CoreSafetyWorkSummaryVo> list(@RequestBody CoreSafetyWorkSummaryRequestDto requestDto) {
+        return CoreSafetyWorkSummaryService.selectPage(requestDto);
+    }
+
+
+    /**
+     * 获取安全保卫部年度工作总结详细信息
+     */
+    @ApiOperation(value = "获取CoreSafetyWorkSummary详细信息")
+    @RequiresPermissions("core:aqbwbndjh:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(CoreSafetyWorkSummaryService.selectCoreSafetyWorkSummaryById(id));
+    }
+
+    /**
+     * 新增安全保卫部年度工作总结
+     */
+    @ApiOperation(value = "新增CoreSafetyWorkSummary")
+    @RequiresPermissions("core:aqbwbndjh:add")
+    @Log(title = "安全保卫部年度工作总结", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody CoreSafetyWorkSummaryRequestDto requestDto) {
+        return toAjax(CoreSafetyWorkSummaryService.insertCoreSafetyWorkSummary(requestDto));
+    }
+
+    /**
+     * 修改安全保卫部年度工作总结
+     */
+    @ApiOperation(value = "修改CoreSafetyWorkSummary")
+    @RequiresPermissions("core:aqbwbndjh:edit")
+    @Log(title = "安全保卫部年度工作总结", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody CoreSafetyWorkSummaryRequestDto requestDto) {
+        return toAjax(CoreSafetyWorkSummaryService.updateCoreSafetyWorkSummary(requestDto));
+    }
+
+    /**
+     * 删除安全保卫部年度工作总结
+     */
+    @ApiOperation(value = "删除CoreSafetyWorkSummary")
+    @RequiresPermissions("core:aqbwbndjh:remove")
+    @Log(title = "安全保卫部年度工作总结", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(CoreSafetyWorkSummaryService.deleteCoreSafetyWorkSummaryByIds(ids));
+    }
+}

+ 132 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/domain/CoreSafetyWorkSummary.java

@@ -0,0 +1,132 @@
+package com.xunmei.core.safetybook.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xunmei.common.core.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 安全保卫部年度工作总结
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("core_safety_work_summary")
+@ApiModel(value = "core_safety_work_summary对象", description = "安全保卫部年度工作总结")
+public class CoreSafetyWorkSummary extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+    /**
+     * 工作主题
+     */
+    @ApiModelProperty(value = "工作主题")
+    private String title;
+    /**
+     * 开会日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "记录日期")
+    private Date date;
+
+    /**
+     * 内容
+     */
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+    /**
+     * 照片
+     */
+//    @ApiModelProperty(value = "照片")
+//    @TableField(exist = false)
+//    private List<CoreSafetyBookBookFilesVo> images;
+
+    /**
+     * 照片
+     */
+    @ApiModelProperty(value = "附件")
+    private String  files;
+
+
+    /**
+     * 机构id
+     */
+    @ApiModelProperty(value = "机构id")
+    private Long orgId;
+
+    private String type;
+
+    private Long year;
+
+
+//    @TableField(exist = false)
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private List<Date> range;
+//    @TableField(exist = false)
+//    private String selectOrgPath;
+
+
+//    @TableField(exist = false)
+//    private String orgName;
+//    @TableField(exist = false)
+//    private String userName;
+
+//    @TableField(exist = false)
+//    private String userNames;
+//    @TableField(exist = false)
+//    private List<Long> userIds;
+
+//    @Override
+//    public String toString() {
+//        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+//
+//
+//                .append("id", getId())
+//
+//
+//                .append("title", getTitle())
+//
+//
+//                .append("date", getDate())
+//
+//
+//                .append("content", getContent())
+//
+//
+//                .append("createTime", getCreateTime())
+//
+//
+//                .append("updateTime", getUpdateTime())
+//
+//
+//                .append("createBy", getCreateBy())
+//
+//
+//                .append("updateBy", getUpdateBy())
+//
+//
+//                .append("images", getImages())
+//
+//
+//                .append("orgId", getOrgId())
+//                .toString();
+//    }
+}

+ 26 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/dto/CoreSafetyWorkSummaryRequestDto.java

@@ -0,0 +1,26 @@
+package com.xunmei.core.safetybook.dto;
+
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 安全保卫部年度工作总结
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+@Data
+public class CoreSafetyWorkSummaryRequestDto extends CoreSafetyWorkSummary {
+
+    private String selectOrgPath;
+
+    private List<String> fileList;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private List<Date> range;
+
+}

+ 71 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/mapper/CoreSafetyWorkSummaryMapper.java

@@ -0,0 +1,71 @@
+package com.xunmei.core.safetybook.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import com.xunmei.core.safetybook.dto.CoreSafetyWorkSummaryRequestDto;
+import com.xunmei.core.safetybook.vo.CoreSafetyWorkSummaryVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 安全保卫部年度工作总结Mapper接口
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+public interface CoreSafetyWorkSummaryMapper extends BaseMapper<CoreSafetyWorkSummary> {
+    /**
+     * 查询安全保卫部年度工作总结
+     *
+     * @param id 安全保卫部年度工作总结主键
+     * @return 安全保卫部年度工作总结
+     */
+    CoreSafetyWorkSummary selectCoreSafetyWorkSummaryById(Long id);
+
+    /**
+     * 查询安全保卫部年度工作总结列表
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度工作总结
+     * @return 安全保卫部年度工作总结集合
+     */
+    List<CoreSafetyWorkSummary> selectCoreSafetyWorkSummaryList(CoreSafetyWorkSummary CoreSafetyWorkSummary);
+
+    /**
+     * 新增安全保卫部年度工作总结
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度工作总结
+     * @return 结果
+     */
+    int insertCoreSafetyWorkSummary(CoreSafetyWorkSummary CoreSafetyWorkSummary);
+
+    /**
+     * 修改安全保卫部年度工作总结
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度工作总结
+     * @return 结果
+     */
+    int updateCoreSafetyWorkSummary(CoreSafetyWorkSummary CoreSafetyWorkSummary);
+
+    /**
+     * 删除安全保卫部年度工作总结
+     *
+     * @param id 安全保卫部年度工作总结主键
+     * @return 结果
+     */
+    int deleteCoreSafetyWorkSummaryById(Long id);
+
+    /**
+     * 批量删除安全保卫部年度工作总结
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteCoreSafetyWorkSummaryByIds(Long[] ids);
+
+    Page<CoreSafetyWorkSummaryVo> selectPage(Page<CoreSafetyWorkSummaryVo> page, @Param("aq") CoreSafetyWorkSummaryRequestDto requestDto);
+
+    CoreSafetyWorkSummaryVo selectById(Long id);
+}

+ 73 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/service/ICoreSafetyWorkSummaryService.java

@@ -0,0 +1,73 @@
+package com.xunmei.core.safetybook.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import com.xunmei.core.safetybook.dto.CoreSafetyWorkSummaryRequestDto;
+import com.xunmei.core.safetybook.vo.CoreSafetyWorkSummaryVo;
+
+import java.util.List;
+
+/**
+ * 安全保卫部年度工作总结Service接口
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+public interface ICoreSafetyWorkSummaryService extends IService<CoreSafetyWorkSummary> {
+    /**
+     * 查询安全保卫部年度总结
+     *
+     * @param id 安全保卫部年度总结主键
+     * @return 安全保卫部年度总结
+     */
+    CoreSafetyWorkSummary selectCoreSafetyWorkSummaryById(Long id);
+
+    /**
+     * 查询安全保卫部年度总结列表
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度总结
+     * @return 安全保卫部年度总结集合
+     */
+    List<CoreSafetyWorkSummary> selectCoreSafetyWorkSummaryList(CoreSafetyWorkSummary CoreSafetyWorkSummary);
+
+    /**
+     * 新增安全保卫部年度总结
+     *
+     * @param requestDto 安全保卫部年度总结
+     * @return 结果
+     */
+    int insertCoreSafetyWorkSummary(CoreSafetyWorkSummaryRequestDto requestDto);
+
+    /**
+     * 修改安全保卫部年度总结
+     *
+     * @param requestDto 安全保卫部年度总结
+     * @return 结果
+     */
+    int updateCoreSafetyWorkSummary(CoreSafetyWorkSummaryRequestDto requestDto);
+
+    /**
+     * 批量删除安全保卫部年度总结
+     *
+     * @param ids 需要删除的安全保卫部年度总结主键集合
+     * @return 结果
+     */
+    int deleteCoreSafetyWorkSummaryByIds(Long[] ids);
+
+    /**
+     * 删除安全保卫部年度总结信息
+     *
+     * @param id 安全保卫部年度总结主键
+     * @return 结果
+     */
+    int deleteCoreSafetyWorkSummaryById(Long id);
+
+    /**
+     * 查询安全保卫部年度总结分页数据
+     *
+     * @param CoreSafetyWorkSummaryRequestDto 查询条件对象
+     * @return Page
+     */
+    TableDataInfo<CoreSafetyWorkSummaryVo> selectPage(CoreSafetyWorkSummaryRequestDto requestDto);
+}

+ 146 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/service/impl/CoreSafetyWorkSummaryServiceImpl.java

@@ -0,0 +1,146 @@
+package com.xunmei.core.safetybook.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.security.utils.SecurityUtils;
+import com.xunmei.core.safetybook.domain.CoreSafetyBookBookFiles;
+import com.xunmei.core.safetybook.domain.CoreSafetyBookBookFilesVo;
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import com.xunmei.core.safetybook.dto.CoreSafetyWorkSummaryRequestDto;
+import com.xunmei.core.safetybook.mapper.CoreSafetyBookBookFilesMapper;
+import com.xunmei.core.safetybook.mapper.CoreSafetyWorkSummaryMapper;
+import com.xunmei.core.safetybook.service.ICoreSafetyWorkSummaryService;
+import com.xunmei.core.safetybook.vo.CoreSafetyWorkSummaryVo;
+import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysOrg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 安全保卫部年度计划Service业务层处理
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+@Service
+public class CoreSafetyWorkSummaryServiceImpl extends ServiceImpl<CoreSafetyWorkSummaryMapper, CoreSafetyWorkSummary> implements ICoreSafetyWorkSummaryService {
+    @Autowired
+    private CoreSafetyWorkSummaryMapper CoreSafetyWorkSummaryMapper;
+    @Autowired
+    private RemoteOrgService orgService;
+//    @Autowired
+//    private CoreSafetyWorkSummaryUserMapper CoreSafetyWorkSummaryUserMapper;
+    @Autowired
+    private CoreSafetyBookBookFilesMapper coreSafetyBookBookFilesMapper;
+
+    @Override
+    public TableDataInfo<CoreSafetyWorkSummaryVo> selectPage(CoreSafetyWorkSummaryRequestDto requestDto) {
+        //未删除
+        Page<CoreSafetyWorkSummaryVo> page;
+        //分页
+        if (requestDto.getPageNum() != null && requestDto.getPageSize() != null) {
+            page = new Page<>(requestDto.getPageNum(), requestDto.getPageSize());
+        } else {
+            page = new Page<>();
+        }
+        if(requestDto.getCheckSub()){
+            SysOrg org = orgService.selectOrgById(requestDto.getOrgId() != null ? requestDto.getOrgId() : SecurityUtils.getLoginUser().getOrgId(), SecurityConstants.INNER);
+            if (org != null) {
+                requestDto.setSelectOrgPath(org.getPath());
+            }
+        }
+
+        //获取数据
+        page = CoreSafetyWorkSummaryMapper.selectPage(page, requestDto);
+        //抓换为TableDataInfo适配前端
+        return TableDataInfo.build(page);
+
+
+    }
+
+
+    /**
+     * 查询安全保卫部年度计划
+     *
+     * @param id 安全保卫部年度计划主键
+     * @return 安全保卫部年度计划
+     */
+    @Override
+    public CoreSafetyWorkSummaryVo selectCoreSafetyWorkSummaryById(Long id) {
+        CoreSafetyWorkSummaryVo vo = CoreSafetyWorkSummaryMapper.selectById(id);
+        vo.setFileList(ObjectUtil.isNotEmpty(vo.getFiles()) ? JSON.parseArray(vo.getFiles(), String.class) : null);
+        return vo;
+    }
+
+    /**
+     * 查询安全保卫部年度计划列表
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度计划
+     * @return 安全保卫部年度计划
+     */
+    @Override
+    public List<CoreSafetyWorkSummary> selectCoreSafetyWorkSummaryList(CoreSafetyWorkSummary CoreSafetyWorkSummary) {
+        return CoreSafetyWorkSummaryMapper.selectList(new QueryWrapper<>(CoreSafetyWorkSummary));
+    }
+
+    /**
+     * 新增安全保卫部年度计划
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度计划
+     * @return 结果
+     */
+    @Override
+    public int insertCoreSafetyWorkSummary(CoreSafetyWorkSummaryRequestDto CoreSafetyWorkSummary) {
+        CoreSafetyWorkSummary.setCreateTime(DateUtils.getNowDate());
+        CoreSafetyWorkSummary.setCreateBy(SecurityUtils.getUserId().toString());
+        CoreSafetyWorkSummary.setFiles(ObjectUtil.isNotEmpty(CoreSafetyWorkSummary.getFileList()) ? JSON.toJSONString(CoreSafetyWorkSummary.getFileList()) : null);
+        CoreSafetyWorkSummaryMapper.insert(CoreSafetyWorkSummary);
+        return 1;
+    }
+
+    /**
+     * 修改安全保卫部年度计划
+     *
+     * @param CoreSafetyWorkSummary 安全保卫部年度计划
+     * @return 结果
+     */
+    @Override
+    public int updateCoreSafetyWorkSummary(CoreSafetyWorkSummaryRequestDto CoreSafetyWorkSummary) {
+        CoreSafetyWorkSummary.setUpdateTime(DateUtils.getNowDate());
+        CoreSafetyWorkSummary.setUpdateBy(SecurityUtils.getUserId().toString());
+        CoreSafetyWorkSummary.setFiles(ObjectUtil.isNotEmpty(CoreSafetyWorkSummary.getFileList()) ? JSON.toJSONString(CoreSafetyWorkSummary.getFileList()) : null);
+        return CoreSafetyWorkSummaryMapper.updateById(CoreSafetyWorkSummary);
+    }
+
+    /**
+     * 批量删除安全保卫部年度计划
+     *
+     * @param ids 需要删除的安全保卫部年度计划主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCoreSafetyWorkSummaryByIds(Long[] ids) {
+        return CoreSafetyWorkSummaryMapper.deleteBatchIds(Arrays.asList((ids)));
+    }
+
+    /**
+     * 删除安全保卫部年度计划信息
+     *
+     * @param id 安全保卫部年度计划主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCoreSafetyWorkSummaryById(Long id) {
+        return CoreSafetyWorkSummaryMapper.deleteById(id);
+    }
+}

+ 32 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/vo/CoreSafetyWorkSummaryVo.java

@@ -0,0 +1,32 @@
+package com.xunmei.core.safetybook.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xunmei.common.core.web.domain.BaseEntity;
+import com.xunmei.core.safetybook.domain.CoreSafetyBookBookFilesVo;
+import com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 安全保卫部年度工作总结
+ *
+ * @author xunmei
+ * @date 2023-10-26
+ */
+@Data
+public class CoreSafetyWorkSummaryVo extends CoreSafetyWorkSummary {
+
+    private String selectOrgPath;
+
+    private List<String> fileList;
+
+    private String orgName;
+}

+ 31 - 29
soc-modules/soc-modules-core/src/main/resources/mapper/board/AppCockpitMapper.xml

@@ -49,62 +49,64 @@
           and o.path like concat(#{orgPath}, '%')
     </select>
     <select id="selectOverViewResumptionTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
-        SELECT sum(if(t.ymd_date >= #{date}, 1, 0))                            as total,
-               sum(if(t.ymd_date >= #{date}, (if(t.`status` = 3, 1, 0)), 0))   as completed,
-               sum(if(t.ymd_date &lt; #{date}, 1, 0))                          as prevTotal,
-               sum(if(t.ymd_date &lt; #{date}, (if(t.`status` = 3, 1, 0)), 0)) as prevcompleted
+        SELECT sum(if(t.plan_end_time >= #{date}, 1, 0))                            as total,
+               sum(if(t.plan_end_time >= #{date}, (if(t.`status` = 3, 1, 0)), 0))   as completed,
+               sum(if(t.plan_end_time &lt; #{date}, 1, 0))                          as prevTotal,
+               sum(if(t.plan_end_time &lt; #{date}, (if(t.`status` = 3, 1, 0)), 0)) as prevcompleted
         FROM core_resumption t
-                 inner join core_resumption_plan p on t.plan_id = p.id and p.plan_cycle &lt; 5
-        WHERE t.ymd_date >= #{prevdate}
+                 inner join core_resumption_plan p on t.plan_id = p.id and p.plan_exec in (2,3,4)
+        WHERE plan_end_time >= #{prevdate}
+          and plan_end_time &lt;= #{end}
           and t.org_path like concat(#{orgPath}, '%')
     </select>
 
     <select id="selectOverViewSafetyCheckTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
-        SELECT sum(if(t.ymd_date >= #{date}, 1, 0))                            as total,
-               sum(if(t.ymd_date >= #{date}, (if(t.`status` = 3, 1, 0)), 0))   as completed,
-               sum(if(t.ymd_date &lt; #{date}, 1, 0))                          as prevTotal,
-               sum(if(t.ymd_date &lt; #{date}, (if(t.`status` = 3, 1, 0)), 0)) as prevcompleted
+        SELECT sum(if(t.plan_end_time >= #{date}, 1, 0))                            as total,
+               sum(if(t.plan_end_time >= #{date}, (if(t.`status` = 3, 1, 0)), 0))   as completed,
+               sum(if(t.plan_end_time &lt; #{date}, 1, 0))                          as prevTotal,
+               sum(if(t.plan_end_time &lt; #{date}, (if(t.`status` = 3, 1, 0)), 0)) as prevcompleted
         FROM core_safety_task t
                  INNER JOIN core_safecheck_plan p on t.plan_id = p.id and p.check_type = 3
-        WHERE ymd_date >= #{prevdate}
+        WHERE plan_end_time >= #{prevdate}
+            and plan_end_time &lt;= #{end}
           and org_path like concat(#{orgPath}, '%')
     </select>
 
     <select id="selectOverViewEduTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
-        SELECT sum(if(t.start_date >= #{date}, 1, 0))                      as total,
-               sum(if(t.start_date >= #{date} and t.`status` = 2, 1, 0))   as completed,
-               sum(if(t.start_date &lt; #{date}, 1, 0))                    as prevTotal,
-               sum(if(t.start_date &lt; #{date} and t.`status` = 2, 1, 0)) as prevcompleted
+        SELECT sum(if(t.end_date >= #{date}, 1, 0))                      as total,
+               sum(if(t.end_date >= #{date} and t.`status` = 2, 1, 0))   as completed,
+               sum(if(t.end_date &lt; #{date}, 1, 0))                    as prevTotal,
+               sum(if(t.end_date &lt; #{date} and t.`status` = 2, 1, 0)) as prevcompleted
         FROM core_edu_training_task t
                  left join core_edu_training_plan p on t.plan_id = p.id
-        WHERE t.start_date >= #{prevdate}
-          and t.start_date &lt;= #{end}
+        WHERE t.end_date >= #{prevdate}
+          and t.end_date &lt;= #{end}
           and t.org_path like concat(#{orgPath}, '%')
           and (p.plan_cycle &lt; 4 or t.plan_id is null)
     </select>
 
     <select id="selectOverViewDrillTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
-        SELECT sum(if(t.start_date >= #{date}, 1, 0))                            as total,
-               sum(if(t.start_date >= #{date}, (if(t.`status` = 4, 1, 0)), 0))   as completed,
-               sum(if(t.start_date &lt; #{date}, 1, 0))                          as prevTotal,
-               sum(if(t.start_date &lt; #{date}, (if(t.`status` = 4, 1, 0)), 0)) as prevcompleted
+        SELECT sum(if(t.end_date >= #{date}, 1, 0))                            as total,
+               sum(if(t.end_date >= #{date}, (if(t.`status` = 4, 1, 0)), 0))   as completed,
+               sum(if(t.end_date &lt; #{date}, 1, 0))                          as prevTotal,
+               sum(if(t.end_date &lt; #{date}, (if(t.`status` = 4, 1, 0)), 0)) as prevcompleted
         FROM core_drill_task t
                  left join core_drill_plan p on t.plan_id = p.id
-        WHERE t.start_date >= #{prevdate}
-          and t.start_date &lt;= #{end}
+        WHERE t.end_date >= #{prevdate}
+          and t.end_date &lt;= #{end}
           and t.org_path like concat(#{orgPath}, '%')
           and (p.plan_cycle &lt; 5 or t.plan_id is null)
     </select>
 
     <select id="selectOverViewMonitorTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
-        SELECT sum(if(t.ymd_date >= #{date}, 1, 0))                      as total,
-               sum(if(t.ymd_date >= #{date} and t.`status` = 2, 1, 0))   as completed,
-               sum(if(t.ymd_date &lt; #{date}, 1, 0))                    as prevTotal,
-               sum(if(t.ymd_date &lt; #{date} and t.`status` = 2, 1, 0)) as prevcompleted
+        SELECT sum(if(t.plan_end_time >= #{date}, 1, 0))                      as total,
+               sum(if(t.plan_end_time >= #{date} and t.`status` = 2, 1, 0))   as completed,
+               sum(if(t.plan_end_time &lt; #{date}, 1, 0))                    as prevTotal,
+               sum(if(t.plan_end_time &lt; #{date} and t.`status` = 2, 1, 0)) as prevcompleted
         FROM core_monitoring_retrieval_task t
                  inner join core_monitoring_retrieval_plan p on t.plan_id = p.id and p.plan_cycle &lt; 4
-        WHERE t.ymd_date >= #{prevdate}
-          and t.ymd_date &lt; #{end}
+        WHERE t.plan_end_time >= #{prevdate}
+          and t.plan_end_time &lt; #{end}
           and t.org_path like concat(#{orgPath}, '%')
     </select>
     <select id="selectOverViewQuestionInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">

+ 19 - 7
soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml

@@ -196,11 +196,14 @@
     <select id="selectRecPage" resultType="com.xunmei.common.core.domain.drill.vo.CoreDrillTaskRecPageVo">
         select * from core_drill_task t
         where t.rec_status is not null
-        <if test="request.recStatus!=null">
-            and t.rec_status =#{request.recStatus} and t.unrec_status is null
+        <if test="request.recStatus!=null and request.unRecStatus==null">
+            and t.rec_status = #{request.recStatus} AND t.unrec_status is null
+        </if>
+        <if test="request.recStatus!=null and request.unRecStatus!=null">
+            and t.rec_status = #{request.recStatus} and t.unrec_status = #{request.unRecStatus}
         </if>
-        <if test="request.unRecStatus!=null">
-            and t.unrec_status =#{request.unRecStatus}
+        <if test="request.drillType!=null">
+            and t.type =#{request.drillType}
         </if>
         and t.org_path like concat(#{request.orgPath},'%')
         <include refid="timeRangeSql"/>
@@ -220,9 +223,18 @@
     <select id="selectRecTaskListPage" resultType="com.xunmei.common.core.domain.drill.vo.CoreDrillTaskRecTaskPageVo">
         select id,org_name,drill_start_time,drill_end_time,type from core_drill_task t
         where drill_start_time is not null
-        <include refid="recTaskListPage"/>
-
-
+        <if test="request.orgPath !=null and request.orgPath != ''">
+            and t.org_path like concat(#{request.orgPath},'%')
+        </if>
+        <if test="request.recStatus!=null and request.unRecStatus==null">
+            and t.rec_status = #{request.recStatus} AND t.unrec_status is null
+        </if>
+        <if test="request.recStatus!=null and request.unRecStatus!=null">
+            and t.rec_status = #{request.recStatus} and t.unrec_status = #{request.unRecStatus}
+        </if>
+        <if test="request.drillType!=null">
+            and t.type =#{request.drillType}
+        </if>
         <if test="request.startTime != null and request.endTime != null">
             and (
             (

+ 168 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/safetybook/CoreSafetyWorkSummaryMapper.xml

@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xunmei.core.safetybook.mapper.CoreSafetyWorkSummaryMapper">
+
+    <resultMap type="com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary" id="CoreSafetyWorkSummaryResult">
+        <result property="id" column="id"/>
+        <result property="title" column="title"/>
+        <result property="date" column="date"/>
+        <result property="content" column="content"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="orgId" column="org_id"/>
+    </resultMap>
+
+    <sql id="selectCoreSafetyWorkSummaryVo">
+        select *
+        from core_safety_work_summary
+    </sql>
+
+    <select id="selectCoreSafetyWorkSummaryList"
+            parameterType="com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary"
+            resultMap="CoreSafetyWorkSummaryResult">
+        <include refid="selectCoreSafetyWorkSummaryVo"/>
+        <where>
+            <if test="title != null  and title != ''">
+                and title = #{title}
+            </if>
+            <if test="date != null ">
+                and date = #{date}
+            </if>
+            <if test="content != null  and content != ''">
+                and content = #{content}
+            </if>
+            <if test="orgId != null ">
+                and org_id = #{orgId}
+            </if>
+        </where>
+    </select>
+
+    <select id="selectCoreSafetyWorkSummaryById" parameterType="Long"
+            resultMap="CoreSafetyWorkSummaryResult">
+        <include refid="selectCoreSafetyWorkSummaryVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectPage" resultType="com.xunmei.core.safetybook.vo.CoreSafetyWorkSummaryVo">
+        select a.*,
+        o.short_name as orgName
+        from core_safety_work_summary a
+        left join sys_org o on o.id=a.org_id
+        <where>
+            <if test="aq.year != null ">
+                and a.year = #{aq.year}
+            </if>
+            <if test="aq.range!=null and aq.range.size >1">
+                and  a.date <![CDATA[>=]]>  #{aq.range[0]} and a.date  <![CDATA[<=]]> #{aq.range[1]}
+            </if>
+            <if test="aq.checkSub ==true">
+                and o.path like concat(#{aq.selectOrgPath},'%')
+            </if>
+            <if test="aq.checkSub ==false and aq.orgId != null">
+                and a.org_id = #{aq.orgId}
+            </if>
+        </where>
+        group by a.id,a.create_time
+        order by a.create_time desc
+    </select>
+    <select id="selectById" resultType="com.xunmei.core.safetybook.vo.CoreSafetyWorkSummaryVo">
+        select a.*,
+               o.short_name as org_name
+        from core_safety_work_summary a
+        left join sys_org o on o.id = a.org_id
+        where a.id = #{id}
+    </select>
+
+<!--    <insert id="insertCoreSafetyWorkSummary"-->
+<!--            parameterType="com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary">-->
+<!--        insert into core_safety_work_summary-->
+<!--        <trim prefix="(" suffix=")" suffixOverrides=",">-->
+<!--            <if test="id != null">id,-->
+<!--            </if>-->
+<!--            <if test="title != null">title,-->
+<!--            </if>-->
+<!--            <if test="date != null">date,-->
+<!--            </if>-->
+<!--            <if test="content != null">content,-->
+<!--            </if>-->
+<!--            <if test="createTime != null">create_time,-->
+<!--            </if>-->
+<!--            <if test="updateTime != null">update_time,-->
+<!--            </if>-->
+<!--            <if test="createBy != null">create_by,-->
+<!--            </if>-->
+<!--            <if test="updateBy != null">update_by,-->
+<!--            </if>-->
+<!--            <if test="orgId != null">org_id,-->
+<!--            </if>-->
+<!--        </trim>-->
+<!--        <trim prefix="values (" suffix=")" suffixOverrides=",">-->
+<!--            <if test="id != null">#{id},-->
+<!--            </if>-->
+<!--            <if test="title != null">#{title},-->
+<!--            </if>-->
+<!--            <if test="date != null">#{date},-->
+<!--            </if>-->
+<!--            <if test="content != null">#{content},-->
+<!--            </if>-->
+<!--            <if test="createTime != null">#{createTime},-->
+<!--            </if>-->
+<!--            <if test="updateTime != null">#{updateTime},-->
+<!--            </if>-->
+<!--            <if test="createBy != null">#{createBy},-->
+<!--            </if>-->
+<!--            <if test="updateBy != null">#{updateBy},-->
+<!--            </if>-->
+<!--            <if test="orgId != null">#{orgId},-->
+<!--            </if>-->
+<!--        </trim>-->
+<!--    </insert>-->
+
+<!--    <update id="updateCoreSafetyWorkSummary"-->
+<!--            parameterType="com.xunmei.core.safetybook.domain.CoreSafetyWorkSummary">-->
+<!--        update core_safety_work_summary-->
+<!--        <trim prefix="SET" suffixOverrides=",">-->
+<!--            <if test="title != null">title =-->
+<!--                #{title},-->
+<!--            </if>-->
+<!--            <if test="date != null">date =-->
+<!--                #{date},-->
+<!--            </if>-->
+<!--            <if test="content != null">content =-->
+<!--                #{content},-->
+<!--            </if>-->
+<!--            <if test="createTime != null">create_time =-->
+<!--                #{createTime},-->
+<!--            </if>-->
+<!--            <if test="updateTime != null">update_time =-->
+<!--                #{updateTime},-->
+<!--            </if>-->
+<!--            <if test="createBy != null">create_by =-->
+<!--                #{createBy},-->
+<!--            </if>-->
+<!--            <if test="updateBy != null">update_by =-->
+<!--                #{updateBy},-->
+<!--            </if>-->
+<!--            <if test="orgId != null">org_id =-->
+<!--                #{orgId},-->
+<!--            </if>-->
+<!--        </trim>-->
+<!--        where id = #{id}-->
+<!--    </update>-->
+
+    <delete id="deleteCoreSafetyWorkSummaryById" parameterType="Long">
+        delete
+        from core_safety_work_summary
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteCoreSafetyWorkSummaryByIds" parameterType="String">
+        delete from core_safety_work_summary where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 14 - 2
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java

@@ -120,7 +120,19 @@ public class SysFileController {
     public void downloadFile(HttpServletResponse response, @RequestBody SysFile sysFile) {
         try {
             String filePath = DesUtil.decode(sysFile.getCode(), secretKey);
-            sysFileService.downloadFile(response, filePath);
+            sysFileService.downloadFile(response, filePath,null);
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    @PostMapping("/downloadFile/realName")
+    public void downloadFileRealName(HttpServletResponse response, @RequestBody SysFile sysFile) {
+        try {
+            //String filePath = DesUtil.decode(sysFile.getCode(), secretKey);
+            String filePath = sysFile.getUrl().replace(prefix,"");
+            sysFileService.downloadFile(response, filePath,sysFile.getRealName());
         } catch (Exception e) {
             log.error("下载文件失败", e);
             throw new RuntimeException(e);
@@ -137,7 +149,7 @@ public class SysFileController {
     public void getFile(HttpServletResponse response, @PathVariable String code) {
         try {
             String filePath = DesUtil.decode(code, secretKey);
-            sysFileService.downloadFile(response, filePath);
+            sysFileService.downloadFile(response, filePath,null);
         } catch (Exception e) {
             log.error("下载文件失败", e);
             throw new RuntimeException(e);

+ 1 - 1
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java

@@ -46,7 +46,7 @@ public interface ISysFileService
      * @return
      * @throws Exception
      */
-    void downloadFile(HttpServletResponse response, String filePath) throws Exception;
+    void downloadFile(HttpServletResponse response, String filePath, String realName) throws Exception;
 
     String generateEduTrainingPdf(Map<String, Object> data) throws Exception;
     String generateResumptionPdf(Map<String, Object> data) throws Exception;

+ 4 - 1
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

@@ -167,7 +167,7 @@ public class LocalSysFileServiceImpl implements ISysFileService {
     }
 
     @Override
-    public void downloadFile(HttpServletResponse response, String filePath) {
+    public void downloadFile(HttpServletResponse response, String filePath,String realName) {
         ByteArrayOutputStream out = null;
         try {
             filePath = localFilePath + filePath;
@@ -175,6 +175,9 @@ public class LocalSysFileServiceImpl implements ISysFileService {
             out = FileDownUtils.downloadFile(filePath);
             String fileSuffix = FileDownUtils.getFileSuffix(filePath);
             String formFileName = UUID.randomUUID().toString() + fileSuffix;
+            if (StringUtils.isNotEmpty(realName)){
+                formFileName = realName;
+            }
             String userAgent = request.getHeader("User-Agent");
 
             // 针对IE或者以IE为内核的浏览器:

+ 6 - 0
soc-modules/soc-modules-system/pom.xml

@@ -52,6 +52,12 @@
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
 
+        <!-- 语义化规范2.0版本对比 -->
+        <dependency>
+            <groupId>com.github.zafarkhaja</groupId>
+            <artifactId>java-semver</artifactId>
+        </dependency>
+
         <!--soc datascope 数据权限-->
         <dependency>
             <groupId>com.xunmei</groupId>

+ 67 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysVersionController.java

@@ -0,0 +1,67 @@
+package com.xunmei.system.controller;
+
+import com.xunmei.common.core.web.controller.BaseController;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.security.annotation.RequiresPermissions;
+import com.xunmei.common.security.utils.SecurityUtils;
+import com.xunmei.system.api.domain.SysVersion;
+import com.xunmei.system.api.model.LoginUser;
+import com.xunmei.system.dto.SysCheckUpdateDto;
+import com.xunmei.system.service.ISysVersionService;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+@Api(tags = {"SysVersion" })
+@RestController
+@RequestMapping("/version")
+public class SysVersionController extends BaseController {
+
+    @Resource
+    private ISysVersionService versionService;
+
+    @RequiresPermissions("system:version:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysVersion> list(SysVersion version) {
+        return versionService.selectPage(version);
+    }
+
+    @RequiresPermissions("system:version:add")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody SysVersion version) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        version.setCreateBy(loginUser.getName());
+        return  versionService.insertVersion(version);
+    }
+
+    @RequiresPermissions("system:version:edit")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody SysVersion version) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        version.setUpdateBy(loginUser.getName());
+        return  versionService.updateVersion(version);
+    }
+
+    //@RequiresPermissions("system:version:edit")
+    @GetMapping("/detail/{id}")
+    public AjaxResult detail(@PathVariable Long id) {
+
+        return  success(versionService.getDetailById(id));
+    }
+
+    //@RequiresPermissions("system:version:download")
+    @GetMapping("/download/{id}")
+    public void download(HttpServletResponse response ,@PathVariable Long id) {
+        versionService.downloadFile(response,id);
+    }
+
+    @PostMapping("/checkUpdate")
+    public AjaxResult checkUpdate(@RequestBody SysCheckUpdateDto updateDto) {
+        SysCheckUpdateDto dto = versionService.checkUpdate(updateDto);
+        return success(dto);
+    }
+
+}

+ 29 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/dto/SysCheckUpdateDto.java

@@ -0,0 +1,29 @@
+package com.xunmei.system.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SysCheckUpdateDto {
+
+    @ApiModelProperty(value = "当前版本")
+    private String currentVersion;
+
+    @ApiModelProperty(value = "平台类型")
+    private String typeDesc;
+
+    @ApiModelProperty(value = "是否有新版本")
+    private boolean needUpdate;
+
+    @ApiModelProperty(value = "是否强制更新")
+    private boolean isForce;
+
+    @ApiModelProperty(value = "下载地址")
+    private String downloadUrl;
+
+    @ApiModelProperty(value = "新版本")
+    private String newVersion;
+
+    @ApiModelProperty(value = "版本说明")
+    private String note;
+}

+ 11 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysVersionMapper.java

@@ -0,0 +1,11 @@
+package com.xunmei.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.system.api.domain.SysVersion;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface SysVersionMapper extends BaseMapper<SysVersion> {
+    void disabledOthers(@Param("id") Long id, @Param("type") Integer type);
+}

+ 31 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysVersionService.java

@@ -0,0 +1,31 @@
+package com.xunmei.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.system.api.domain.SysVersion;
+import com.xunmei.system.dto.SysCheckUpdateDto;
+
+import javax.servlet.http.HttpServletResponse;
+
+public interface ISysVersionService extends IService<SysVersion> {
+
+    TableDataInfo<SysVersion> selectPage(SysVersion sysVersion);
+
+    AjaxResult insertVersion(SysVersion sysVersion);
+
+    AjaxResult updateVersion(SysVersion sysVersion);
+
+    /**
+     * 修改当前类型的升级包,其他版本的为未使用
+     * @param id
+     * @param type
+     */
+    void disabledOthers(Long id,Integer type);
+
+    SysVersion getDetailById(Long id);
+
+    void downloadFile(HttpServletResponse response, Long id);
+
+    SysCheckUpdateDto checkUpdate(SysCheckUpdateDto checkUpdateDto);
+}

+ 201 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysVersionServiceImpl.java

@@ -0,0 +1,201 @@
+package com.xunmei.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.utils.StringUtils;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.system.api.RemoteFileService;
+import com.xunmei.system.api.domain.SysFile;
+import com.xunmei.system.api.domain.SysVersion;
+import com.xunmei.system.api.enums.AppType;
+import com.xunmei.system.dto.SysCheckUpdateDto;
+import com.xunmei.system.mapper.SysVersionMapper;
+import com.xunmei.system.service.ISysVersionService;
+import feign.Response;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.github.zafarkhaja.semver.Version;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class SysVersionServiceImpl extends ServiceImpl<SysVersionMapper, SysVersion> implements ISysVersionService {
+
+    @Resource
+    private SysVersionMapper versionMapper;
+
+
+    @Resource
+    private RemoteFileService fileService;
+
+    @Override
+    public TableDataInfo<SysVersion> selectPage(SysVersion sysVersion) {
+        Page<SysVersion> page;
+        if (sysVersion.getPageNum() != null && sysVersion.getPageSize() != null) {
+            page = new Page<>(sysVersion.getPageNum(), sysVersion.getPageSize());
+        } else {
+            page = new Page<>();
+        }
+        QueryWrapper<SysVersion> wrapper = new QueryWrapper<>();
+        if (sysVersion.getType() != null ){
+            wrapper.eq("type",sysVersion.getType());
+        }
+        if (StringUtils.isNotEmpty(sysVersion.getVersion())){
+            wrapper.like("version",sysVersion.getVersion());
+        }
+        page = versionMapper.selectPage(page, wrapper);
+        return TableDataInfo.build(page);
+    }
+
+    @Transactional
+    @Override
+    public AjaxResult insertVersion(SysVersion sysVersion) {
+        //查询当前类型是否有当前版本
+        String msg = checkSameVersion(sysVersion,false);
+        if (StringUtils.isNotEmpty(msg)){
+            return AjaxResult.error(msg);
+        }
+
+        sysVersion.setCreateTime(new Date());
+        this.save(sysVersion);
+        if (sysVersion.getIsUse()){
+            disabledOthers(sysVersion.getId(),sysVersion.getType());
+        }
+        return AjaxResult.success();
+    }
+
+    @Transactional
+    @Override
+    public AjaxResult updateVersion(SysVersion sysVersion) {
+        //查询当前类型是否有当前版本
+        String msg = checkSameVersion(sysVersion,true);
+        if (StringUtils.isNotEmpty(msg)){
+            return AjaxResult.error(msg);
+        }
+
+        if (sysVersion.getId() != null){
+            sysVersion.setUpdateTime(new Date());
+            this.updateById(sysVersion);
+            if (sysVersion.getIsUse()){
+                disabledOthers(sysVersion.getId(),sysVersion.getType());
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public void disabledOthers(Long id, Integer type) {
+        versionMapper.disabledOthers(id,type);
+    }
+
+    @Override
+    public SysVersion getDetailById(Long id) {
+        return getById(id);
+    }
+
+    @Override
+    public void downloadFile(HttpServletResponse response, Long id){
+        InputStream inputStream = null;
+        BufferedInputStream bufferedInputStream = null;
+        BufferedOutputStream bufferedOutputStream = null;
+        try {
+            SysVersion version = getById(id);
+            if (null != version){
+                SysFile sysFile = new SysFile();
+                sysFile.setRealName(version.getPackageName());
+                sysFile.setUrl(version.getPath());
+                //Feign远程调用获取文件流
+                Response result = fileService.downloadFileRealName(sysFile);
+                Response.Body body = result.body();
+                inputStream = body.asInputStream();
+                bufferedInputStream = new BufferedInputStream(inputStream);
+                response.setHeader("Content-Type","application/octet-stream");
+                response.setHeader("Content-Disposition", result.headers().get("Content-Disposition").toString().replace("[", "").replace("]", ""));
+                bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
+                int length = 0;
+                byte[] temp = new byte[1024 * 10];
+                while ((length = bufferedInputStream.read(temp)) != -1) {
+                    bufferedOutputStream.write(temp, 0, length);
+                }
+                bufferedOutputStream.flush();
+                bufferedOutputStream.close();
+                bufferedInputStream.close();
+                inputStream.close();
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public SysCheckUpdateDto checkUpdate(SysCheckUpdateDto checkUpdateDto) {
+        SysCheckUpdateDto dto = new SysCheckUpdateDto();
+        dto.setNeedUpdate(false);
+        dto.setCurrentVersion(checkUpdateDto.getCurrentVersion());
+        dto.setTypeDesc(checkUpdateDto.getTypeDesc());
+        int type = -1;
+        switch (checkUpdateDto.getTypeDesc()){
+            case "APP":
+                type = AppType.APP.getIndex();
+                break;
+            case "PC":
+                type = AppType.PC.getIndex();
+                break;
+            case "IOS":
+                type = AppType.IOS.getIndex();
+                break;
+            case "HANG_WALL":
+                type = AppType.HANG_WALL.getIndex();
+                break;
+        }
+        if (type == -1){
+            return dto;
+        }
+        //使用的版本只有一个
+        QueryWrapper<SysVersion> wrapper = new QueryWrapper<>();
+        wrapper.eq("type",type);
+        wrapper.eq("is_use",1);
+        SysVersion version = getOne(wrapper);
+        if (null != version){
+            //判断终端版本是否小于等于使用版本
+            Version currentVersion = Version.valueOf(checkUpdateDto.getCurrentVersion());
+            Version useVersion = Version.valueOf(version.getVersion());
+            if (useVersion.compareTo(currentVersion) > 0){
+                //使用版本大于终端版本,需要升级
+                dto.setNeedUpdate(true);
+                dto.setForce(version.getIsForce());
+                dto.setNewVersion(version.getVersion());
+                dto.setNote(version.getNote());
+                dto.setDownloadUrl("/system/version/download/"+version.getId());
+                return dto;
+            }
+        }
+        return dto;
+    }
+
+    private String checkSameVersion(SysVersion sysVersion,boolean isUpdate){
+        //查询当前类型是否有当前版本
+        QueryWrapper<SysVersion> wrapper = new QueryWrapper<>();
+        wrapper.eq("type",sysVersion.getType());
+        wrapper.eq("version",sysVersion.getVersion());
+        //同一类型同一版本只有一条数据
+        SysVersion one = getOne(wrapper);
+        if (isUpdate){
+            if (null != one && !Objects.equals(one.getId(), sysVersion.getId())){
+                AppType appType = AppType.getEnumByIndex(sysVersion.getType());
+                return appType.getText() + " 终端已存在 " + sysVersion.getVersion() + " 版本包,请重新输入!";
+            }
+        }else {
+            if (null != one){
+                AppType appType = AppType.getEnumByIndex(sysVersion.getType());
+                return appType.getText() + " 终端已存在 " + sysVersion.getVersion() + " 版本包,请重新输入!";
+            }
+        }
+        return null;
+    }
+}

+ 10 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysVersionMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xunmei.system.mapper.SysVersionMapper">
+
+    <update id="disabledOthers">
+        update sys_version set is_use = 0 where id != #{id} and `type` = #{type}
+    </update>
+</mapper>