项目管理分析,整体效能分析

This commit is contained in:
马三炮 2025-10-17 14:38:57 +08:00
parent 3b49dc5651
commit 5c5f9dee1c
14 changed files with 1312 additions and 1 deletions

View File

@ -0,0 +1,668 @@
package com.securitycontrol.screen;
import org.apache.commons.lang3.ObjectUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
* 日期工具类提供常见的日期处理方法
* 作者: bonus
*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
// 常见日期格式
public static final String YYYY = "yyyy";
public static final String YYYY_MM = "yyyy-MM";
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
private static final String[] PARSE_PATTERNS = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 获取当前 Date 型日期
*
* @return 当前日期
*/
public static Date getNowDate() {
return new Date();
}
/**
* 获取当前日期格式为 yyyy-MM-dd
*
* @return 当前日期的字符串
*/
public static String getDate() {
return dateTimeNow(YYYY_MM_DD);
}
/**
* 获取当前时间格式为 yyyy-MM-dd HH:mm:ss
*
* @return 当前时间的字符串
*/
public static String getTime() {
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
/**
* 获取当前年份
*
* @return 当前年份的字符串
*/
public static String getCurrentYear() {
return String.valueOf(LocalDate.now().getYear());
}
/**
* 获取当前月份
*
* @return 当前月份的字符串
*/
public static String getCurrentMonth() {
return String.format("%02d", LocalDate.now().getMonthValue());
}
/**
* 获取当前日期中的日
*
* @return 当前日的字符串
*/
public static String getCurrentDay() {
return String.format("%02d", LocalDate.now().getDayOfMonth());
}
/**
* 获取当前日期时间格式为 yyyyMMddHHmmss
*
* @return 当前日期时间的字符串
*/
public static String dateTimeNow() {
return dateTimeNow(YYYYMMDDHHMMSS);
}
/**
* 根据指定格式获取当前日期时间
*
* @param format 日期格式
* @return 当前日期时间的字符串
*/
public static String dateTimeNow(final String format) {
return parseDateToStr(format, new Date());
}
/**
* Date 类型日期转换为指定格式的字符串
*
* @param format 日期格式
* @param date 日期
* @return 格式化后的日期字符串
*/
public static String parseDateToStr(final String format, final Date date) {
return new SimpleDateFormat(format).format(date);
}
/**
* 将字符串解析为 Date 类型日期
*
* @param format 日期格式
* @param ts 日期字符串
* @return 解析后的日期
*/
public static Date dateTime(final String format, final String ts) {
try {
return new SimpleDateFormat(format).parse(ts);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 计算两个日期之间的时间差返回格式为 X天X小时X分钟
*
* @param endDate 结束日期
* @param startDate 开始日期
* @param separator 自定义拼接符
* @return 时间差字符串
*/
public static String timeDistance(Date endDate, Date startDate, String separator) {
long duration = endDate.getTime() - startDate.getTime();
long days = TimeUnit.MILLISECONDS.toDays(duration);
long hours = TimeUnit.MILLISECONDS.toHours(duration) % 24;
long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) % 60;
if (ObjectUtils.isEmpty(separator)) {
return days + "" + hours + "小时" + minutes + "分钟";
}
return days + separator + hours + separator + minutes;
}
/**
* LocalDateTime 转换为 Date
*
* @param localDateTime LocalDateTime 对象
* @return 转换后的 Date 对象
*/
public static Date toDate(LocalDateTime localDateTime) {
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* LocalDate 转换为 Date
*
* @param localDate LocalDate 对象
* @return 转换后的 Date 对象
*/
public static Date toDate(LocalDate localDate) {
LocalDateTime localDateTime = localDate.atTime(0, 0, 0);
return toDate(localDateTime);
}
/**
* Date 转换为 LocalDateTime
*
* @param date Date 对象
* @return 转换后的 LocalDateTime 对象
*/
public static LocalDateTime toLocalDateTime(Date date) {
Instant instant = date.toInstant();
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
/**
* Date 转换为 LocalDate
*
* @param date Date 对象
* @return 转换后的 LocalDate 对象
*/
public static LocalDate toLocalDate(Date date) {
Instant instant = date.toInstant();
return instant.atZone(ZoneId.systemDefault()).toLocalDate();
}
/**
* Date 转换为 LocalTime
*
* @param date Date 对象
* @return 转换后的 LocalTime 对象
*/
public static LocalTime toLocalTime(Date date) {
Instant instant = date.toInstant();
return instant.atZone(ZoneId.systemDefault()).toLocalTime();
}
/**
* 获取服务器启动时间
*
* @return 服务器启动时间
*/
public static Date getServerStartDate() {
long startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(startTime);
}
/**
* 获取当前日期路径格式为 yyyy/MM/dd
*
* @return 当前日期路径字符串
*/
public static String datePath() {
return parseDateToStr("yyyy/MM/dd", new Date());
}
/**
* 获取当前日期路径格式为 yyyyMMdd
*
* @return 当前日期路径字符串
*/
public static String dateTime() {
return parseDateToStr("yyyyMMdd", new Date());
}
/**
* 获取两个日期之间的天数
*
* @param startDate 开始日期
* @param endDate 结束日期
* @return 两个日期之间的天数
*/
public static long daysBetween(Date startDate, Date endDate) {
long diffInMillis = endDate.getTime() - startDate.getTime();
return TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS);
}
/**
* 获取两个日期之间的小时数
*
* @param startDate 开始日期
* @param endDate 结束日期
* @return 两个日期之间的小时数
*/
public static long hoursBetween(Date startDate, Date endDate) {
long diffInMillis = endDate.getTime() - startDate.getTime();
return TimeUnit.HOURS.convert(diffInMillis, TimeUnit.MILLISECONDS);
}
/**
* 获取两个日期之间的分钟数
*
* @param startDate 开始日期
* @param endDate 结束日期
* @return 两个日期之间的分钟数
*/
public static long minutesBetween(Date startDate, Date endDate) {
long diffInMillis = endDate.getTime() - startDate.getTime();
return TimeUnit.MINUTES.convert(diffInMillis, TimeUnit.MILLISECONDS);
}
/**
* 增加指定天数到日期
*
* @param date 日期
* @param days 天数
* @return 增加天数后的日期
*/
public static Date addDays(Date date, int days) {
LocalDateTime localDateTime = toLocalDateTime(date);
localDateTime = localDateTime.plusDays(days);
return toDate(localDateTime);
}
/**
* 增加指定小时数到日期
*
* @param date 日期
* @param hours 小时数
* @return 增加小时数后的日期
*/
public static Date addHours(Date date, int hours) {
LocalDateTime localDateTime = toLocalDateTime(date);
localDateTime = localDateTime.plusHours(hours);
return toDate(localDateTime);
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str) {
if (str == null) {
return null;
}
try {
return parseDate(str.toString(), PARSE_PATTERNS);
} catch (ParseException e) {
return null;
}
}
/**
* 增加指定分钟数到日期
*
* @param date 日期
* @param minutes 分钟数
* @return 增加分钟数后的日期
*/
public static Date addMinutes(Date date, int minutes) {
LocalDateTime localDateTime = toLocalDateTime(date);
localDateTime = localDateTime.plusMinutes(minutes);
return toDate(localDateTime);
}
/**
* 判断一个日期是否在另一个日期之前
*
* @param date1 日期1
* @param date2 日期2
* @return 如果日期1在日期2之前返回 true否则返回 false
*/
public static boolean isBefore(Date date1, Date date2) {
return date1.before(date2);
}
/**
* 判断一个日期是否在另一个日期之后
*
* @param date1 日期1
* @param date2 日期2
* @return 如果日期1在日期2之后返回 true否则返回 false
*/
public static boolean isAfter(Date date1, Date date2) {
return date1.after(date2);
}
/**
* 判断两个日期是否相等
*
* @param date1 日期1
* @param date2 日期2
* @return 如果两个日期相等返回 true否则返回 false
*/
public static boolean isEqual(Date date1, Date date2) {
return date1.equals(date2);
}
/**
* 获取当前时间的 Unix 时间戳
*
* @return 当前时间的 Unix 时间戳
*/
public static long getUnixTimestamp() {
return System.currentTimeMillis() / 1000L;
}
/**
* Unix 时间戳转换为 Date
*
* @param timestamp Unix 时间戳
* @return 转换后的 Date 对象
*/
public static Date fromUnixTimestamp(long timestamp) {
return new Date(timestamp * 1000L);
}
/**
* Date 转换为 Unix 时间戳
*
* @param date Date 对象
* @return 转换后的 Unix 时间戳
*/
public static long toUnixTimestamp(Date date) {
return date.getTime() / 1000L;
}
/**
* 获取当前日期时间格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
*
* @return 当前日期时间的字符串
*/
public static String getISO8601Timestamp() {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(OffsetDateTime.now());
}
/**
* ISO8601 格式的字符串转换为 Date
*
* @param iso8601Timestamp ISO8601 格式的日期字符串
* @return 转换后的 Date 对象
*/
public static Date fromISO8601Timestamp(String iso8601Timestamp) {
OffsetDateTime odt = OffsetDateTime.parse(iso8601Timestamp);
return Date.from(odt.toInstant());
}
/**
* 获取本周的开始时间
*
* @return 本周的开始时间
*/
public static Date getStartOfWeek() {
LocalDate now = LocalDate.now();
LocalDate startOfWeek = now.with(DayOfWeek.MONDAY);
return toDate(startOfWeek);
}
/**
* 获取本周的结束时间
*
* @return 本周的结束时间
*/
public static Date getEndOfWeek() {
LocalDate now = LocalDate.now();
LocalDate endOfWeek = now.with(DayOfWeek.SUNDAY);
return toDate(endOfWeek.atTime(LocalTime.MAX));
}
/**
* 获取当前日期是当年的第几周
*
* @return 当前日期是当年的第几周
*/
public static int getWeekOfYear() {
LocalDate now = LocalDate.now();
return now.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
}
/**
* 获取指定日期前几天的日期
*
* @param date 日期
* @param days 天数
* @return 指定日期前几天的日期
*/
public static Date getDateBefore(Date date, int days) {
LocalDateTime localDateTime = toLocalDateTime(date);
localDateTime = localDateTime.minusDays(days);
return toDate(localDateTime);
}
/**
* 获取指定日期后几天的日期
*
* @param date 日期
* @param days 天数
* @return 指定日期后几天的日期
*/
public static Date getDateAfter(Date date, int days) {
return addDays(date, days);
}
/**
* 根据输入的日 返回月/
*
* @param day
* @param separator 分隔符
* @return /
*/
public static String getMonthOrDay(int day, String separator) {
LocalDate today = LocalDate.now();
if (day < 1 || day > today.lengthOfMonth()) {
return null;
} else {
if (ObjectUtils.isEmpty(separator)) {
return String.format("%02d", LocalDate.now().getMonthValue()) + "" + day;
} else {
return String.format("%02d", LocalDate.now().getMonthValue()) + separator + day;
}
}
}
/**
* 将日期字符串转换为 ISO 8601 格式
*
* @param dateStr 输入的日期字符串
* @param format 输入日期的格式
* @return ISO 8601 格式的日期字符串
*/
public static String convertToISO8601(String dateStr, String format) {
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(format);
DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME;
LocalDateTime dateTime = LocalDateTime.parse(dateStr, inputFormatter);
return dateTime.format(isoFormatter);
}
/**
* 获取两个时间之间的相差秒数
*
* @param startTimeStr 开始时间的字符串
* @param endTimeStr 结束时间的字符串
* @param format 时间格式
* @return 相差的秒数
*/
public static long getSecondsBetween(String startTimeStr, String endTimeStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDateTime startTime = LocalDateTime.parse(startTimeStr, formatter);
LocalDateTime endTime = LocalDateTime.parse(endTimeStr, formatter);
Duration duration = Duration.between(startTime, endTime);
return duration.getSeconds();
}
/**
* 根据输入日期字符串返回本周的周一和周日的日期
*
* @param dateStr 日期字符串
* @param format 日期格式
* @return 包含本周一和周日日期的数组
*/
public static String[] getWeekStartAndEndDate(String dateStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDate date = LocalDate.parse(dateStr, formatter);
// 获取本周一
LocalDate monday = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
// 获取本周日
LocalDate sunday = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
return new String[] {
monday.format(formatter),
sunday.format(formatter)
};
}
/**
* 根据输入日期字符串返回本周的开始时间和结束时间
*
* @param dateStr 日期字符串
* @param format 日期格式
* @return 包含本周开始时间和结束时间的数组
*/
public static String[] getWeekStartAndEndDateTime(String dateStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDate date = LocalDate.parse(dateStr, formatter);
// 获取本周一的开始时间
LocalDateTime startOfWeek = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
.atStartOfDay();
// 获取本周日的结束时间
LocalDateTime endOfWeek = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY))
.atTime(23, 59, 59);
return new String[] {
startOfWeek.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
endOfWeek.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
};
}
/**
* 根据输入日期字符串返回该日期属于本月的第几周
*
* @param dateStr 日期字符串
* @param format 日期格式
* @return 该日期属于本月的第几周
*/
public static int getWeekOfMonth(String dateStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDate date = LocalDate.parse(dateStr, formatter);
// 获取周字段周一为一周的开始
WeekFields weekFields = WeekFields.of(Locale.getDefault());
return date.get(weekFields.weekOfMonth());
}
/**
* 获取从当前日期往前推 n 天的所有日期并以字符串形式返回
*
* @param n 天数
* @param format 日期格式
* @param sort 排序,sort =true 正序,false 倒叙
* @return 从当前日期往前推 n 天的所有日期的字符串列表
*/
public static List<String> getDatesBefore(int n, String format,boolean sort) {
List<String> dates = new ArrayList<>();
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
if(sort){
for (int i=n-1;i>=0;i--){
LocalDate date = today.minusDays(i);
dates.add(date.format(formatter));
}
}else{
for (int i = 0; i < n; i++) {
LocalDate date = today.minusDays(i);
dates.add(date.format(formatter));
}
}
return dates;
}
/**
* 获取从当前日期往后推 n 天的所有日期并以字符串形式返回
*
* @param n 天数
* @param format 日期格式
* @return 从当前日期往后推 n 天的所有日期的字符串列表
*/
public static List<String> getDatesAfter(int n, String format) {
List<String> dates = new ArrayList<>();
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
for (int i = 0; i < n; i++) {
LocalDate date = today.plusDays(i);
dates.add(date.format(formatter));
}
return dates;
}
/**
* 根据输入日期字符串获取从指定日期往后推 n 天的所有日期并以字符串形式返回
*
* @param startDateStr 起始日期字符串
* @param n 天数
* @param format 输入日期的格式
* @return 从指定日期往后推 n 天的所有日期的字符串列表
*/
public static List<String> getDatesAfter(String startDateStr, int n, String format) {
List<String> dates = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDate startDate = LocalDate.parse(startDateStr, formatter);
for (int i = 0; i < n; i++) {
LocalDate date = startDate.plusDays(i);
dates.add(date.format(formatter));
}
return dates;
}
/**
* 根据输入日期字符串获取从指定日期往前推 n 天的所有日期并以字符串形式返回
*
* @param startDateStr 起始日期字符串
* @param n 天数
* @param format 日期格式
* @return 从指定日期往前推 n 天的所有日期的字符串列表
*/
public static List<String> getDatesBefore(String startDateStr, int n, String format) {
List<String> dates = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDate startDate = LocalDate.parse(startDateStr, formatter);
for (int i = 0; i < n; i++) {
LocalDate date = startDate.minusDays(i);
dates.add(date.format(formatter));
}
return dates;
}
}

