using MeterVision.db;
using MeterVision.FreeAi;
using MeterVision.Util;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace MeterVision.Patch
{
///
/// AddPatchDlg.xaml 的交互逻辑
///
public partial class AddPatchDlg : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public TPatch NewPatch { get; set; }
//下拉框绑定的数据
public ObservableCollection StandList { get; set; }
private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
public AddPatchDlg()
{
InitializeComponent();
StandList = new ObservableCollection();
cmbStand.ItemsSource = StandList;
this.DataContext = this;
LoadStandList();
}
private async void LoadStandList()
{
try
{
var stands = await Task.Run(() => DBStand.GetAllVStands());
StandList.Clear();
foreach (VStand stand in stands)
{
StandList.Add(stand);
}
}
catch (Exception ex)
{
MessageBox.Show($"加载数据失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private async void BtnOK_Click(object sender, RoutedEventArgs e)
{
if (!_semaphore.Wait(0)) return; // 如果信号量已被占用,直接返回
this.IsEnabled = false;
try
{
string patchName = txtPatchName.Text.ToString();
if (string.IsNullOrWhiteSpace(patchName))
{
MessageBox.Show("请填写批量任务的名称!");
return;
}
var standItem = cmbStand.SelectedItem as VStand;
if (standItem == null)
{
MessageBox.Show("请选择一个标准模板!");
return;
}
NewPatch = new TPatch
{
PatchId = Guid.NewGuid().ToString(),
CreateTime = ThisApp.GetNowTime_yyyyMMddHHmmss(),
PatchName = patchName,
StandId = standItem.StandId,
StandName = standItem.StandName,
JudgeLastnumFlag = chkJudgeLastnumFlag.IsChecked == true ? 1 : 0,
};
string standId = standItem.StandId;
bool result = await InsertTPatchAndDetailAsync(NewPatch, standId);
if (result)
{
this.DialogResult = true;
this.Close();
}
else
{
MessageBox.Show("保存批量任务失败,请重试!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
catch { }
finally
{
_semaphore.Release();
this.IsEnabled = true;
}
}
//最好能异步(要不会阻塞主线程)
private async Task InsertTPatchAndDetailAsync(TPatch patch,string standId)
{
//插入t_patch表与插入t_patch_detail表应该在一个事务中,还需要优化
//插入t_patch表
return await Task.Run(() =>
{
return InsertTPatchAndDetail(patch, standId);
});
}
private bool InsertTPatchAndDetail(TPatch patch,string standId)
{
try
{
//1. 从指定stand_id的t_station表中查询配置了数据的站点,
//要求,meter_type > 0,meter_region,feature_region,last_time !=""
// 查询 t_stand_detail 表
var patchDetails = new List();
//var stations = DBStation.GetAllStation(standId);
var stations = DBStation.GetAllVStation(standId);
//TStandDetail validStandDetail = null; //有效的模板明细
foreach(var station in stations)
{
TStandDetail validStandDetail = null; ////有效的模板明细
var standDetails = DBStand.GetAllStandDetails(standId, station.StationId);
for(int i = 0; i < standDetails.Count; i++)
{
var standDetail = standDetails[i];
//水表类型大于0,说明这条模板数据配置过
//if(standDetail.MeterType > 0)
//{
//有有效配置
validStandDetail = new TStandDetail();
ObjectHelper.CopyMatchingFields(standDetail, validStandDetail);
//}
if(validStandDetail == null)
{
continue; //无有效的数据则继续循环
}
var patchDetail = new TPatchDetail();
patchDetail.PatchId = patch.PatchId;
patchDetail.JudgeLastnumFlag = patch.JudgeLastnumFlag;
patchDetail.PatchDetailId = Guid.NewGuid().ToString();
patchDetail.CreateTime = ThisApp.GetNowTime_yyyyMMddHHmmss();
patchDetail.StandDetailId = standDetail.StandDetailId;
patchDetail.StandValue = standDetail.StandValue;
patchDetail.SrcImage = standDetail.SrcImage;
patchDetail.SampleTime = standDetail.SampleTime;
patchDetail.StationKey = station.Id;
patchDetail.StationId = station.StationId;
//用有效的配置
patchDetail.MeterType = validStandDetail.MeterType;
patchDetail.BrightVal = validStandDetail.BrightVal;
patchDetail.FlowRate = validStandDetail.FlowRate;
patchDetail.DigitCount = validStandDetail.NumCount;
patchDetail.PointerCount = validStandDetail.IndCount;
patchDetail.LastUnit = validStandDetail.LastUnit;
//20250430新加项
patchDetail.NumInUpper = validStandDetail.NumInUpper;
//patchDetail.MeterRegion = validStandDetail.DialRegion;
//patchDetail.FeatureRegion = validStandDetail.FeatureRegion;
if (standDetail.MeterType > 0)
{
//第一条有效的数据
patchDetail.LastCompress = 100;
patchDetail.LatestValue = (long)(validStandDetail.LastValue * FaConstant.CUBE_VALUE);
patchDetail.LatestTime = validStandDetail.LastTime;
//复制第一条数据标注的坐标值(空字符串页无所谓)
patchDetail.MeterRegion = validStandDetail.DialRegion;
patchDetail.FeatureRegion = validStandDetail.FeatureRegion;
}
patchDetails.Add(patchDetail);
}
}
if (patchDetails.Count > 0)
{
bool blInsert = DBPatch.InsertPatchAndDetails(patch, patchDetails);
return blInsert;
}
return false;
}
catch (Exception ex)
{
Console.WriteLine($"插入数据失败:{ex.Message}");
return false;
}
}
private void BtnClose_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
this.Close() ;
}
//private void CmbStand_Selected(object sender, RoutedEventArgs e)
//{
// var standItem = cmbStand.SelectedItem as VStand;
// if(standItem != null)
// {
// string patchName = txtPatchName.Text.Trim();
// if (string.IsNullOrWhiteSpace(patchName))
// {
// txtPatchName.Text = $"任务-{standItem.StandName}";
// }
// }
//}
private void CmbStand_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var standItem = cmbStand.SelectedItem as VStand;
if (standItem != null)
{
string patchName = txtPatchName.Text.Trim();
if (string.IsNullOrWhiteSpace(patchName))
{
txtPatchName.Text = $"任务-{standItem.StandName}";
}
}
}
//----------------------------------------------------------
}
}