浏览代码

fix:sop监控统计

caozixuan 1 年之前
父节点
当前提交
bc30a58e00
共有 15 个文件被更改,包括 495 次插入19 次删除
  1. 1 3
      sop-api/src/main/java/com/qmth/sop/server/api/SopAnalyseController.java
  2. 1 1
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/RegionPersonnel.java
  3. 1 1
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/ServiceUnitOverview.java
  4. 1 1
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/ServiceUnitPersonnel.java
  5. 1 1
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/SupplierPersonnel.java
  6. 142 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/sopWarn/SopMonitor.java
  7. 21 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/sopWarn/SopMonitorEnum.java
  8. 133 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/sopWarn/SopWarnOverview.java
  9. 12 3
      sop-business/src/main/java/com/qmth/sop/business/mapper/SopAnalyseMapper.java
  10. 2 2
      sop-business/src/main/java/com/qmth/sop/business/service/ServiceAnalyseService.java
  11. 5 1
      sop-business/src/main/java/com/qmth/sop/business/service/SopAnalyseService.java
  12. 4 4
      sop-business/src/main/java/com/qmth/sop/business/service/impl/ServiceAnalyseServiceImpl.java
  13. 112 1
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SopAnalyseServiceImpl.java
  14. 56 0
      sop-business/src/main/resources/mapper/SopAnalyseMapper.xml
  15. 3 1
      sop-common/src/main/java/com/qmth/sop/common/util/DateDisposeUtils.java

+ 1 - 3
sop-api/src/main/java/com/qmth/sop/server/api/SopAnalyseController.java

@@ -1,6 +1,5 @@
 package com.qmth.sop.server.api;
 
