# Conflicts:
#	PVDEMCS/.vs/PVDEMCS/DesignTimeBuild/.dtbcache.v2
#	PVDEMCS/.vs/PVDEMCS/v17/.suo
main
xiaoguo 8 months ago
commit 665c1c3185

Binary file not shown.

@ -6,6 +6,7 @@ using PVDEMCS.Devices;
using PVDEMCS.Services;
using PVDEMCS.Services.Impl;
using PVDEMCS.Services.Models;
using SixLabors.Fonts;
using System.Linq;
using System.Threading;
@ -138,7 +139,7 @@ namespace PVDEMCS.Devices.Impl
}
catch (Exception ex)
{
ex.WriteErrorLog("设备记录日统计异常");
ex.WriteErrorLog("设备记录日统计异常");
}
Thread.Sleep(1000 * 60);
@ -146,6 +147,41 @@ namespace PVDEMCS.Devices.Impl
}
});
//设备记录日统计(修复统计,解决出现跨天的数据统计不到的情况)
Task.Run(() =>
{
//凌晨1点运行
var now = DateTime.Now;
var targetTime = new DateTime(now.Year, now.Month, now.Day, 1, 0, 0);
if (targetTime <= now)
{
// 如果目标时间已经过去,则设置到明天
targetTime = targetTime.AddDays(1);
}
while (true)
{
try
{
Thread.Sleep(TimeSpan.FromMilliseconds(targetTime.Subtract(DateTime.Now).TotalMilliseconds));
//这里修复10天前的
for (int i = 10; i > 0; i--)
{
equipmentRecordService.RunEquipmentRecordDayTotal(DateTime.Now.AddDays(-i));
}
$" 设备记录日统计(修复统计) ".WriteInfoLog();
}
catch (Exception ex)
{
ex.WriteErrorLog("设备记录日统计(修复统计)异常");
}
//明天继续
targetTime = targetTime.AddDays(1);
}
});
//设备记录统计
Task.Run(() =>
{
@ -155,11 +191,11 @@ namespace PVDEMCS.Devices.Impl
{
equipmentRecordService.RunEquipmentRecordTotal();
}
catch (Exception ex)
catch (Exception ex)
{
ex.WriteErrorLog("设备记录统计异常");
}
Thread.Sleep(1000 * 1800);
}
});
@ -205,28 +241,28 @@ namespace PVDEMCS.Devices.Impl
else if (fault.GetValue<bool>())
{
state = EquipmentState.Alarm;
}
//如果为报警状态,则判断是否设为手动,且为不报警,则屏蔽报警信号,不做记录
if (state == EquipmentState.Alarm &&
startStop.Model == EquipmentAlarmModel.Manual &&
if (state == EquipmentState.Alarm &&
startStop.Model == EquipmentAlarmModel.Manual &&
!startStop.IsAlarm)
{
continue;
}
//equipmentRecordService.AddUpdateEquipmentRecord(id, state, DateTime.Now);
models.Add(new EquipmentRecordUpdateModel
models.Add(new EquipmentRecordUpdateModel
{
EquipmentId=id,
State=state,
DateTime=DateTime.Now
EquipmentId = id,
State = state,
DateTime = DateTime.Now
});
}
}
}
}
if (models.Count > 0)
if (models.Count > 0)
{
//批量更新
equipmentRecordService.AddUpdateEquipmentRecordBatch(models);

@ -16,7 +16,7 @@
xsi:type="File"
fileName="${basedir}/logs/${appName}-${shortdate}.log"
layout="${longdate} [${uppercase:${level}}] ${callsite}(${callsite-filename:includeSourcePath=False}:${callsite-linenumber}) - ${message} ${exception:format=ToString}"
maxArchiveFiles="999"
maxArchiveFiles="100"
archiveFileName="${basedir}/logs/${appName}-${shortdate}-${###}.log"
createDirs="true"
archiveAboveSize="1048576"

@ -65,7 +65,7 @@ app.Lifetime.ApplicationStarted.Register(() =>
deviceRun.Run();
// Test.UpdateEquipmentRecordDayTotal(app.Services.GetService<IEquipmentRecordService>());
//Test.UpdateEquipmentRecordDayTotal(app.Services.GetService<IEquipmentRecordService>());
//var equipmentList = app.Services.GetService<IEquipmentService>();
//var equipmentRecord = app.Services.GetService<IEquipmentRecordService>();
@ -97,6 +97,13 @@ app.Lifetime.ApplicationStarted.Register(() =>
// Thread.Sleep(100);
//}
// Test.EqualsRecordAndDayTotal();
// Test.QueryRecordFaultInfo();
});
app.Run();

@ -238,7 +238,6 @@ namespace PVDEMCS.Services.Repositories.Impl
using (var context = new EFContext())
{
var query = context.EquipmentRecords.Where(f => (f.StartTime >= begDate && f.StartTime <= endDate)).ToList();
//过滤跨天的数据部分
//获取状态统计时间
var total = query.GroupBy(f => new { f.EquipmentId, f.State })
@ -572,6 +571,7 @@ namespace PVDEMCS.Services.Repositories.Impl
equipment_info.id as EquipmentId,
equipment_code as EquipmentCode,
equipment_name as EquipmentName,
equipment_type AS EquipmentType,
SUM(furnace_num) AS FurnaceNum,
SUM( total_running_time ) AS TotalRunningTime,
SUM( total_alarm_time ) AS TotalAlarmTime,
@ -586,7 +586,7 @@ namespace PVDEMCS.Services.Repositories.Impl
}
if (endTime.HasValue)
{
sql += $" AND total_day <= '{endTime.Value.AddDays(1).ToString("yyyy-MM-dd")}'";
sql += $" AND total_day <= '{endTime.Value.ToString("yyyy-MM-dd")}'";
}
if (!equipmentName.IsNullOrEmpty())
{
@ -601,8 +601,8 @@ namespace PVDEMCS.Services.Repositories.Impl
sql += $" AND equipment_info.equipment_type='{equipmentType}'";
}
sql += " GROUP BY equipment_info.id,equipment_info.equipment_code,equipment_info.equipment_name";
return sql;
return sql;
}
@ -742,10 +742,9 @@ namespace PVDEMCS.Services.Repositories.Impl
if (item.TotalMonth == DateTime.Now.ToString("yyyy-MM"))
{
//初尝值不包括今天
//days = now.Day - 1;
days = now.Day;
days = now.Day - 1;
//获取当月到当前的分钟
minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute;
minutes = days * 24 * 60 + now.Hour * 60 + now.Minute;
}
else
{
@ -753,7 +752,7 @@ namespace PVDEMCS.Services.Repositories.Impl
if (sptr.Length == 2)
{
days = DateTime.DaysInMonth(int.Parse(sptr[0]), int.Parse(sptr[1]));
minutes = days * 60 * 24;
minutes = days * 24 * 60;
}
}
@ -817,7 +816,7 @@ namespace PVDEMCS.Services.Repositories.Impl
WHERE
info.id = '{equipmentId}'
AND total_day >= '{beg}'
AND total_day <= '{endDate}'
AND total_day <= '{end}'
GROUP BY
EquipmentId,
EquipmentType";
@ -859,14 +858,13 @@ namespace PVDEMCS.Services.Repositories.Impl
{
days = Convert.ToDecimal((endDate - begDate).TotalDays);
}
if (end == DateTime.Now.ToString("yyyy-MM-dd"))
if (endDate.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd"))
{
//days = days - 1;
minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute;
minutes = days * 24 * 60 + now.Hour * 60 + now.Minute;
}
else
{
minutes = days * 60 * 24;
minutes = days * 24 * 60;
}
var value = 0m;

@ -1,6 +1,11 @@
using Masuit.Tools;
using Masuit.Tools.Models;
using PVDEMCS.Common.Constant;
using PVDEMCS.Services;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using System.Net;
using System.Security.Principal;
namespace PVDEMCS
{
@ -33,18 +38,133 @@ namespace PVDEMCS
public static void UpdateEquipmentRecordDayTotal(IEquipmentRecordService equipmentRecordService)
{
var begDate = DateTime.Parse("2023-12-1");
var endDate = DateTime.Parse("2024-5-7");
var begDate = DateTime.Parse("2024-4-1");
var endDate = DateTime.Parse("2024-6-19");
do
{
equipmentRecordService.RunEquipmentRecordDayTotal(begDate);
Console.WriteLine(begDate.ToString() + "统计完成!!");
begDate = begDate.AddDays(1);
Console.WriteLine(begDate.ToString() + "统计完成!!");
} while (begDate <= endDate);
}
/// <summary>
/// 明细与日汇总数据比较
/// </summary>
public static void EqualsRecordAndDayTotal()
{
var dayList = new List<EquipmentRecordDayTotal>();
using (var context = new EFContext())
{
var start = DateTime.Parse("2024-05-01");
do
{
var query = context.EquipmentRecords.Where(f => f.EquipmentId == "1139430645193863168" && f.StartTime >= start && f.StartTime <= start.AddDays(1).AddMinutes(-1)).ToList();
//获取状态统计时间
var total = query.GroupBy(f => new { f.EquipmentId, f.State })
.Select(f => new
{
EquipmentId = f.Key.EquipmentId,
State = f.Key.State,
Value = Convert.ToDecimal(f.Sum(ff => (ff.EndTime - ff.StartTime).TotalMinutes)),
Date = DateTime.Parse(f.Min(ff => ff.StartTime).ToString("yyyy-MM-dd")),
}).ToList();
if (total.Count > 0)
{
var day = new EquipmentRecordDayTotal();
day.TotalDay = start;
var value = total.Where(f => f.State == EquipmentState.Stop).FirstOrDefault();
if (value != null)
{
day.TotalStopTime = Math.Round(value.Value, 2);
}
value = total.Where(f => f.State == EquipmentState.Alarm).FirstOrDefault();
if (value != null)
{
day.TotalAlarmTime = Math.Round(value.Value, 2);
}
value = total.Where(f => f.State == EquipmentState.Run).FirstOrDefault();
if (value != null)
{
day.TotalRunningTime = Math.Round(value.Value, 2);
}
dayList.Add(day);
}
start = start.AddDays(1);
} while (start <= DateTime.Parse("2024-05-31"));
} while (begDate<=endDate);
var days = context.EquipmentRecordDayTotals.Where(f => f.EquipmentId == "1139430645193863168" && f.TotalDay >= DateTime.Parse("2024-05-01") && f.TotalDay <= DateTime.Parse("2024-05-31")).ToList();
foreach (var item in dayList)
{
var val = days.Where(f => f.TotalDay == item.TotalDay).FirstOrDefault();
if (val != null)
{
if (val.TotalAlarmTime != item.TotalAlarmTime ||
val.TotalStopTime != item.TotalStopTime ||
val.TotalRunningTime != item.TotalRunningTime)
{
Console.WriteLine(item.TotalDay);
Console.WriteLine($"record:Alarm:{item.TotalAlarmTime},Stop:{item.TotalStopTime},Running:{item.TotalRunningTime}");
Console.WriteLine($"total: Alarm:{val.TotalAlarmTime},Stop:{val.TotalStopTime},Running:{val.TotalRunningTime}");
}
else
{
Console.WriteLine(item.TotalDay + " OK!!!");
}
}
}
}
}
public static void QueryRecordFaultInfo()
{
var beg = DateTime.Parse("2024-6-1");
var end = beg.AddMonths(1);
using (var context = new EFContext())
{
var equiments = context.EquipmentInfos.Where(f => !f.IsDelete).ToList();
var records = context.EquipmentRecords.Where(f => f.StartTime >= beg && f.StartTime <= end).ToList();
foreach (var equipment in equiments)
{
EquipmentRecordEntity er = null;
var list = records.Where(f => f.EquipmentId == equipment.Id).OrderBy(f => f.CreateAt).ToList();
for (int i = 0; i < list.Count; i++)
{
if (i == 0)
{
er= list[i];
continue;
}
if (er.EndTime != list[i].StartTime)
{
Console.WriteLine(er.ToJsonString());
Console.WriteLine(list[i].StartTime.ToJsonString());
}
else
{
// Console.WriteLine(er.EquipmentId + "OK!!!");
}
er = list[i];
}
}
}
}
}

