Browse Source

实现APP驾驶舱总览后端;定义APP驾驶舱返回结果

jiawuxian 1 year ago
parent
commit
4822223809
20 changed files with 691 additions and 45 deletions
  1. 34 32
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/controller/AppCockpitController.java
  2. 33 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/dto/app/AppGA38InfoDto.java
  3. 27 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/dto/app/AppOverviewTaskInfoDto.java
  4. 78 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/mapper/AppCockpitMapper.java
  5. 9 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/AppCockpitService.java
  6. 168 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/service/impl/AppCockpitServiceImpl.java
  7. 17 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppBaseInfoSecurityFacilitiesVo.java
  8. 23 7
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppBaseInfoVo.java
  9. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppGa38RateVo.java
  10. 23 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppOverviewItemVo.java
  11. 35 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppOverviewVo.java
  12. 19 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticInOutVo.java
  13. 17 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticOtherVo.java
  14. 21 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticQuestionVo.java
  15. 18 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticResumptionVo.java
  16. 20 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticSafetycheckTaskVo.java
  17. 18 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticSafetycheckVo.java
  18. 19 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/board/vo/app/AppSyntheticTaskInfoVo.java
  19. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java
  20. 107 0
      soc-modules/soc-modules-core/src/main/resources/mapper/board/AppCockpitMapper.xml

+ 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;
+}

+ 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>