Переглянути джерело

Merge branch 'V0.0.2' of http://10.87.10.227:4000/jzyd_yyds/soc into V0.0.2

Conflicts:
	project_data/sql/0.0.3/soc/soc.sql
zhulu 1 рік тому
батько
коміт
c558ebe31c
23 змінених файлів з 715 додано та 50 видалено
  1. 21 2
      project_data/sql/0.0.3/soc/soc.sql
  2. 1 1
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/PdfLocalFileTempVo.java
  3. 34 32
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/controller/AppCockpitController.java
  4. 33 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/dto/app/AppGA38InfoDto.java
  5. 27 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/dto/app/AppOverviewTaskInfoDto.java
  6. 78 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/mapper/AppCockpitMapper.java
  7. 9 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/AppCockpitService.java
  8. 168 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/impl/AppCockpitServiceImpl.java
  9. 17 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppBaseInfoSecurityFacilitiesVo.java
  10. 23 7
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppBaseInfoVo.java
  11. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppGa38RateVo.java
  12. 23 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppOverviewItemVo.java
  13. 35 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppOverviewVo.java
  14. 19 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticInOutVo.java
  15. 17 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticOtherVo.java
  16. 21 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticQuestionVo.java
  17. 18 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticResumptionVo.java
  18. 20 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticSafetycheckTaskVo.java
  19. 18 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticSafetycheckVo.java
  20. 19 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticTaskInfoVo.java
  21. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/impl/CoreRegisterBookPdfServiceImpl.java
  22. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java
  23. 107 0
      soc-modules/soc-modules-core/src/main/resources/mapper/board/AppCockpitMapper.xml

+ 21 - 2
project_data/sql/0.0.3/soc/soc.sql