@ -23,9 +23,8 @@
</div>
<!-- 搜索条件 -->
<div class="col-xl-2 col-lg-2 col-sm-3">
<q-input dense label="日期范围" ref="rangDateRef" readonly outlined v-model="rangDateText" :rules="[
(val: string) => (val !== null && val !== '' && val !== undefined) || '请选择日期范围',
]">
<!-- :rules="[ (val: string) => (val !== null && val !== '' && val !== undefined) || '请选择日期范围']" -->
<q-input dense label="日期范围" ref="rangDateRef" readonly outlined v-model="rangDateText">
<template v-slot:append>
<q-icon name="event" class="cursor-pointer">
<q-tooltip content-class="bg-amber text-black shadow-4" :offset="[10, 10]"
@ -74,7 +73,7 @@
props.row.equipmentName }}</q-td>
<q-td style="font-size: 16px;" key="equipmentType" :props="props">{{
props.row.equipmentType
}}</q-td>
}}</q-td>
<q-td style="font-size: 16px;" key="furnaceNum" :props="props">{{ props.row.furnaceNum
}}</q-td>
<q-td style="font-size: 16px;" key="totalRunningTime" :props="props">{{
@ -169,7 +168,7 @@ const onRequest = (props: any) => {
const pagination = ref(new Pagination(new EquipmentRecord()));
const getPage = () => {
rangDateRef.value.resetValidation();
// rangDateRef.value.resetValidation();
if (rangeDate.value) {
pagination.value.data.begTime = rangeDate.value.from + ' 00:00:00';
pagination.value.data.endTime = rangeDate.value.to + ' 23:59:59';
@ -233,78 +232,78 @@ const rangeDateUpdate = (value: any, reason: any, details) => {
// Excel
const equipmentNoTimeRecord = ref();
const exportTable = () => {
rangDateRef.value.validate();
if (!rangDateRef.value.hasError) {
//rangDateRef.value.validate();
//if (!rangDateRef.value.hasError) {
if (rangeDate.value) {
let begTime = rangeDate.value.from + ' 00:00:00';
let endTime = rangeDate.value.to + ' 23:59:59';
const diff = date.getDateDiff(new Date(endTime), new Date(begTime), 'days') //
// 30
if (diff > 30) {
Notify.create({
position: 'top',
message: '日期范围不能大于30天',
icon: 'feedback',
color: 'negative',
})
return
}
equipmentNoTimeRecord.value = new EquipmentNoTimeRecord();
equipmentNoTimeRecord.value.begTime = begTime;
equipmentNoTimeRecord.value.endTime = endTime;
}
equipmentNoTimeRecord.value = new EquipmentNoTimeRecord();
if (rangeDate.value) {
let begTime = rangeDate.value.from + ' 00:00:00';
let endTime = rangeDate.value.to + ' 23:59:59';
// const diff = date.getDateDiff(new Date(endTime), new Date(begTime), 'days') //
// 30
// if (diff > 30) {
// Notify.create({
// position: 'top',
// message: '30',
// icon: 'feedback',
// color: 'negative',
// })
// return
// }
equipmentNoTimeRecord.value.begTime = begTime;
equipmentNoTimeRecord.value.endTime = endTime;
}
Dialog.create({
title: '系统提示',
message: '是否导出?',
class: 'text-h7 text-weight-bold',
cancel: true,
persistent: true
}).onOk(() => {
Loading.show({
spinner: QSpinnerIos,
message: '正在导出,请稍等...',
boxClass: 'bg-grey-2 text-grey-9',
spinnerColor: 'primary'
});
Dialog.create({
title: '系统提示',
message: '是否导出?',
class: 'text-h7 text-weight-bold',
cancel: true,
persistent: true
}).onOk(() => {
Loading.show({
spinner: QSpinnerIos,
message: '正在导出,请稍等...',
boxClass: 'bg-grey-2 text-grey-9',
spinnerColor: 'primary'
});
// var d = new Date(); //
// var monthStart = date.formatDate(new Date(d.getFullYear(), d.getMonth(), 1), 'YYYY-MM-DD'); //
// var monthEnd = date.formatDate(new Date(d.getFullYear(), d.getMonth() + 1, 0), 'YYYY-MM-DD'); // 23:59:5
// var d = new Date(); //
// var monthStart = date.formatDate(new Date(d.getFullYear(), d.getMonth(), 1), 'YYYY-MM-DD'); //
// var monthEnd = date.formatDate(new Date(d.getFullYear(), d.getMonth() + 1, 0), 'YYYY-MM-DD'); // 23:59:5
let tableData = [
['序号', '设备编码', '设备名称', '设备类型', '开炉次数', '总运行时长(小时)', '总报警时长(小时)', '总待机时长(小时)']//
] //
let tableData = [
['序号', '设备编码', '设备名称', '设备类型', '开炉次数', '总运行时长(小时)', '总报警时长(小时)', '总待机时长(小时)']//
] //
equipmentRecordApi.getEquipmentRecordTotalList(equipmentNoTimeRecord.value).then((res: any) => {
equipmentRecordApi.getEquipmentRecordTotalList(equipmentNoTimeRecord.value).then((res: any) => {
res.forEach((item: any, index: any) => {
console.log(item, item.name)
let rowData = []
//
rowData = [
index + 1,
item.equipmentCode,
item.equipmentName,
item.equipmentType,
item.furnaceNum,
item.totalRunningTime,
item.totalAlarmTime,
item.totalStopTime
]
tableData.push(rowData)
})
let workSheet = XLSX.utils.aoa_to_sheet(tableData);
let bookNew = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(bookNew, workSheet, 'Sheet1') // 簿
let name = '导出数据' + '.xlsx'
XLSX.writeFile(bookNew, name) //
}).finally(() => {
Loading.hide();
});
}).onCancel(() => { })
}
res.forEach((item: any, index: any) => {
console.log(item, item.name)
let rowData = []
//
rowData = [
index + 1,
item.equipmentCode,
item.equipmentName,
item.equipmentType,
item.furnaceNum,
item.totalRunningTime,
item.totalAlarmTime,
item.totalStopTime
]
tableData.push(rowData)
})
let workSheet = XLSX.utils.aoa_to_sheet(tableData);
let bookNew = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(bookNew, workSheet, 'Sheet1') // 簿
let name = '导出数据' + '.xlsx'
XLSX.writeFile(bookNew, name) //
}).finally(() => {
Loading.hide();
});
}).onCancel(() => { })
// }
}
</script>

Loading…
Cancel
Save