View File

@ -0,0 +1,43 @@
package com.securitycontrol.screen.controller;
import com.securitycontrol.common.core.web.controller.BaseController;
import com.securitycontrol.common.core.web.domain.AjaxResult;
import com.securitycontrol.screen.domain.OverallEfficiency;
import com.securitycontrol.screen.service.OverallEfficiencyAnalysisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 整体效能分析
* @author 马三炮
* @date 2025/10/16
*/
@RestController
@RequestMapping("/proSafety")
@Slf4j
public class OverallEfficiencyAnalysisController extends BaseController {
@Resource
private OverallEfficiencyAnalysisService overallEfficiencyAnalysisService;
/**
* 查询整体效能分析
*
* @param overallEfficiency 传参
* @return 查询整体效能分析
*/
@GetMapping("selectOverallEfficiencyData")
public AjaxResult selectOverallEfficiencyData(OverallEfficiency overallEfficiency) {
try {
return overallEfficiencyAnalysisService.selectOverallEfficiencyData(overallEfficiency);
} catch (Exception e) {
log.error(e.toString(),e);
return error("请求出错了");
}
}
}

View File

@ -0,0 +1,43 @@
package com.securitycontrol.screen.controller;
import com.securitycontrol.common.core.web.controller.BaseController;
import com.securitycontrol.common.core.web.domain.AjaxResult;
import com.securitycontrol.screen.domain.OverallEfficiency;
import com.securitycontrol.screen.domain.ProjectData;
import com.securitycontrol.screen.service.ProjectDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author 马三炮
* @date 2025/10/17
*/
@RestController
@RequestMapping("/projectData")
@Slf4j
public class ProjectDataController extends BaseController {
@Resource
private ProjectDataService projectDataService;
/**
* 项目管理分析
*
* @param projectData 传参
* @return 项目管理分析
*/
@GetMapping("selectProjectData")
public AjaxResult selectProjectData(ProjectData projectData) {
try {
return projectDataService.selectProjectData(projectData);
} catch (Exception e) {
log.error(e.toString(),e);
return error("请求出错了");
}
}
}

