Procházet zdrojové kódy

pms 首页 日报完成率

zhangcl před 1 dnem
rodič
revize
7573653618

+ 100 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrhdailyreport/IotRhDailyReportController.java

@@ -8,18 +8,25 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
 import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportStatisticsVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
 import cn.iocoder.yudao.module.pms.service.iotprojectinfo.IotProjectInfoService;
 import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
+import cn.iocoder.yudao.module.pms.service.iotrddailyreport.IotRdDailyReportService;
 import cn.iocoder.yudao.module.pms.service.iotrhdailyreport.IotRhDailyReportService;
+import cn.iocoder.yudao.module.pms.service.iotrydailyreport.IotRyDailyReportService;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
@@ -36,6 +43,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -60,6 +68,10 @@ public class IotRhDailyReportController {
     @Resource
     private IotProjectTaskService iotProjectTaskService;
     @Resource
+    private IotRdDailyReportService iotRdDailyReportService;
+    @Resource
+    private IotRyDailyReportService iotRyDailyReportService;
+    @Resource
     private DictDataService dictDataService;
 
     @PostMapping("/create")
@@ -132,6 +144,94 @@ public class IotRhDailyReportController {
         return success(new PageResult<>(buildRhDailyReports(pageResult.getList()), pageResult.getTotal()));
     }
 
+    @GetMapping("/completeRate")
+    @Operation(summary = "查询各专业公司日报完成率")
+    @DataPermission(enable = false)
+    public CommonResult<List<Map<String, Object>>> completeRate(@Valid IotRhDailyReportPageReqVO pageReqVO) {
+        List<Map<String, Object>> result = new ArrayList<>();
+        DataPermissionUtils.executeIgnore(() -> {
+            // 查询3家专业公司的日报完成率
+            // 瑞都日报完成率
+            Map<String, Object> rdRate = new HashMap<>();
+            rdRate.put("department", "四川瑞都");
+            IotRdDailyReportPageReqVO rdReqVO = new IotRdDailyReportPageReqVO();
+            rdReqVO.setCreateTime(pageReqVO.getCreateTime());
+            List<IotRdDailyReportDO> rdReports = iotRdDailyReportService.dailyReports(rdReqVO);
+            // 瑞都日报总数
+            Integer rdTotalReportCount = 0;
+            // 瑞都已填报完成日报总数
+            Integer rdFilledReportCount = 0;
+            if (CollUtil.isNotEmpty(rdReports)) {
+                for (IotRdDailyReportDO report : rdReports) {
+                    if (1 == report.getPlatformWell() || 0 == report.getPlatformWell()) {
+                        rdTotalReportCount++;
+                        if (1 == report.getStatus()) {
+                            // 已经填报完成的日报
+                            rdFilledReportCount++;
+                        }
+                    }
+                }
+                // 计算瑞都日报填报率
+                if (rdTotalReportCount != 0) {
+                    BigDecimal filled = BigDecimal.valueOf(rdFilledReportCount);
+                    BigDecimal total = BigDecimal.valueOf(rdTotalReportCount);
+                    BigDecimal rate = filled.divide(total, 2, RoundingMode.HALF_UP);
+                    rdRate.put("rate", rate);
+                }
+            }
+            result.add(rdRate);
+            // 计算瑞恒日报填报完成率
+            Map<String, Object> rhRate = new HashMap<>();
+            rhRate.put("department", "瑞恒兴域");
+            long totalRhCount = 0;
+            long completeRhCount = 0;
+            List<IotRhDailyReportStatisticsVO> rhReports = iotRhDailyReportService.rhDailyReportStatistics(pageReqVO);
+            if (CollUtil.isNotEmpty(rhReports)) {
+                for (IotRhDailyReportStatisticsVO rhReport : rhReports) {
+                    if ("总数".equals(rhReport.getGroupName())) {
+                        totalRhCount = rhReport.getCount();
+                    }
+                    if ("已填报".equals(rhReport.getGroupName())) {
+                        completeRhCount = rhReport.getCount();
+                    }
+                }
+                if (totalRhCount != 0l) {
+                    BigDecimal filled = BigDecimal.valueOf(completeRhCount);
+                    BigDecimal total = BigDecimal.valueOf(totalRhCount);
+                    BigDecimal rate = filled.divide(total, 2, RoundingMode.HALF_UP);
+                    rhRate.put("瑞恒兴域", rate);
+                }
+            }
+            result.add(rhRate);
+            // 计算瑞鹰日报填报完成率
+            Map<String, Object> ryRate = new HashMap<>();
+            ryRate.put("department", "瑞鹰国际");
+            long totalRyCount = 0;
+            long completeRyCount = 0;
+            IotRyDailyReportPageReqVO ryReqVO = new IotRyDailyReportPageReqVO();
+            ryReqVO.setCreateTime(pageReqVO.getCreateTime());
+            List<IotRyDailyReportStatisticsVO> ryReports = iotRyDailyReportService.ryDailyReportStatistics(ryReqVO);
+            if (CollUtil.isNotEmpty(ryReports)) {
+                for (IotRyDailyReportStatisticsVO ryReport : ryReports) {
+                    if ("总数".equals(ryReport.getGroupName())) {
+                        totalRyCount = ryReport.getCount();
+                    }
+                    if ("已填报".equals(ryReport.getGroupName())) {
+                        completeRyCount = ryReport.getCount();
+                    }
+                }
+                if (totalRhCount != 0l) {
+                    BigDecimal filled = BigDecimal.valueOf(completeRyCount);
+                    BigDecimal total = BigDecimal.valueOf(totalRyCount);
+                    BigDecimal rate = filled.divide(total, 2, RoundingMode.HALF_UP);
+                    ryRate.put("rate", rate);
+                }
+            }
+            result.add(ryRate);
+        });
+        return success(result);
+    }
+
     @GetMapping("/statistics")
     @Operation(summary = "获得瑞恒日报汇总统计")
     @PreAuthorize("@ss.hasPermission('pms:iot-rh-daily-report:query')")

+ 20 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/vo/IotRyDailyReportStatisticsVO.java

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 瑞鹰日报统计 已填报 未填报 Request VO")
+@Data
+public class IotRyDailyReportStatisticsVO {
+    @Schema(description = "名称 已填报 未填报")
+    private String groupName;
+
+    @Schema(description = "已填报 未填报 小队 数量")
+    private long count;
+
+    @Schema(description = "队伍名称")
+    private String deptNames;
+
+    @Schema(description = "日期 2025-01-01")
+    private String reportDate;
+}

+ 3 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java

@@ -649,8 +649,8 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             // 过滤掉部门中的 ‘项目部’
             if (CollUtil.isNotEmpty(allDepts)) {
                 allDepts.forEach((deptId, dept) -> {
-                    if (!dept.getName().contains("项目部") && !dept.getName().contains("瑞恒兴域")
-                            && !dept.getName().contains("基地") && !dept.getName().contains("服务部")) {
+                    // 将不属于 队伍 的组织部门过滤掉
+                    if ("3".equals(dept.getType())) {
                         filteredDepts.put(deptId, dept);
                     }
                 });
@@ -742,8 +742,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             // 过滤掉部门中的 ‘项目部’
             if (CollUtil.isNotEmpty(allDepts)) {
                 allDepts.forEach((deptId, dept) -> {
-                    if (!dept.getName().contains("项目部") && !dept.getName().contains("瑞恒兴域")
-                            && !dept.getName().contains("基地") && !dept.getName().contains("服务部")) {
+                    if ("3".equals(dept.getType())) {
                         filteredDepts.put(deptId, dept);
                     }
                 });

+ 9 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrydailyreport/IotRyDailyReportService.java

@@ -1,10 +1,7 @@
 package cn.iocoder.yudao.module.pms.service.iotrydailyreport;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportStatisticsRespVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportTaskCountVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.*;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrydailyreport.IotRyDailyReportDO;
 
 import javax.validation.Valid;
@@ -121,4 +118,12 @@ public interface IotRyDailyReportService {
      * @return 瑞恒日报汇总统计
      */
     List<IotRyDailyReportStatisticsRespVO> statistics(IotRyDailyReportPageReqVO pageReqVO);
+
+    /**
+     * 按照日期查询瑞恒日报统计数据 已填报 未填报 数量
+     *
+     * @param pageReqVO 查询参数
+     * @return 统计数据
+     */
+    List<IotRyDailyReportStatisticsVO> ryDailyReportStatistics(IotRyDailyReportPageReqVO pageReqVO);
 }

+ 81 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrydailyreport/IotRyDailyReportServiceImpl.java

@@ -8,10 +8,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicecategorytemplateattrs.vo.IotDeviceProperty;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportStatisticsRespVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.IotRyDailyReportTaskCountVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrydailyreport.vo.*;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
@@ -34,7 +31,9 @@ import javax.annotation.Resource;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -351,6 +350,84 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
         return result;
     }
 
+    @Override
+    public List<IotRyDailyReportStatisticsVO> ryDailyReportStatistics(IotRyDailyReportPageReqVO pageReqVO) {
+        if (pageReqVO.getCreateTime().length == 0) {
+            // 必须传递时间区间参数
+            throw exception(IOT_DAILY_REPORT_TIME_NOT_EXISTS);
+        }
+        List<IotRyDailyReportStatisticsVO> results = new ArrayList<>();
+        // 查询 瑞鹰158l 所有存在设备的队伍
+        // 查询瑞鹰下所有部门
+        List<IotDeviceDO> devices = devices();
+        // 所有需要填报日报的 瑞鹰 队伍集合
+        Set<Long> deptIds = new HashSet<>();
+        if (CollUtil.isNotEmpty(devices)){
+            devices.forEach(device -> {
+                deptIds.add(device.getDeptId());
+            });
+            // 根据部门id集合查询所有部门信息
+            // 查询所有部门信息
+            Map<Long, DeptDO> allDepts = deptService.getDeptMap(deptIds);
+            // 过滤后的所有部门信息
+            Map<Long, DeptDO> filteredDepts = new HashMap<>();
+            // 过滤掉部门中的 ‘项目部’...
+            if (CollUtil.isNotEmpty(allDepts)) {
+                allDepts.forEach((deptId, dept) -> {
+                    // 将不属于 队伍 的组织部门过滤掉
+                    if ("3".equals(dept.getType())) {
+                        filteredDepts.put(deptId, dept);
+                    }
+                });
+            }
+
+            // 比如有20个队伍 某个时间区间D内 必须有20*D份日报 时间区间最好是1天
+            // 查询出指定时间区间内 已经填写的日报数量
+            List<IotRyDailyReportDO> dailyReports = iotRyDailyReportMapper.dailyReports(pageReqVO);
+            // 根据指定的时间区间 计算出天数
+            LocalDateTime[] createTimes = pageReqVO.getCreateTime();
+            // 获取开始时间和结束时间
+            LocalDateTime startTime = createTimes[0];
+            LocalDateTime endTime = createTimes[1];
+            // 截断到日期(忽略时分秒)
+            LocalDate startDate = startTime.toLocalDate();
+            LocalDate endDate = endTime.toLocalDate();
+            // 计算天数:日期差 + 1(包含首尾两天)
+            long days = ChronoUnit.DAYS.between(startDate, endDate) + 1;
+            // 计算指定时间区间内所有日报数量总数
+            long totalRequiredReports = (long) filteredDepts.size() * days;
+            // 获取【实际已报的日报数量】
+            long totalReportedReports = CollUtil.isNotEmpty(dailyReports) ? dailyReports.size() : 0l;
+            // 计算指定时间区间内未填报的日报数量
+            long notReportedCount = totalRequiredReports - totalReportedReports;
+            IotRyDailyReportStatisticsVO allReports = new IotRyDailyReportStatisticsVO();
+            allReports.setGroupName("总数");
+            allReports.setCount(totalRequiredReports);
+            IotRyDailyReportStatisticsVO haveReported = new IotRyDailyReportStatisticsVO();
+            haveReported.setGroupName("已填报");
+            haveReported.setCount(totalReportedReports);
+            IotRyDailyReportStatisticsVO notReported = new IotRyDailyReportStatisticsVO();
+            notReported.setGroupName("未填报");
+            notReported.setCount(notReportedCount);
+            results.add(allReports);
+            results.add(haveReported);
+            results.add(notReported);
+        }
+        return results;
+    }
+
+    private List<IotDeviceDO> devices() {
+        // 查询 瑞鹰158l 所有存在设备的队伍
+        // 查询 瑞鹰 下所有部门
+        Set<Long> ids = new HashSet<>();
+        ids = deptService.getChildDeptIdListFromCache(157l);
+        ids.add(158l);
+        // 查询ids下包含的所有设备 设备对应的部门就是 小队全集
+        IotDevicePageReqVO deviceReqVO = new IotDevicePageReqVO();
+        List<IotDeviceDO> devices = iotDeviceMapper.selectSimpleList(deviceReqVO, ids);
+        return devices;
+    }
+
     /**
      * 按项目部维度统计数据
      * @param pageReqVO 日报查询对象