-import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.service.SopAnalyseService;
@@ -62,8 +61,7 @@ public class SopAnalyseController {
     @ApiResponses({@ApiResponse(code = 200, message = "总体概况", response = Map.class)})
     public Result overview(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceId,
                            @ApiParam(value = "分组", required = true) @RequestParam SopAnalyseGroupEnum group) {
-        List<Map<String, Object>> list = sopAnalyseService.overview(serviceId, group);
-        return ResultUtil.ok(list);
+        return ResultUtil.ok(sopAnalyseService.overview(serviceId, group));
     }
 
 

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/RegionPersonnel.java → sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/RegionPersonnel.java

@@ -1,4 +1,4 @@
-package com.qmth.sop.business.bean.result.analyze;
+package com.qmth.sop.business.bean.result.analyze.serviceUnit;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/ServiceUnitOverview.java → sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/ServiceUnitOverview.java

@@ -1,4 +1,4 @@
-package com.qmth.sop.business.bean.result.analyze;
+package com.qmth.sop.business.bean.result.analyze.serviceUnit;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/ServiceUnitPersonnel.java → sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/ServiceUnitPersonnel.java

@@ -1,4 +1,4 @@
-package com.qmth.sop.business.bean.result.analyze;
+package com.qmth.sop.business.bean.result.analyze.serviceUnit;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/SupplierPersonnel.java → sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/serviceUnit/SupplierPersonnel.java

@@ -1,4 +1,4 @@
-package com.qmth.sop.business.bean.result.analyze;
+package com.qmth.sop.business.bean.result.analyze.serviceUnit;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 142 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/sopWarn/SopMonitor.java

@@ -0,0 +1,142 @@
+package com.qmth.sop.business.bean.result.analyze.sopWarn;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: sop监控集合
+ * @Author: CaoZixuan
+ * @Date: 2023-11-22
+ */
+public class SopMonitor {
+    @ApiModelProperty("sop监控类型(延期预警 - 违规登记)")
+    private SopMonitorEnum sopMonitorType;
+
+    @ApiModelProperty("派单号")
+    private String crmNo;
+
+    @ApiModelProperty("sop号")
+    private String sopNo;
+
+    @ApiModelProperty("服务单元id")
+    private Long serviceId;
+
+    @ApiModelProperty("责任人id")
+    private Long userId;
+
+    @ApiModelProperty("完成状态")
+    private Boolean finishStatus;
+
+    @ApiModelProperty("开始时间")
+    private Long startTime;
+
+    @ApiModelProperty("关闭时间")
+    private Long closeTime;
+
+    @ApiModelProperty("派单所属大区id")
+    private Long regionId;
+
+    @ApiModelProperty("派单所属大区名称")
+    private String regionName;
+
+    @ApiModelProperty("责任人所属供应商id")
+    private Long supplierId;
+
+    @ApiModelProperty("责任人所属供应商名称")
+    private String supplierName;
+
+    public SopMonitorEnum getSopMonitorType() {
+        return sopMonitorType;
+    }
+
+    public void setSopMonitorType(SopMonitorEnum sopMonitorType) {
+        this.sopMonitorType = sopMonitorType;
+    }
+
+    public String getCrmNo() {
+        return crmNo;
+    }
+
+    public void setCrmNo(String crmNo) {
+        this.crmNo = crmNo;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public Long getServiceId() {
+        return serviceId;
+    }
+
+    public void setServiceId(Long serviceId) {
+        this.serviceId = serviceId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Boolean getFinishStatus() {
+        return finishStatus;
+    }
+
+    public void setFinishStatus(Boolean finishStatus) {
+        this.finishStatus = finishStatus;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getCloseTime() {
+        return closeTime;
+    }
+
+    public void setCloseTime(Long closeTime) {
+        this.closeTime = closeTime;
+    }
+
+    public Long getRegionId() {
+        return regionId;
+    }
+
+    public void setRegionId(Long regionId) {
+        this.regionId = regionId;
+    }
+
+    public String getRegionName() {
+        return regionName;
+    }
+
+    public void setRegionName(String regionName) {
+        this.regionName = regionName;
+    }
+
+    public Long getSupplierId() {
+        return supplierId;
+    }
+
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+}

+ 21 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/sopWarn/SopMonitorEnum.java

@@ -0,0 +1,21 @@
+package com.qmth.sop.business.bean.result.analyze.sopWarn;
+
+/**
+ * @Description: sop监控类型
+ * @Author: CaoZixuan
+ * @Date: 2023-11-22
+ */
+public enum SopMonitorEnum {
+    DELAY_WARN("延期预警"),
+    VIOLATION("违规登记");
+
+    private final String title;
+
+    SopMonitorEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+}

+ 133 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/sopWarn/SopWarnOverview.java

@@ -0,0 +1,133 @@
+package com.qmth.sop.business.bean.result.analyze.sopWarn;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @Description: sop预警监控概况
+ * @Author: CaoZixuan
+ * @Date: 2023-11-12
+ */
+public class SopWarnOverview {
+    @ApiModelProperty("派单数")
+    private Integer crmNum;
+
+    @ApiModelProperty("已完成派单数")
+    private Integer finishCrmNum;
+
+    @ApiModelProperty("平均处理时限(小时)")
+    private BigDecimal avgMinutes;
+
+    @ApiModelProperty("违规数")
+    private Integer violationNum;
+
+    @ApiModelProperty("完成违规数")
+    private Integer finishViolationNum;
+
+    @ApiModelProperty("预警数")
+    private Integer delayNum;
+
+    @ApiModelProperty("完成预警数")
+    private Integer finishDelayNum;
+
+    @ApiModelProperty("大区id")
+    private Long regionId;
+
+    @ApiModelProperty("大区名称")
+    private String regionName;
+
+    @ApiModelProperty("供应商id")
+    private Long supplierId;
+
+    @ApiModelProperty("供应商名称")
+    private String supplierName;
+
+    public Integer getCrmNum() {
+        return crmNum;
+    }
+
+    public void setCrmNum(Integer crmNum) {
+        this.crmNum = crmNum;
+    }
+
+    public Integer getFinishCrmNum() {
+        return finishCrmNum;
+    }
+
+    public void setFinishCrmNum(Integer finishCrmNum) {
+        this.finishCrmNum = finishCrmNum;
+    }
+
+    public BigDecimal getAvgMinutes() {
+        return avgMinutes;
+    }
+
+    public void setAvgMinutes(BigDecimal avgMinutes) {
+        this.avgMinutes = avgMinutes;
+    }
+
+    public Integer getViolationNum() {
+        return violationNum;
+    }
+
+    public void setViolationNum(Integer violationNum) {
+        this.violationNum = violationNum;
+    }
+
+    public Integer getFinishViolationNum() {
+        return finishViolationNum;
+    }
+
+    public void setFinishViolationNum(Integer finishViolationNum) {
+        this.finishViolationNum = finishViolationNum;
+    }
+
+    public Integer getDelayNum() {
+        return delayNum;
+    }
+
+    public void setDelayNum(Integer delayNum) {
+        this.delayNum = delayNum;
+    }
+
+    public Integer getFinishDelayNum() {
+        return finishDelayNum;
+    }
+
+    public void setFinishDelayNum(Integer finishDelayNum) {
+        this.finishDelayNum = finishDelayNum;
+    }
+
+    public Long getRegionId() {
+        return regionId;
+    }
+
+    public void setRegionId(Long regionId) {
+        this.regionId = regionId;
+    }
+
+    public String getRegionName() {
+        return regionName;
+    }
+
+    public void setRegionName(String regionName) {
+        this.regionName = regionName;
+    }
+
+    public Long getSupplierId() {
+        return supplierId;
+    }
+
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+}

+ 12 - 3
sop-business/src/main/java/com/qmth/sop/business/mapper/SopAnalyseMapper.java

@@ -2,6 +2,7 @@ package com.qmth.sop.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.sop.business.bean.dto.DataPermissionDto;
+import com.qmth.sop.business.bean.result.analyze.sopWarn.SopMonitor;
 import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.entity.TBSopInfo;
 import org.apache.ibatis.annotations.Param;
@@ -19,11 +20,19 @@ import java.util.Map;
 public interface SopAnalyseMapper extends BaseMapper<TBSopInfo> {
 
 
-    List<TBService> list(@Param("startTime") Long startTime, @Param("endTime") Long endTime,@Param("dpr")  DataPermissionDto dpr);
+    List<TBService> list(@Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("dpr") DataPermissionDto dpr);
 
     List<Map<String, Object>> overview(@Param("serviceId") Long serviceId);
 
-    List<Map<String, Object>> trend(@Param("serviceId")Long serviceId);
+    List<Map<String, Object>> trend(@Param("serviceId") Long serviceId);
 
-    List<Map<String, Object>> attendance(@Param("serviceId")Long serviceId);
+    List<Map<String, Object>> attendance(@Param("serviceId") Long serviceId);
+
+    /**
+     * 根据服务单元id查询sop监控数据集
+     *
+     * @param serviceId 服务单元id
+     * @return 监控数据集
+     */
+    List<SopMonitor> findSopMonitorListByServiceId(@Param("serviceId") Long serviceId);
 }

+ 2 - 2
sop-business/src/main/java/com/qmth/sop/business/service/ServiceAnalyseService.java

@@ -6,8 +6,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.sop.business.bean.result.TBCrmResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
-import com.qmth.sop.business.bean.result.analyze.ServiceUnitOverview;
-import com.qmth.sop.business.bean.result.analyze.ServiceUnitPersonnel;
+import com.qmth.sop.business.bean.result.analyze.serviceUnit.ServiceUnitOverview;
+import com.qmth.sop.business.bean.result.analyze.serviceUnit.ServiceUnitPersonnel;
 import com.qmth.sop.business.entity.TBService;
 
 import java.util.List;

+ 5 - 1
sop-business/src/main/java/com/qmth/sop/business/service/SopAnalyseService.java

@@ -1,6 +1,7 @@
 package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.result.analyze.sopWarn.SopWarnOverview;
 import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.entity.TBSopInfo;
 import com.qmth.sop.common.enums.SopAnalyseGroupEnum;
@@ -12,7 +13,10 @@ import java.util.Map;
 public interface SopAnalyseService extends IService<TBSopInfo> {
     List<TBService> list(Long startTime,Long endTime);
 
-    List<Map<String, Object>> overview(Long serviceId, SopAnalyseGroupEnum group);
+    @Deprecated
+    List<Map<String, Object>> overview1(Long serviceId, SopAnalyseGroupEnum group);
+
+    List<SopWarnOverview> overview(Long serviceId,SopAnalyseGroupEnum group);
 
     List<Map<String, Object>> processing(Long serviceId, SopAnalyseGroupEnum group, SopAnalyseSortEnum sort);
 

+ 4 - 4
sop-business/src/main/java/com/qmth/sop/business/service/impl/ServiceAnalyseServiceImpl.java

@@ -9,10 +9,10 @@ import com.qmth.sop.business.bean.result.CrmArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.TBCrmResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
-import com.qmth.sop.business.bean.result.analyze.RegionPersonnel;
-import com.qmth.sop.business.bean.result.analyze.ServiceUnitOverview;
-import com.qmth.sop.business.bean.result.analyze.ServiceUnitPersonnel;
-import com.qmth.sop.business.bean.result.analyze.SupplierPersonnel;
+import com.qmth.sop.business.bean.result.analyze.serviceUnit.RegionPersonnel;
+import com.qmth.sop.business.bean.result.analyze.serviceUnit.ServiceUnitOverview;
+import com.qmth.sop.business.bean.result.analyze.serviceUnit.ServiceUnitPersonnel;
+import com.qmth.sop.business.bean.result.analyze.serviceUnit.SupplierPersonnel;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.mapper.ServiceAnalyseMapper;
 import com.qmth.sop.business.service.*;

+ 112 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/SopAnalyseServiceImpl.java

@@ -1,7 +1,12 @@
 package com.qmth.sop.business.service.impl;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.sop.business.bean.dto.DataPermissionDto;
+import com.qmth.sop.business.bean.result.analyze.sopWarn.SopMonitor;
+import com.qmth.sop.business.bean.result.analyze.sopWarn.SopMonitorEnum;
+import com.qmth.sop.business.bean.result.analyze.sopWarn.SopWarnOverview;
 import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.entity.TBSopInfo;
@@ -11,9 +16,12 @@ import com.qmth.sop.business.service.SysUserService;
 import com.qmth.sop.common.enums.SopAnalyseGroupEnum;
 import com.qmth.sop.common.enums.SopAnalyseSortEnum;
 import com.qmth.sop.common.util.ServletUtil;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -36,8 +44,9 @@ public class SopAnalyseServiceImpl extends ServiceImpl<SopAnalyseMapper, TBSopIn
      * * ③完成进度:该大区/供应商派单的完成进度,按照派单已有完成SOP,且没有在执行的SOP认为是已完成的派单;
      * * ④平均处理时限:该大区/供应商预警处理的平均时限。按照预警产生到关闭的时长的均值,≥1小时,按小时显示;<小时,按分钟显示;
      */
+    @Deprecated
     @Override
-    public List<Map<String, Object>> overview(Long serviceId, SopAnalyseGroupEnum group) {
+    public List<Map<String, Object>> overview1(Long serviceId, SopAnalyseGroupEnum group) {
         List<Map<String, Object>> list = this.baseMapper.overview(serviceId);
         List<Map<String, Object>> result = new ArrayList<>();
         if (group.equals(SopAnalyseGroupEnum.REGION)) {
@@ -58,6 +67,108 @@ public class SopAnalyseServiceImpl extends ServiceImpl<SopAnalyseMapper, TBSopIn
         return result.stream().sorted(Comparator.comparingInt(o -> Integer.parseInt(o.get("crmNum").toString()))).limit(3).collect(Collectors.toList());
     }
 
+    /**
+     * * ①可按照大区/人力供应商进行切换如图;
+     * * ②按照派单数TOP3的大区、人力供应商显示;
+     * * ③完成进度:该大区/供应商派单的完成进度,按照派单已有完成SOP,且没有在执行的SOP认为是已完成的派单;
+     * * ④平均处理时限:该大区/供应商预警处理的平均时限。按照预警产生到关闭的时长的均值,≥1小时,按小时显示;<小时,按分钟显示;
+     */
+    @Override
+    public List<SopWarnOverview> overview(Long serviceId, SopAnalyseGroupEnum group) {
+        List<SopMonitor> sopMonitorList = this.baseMapper.findSopMonitorListByServiceId(serviceId);
+        List<SopWarnOverview> result = new ArrayList<>();
+        switch (group) {
+            case REGION:
+                Set<Long> regionIdSet = sopMonitorList.stream().filter(e -> e.getRegionId() != null && e.getRegionId() > 0).map(SopMonitor::getRegionId).collect(Collectors.toSet());
+                for (Long regionId : regionIdSet) {
+                    List<SopMonitor> dataCell = sopMonitorList.stream().filter(e -> regionId.equals(e.getRegionId())).collect(Collectors.toList());
+                    String regionName = dataCell.get(0).getRegionName();
+                    SopWarnOverview regionOverview = buildSopOverviewStatistic(dataCell);
+                    regionOverview.setRegionId(regionId);
+                    regionOverview.setRegionName(regionName);
+                    result.add(regionOverview);
+                }
+                break;
+            case SUPPLIER:
+                Set<Long> supplierIdSet = sopMonitorList.stream().map(SopMonitor::getSupplierId).collect(Collectors.toSet());
+                for (Long supplierId : supplierIdSet) {
+                    List<SopMonitor> dataCell = sopMonitorList.stream().filter(e -> supplierId.equals(e.getSupplierId())).collect(Collectors.toList());
+                    SopWarnOverview supplierOverview = buildSopOverviewStatistic(dataCell);
+                    supplierOverview.setSupplierName(dataCell.get(0).getSupplierName());
+                    supplierOverview.setSupplierId(supplierId);
+                    result.add(supplierOverview);
+                }
+                break;
+        }
+        return result;
+    }
+
+    /**
+     * 创建sop监控统计
+     * @param dataCell 数据集
+     * @return sop监控
+     */
+    private SopWarnOverview buildSopOverviewStatistic(List<SopMonitor> dataCell) {
+        SopWarnOverview sopWarnOverview = new SopWarnOverview();
+        if (CollectionUtils.isNotEmpty(dataCell)) {
+            int crmNum = (int) dataCell.stream().map(SopMonitor::getCrmNo).distinct().count();
+            int finishCrmNum = (int) (crmNum - dataCell.stream().filter(e -> !e.getFinishStatus()).map(SopMonitor::getCrmNo).distinct().count());
+            int effectAvgTimeCount = 0;
+            long effectTotalMinutes = 0L;
+            int violationNum = 0;
+            int finishViolationNum = 0;
+            int delayNum = 0;
+            int finishDelayNum = 0;
+
+            for (SopMonitor sopMonitor : dataCell) {
+                SopMonitorEnum sopMonitorType = sopMonitor.getSopMonitorType();
+                switch (sopMonitorType) {
+                    case DELAY_WARN:
+                        delayNum++;
+                        break;
+                    case VIOLATION:
+                        violationNum++;
+                        break;
+                }
+
+
+                Boolean finishStatus = sopMonitor.getFinishStatus();
+                if (finishStatus) {
+                    Long startTime = sopMonitor.getStartTime();
+                    Long closeTime = sopMonitor.getCloseTime();
+                    if (startTime != null && startTime > 0 && closeTime != null && closeTime > 0) {
+                        effectAvgTimeCount++;
+                        long cellMinutes = DateUtil.between(new Date(startTime), new Date(closeTime), DateUnit.MINUTE);
+                        effectTotalMinutes = effectTotalMinutes + cellMinutes;
+                    }
+
+                    switch (sopMonitorType) {
+                        case DELAY_WARN:
+                            finishDelayNum++;
+                            break;
+                        case VIOLATION:
+                            finishViolationNum++;
+                            break;
+                    }
+                }
+            }
+
+            sopWarnOverview.setCrmNum(crmNum);
+            sopWarnOverview.setFinishCrmNum(finishCrmNum);
+            BigDecimal avgMinutes = new BigDecimal(0);
+            if (effectAvgTimeCount > 0) {
+                avgMinutes = new BigDecimal(effectTotalMinutes).divide(new BigDecimal(effectAvgTimeCount), 2, RoundingMode.HALF_UP);
+            }
+            sopWarnOverview.setAvgMinutes(avgMinutes);
+            sopWarnOverview.setViolationNum(violationNum);
+            sopWarnOverview.setFinishViolationNum(finishViolationNum);
+            sopWarnOverview.setDelayNum(delayNum);
+            sopWarnOverview.setFinishDelayNum(finishDelayNum);
+        }
+        return sopWarnOverview;
+    }
+
+
     private static void processOverviewData(List<Map<String, Object>> v, Map<String, Object> map) {
         //派单数
         map.put("crmNum", v.stream().collect(Collectors.groupingBy(map1 -> map1.get("crm_no"))).size());

+ 56 - 0
sop-business/src/main/resources/mapper/SopAnalyseMapper.xml

@@ -144,4 +144,60 @@
 
         </where>
     </select>
+    <select id="findSopMonitorListByServiceId"
+            resultType="com.qmth.sop.business.bean.result.analyze.sopWarn.SopMonitor">
+        SELECT
+            sopMonitor.sop_monitor_type AS sopMonitorType,
+            sopMonitor.crm_no AS crmNo,
+            sopMonitor.sop_no AS sopNo,
+            sopMonitor.service_id AS serviceId,
+            sopMonitor.user_id AS userId,
+            sopMonitor.finish_status AS finishStatus,
+            sopMonitor.start_time AS startTime,
+            sopMonitor.close_time AS closeTime,
+            tbc.region_id AS regionId,
+            tbsr.region_name AS regionName,
+            IFNULL(ss.id,0) AS supplierId,
+            IFNULL(ss.name,'大区经理兼任') AS supplierName
+        FROM
+            (SELECT
+                 'DELAY_WARN' AS sop_monitor_type,
+                 crm_no,
+                 sop_no,
+                 service_id,
+                 create_id AS user_id,
+                 IF(status = 'CLOSE', TRUE, FALSE) AS finish_status,
+                 warn_time AS start_time,
+                 close_time AS close_time
+             FROM
+                 t_b_delay_warn
+             UNION ALL SELECT
+                 'VIOLATION' AS sop_monitor_type,
+                 crm_no,
+                 sop_no,
+                 service_id,
+                 create_id AS user_id,
+                 IF(status = 'CLOSE', TRUE, FALSE) AS finish_status,
+                 create_time AS start_time,
+                 close_time AS close_time
+             FROM
+                 t_b_violation) sopMonitor
+                LEFT JOIN
+            t_b_crm tbc ON tbc.crm_no = sopMonitor.crm_no
+                LEFT JOIN
+            t_b_service_region tbsr ON tbc.region_id = tbsr.id
+                LEFT JOIN
+            sys_user su ON sopMonitor.user_id = su.id
+                LEFT JOIN
+            t_b_user_archives tbua ON tbua.mobile_number = su.mobile_number
+                LEFT JOIN
+            t_b_user_archives_supplier tbuas ON tbua.id = tbuas.user_archives_id
+                LEFT JOIN
+            sys_supplier ss ON tbuas.supplier_id = ss.id
+        <where>
+            <if test="serviceId != null">
+                AND sopMonitor.service_id = #{serviceId}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 3 - 1
sop-common/src/main/java/com/qmth/sop/common/util/DateDisposeUtils.java

@@ -1,6 +1,7 @@
 package com.qmth.sop.common.util;
 
-import com.qmth.sop.common.contant.SystemConstant;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.commons.lang3.time.DateUtils;
 
@@ -208,5 +209,6 @@ public class DateDisposeUtils extends DateUtils {
         String signYear = calendar.get(Calendar.YEAR) + "年";
         String signDay = calendar.get(Calendar.MONTH) + 1 + "月" + calendar.get(Calendar.DATE) + "日";
         System.out.println(signYear + signDay);
+        System.out.println(DateUtil.between(new Date(1700706600000L),new Date(1700712000000L), DateUnit.MINUTE));
     }
 }