@@ -734,8 +734,9 @@ update sys_dict_type  SET dict_name = '预案演练项目' WHERE dict_name = '
 delete  from sys_dict_type where dict_type='core_drill_category';
 delete  from sys_dict_data where dict_type='core_drill_category';
 INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark) VALUES ('预案演练类型', 'core_drill_category', '0', null, now(), null, now(), 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 (10, '季度应急预案', '1', 'core_drill_category', null, 'default', 'N', '0',  null, now(), null, now(), 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 (20, '消防应急预案', '2', 'core_drill_category', null, 'default', 'N', '0',  null, now(), null, now(), 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 (10, '应急预案演练', '1', 'core_drill_category', null, 'default', 'N', '0',  null, now(), null, now(), 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 (20, '灭火和应急疏散预案演练', '2', 'core_drill_category', null, 'default', 'N', '0',  null, now(), null, now(), 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 (30, '其他', '3', 'core_drill_category', null, 'default', 'N', '0',  null, now(), null, now(), null);
 
 -- 报警控制器
 ALTER TABLE `core_protection_log`
@@ -911,6 +912,16 @@ INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (118, 0171419510995796
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (119, 01714195109957963777);
 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (120, 01714195109957963777);
 
+-- 变更安全检查类型
+DELETE FROM `sys_dict_data` WHERE `dict_type` = 'check_type';
+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 ( 1, '【定期检查】全省农信系统安全检查', '1', 'check_type', NULL, 'default', 'N', '0', '超级管理员', '2023-09-12 15:00:48', '省联社账号', '2023-11-13 16:57:40', 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 ( 2, '【定期检查】办事处辖区安全检查', '2', 'check_type', NULL, 'default', 'N', '0', '超级管理员', '2023-09-12 15:00:59', '省联社账号', '2023-11-13 16:57:52', 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 ( 3, '【定期检查】营业网点安全保卫检查', '3', 'check_type', NULL, 'default', 'N', '0', '超级管理员', '2023-09-12 15:01:25', '省联社账号', '2023-11-13 16:58:03', 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, '【定期检查】行社全面安全检查', '4', 'check_type', NULL, 'default', 'N', '0', '超级管理员', '2023-09-12 15:01:36', '省联社账号', '2023-11-13 16:58:12', 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 ( 5, '【不定期检查】阶段性检查  ', '5', 'check_type', NULL, 'default', 'N', '0', '省联社账号', '2023-11-13 16:58:27', '', 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 ( 6, ' 【不定期检查】专项检查 ', '6', 'check_type', NULL, 'default', 'N', '0', '省联社账号', '2023-11-13 16:58:40', '', 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 ( 7, '其他', '7', 'check_type', NULL, 'default', 'N', '0', '省联社账号', '2023-11-13 16:58:53', '', NULL, NULL);
+
 
 
 delete from sys_dict_data where dict_type = 'org_extend_type';
@@ -929,6 +940,14 @@ INSERT INTO `sys_dict_type` (`dict_id`, `dict_name`, `dict_type`, `status`, `cre
 INSERT INTO `sys_dict_data` (`dict_code`, `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 (20231113008, 1, '远程中心值守', '1', 'duty_options', NULL, 'default', 'N', '0', '超级管理员', '2023-11-13 12:01:10', '', NULL, NULL);
 INSERT INTO `sys_dict_data` (`dict_code`, `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 (20231113009, 2, '同楼异地值守', '2', 'duty_options', NULL, 'default', 'N', '0', '超级管理员', '2023-11-13 12:01:25', '', NULL, NULL);
 
+-- 修改/新增教育培训类型字典信息
+update sys_dict_data set dict_label='行社安全保卫教育培训' where dict_label='每月安全培训教育' and dict_type='edu_training_type' limit 1;
+update sys_dict_data set dict_label='行社消防安全培训' where dict_label='专项安全培训教育' and dict_type='edu_training_type' limit 1;
+delete from sys_dict_data where dict_type='edu_training_type' and dict_label in ('营业网点安全保卫教育培训','营业网点消防安全培训');
+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 (2, '营业网点安全保卫教育培训', '2', 'edu_training_type', null, 'default', 'N', '0', null, now(), null, now(), 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 (3, '营业网点消防安全培训', '3', 'edu_training_type', null, 'default', 'N', '0',  null, now(), null, now(), null);
+
+
 
 
 

+ 1 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/registerbook/vo/PdfLocalFileTempVo.java

@@ -14,6 +14,6 @@ public class PdfLocalFileTempVo {
     private String zipName;
     private String fileSize;
     private String downLoadTime;
-    private Boolean isRegisterBookPage;
+    private Boolean isRegisterBookPage=Boolean.FALSE;
     private Date createTime;
 }

+ 34 - 32
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/controller/AppCockpitController.java

@@ -4,11 +4,9 @@ package com.xunmei.core.board.controller;
 import com.xunmei.common.core.web.controller.BaseController;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.core.board.dto.app.AppTaskRankingDto;
-import com.xunmei.core.board.dto.web.TaskStatisticDto;
+import com.xunmei.core.board.service.AppCockpitService;
 import com.xunmei.core.board.service.CockpitService;
-import com.xunmei.core.board.vo.app.AppBaseInfoVo;
-import com.xunmei.core.board.vo.app.AppGa38Vo;
-import com.xunmei.core.board.vo.app.AppTaskRankingVo;
+import com.xunmei.core.board.vo.app.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -19,6 +17,8 @@ import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
 
 /**
  * 驾驶舱
@@ -32,20 +32,16 @@ import java.util.List;
 //@RequiresPermissions("core:cockpit")
 public class AppCockpitController extends BaseController {
     @Resource
-    CockpitService cockpitService;
+    AppCockpitService cockpitService;
 
     /**
      * 履职排名
      */
     @ApiOperation(value = "履职排名")
-    @GetMapping("/taskranking")
+    @GetMapping("/ranking/resumption")
     public AjaxResult taskRanking(AppTaskRankingDto dto) {
-        List<AppTaskRankingVo> vos = new ArrayList<>();
-        AppTaskRankingVo vo=  new AppTaskRankingVo();
-        vo.setOrgName("机构名称");
-        vo.setRate(0.456434354f);
-        vos.add(vo);
-        return success(vos);
+        List<AppTaskRankingVo> rankingVos = cockpitService.taskRanking(dto);
+        return success(rankingVos);
     }
 
 
@@ -55,36 +51,42 @@ public class AppCockpitController extends BaseController {
     @ApiOperation(value = "基础信息")
     @GetMapping("/baseInfo")
     public AjaxResult baseInfo() {
-        AppBaseInfoVo vo=new AppBaseInfoVo();
-        vo.setGa38Info(new HashMap<>());
-        vo.getGa38Info().put("GA38-2021",new AppGa38Vo());
-        vo.getGa38Info().put("GA38-2015",new AppGa38Vo());
+        AppBaseInfoVo vo = new AppBaseInfoVo();
+        vo.setSecurityFacilities(new AppBaseInfoSecurityFacilitiesVo());
+        vo.setBanking2015(new AppGa38RateVo());
+        vo.setOfflineATM2015(new AppGa38RateVo());
+        vo.setBanking2021(new AppGa38RateVo());
+        vo.setOfflineATM2021(new AppGa38RateVo());
 
         vo.setBusinessStoreInfo(new HashMap<>());
-        vo.getBusinessStoreInfo().put("一类库",50);
-        vo.getBusinessStoreInfo().put("二类库",50);
-        vo.getBusinessStoreInfo().put("三类库",50);
-        vo.getBusinessStoreInfo().put("四类库",50);
+        vo.getBusinessStoreInfo().put("一类库", 50);
+        vo.getBusinessStoreInfo().put("二类库", 50);
+        vo.getBusinessStoreInfo().put("三类库", 50);
+        vo.getBusinessStoreInfo().put("四类库", 50);
 
-        vo.setBankPropertyRight(new HashMap<>());
-        vo.getBankPropertyRight().put("自有",100);
-        vo.getBankPropertyRight().put("租赁",100);
-        vo.getBankPropertyRight().put("部分自有+部分租赁",100);
 
         vo.setSecurityPeopleInfo(new HashMap<>());
-        vo.getSecurityPeopleInfo().put("未配备",40);
-        vo.getSecurityPeopleInfo().put("已配备",40);
-        vo.getSecurityPeopleInfo().put("内部人员",40);
-        vo.getSecurityPeopleInfo().put("外部人员",40);
+        vo.getSecurityPeopleInfo().put("未配备", 40);
+        vo.getSecurityPeopleInfo().put("已配备", 40);
+
+        vo.setOnlineATMPropertyRight(new HashMap<>());
+        vo.getOnlineATMPropertyRight().put("穿墙式设备",40);
+        vo.getOnlineATMPropertyRight().put("大堂式设备",40);
+
+        vo.setOfflineATMPropertyRight(new HashMap<>());
+        vo.getOfflineATMPropertyRight().put("穿墙式设备",40);
+        vo.getOfflineATMPropertyRight().put("大堂式设备",40);
         return success(vo);
     }
 
     /**
-     * 统计近期下级视频调阅情况
+     * 总览
      */
-    @ApiOperation(value = "统计近期下级视频调阅情况")
+    @ApiOperation(value = "总览")
     @GetMapping("/overview")
-    public AjaxResult overview() {
-        return success();
+    public AjaxResult overview()   throws ExecutionException, InterruptedException, TimeoutException {
+        AppOverviewVo vo = cockpitService.overview();
+
+        return success(vo);
     }
 }

+ 33 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/dto/app/AppGA38InfoDto.java

@@ -0,0 +1,33 @@
+package com.xunmei.core.board.dto.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * APP驾驶舱总览GA38信息
+ */
+@Data
+public class AppGA38InfoDto {
+    /**
+     * 应完成数
+     */
+    private int total;
+
+    @ApiModelProperty("GA38-2021总达标数")
+    private int  ga382021;
+
+    @ApiModelProperty("本周期的GA38-2021达标数")
+    private int  ga382021current;
+
+    @ApiModelProperty("本周期前的GA38-2021达标数")
+    private int  ga382021prev;
+
+    @ApiModelProperty("本周期前的GA38-2015达标数")
+    private int  ga382015;
+
+    @ApiModelProperty("本周期的GA38-2015达标数")
+    private int  ga382015current;
+
+    @ApiModelProperty("本周期前的GA38-2015达标数")
+    private int  ga382015prev;
+}

+ 27 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/dto/app/AppOverviewTaskInfoDto.java

@@ -0,0 +1,27 @@
+package com.xunmei.core.board.dto.app;
+
+import lombok.Data;
+
+/**
+ * 总览-任务完成情况
+ * 定义为int,方便
+ */
+@Data
+public class AppOverviewTaskInfoDto {
+    /**
+     * 应完成数
+     */
+    private int total;
+    /**
+     * 已完成数
+     */
+    private int completed;
+    /**
+     * 上一周期(月)应完成数
+     */
+    private int prevTotal;
+    /**
+     * 上一周期(月)已完成数
+     */
+    private int prevCompleted;
+}

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

@@ -0,0 +1,78 @@
+package com.xunmei.core.board.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.core.board.dto.app.AppGA38InfoDto;
+import com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto;
+import com.xunmei.core.board.vo.app.AppOverviewVo;
+import org.apache.ibatis.annotations.Param;
+import  java.util.Date;
+
+public interface AppCockpitMapper extends BaseMapper {
+    /**
+     * 总览-机构信息
+     * @param orgId
+     * @return
+     */
+    AppOverviewVo selectOrgOverview(@Param("orgPath") String orgPath);
+
+    /**
+     * 总览-GA38达标数
+     * @param orgPath
+     * @param date
+     * @return
+     */
+    AppGA38InfoDto selectOrgGa38(@Param("orgPath") String orgPath, @Param("date") Date date);
+
+    /**
+     * 履职本周期、上周期完成情况
+     * @param orgPath
+     * @param date
+     * @param prevDate
+     * @return
+     */
+    AppOverviewTaskInfoDto selectOverViewResumptionTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("prevdate") Date prevDate);
+
+    /**
+     * 安全检查本周期、上周期完成情况
+     * @param orgPath
+     * @param date
+     * @param prevDate
+     * @return
+     */
+    AppOverviewTaskInfoDto selectOverViewSafetyCheckTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("prevdate") Date prevDate);
+
+    /**
+     * 教育本周期、上周期完成情况
+     * @param orgPath
+     * @param date
+     * @param prevDate
+     * @return
+     */
+    AppOverviewTaskInfoDto selectOverViewEduTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("prevdate") Date prevDate);
+
+    /**
+     * 预案演练本周期、上周期完成情况
+     * @param orgPath
+     * @param date
+     * @param prevDate
+     * @return
+     */
+    AppOverviewTaskInfoDto selectOverViewDrillTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("prevdate") Date prevDate);
+
+    /**
+     * 教育本周期、上周期完成情况
+     * @param orgPath
+     * @param date
+     * @param prevDate
+     * @return
+     */
+    AppOverviewTaskInfoDto selectOverViewMonitorTaskInfo(@Param("orgPath") String orgPath, @Param("date") Date date,@Param("prevdate") Date prevDate);
+
+    /**
+     * 问题整改情况
+     * @param orgPath
+     * @param date
+     * @return
+     */
+    AppOverviewTaskInfoDto selectOverViewQuestionInfo(@Param("orgPath") String orgPath, @Param("date") Date date);
+}

+ 9 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/AppCockpitService.java

@@ -2,9 +2,12 @@ package com.xunmei.core.board.service;
 
 import com.xunmei.core.board.dto.app.AppTaskRankingDto;
 import com.xunmei.core.board.vo.app.AppBaseInfoVo;
+import com.xunmei.core.board.vo.app.AppOverviewVo;
 import com.xunmei.core.board.vo.app.AppTaskRankingVo;
 
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
 
 public interface AppCockpitService {
     /**
@@ -19,4 +22,10 @@ public interface AppCockpitService {
      * @return
      */
     AppBaseInfoVo baseInfo() ;
+
+    /**
+     * 总览
+     * @return
+     */
+    AppOverviewVo overview()  throws ExecutionException, InterruptedException, TimeoutException;
 }

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

@@ -1,28 +1,44 @@
 package com.xunmei.core.board.service.impl;
 
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.DateRange;
+import com.xunmei.common.core.domain.panel.vo.PanelListVo;
 import com.xunmei.common.core.enums.CycleCommonEnum;
+import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
+import com.xunmei.core.board.dto.app.AppGA38InfoDto;
+import com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto;
 import com.xunmei.core.board.dto.app.AppTaskRankingDto;
+import com.xunmei.core.board.mapper.AppCockpitMapper;
 import com.xunmei.core.board.mapper.CockpitMapper;
 import com.xunmei.core.board.service.AppCockpitService;
 import com.xunmei.core.board.vo.app.AppBaseInfoVo;
+import com.xunmei.core.board.vo.app.AppOverviewItemVo;
+import com.xunmei.core.board.vo.app.AppOverviewVo;
 import com.xunmei.core.board.vo.app.AppTaskRankingVo;
 import com.xunmei.core.board.vo.web.TaskStatisticVo;
+import com.xunmei.core.thread.ThreadPoolConfig;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
+import io.reactivex.rxjava3.core.Single;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 @Service
 public class AppCockpitServiceImpl implements AppCockpitService {
@@ -30,8 +46,16 @@ public class AppCockpitServiceImpl implements AppCockpitService {
     private CockpitMapper cockpitMapper;
 
     @Resource
+    private AppCockpitMapper appCockpitMapper;
+    @Resource
     RemoteOrgService remoteOrgService;
 
+    public static final int TIMEOUT = 3;
+
+    @Autowired
+    @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
     @Override
     public List<AppTaskRankingVo> taskRanking(AppTaskRankingDto dto) {
         DateRange range = DateUtils.getStartAndEnd(dto.getMonth(), CycleCommonEnum.MONTHLY);
@@ -44,6 +68,7 @@ public class AppCockpitServiceImpl implements AppCockpitService {
         List<TaskStatisticVo> childrenStatistic = new ArrayList<>();
         for (SysOrg child : children) {
             TaskStatisticVo childVo = new TaskStatisticVo();
+            childVo.setOrgName(child.getShortName());
             childrenStatistic.add(childVo);
 
             for (TaskStatisticVo orgItem : list) {
@@ -63,6 +88,7 @@ public class AppCockpitServiceImpl implements AppCockpitService {
             } else {
                 vo.setRate(i.getCompletedCount() / i.getTaskTotal());
             }
+            r.add(vo);
         });
         r.sort(new Comparator<AppTaskRankingVo>() {
             @Override
@@ -82,4 +108,142 @@ public class AppCockpitServiceImpl implements AppCockpitService {
     public AppBaseInfoVo baseInfo() {
         return null;
     }
+
+    /**
+     * 总览
+     *
+     * @return
+     */
+    @Override
+    public AppOverviewVo overview() throws ExecutionException, InterruptedException, TimeoutException {
+        SysOrg org = remoteOrgService.selectOrgById(SecurityUtils.getLoginUser().getOrgId(), SecurityConstants.INNER);
+        AppOverviewVo vo = new AppOverviewVo();
+        if (ObjectUtil.isNull(org)) {
+            return vo;
+        }
+
+        Date currentMonth = DateUtil.beginOfMonth(new Date());
+        Date prevMonth = DateUtil.beginOfMonth(new Date()).offset(DateField.MONTH, -1);
+
+        CompletableFuture<AppOverviewVo> orgOverview = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOrgOverview(org.getPath()), threadPoolTaskExecutor
+        );
+        AppGA38InfoDto d1 = appCockpitMapper.selectOrgGa38(org.getPath(), currentMonth);
+        CompletableFuture<AppGA38InfoDto> orgga38 = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOrgGa38(org.getPath(), currentMonth), threadPoolTaskExecutor
+        );
+
+        CompletableFuture<AppOverviewTaskInfoDto> resumption = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOverViewResumptionTaskInfo(org.getPath(), currentMonth, prevMonth), threadPoolTaskExecutor
+        );
+
+        CompletableFuture<AppOverviewTaskInfoDto> safetyCheck = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOverViewSafetyCheckTaskInfo(org.getPath(), currentMonth, prevMonth), threadPoolTaskExecutor
+        );
+
+        CompletableFuture<AppOverviewTaskInfoDto> edu = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOverViewEduTaskInfo(org.getPath(), currentMonth, prevMonth), threadPoolTaskExecutor
+        );
+
+        CompletableFuture<AppOverviewTaskInfoDto> monitor = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOverViewMonitorTaskInfo(org.getPath(), currentMonth, prevMonth), threadPoolTaskExecutor
+        );
+
+        Date currentQuarter = DateUtil.beginOfQuarter(new Date());
+        Date prevQuarter = DateUtil.beginOfMonth(new Date()).offset(DateField.MONTH, -3);
+        CompletableFuture<AppOverviewTaskInfoDto> drill = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOverViewDrillTaskInfo(org.getPath(), currentQuarter, prevQuarter), threadPoolTaskExecutor
+        );
+
+        Date near90 = DateUtil.beginOfDay(new Date()).offset(DateField.DAY_OF_YEAR, -90);
+        CompletableFuture<AppOverviewTaskInfoDto> question = CompletableFuture.supplyAsync(() ->
+                appCockpitMapper.selectOverViewQuestionInfo(org.getPath(), near90), threadPoolTaskExecutor
+        );
+
+        CompletableFuture<Void> allQueries = CompletableFuture.allOf(
+                orgOverview, orgga38, resumption,
+                safetyCheck, edu, drill, question, monitor
+        );
+
+
+        allQueries.get(TIMEOUT, TimeUnit.SECONDS);
+
+        BeanUtils.copyProperties(orgOverview.join(), vo);
+        vo.setGa38(new HashMap<>());
+        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.setTaskInfo(new HashMap<>());
+        vo.getTaskInfo().put("日常履职", computeOverviewItem(resumption.get()));
+        vo.getTaskInfo().put("网点自查", computeOverviewItem(safetyCheck.get()));
+        vo.getTaskInfo().put("教育培训", computeOverviewItem(edu.get()));
+        vo.getTaskInfo().put("预案演练", computeOverviewItem(drill.get()));
+        vo.getTaskInfo().put("监控调阅", computeOverviewItem(monitor.get()));
+
+        AppOverviewItemVo questionVo = new AppOverviewItemVo();
+        questionVo.setShouldComplete(question.get().getTotal());
+        questionVo.setCurrentCompletedCount(question.get().getCompleted());
+        if (ObjectUtil.equal(questionVo.getShouldComplete(), 0)) {
+            questionVo.setCurrentCompletedRate(1F);
+        } else {
+            questionVo.setCurrentCompletedRate(questionVo.getCurrentCompletedCount().floatValue() / questionVo.getShouldComplete());
+        }
+        vo.getTaskInfo().put("问题整改", questionVo);
+        return vo;
+    }
+
+    private AppOverviewItemVo computeOverviewItem(AppOverviewTaskInfoDto dto) {
+
+        AppOverviewItemVo vo = new AppOverviewItemVo();
+        if(ObjectUtil.isNull(dto)){
+            vo.setShouldComplete(0);
+            vo.setCurrentCompletedCount(0);
+            vo.setCurrentCompletedRate(0F);
+            vo.setCompare(0F);
+            
+            return  vo;
+        }
+        vo.setCurrentCompletedCount(dto.getCompleted());
+        vo.setShouldComplete(dto.getTotal());
+        if (ObjectUtil.equal(dto.getTotal(), 0) || ObjectUtil.isNull(dto.getTotal())) {
+            vo.setCurrentCompletedRate(1F);
+        } else if (ObjectUtil.equal(dto.getCompleted(), 0) || ObjectUtil.isNull(dto.getCompleted())) {
+            vo.setCurrentCompletedCount(0);
+        } else {
+            vo.setCurrentCompletedRate(((float) dto.getCompleted()) / dto.getTotal());
+        }
+
+        float prevRate = 0;
+        if (ObjectUtil.equal(dto.getPrevTotal(), 0) || ObjectUtil.isNull(dto.getPrevTotal())) {
+            prevRate = 1F;
+        } else if (ObjectUtil.isNotNull(dto.getPrevCompleted())) {
+            prevRate = ((float) dto.getPrevCompleted()) / dto.getPrevTotal();
+        }
+
+        vo.setPrevCompletedRate(prevRate);
+        vo.setCompare(vo.getCurrentCompletedRate() - prevRate);
+        return vo;
+    }
+
+
+    /**
+     * @param total            应完成
+     * @param completed        已完成
+     * @param currentCompleted 本周期完成
+     * @param prevCompleted    上一周期完成
+     * @return
+     */
+    private AppOverviewItemVo computeGa38(int total, int completed, int currentCompleted, int prevCompleted) {
+        AppOverviewItemVo vo = new AppOverviewItemVo();
+        if (ObjectUtil.equal(total, 0)) {
+            vo.setCurrentCompletedRate(1F);
+        } else {
+            vo.setCurrentCompletedRate(((float) completed) / total);
+        }
+
+        vo.setCompare(((float) currentCompleted) - prevCompleted);
+        vo.setCurrentCompletedCount(currentCompleted);
+        return vo;
+    }
+
 }

+ 17 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppBaseInfoSecurityFacilitiesVo.java

@@ -0,0 +1,17 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 安全防范设施改造情况
+ */
+@Data
+public class AppBaseInfoSecurityFacilitiesVo {
+    @ApiModelProperty("2021达标数")
+    private Integer ga382021;
+    @ApiModelProperty("2015达标数")
+    private Integer ga382015;
+    @ApiModelProperty("未达标数")
+    private Integer ga38Unreached;
+}

+ 23 - 7
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppBaseInfoVo.java

@@ -10,15 +10,31 @@ import java.util.Map;
  */
 @Data
 public class AppBaseInfoVo {
-    @ApiModelProperty("GA38达标情况")
-    private Map<String,AppGa38Vo> ga38Info;
 
-    @ApiModelProperty("业务库")
-    private Map<String,Integer> businessStoreInfo;
+    @ApiModelProperty("安全防范设施改造情况")
+    private AppBaseInfoSecurityFacilitiesVo securityFacilities;
+
+    @ApiModelProperty("GA382021-营业网点")
+    private AppGa38RateVo banking2021;
+
+    @ApiModelProperty("GA382021-离行")
+    private AppGa38RateVo offlineATM2021;
+
+    @ApiModelProperty("GA382015-营业网点")
+    private AppGa38RateVo banking2015;
 
-    @ApiModelProperty("营业网点产权信息")
-    private Map<String,Integer> bankPropertyRight;
+    @ApiModelProperty("GA382015-离行")
+    private AppGa38RateVo offlineATM2015;
 
-    @ApiModelProperty("安保人员配备情况")
+    @ApiModelProperty("网点业务库总览(一、二、三、四类库)")
+    private Map<String,Integer> businessStoreInfo;
+
+    @ApiModelProperty("安保人员配备情况(已配备、未配备)")
     private Map<String,Integer> securityPeopleInfo;
+
+    @ApiModelProperty("在行产权信息")
+    private Map<String,Integer> onlineATMPropertyRight;
+
+    @ApiModelProperty("离行产权信息")
+    private Map<String,Integer> offlineATMPropertyRight;
 }

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppGa38Vo.java → soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppGa38RateVo.java

@@ -7,8 +7,8 @@ import lombok.Data;
  * app驾驶舱机构GA38达标情况
  */
 @Data
-public class AppGa38Vo{
+public class AppGa38RateVo {
     private  Integer total;
 
-    private double rate;
+    private float rate;
 }

+ 23 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppOverviewItemVo.java

@@ -0,0 +1,23 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class AppOverviewItemVo {
+    @ApiModelProperty("当前周期完成率,近90天整改率")
+    private Float currentCompletedRate;
+
+    @ApiModelProperty("当前周期应完成")
+    private Integer shouldComplete;
+
+    @ApiModelProperty("当前周期完成数,已整改")
+    private Integer currentCompletedCount;
+
+    @ApiModelProperty("上一周期完成率,")
+    private Float prevCompletedRate;
+
+    @ApiModelProperty("本周期与上一周期的比")
+    private  Float compare;
+}

+ 35 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppOverviewVo.java

@@ -0,0 +1,35 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 总览
+ */
+@Data
+public class AppOverviewVo {
+    @ApiModelProperty("行社数量")
+    private Integer hangsheCount;
+    @ApiModelProperty("营业网点数量")
+    private Integer bankingCount;
+    @ApiModelProperty("中心业务库数量")
+    private Integer centerStoreCount;
+    @ApiModelProperty("网点业务库数量")
+    private Integer bankingStoreCount;
+    @ApiModelProperty("在行式自动银行数量")
+    private  Integer onlineATMCount;
+    @ApiModelProperty("离行式自动银行数量")
+    private Integer offlineATMCount;
+    @ApiModelProperty("大堂式设备数量")
+    private Integer lobbyDeviceCount;
+    @ApiModelProperty("穿墙式设备数量")
+    private Integer throughwallDeviceCount;
+
+    @ApiModelProperty("GA38信息:GA382021、GA382015")
+    private Map<String,AppOverviewItemVo>  ga38;
+
+    @ApiModelProperty("各类任务信息:日常履职、网点自查、教育培训、预案演练、监控调阅、问题整改")
+    private Map<String,AppOverviewItemVo>  taskInfo;
+}

+ 19 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticInOutVo.java

@@ -0,0 +1,19 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 综合数据-出入管理
+ */
+@Data
+public class AppSyntheticInOutVo {
+    @ApiModelProperty("总数")
+    private  Integer total;
+    @ApiModelProperty("紧急出入")
+    private Integer emergency;
+    @ApiModelProperty("临时出入")
+    private Integer temporary;
+    @ApiModelProperty("职能部门出入")
+    private Integer department;
+}

+ 17 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticOtherVo.java

@@ -0,0 +1,17 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 综合数据-其它
+ */
+@Data
+public class AppSyntheticOtherVo {
+    @ApiModelProperty("教育培训")
+    private AppSyntheticTaskInfoVo edu;
+    @ApiModelProperty("监控调阅")
+    private AppSyntheticTaskInfoVo monitor;
+    @ApiModelProperty("出入管理")
+    private AppSyntheticInOutVo inout;
+}

+ 21 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticQuestionVo.java

@@ -0,0 +1,21 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 综合数据-隐患整改
+ */
+@Data
+public class AppSyntheticQuestionVo {
+    @ApiModelProperty("各种状态下的整改数据:已确认、有异议 、已取消、待整改、未整改、已整改、整改率")
+    private Map<String,Float>  rateByState;
+
+    @ApiModelProperty("每日履职:隐患数、已整改、整改率")
+    private  Map<String,Float> resumption;
+
+    @ApiModelProperty("安全检查:隐患数、有异议、已取消、已确认、已整改、整改率")
+    private  Map<String,Float> safetyCheck;
+}

+ 18 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticResumptionVo.java

@@ -0,0 +1,18 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 综合数据-日常履职
+ */
+@Data
+public class AppSyntheticResumptionVo {
+    @ApiModelProperty("各类型完成率")
+    private Map<String,Float> rateByType;
+
+    @ApiModelProperty("各类型完成情况")
+    private Map<String,AppSyntheticTaskInfoVo> infoByType;
+}

+ 20 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticSafetycheckTaskVo.java

@@ -0,0 +1,20 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 综合数据-安全检查-任务信息
+ */
+@Data
+public class AppSyntheticSafetycheckTaskVo {
+    @ApiModelProperty("隐患数")
+    private Integer questionCount;
+    @ApiModelProperty("应检查")
+    private  Integer shouldCheckCount;
+    @ApiModelProperty("已检查")
+    private  Integer checkedCount;
+    @ApiModelProperty("完成率")
+    private Float completedCount;
+}

+ 18 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticSafetycheckVo.java

@@ -0,0 +1,18 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 综合数据-安全检查
+ */
+@Data
+public class AppSyntheticSafetycheckVo {
+    @ApiModelProperty("完成率:网点自查、全面检查、办事处检查、省联社检查、阶段性检查、专项检查、其他检查")
+    private Map<String,Float> rateByType;
+
+    @ApiModelProperty("完成率:网点自查、全面检查、办事处检查、省联社检查、阶段性检查、专项检查、其他检查")
+    private Map<String,AppSyntheticSafetycheckTaskVo> taskInfoByType;
+}

+ 19 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticTaskInfoVo.java

@@ -0,0 +1,19 @@
+package com.xunmei.core.board.vo.app;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+/**
+ * 综合数据-任务完成情况
+ */
+public class AppSyntheticTaskInfoVo {
+    @ApiModelProperty("应完成")
+    private float shouldCompleteCount;
+
+    @ApiModelProperty("已完成")
+    private float completedCount;
+
+    @ApiModelProperty("完成率")
+    private float completedRate;
+}

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/registerbook/service/impl/CoreRegisterBookPdfServiceImpl.java

@@ -203,9 +203,9 @@ public class CoreRegisterBookPdfServiceImpl extends ServiceImpl<CoreRegisterBook
         }
         List<PdfLocalFileTempVo> list = new ArrayList<>();
         for (String key : keys) {
-            String json = (String) redisTemplate.opsForValue().get(key);
+            String json =  RedisUtils.getCacheObject(key);
             PdfLocalFileTempVo pdfLocalFileTempVo = JSON.parseObject(json, PdfLocalFileTempVo.class);
-            if (pdfLocalFileTempVo != null && ObjectUtil.notEqual(pdfLocalFileTempVo.getIsRegisterBookPage(), exportDto.getIsRegisterBookPage())) {
+            if (pdfLocalFileTempVo == null || ObjectUtil.notEqual(pdfLocalFileTempVo.getIsRegisterBookPage(), exportDto.getIsRegisterBookPage())) {
                 continue;
             }
             list.add(pdfLocalFileTempVo);

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java

@@ -401,6 +401,9 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
         } else if (appPlan.getPlanExec() == 4) {//营业终 营业终了-23.59.59
             planstartTime = time1.setField(DateField.HOUR_OF_DAY, Integer.parseInt(closetime.split(":")[0])).setField(DateField.MINUTE, Integer.parseInt(closetime.split(":")[1])).setField(DateField.SECOND, 0).setField(DateField.MILLISECOND, 0);
             planendTime = DateUtil.endOfDay(time2).setField(DateField.MILLISECOND, 0);
+        }else if (appPlan.getPlanExec() == 5){ //非营业时间
+            planstartTime = time1.setField(DateField.HOUR_OF_DAY, Integer.parseInt(closetime.split(":")[0])).setField(DateField.MINUTE, Integer.parseInt(closetime.split(":")[1])).setField(DateField.SECOND, 0).setField(DateField.MILLISECOND, 0);
+            planendTime = DateUtil.endOfDay(time2).setField(DateField.MILLISECOND, 0);
         }
 
         return buildResumptions(appPlan, execOrg, planstartTime, planendTime, new ArrayList<>(), workTimes);

+ 107 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/board/AppCockpitMapper.xml

@@ -0,0 +1,107 @@
+<?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.board.mapper.AppCockpitMapper">
+    <select id="selectOrgOverview" resultType="com.xunmei.core.board.vo.app.AppOverviewVo">
+        SELECT sum(IF(o.type = 3, 1, 0))                                                    as hangsheCount,
+               sum(IF(o.type = 4, 1, 0))                                                    as bankingCount,
+               sum(IF(o.type = 6, 1, 0))                                                    as centerStoreCount,
+               sum(IF(o.type = 8, 1, 0))                                                    as bankingStoreCount,
+               sum(IF(o.type = 5, 1, 0))                                                    as offlineATMCount,
+               sum(IF(oe.self_service_bank is not null, 1, 0))                              as onlineATMCount,
+               sum(IF(oe.lobby_equipment is not null, oe.lobby_equipment, 0))               as lobbyDeviceCount,
+               sum(IF(oe.wall_penetrating_equipment = 4, oe.wall_penetrating_equipment, 0)) as throughwallDeviceCount
+        from sys_org o
+                 LEFT JOIN sys_org_extend oe on o.id = oe.org_id
+        WHERE o.deleted = 0
+          and o.is_lock = 0
+          and o.path like concat(#{orgPath}, '%')
+    </select>
+    <select id="selectOrgGa38" resultType="com.xunmei.core.board.dto.app.AppGA38InfoDto">
+        SELECT count(0)            as total,
+               sum(m.ga382021)     as ga382021,
+               sum(m.ga382021current) as ga382021current,
+               sum(m.ga382021prev) as ga382021prev,
+               sum(m.ga382015)     as ga382015,
+               sum(m.ga382015current) as ga382015current,
+               sum(m.ga382021prev) as ga382021prev
+        from sys_org o
+                 LEFT JOIN (SELECT org_id,
+                                   IF
+                                       (standard = 1, 1, 0)                                         AS ga382021,
+                                   IF
+                                       (standard = 1, IF(date_of_compliance >= #{date}, 1, 0), 0) AS ga382021current,
+                                   IF
+                                       (standard = 1, IF(date_of_compliance &lt; #{date}, 1, 0), 0) AS ga382021prev,
+                                   IF
+                                       (standard = 2, 1, 0)                                         AS ga382015,
+                                   IF
+                                       (standard = 2, IF(date_of_compliance >= #{date}, 1, 0), 0) AS ga382015current,
+                                   IF
+                                       (standard = 2, IF(date_of_compliance &lt; #{date}, 1, 0), 0) AS ga382015prev
+                            FROM sys_org_physical_defense_construction
+                            WHERE type = 4
+                               OR type = 5
+                            GROUP BY org_id) m on o.id = m.org_id
+        WHERE o.deleted = 0
+          and o.is_lock = 0
+          and (o.type = 4 OR o.type = 5)
+          and o.path like concat(#{orgPath}, '%')
+    </select>
+    <select id="selectOverViewResumptionTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
+        SELECT sum(if(ymd_date >= #{date}, 1, 0))                          as count,
+               sum(if(ymd_date >= #{date}, (if(`status` = 3, 1, 0)), 0))   as completed,
+               sum(if(ymd_date &lt; #{date}, 1, 0))                        as prevcount,
+               sum(if(ymd_date &lt; #{date}, (if(`status` = 3, 1, 0)), 0)) as prevcompleted
+        FROM core_resumption
+        WHERE ymd_date >= #{prevdate}
+          and 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 count,
+               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 prevcount,
+               sum(if(t.ymd_date &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=1
+        WHERE ymd_date >= #{prevdate}
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+
+    <select id="selectOverViewEduTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
+        SELECT sum(if(start_date >= #{date}, 1, 0))                          as count,
+               sum(if(start_date >= #{date}, (if(`status` = 4, 1, 0)), 0))   as completed,
+               sum(if(start_date &lt; #{date}, 1, 0))                        as prevcount,
+               sum(if(start_date &lt; #{date}, (if(`status` = 4, 1, 0)), 0)) as prevcompleted
+        FROM core_edu_training_task
+        WHERE start_date >= #{prevdate}
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+
+    <select id="selectOverViewDrillTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
+        SELECT sum(if(start_date >= #{date}, 1, 0))                          as count,
+               sum(if(start_date >= #{date}, (if(`status` = 4, 1, 0)), 0))   as completed,
+               sum(if(start_date &lt; #{date}, 1, 0))                        as prevcount,
+               sum(if(start_date &lt; #{date}, (if(`status` = 4, 1, 0)), 0)) as prevcompleted
+        FROM core_drill_task
+        WHERE start_date >= #{prevdate}
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+
+    <select id="selectOverViewMonitorTaskInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
+        SELECT sum(if(ymd_date >= #{date}, 1, 0))                          as count,
+               sum(if(ymd_date >= #{date}, (if(`status` = 3, 1, 0)), 0))   as completed,
+               sum(if(ymd_date &lt; #{date}, 1, 0))                        as prevcount,
+               sum(if(ymd_date &lt; #{date}, (if(`status` = 3, 1, 0)), 0)) as prevcompleted
+        FROM core_monitoring_retrieval_task
+        WHERE ymd_date >= #{prevdate}
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+    <select id="selectOverViewQuestionInfo" resultType="com.xunmei.core.board.dto.app.AppOverviewTaskInfoDto">
+        SELECT sum(if(confirm_status >= 2, 1, 0)) as total,
+               sum(if(reform_status = 11, 1, 0))  as completed
+        FROM core_question
+        WHERE submit_time >= #{date}
+          and org_path like concat(#{orgPath}, '%')
+    </select>
+</mapper>