View File

@ -0,0 +1,73 @@
package com.securitycontrol.screen.domain;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author 马三炮
* @date 2025/10/16
*/
@Data
public class OverallEfficiency {
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
/**
* 计划施工天数
*/
private Integer planDay;
/**
* 有效施工天数
*/
private Integer effectiveDay;
/**
* 天气
*/
private String weather;
/**
* 天数
*/
private Integer day;
/**
* 当前进度
*/
private String currentProgress;
/**
* 计划进度
*/
private String planProgress;
/**
* 进度偏差
*/
private String deviationPercent;
/**
* 成本
*/
private String cost;
/**
* 成本
*/
private BigDecimal dataMoney;
/**
* 类型
*/
private String dataType;
}

View File

@ -0,0 +1,50 @@
package com.securitycontrol.screen.domain;
import io.swagger.models.auth.In;
import lombok.Data;
/**
* @author 马三炮
* @date 2025/10/17
*/
@Data
public class ProjectData {
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
private String sql;
/**
* 日期
*/
private String dateTime;
/**
* 费用
*/
private String dataMoney;
/**
* 类型
*/
private String dataType;
/**
* 风险等级
*/
private String riskLevel;
/**
* 数量
*/
private Integer num;
}

View File

@ -60,5 +60,5 @@ public class SjProjectSafety {
private String createTime;
private String imagePath;
private String name;
private Integer num;
}

