项目管理分析,整体效能分析
This commit is contained in:
parent
3b49dc5651
commit
5c5f9dee1c
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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("请求出错了");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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("请求出错了");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -60,5 +60,5 @@ public class SjProjectSafety {
|
|||
private String createTime;
|
||||
private String imagePath;
|
||||
private String name;
|
||||
|
||||
private Integer num;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in New Issue