View File

@ -0,0 +1,21 @@
package com.securitycontrol.screen.mapper;
import com.securitycontrol.entity.background.vo.SjProjectQualityVo;
import com.securitycontrol.screen.domain.OverallEfficiency;
import com.securitycontrol.screen.domain.SjProjectSafety;
import java.util.List;
public interface OverallEfficiencyAnalysisMapper {
List<OverallEfficiency> selectOverallEfficiencyData(OverallEfficiency overallEfficiency);
OverallEfficiency getPlanDay(OverallEfficiency overallEfficiency);
SjProjectQualityVo getSjProjectQuality();
List<SjProjectSafety> getSjProjectSafety(OverallEfficiency overallEfficiency);
OverallEfficiency getProgress(OverallEfficiency overallEfficiency);
OverallEfficiency getCost(OverallEfficiency overallEfficiency);
}

View File

@ -0,0 +1,17 @@
package com.securitycontrol.screen.mapper;
import com.securitycontrol.screen.domain.ProjectData;
import java.util.List;
public interface ProjectDataMapper {
List<ProjectData> getCost(ProjectData projectData);
List<ProjectData> getSafety(ProjectData projectData);
List<ProjectData> getTodaySafety(ProjectData projectData);
Integer getXhSafety(ProjectData projectData);
Integer getTwoSafety(ProjectData projectData);
}

View File

@ -0,0 +1,8 @@
package com.securitycontrol.screen.service;
import com.securitycontrol.common.core.web.domain.AjaxResult;
import com.securitycontrol.screen.domain.OverallEfficiency;
public interface OverallEfficiencyAnalysisService {
AjaxResult selectOverallEfficiencyData(OverallEfficiency overallEfficiency);
}

View File

@ -0,0 +1,8 @@
package com.securitycontrol.screen.service;
import com.securitycontrol.common.core.web.domain.AjaxResult;
import com.securitycontrol.screen.domain.ProjectData;
public interface ProjectDataService {
AjaxResult selectProjectData(ProjectData projectData);
}

View File

@ -0,0 +1,68 @@
package com.securitycontrol.screen.service.impl;
import com.securitycontrol.common.core.web.domain.AjaxResult;
import com.securitycontrol.entity.background.vo.SjProjectQualityVo;
import com.securitycontrol.screen.domain.OverallEfficiency;
import com.securitycontrol.screen.domain.SjProjectSafety;
import com.securitycontrol.screen.mapper.OverallEfficiencyAnalysisMapper;
import com.securitycontrol.screen.service.OverallEfficiencyAnalysisService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author 马三炮
* @date 2025/10/16
*/
@Slf4j
@Service
public class OverallEfficiencyAnalysisServiceImpl implements OverallEfficiencyAnalysisService {
@Resource
private OverallEfficiencyAnalysisMapper overallEfficiencyAnalysisMapper;
@Override
public AjaxResult selectOverallEfficiencyData(OverallEfficiency overallEfficiency) {
Map<String, Object> res = new HashMap<>();
//获取天气数据
List<OverallEfficiency> overallEfficiencyList = overallEfficiencyAnalysisMapper.selectOverallEfficiencyData(overallEfficiency);
res.put("天气",overallEfficiencyList);
//获取施工天数
OverallEfficiency overallEfficiencyNew = overallEfficiencyAnalysisMapper.getPlanDay(overallEfficiency);
res.put("计划施工天数",overallEfficiencyNew.getPlanDay());
res.put("有效施工天数",overallEfficiencyNew.getEffectiveDay());
//质量分析
SjProjectQualityVo sjProjectQuality = overallEfficiencyAnalysisMapper.getSjProjectQuality();
res.put("总验收项",sjProjectQuality.getTotalItem());
res.put("已验收项",sjProjectQuality.getAcceptItem());
res.put("验收率",sjProjectQuality.getAcceptRate());
res.put("主设备试验调试一次通过率",sjProjectQuality.getMainAcceptRate());
//安全预警
List<SjProjectSafety> sjProjectSafetyList = overallEfficiencyAnalysisMapper.getSjProjectSafety(overallEfficiency);
res.put("安全预警",sjProjectSafetyList);
//进度分析
OverallEfficiency overallEfficiencyProgress = overallEfficiencyAnalysisMapper.getProgress(overallEfficiency);
res.put("当前进度",overallEfficiencyProgress.getCurrentProgress()+"%");
res.put("计划进度",overallEfficiencyProgress.getPlanProgress()+"%");
res.put("进度偏差",overallEfficiencyProgress.getDeviationPercent()+"%");
//成本分析 1--计划 2--实际
overallEfficiency.setDataType("1");
OverallEfficiency overallEfficiencyCost = overallEfficiencyAnalysisMapper.getCost(overallEfficiency);
overallEfficiency.setDataType("2");
OverallEfficiency overallEfficiencyCost2 = overallEfficiencyAnalysisMapper.getCost(overallEfficiency);
res.put("计划成本",overallEfficiencyCost.getDataMoney());
res.put("实际成本",overallEfficiencyCost2.getDataMoney());
BigDecimal difference = overallEfficiencyCost2.getDataMoney().subtract(overallEfficiencyCost.getDataMoney()); // B - A
BigDecimal ratio = difference.divide(overallEfficiencyCost.getDataMoney(), 2, RoundingMode.HALF_UP); // 除法保留scale位小数四舍五入
res.put("缩减成本",ratio+"%");
return AjaxResult.success(res);
}
}

View File

@ -0,0 +1,108 @@
package com.securitycontrol.screen.service.impl;
import com.securitycontrol.common.core.web.domain.AjaxResult;
import com.securitycontrol.screen.DateUtils;
import com.securitycontrol.screen.domain.OverallEfficiency;
import com.securitycontrol.screen.domain.ProjectData;
import com.securitycontrol.screen.domain.SjConstructionProgress;
import com.securitycontrol.screen.mapper.OverallEfficiencyAnalysisMapper;
import com.securitycontrol.screen.mapper.ProjectDataMapper;
import com.securitycontrol.screen.mapper.SjConstructionProgressMapper;
import com.securitycontrol.screen.service.ProjectDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author 马三炮
* @date 2025/10/17
*/
@Slf4j
@Service
public class ProjectDataServiceImpl implements ProjectDataService {
@Resource
private ProjectDataMapper projectDataMapper;
@Resource
private OverallEfficiencyAnalysisMapper overallEfficiencyAnalysisMapper;
@Resource
private SjConstructionProgressMapper sjConstructionProgressMapper;
@Override
public AjaxResult selectProjectData(ProjectData projectData) {
Map<String, Object> res = new HashMap<>();
OverallEfficiency overallEfficiency = new OverallEfficiency();
overallEfficiency.setStartTime(projectData.getStartTime());
overallEfficiency.setEndTime(projectData.getEndTime());
//进度分析
OverallEfficiency overallEfficiencyProgress = overallEfficiencyAnalysisMapper.getProgress(overallEfficiency);
res.put("当前工程进度",overallEfficiencyProgress.getCurrentProgress()+"%");
//成本分析 1--计划 2--实际
overallEfficiency.setDataType("1");
OverallEfficiency overallEfficiencyCost = overallEfficiencyAnalysisMapper.getCost(overallEfficiency);
overallEfficiency.setDataType("2");
OverallEfficiency overallEfficiencyCost2 = overallEfficiencyAnalysisMapper.getCost(overallEfficiency);
BigDecimal ratio = overallEfficiencyCost2.getDataMoney().divide(overallEfficiencyCost.getDataMoney(), 2, RoundingMode.HALF_UP); // 除法保留scale位小数四舍五入
res.put("当前成本投入",ratio+"%");
//折线图
SjConstructionProgress o = new SjConstructionProgress();
String sql = "SELECT DATE_ADD("+projectData.getStartTime()+", INTERVAL (ones.a + tens.a * 10) DAY) AS dt\n" +
" FROM\n" +
" (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n" +
" UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7\n" +
" UNION ALL SELECT 8 UNION ALL SELECT 9) AS ones\n" +
" CROSS JOIN\n" +
" (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3\n" +
" UNION ALL SELECT 4 UNION ALL SELECT 5) AS tens\n" +
" WHERE DATE_ADD("+projectData.getStartTime()+", INTERVAL (ones.a + tens.a * 10) DAY) <= "+projectData.getEndTime();
o.setSql(sql);
o.setEndTime(projectData.getEndTime());
o.setStartTime(projectData.getStartTime());
List<SjConstructionProgress> echartsList = sjConstructionProgressMapper.selectProProgress(o);
Map<String, List<SjConstructionProgress>> groupedByProTypeEcharts = echartsList.stream()
.collect(Collectors.groupingBy(SjConstructionProgress::getProType));
res.put("项目情况详情",groupedByProTypeEcharts);
//今日风险
Integer countNum=0 ;
projectData.setDateTime(DateUtils.getDate());
List<ProjectData> projectSafetyDataList = projectDataMapper.getTodaySafety(projectData);
for (ProjectData projectDataNew:projectSafetyDataList) {
countNum = countNum + projectDataNew.getNum();
}
ProjectData projectDataCount = new ProjectData();
projectDataCount.setRiskLevel("0");
projectDataCount.setNum(countNum);
projectSafetyDataList.add(projectDataCount);
res.put("今日风险",projectSafetyDataList);
//项目成本
projectData.setDataType("2");
List<ProjectData> projectDataList = projectDataMapper.getCost(projectData);
res.put("项目成本",projectDataList);
//项目风险
List<ProjectData> projectSafetyDataList2 = projectDataMapper.getSafety(projectData);
countNum=0;
for (ProjectData projectDataNew:projectSafetyDataList) {
countNum = countNum + projectDataNew.getNum();
}
ProjectData projectDataCountNum = new ProjectData();
projectDataCountNum.setRiskLevel("0");
projectDataCountNum.setNum(countNum);
projectSafetyDataList2.add(projectDataCountNum);
res.put("项目风险",projectSafetyDataList2);
Integer xhCount = projectDataMapper.getXhSafety(projectData);
res.put("已销号风险",xhCount);
res.put("剩余风险",countNum-xhCount);
Integer twoCount = projectDataMapper.getTwoSafety(projectData);
res.put("剩余二级及以上风险",twoCount);
return AjaxResult.success(res);
}
}

View File

@ -0,0 +1,171 @@
<?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.securitycontrol.screen.mapper.OverallEfficiencyAnalysisMapper">
<select id="selectOverallEfficiencyData" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
select weather,count(id) as 'day'
from sj_efficiency_analysis
where create_time between #{startTime} and #{endTime}
GROUP BY weather
</select>
<select id="getPlanDay" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
SELECT
SUM(
DATEDIFF(LEAST(plan_end_time, #{endTime}), GREATEST(plan_start_time, #{startTime})) + 1
) AS total_plan_days,
SUM(
CASE
WHEN start_time IS NOT NULL AND end_time IS NOT NULL THEN
GREATEST(
0,
DATEDIFF(
LEAST(end_time, #{endTime}),
GREATEST(start_time, #{startTime})
) + 1
)
ELSE 0
END
) AS total_actual_days
FROM
sj_construction_progress
WHERE
( #{endTime} >= plan_start_time AND plan_end_time >= #{startTime})
OR
(start_time IS NOT NULL AND end_time IS NOT NULL AND #{endTime} >= start_time AND end_time >= #{startTime});
</select>
<select id="getSjProjectQuality" resultType="com.securitycontrol.entity.background.vo.SjProjectQualityVo">
SELECT
-- 总验收项合计(需排除空值,避免计算错误)
SUM(CASE WHEN total_item != '' THEN CAST(total_item AS UNSIGNED) ELSE 0 END) AS totalItem,
-- 已验收项合计(同样处理空值)
SUM(CASE WHEN accept_item != '' THEN CAST(accept_item AS UNSIGNED) ELSE 0 END) AS acceptItem,
-- 整体验收率保留2位小数避免除数为0
CASE
WHEN SUM(CASE WHEN total_item != '' THEN CAST(total_item AS UNSIGNED) ELSE 0 END) = 0 THEN 0
ELSE ROUND(
SUM(CASE WHEN accept_item != '' THEN CAST(accept_item AS UNSIGNED) ELSE 0 END)
/ SUM(CASE WHEN total_item != '' THEN CAST(total_item AS UNSIGNED) ELSE 0 END)
* 100,
2
)
END AS acceptRate,
-- 主设备试验调试一次通过总数
SUM(CASE WHEN main_one_accept_num != '' THEN CAST(main_one_accept_num AS UNSIGNED) ELSE 0 END) AS mainOneAcceptNum,
-- 主设备试验调试通过总数
SUM(CASE WHEN main_accept_num != '' THEN CAST(main_accept_num AS UNSIGNED) ELSE 0 END) AS mainAcceptNum,
-- 主设备试验调试一次通过率保留2位小数避免除数为0
CASE
WHEN SUM(CASE WHEN main_accept_num != '' THEN CAST(main_accept_num AS UNSIGNED) ELSE 0 END) = 0 THEN 0
ELSE ROUND(
SUM(CASE WHEN main_one_accept_num != '' THEN CAST(main_one_accept_num AS UNSIGNED) ELSE 0 END)
/ SUM(CASE WHEN main_accept_num != '' THEN CAST(main_accept_num AS UNSIGNED) ELSE 0 END)
* 100,
2
)
END AS mainAcceptRate
FROM
sj_project_quality;
</select>
<select id="getSjProjectSafety" resultType="com.securitycontrol.screen.domain.SjProjectSafety">
select name,count(id) as num
from sj_video_safety
where create_time between #{startTime} and #{endTime}
GROUP BY name
</select>
<select id="getProgress" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
SELECT
-- 计划进度:查询区间内的计划工作天数占总天数的百分比
ROUND(
SUM(
GREATEST(
0,
DATEDIFF(
LEAST(plan_end_time, #{startTime}),
GREATEST(plan_start_time, #{startTime})
) + 1
)
) / sum(NULLIF(DATEDIFF(plan_end_time, plan_start_time) + 1, 0)) * 100,
2
) AS planProgress,
-- 实际进度:查询区间内的实际工作天数占总天数的百分比
ROUND(
SUM(
CASE
-- 已完成工序:取实际时间与查询区间的交集天数
WHEN start_time IS NOT NULL AND end_time IS NOT NULL THEN
GREATEST(
0,
DATEDIFF(
LEAST(end_time, #{startTime}),
GREATEST(start_time, #{startTime})
) + 1
)
-- 进行中工序:从实际开始到查询结束的天数
WHEN start_time IS NOT NULL AND end_time IS NULL AND #{startTime} >=start_time THEN
GREATEST(
0,
DATEDIFF(#{startTime}, GREATEST(start_time, #{startTime})) + 1
)
-- 未开始或不相关工序计为0
ELSE 0
END
) / sum(NULLIF(DATEDIFF(end_time, start_time) + 1, 0)) * 100,
2
) AS currentProgress,
-- 进度偏差:实际进度 - 计划进度(正数表示超前,负数表示滞后)
ROUND(
(
SUM(
CASE
WHEN start_time IS NOT NULL AND end_time IS NOT NULL THEN
GREATEST(
0,
DATEDIFF(
LEAST(end_time, #{startTime}),
GREATEST(start_time, #{startTime})
) + 1
)
WHEN start_time IS NOT NULL AND end_time IS NULL AND #{startTime} >= start_time THEN
GREATEST(
0,
DATEDIFF(#{startTime}, GREATEST(start_time, #{startTime})) + 1
)
ELSE 0
END
) / sum(NULLIF(DATEDIFF(end_time, start_time) + 1, 0)) * 100
) -
(
SUM(
GREATEST(
0,
DATEDIFF(
LEAST(plan_end_time, #{startTime}),
GREATEST(plan_start_time, #{startTime})
) + 1
)
) / sum(NULLIF(DATEDIFF(plan_end_time, plan_start_time) + 1, 0)) * 100
),
2
) AS deviationPercent
FROM
sj_construction_progress
WHERE
-- 筛选与查询时间段相关的记录
( #{startTime} >=plan_start_time AND plan_end_time >= #{startTime}) -- 计划时间在区间内
OR
(start_time IS NOT NULL AND #{startTime} >=start_time) -- 实际已开始且在区间内
</select>
<select id="getCost" resultType="com.securitycontrol.screen.domain.OverallEfficiency">
select sum(COALESCE(data_money, 0)) as dataMoney
from sj_project_manage where data_type= #{dataType}
and date_time between #{startTime} and #{endTime}
</select>
</mapper>

View File

@ -0,0 +1,33 @@
<?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.securitycontrol.screen.mapper.ProjectDataMapper">
<select id="getCost" resultType="com.securitycontrol.screen.domain.ProjectData">
select date_time,data_money
from sj_project_manage where data_type= #{dataType}
and date_time between #{startTime} and #{endTime}
</select>
<select id="getSafety" resultType="com.securitycontrol.screen.domain.ProjectData">
select count(id) as num ,risk_level as riskLevel
from sj_project_safety
where start_time between #{startTime} and #{endTime}
GROUP BY risk_level
</select>
<select id="getTodaySafety" resultType="com.securitycontrol.screen.domain.ProjectData">
select count(id) as num ,risk_level as riskLevel
from sj_project_safety
where start_time=#{dateTime}
GROUP BY risk_level
</select>
<select id="getXhSafety" resultType="java.lang.Integer">
select count(id) as num
from sj_project_safety
where is_xh='1' and start_time between #{startTime} and #{endTime}
</select>
<select id="getTwoSafety" resultType="java.lang.Integer">
select count(id) as num
from sj_project_safety
where is_xh='0' and risk_level !='1' and start_time between #{startTime} and #{endTime}
</select>
</mapper>