add -条码绑定成品扫码统计图表

dev
liuwf 1 year ago
parent e58258da2e
commit 322a012af7

@ -296,26 +296,6 @@
更新时间
</summary>
</member>
<member name="P:Admin.Core.Model.BaseBomInfo.FactoryCode">
<summary>
工厂编码
</summary>
</member>
<member name="P:Admin.Core.Model.BaseBomInfo.Sort">
<summary>
排序
</summary>
</member>
<member name="P:Admin.Core.Model.BaseBomInfo.Vbeln">
<summary>
销售凭证
</summary>
</member>
<member name="P:Admin.Core.Model.BaseBomInfo.Vbpos">
<summary>
销售单据项目
</summary>
</member>
<member name="P:Admin.Core.Model.BaseBomInfo.Ancestors">
<summary>
祖级列表
@ -431,6 +411,11 @@
是否已下达计划0-是1-否)
</summary>
</member>
<member name="P:Admin.Core.Model.Model_New.BaseTest.result">
<summary>
接收从条码系统获取的校验字符串
</summary>
</member>
<member name="T:Admin.Core.Model.Model_New.MaterialCompletion">
<summary>
物料完成记录
@ -2896,6 +2881,21 @@
部门名称
</summary>
</member>
<member name="T:Admin.Core.Model.ViewModels.CodeBindCharts">
<summary>
条码绑定扫描类型统计
</summary>
</member>
<member name="P:Admin.Core.Model.ViewModels.CodeBindCharts.BoxName">
<summary>
箱体名称
</summary>
</member>
<member name="P:Admin.Core.Model.ViewModels.CodeBindCharts.Amount">
<summary>
数量
</summary>
</member>
<member name="T:Admin.Core.Model.ViewModels.EnterLibView">
<summary>
泡前库入库相信展示

@ -1,5 +1,6 @@
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using Admin.Core.Model.ViewModels;
using System.Collections.Generic;
using System.Threading.Tasks;
@ -15,9 +16,9 @@ namespace Admin.Core.IRepository
/// 查询第一条数据
/// </summary>
/// <returns></returns>
Task<CodeBindingRecord> FirstAsync();
public Task<CodeBindingRecord> FirstAsync();
}
}

@ -1,5 +1,6 @@
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.ViewModels;
using System.Collections.Generic;
using System.Threading.Tasks;
@ -11,6 +12,11 @@ namespace Admin.Core.IService
public interface ICodeBindingRecordServices : IBaseServices<CodeBindingRecord>
{
/// <summary>
/// 查询图表信息,扫描产品类型统计
/// </summary>
public Task<List<CodeBindCharts>> QueryCharts();
/// <summary>
/// 查询第一条数据
/// </summary>

@ -19,8 +19,12 @@ namespace Admin.Core.IService
/// <summary>
/// 条码系统入库接口
/// string Barcode 产品条码编号
/// string Created_By 条码系统用户账号
/// string Order_number 生产订单号(正常订单和返工单要分别传输)
/// int Order_type 正常订单为1 返工单为3
/// </summary>
public Task<string> SaveBarcodeInfo();
public Task<string> SaveBarcodeInfo(string Barcode, string Created_By, string Order_number, int Order_type);
}

@ -0,0 +1,26 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Admin.Core.Model.ViewModels
{
/// <summary>
/// 条码绑定扫描类型统计
/// </summary>
[SugarTable("CODE_BINDING", "AUCMA_SCADA")]
public class CodeBindCharts
{
/// <summary>
/// 箱体名称
/// </summary>
public string BoxName { get; set; }
/// <summary>
/// 数量
/// </summary>
public double Amount { get; set; }
}
}

@ -1,5 +1,6 @@
using Admin.Core.IRepository;
using Admin.Core.Model;
using Admin.Core.Model.ViewModels;
using SqlSugar;
using System;
using System.Collections.Generic;
@ -17,9 +18,6 @@ namespace Admin.Core.Repository
{
}
/// <summary>
/// 查询第一条数据
/// </summary>

@ -1,6 +1,9 @@
using Admin.Core.IRepository;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using Admin.Core.Model.ViewModels;
using Consul;
using log4net;
using Microsoft.IdentityModel.Logging;
using SqlSugar;
@ -27,6 +30,16 @@ namespace Admin.Core.Service
}
/// <summary>
/// 查询图表信息,扫描产品类型统计
/// </summary>
public async Task<List<CodeBindCharts>> QueryCharts()
{
List<CodeBindCharts> list = null;
var _db = this.BaseDal.Db;
list = await _db.Ado.SqlQueryAsync<CodeBindCharts>("SELECT BOX_NAME as BoxName,COUNT(*) as Amount FROM CODE_BINDING GROUP BY BOX_NAME");
return list;
}
/// <summary>
/// 时间段条件查询

@ -46,14 +46,19 @@ namespace Admin.Core.Service
/// <summary>
/// 条码系统入库接口
/// string Barcode 产品条码编号
/// string Created_By 条码系统用户账号
/// string Order_number 生产订单号(正常订单和返工单要分别传输)
/// int Order_type 正常订单为1 返工单为3
/// </summary>
public async Task<string> SaveBarcodeInfo()
public async Task<string> SaveBarcodeInfo(string Barcode,string Created_By,string Order_number,int Order_type)
{
try
{
// 保存业务
var _db = baseRepository.Db;
var infos = await _db.Ado.SqlQueryAsync<BaseTest>($"");
return infos.FirstOrDefault().result;
}
catch (Exception ex)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

@ -25,7 +25,9 @@
<ItemGroup>
<None Remove="appsettings.json" />
<None Remove="Assets\Images\background.jpg" />
<None Remove="Assets\Images\Green.png" />
<None Remove="Assets\Images\Icon.png" />
<None Remove="Assets\Images\logo.png" />
<None Remove="Assets\Images\Newlog.png" />
<None Remove="Assets\Images\Red.png" />
@ -46,11 +48,13 @@
</ItemGroup>
<ItemGroup>
<Resource Include="Assets\Images\background.jpg" />
<Resource Include="Assets\Images\Icon.png" />
<Resource Include="Assets\Images\Newlog.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Assets\Images\Green.png" />
<DesignDataWithDesignTimeCreatableTypes Include="Assets\Images\Green.png" />
<Resource Include="Assets\Images\logo.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Resource>

@ -26,6 +26,9 @@ using System.Collections.Generic;
using NPOI.HSSF.Record;
using Aucma.Core.PLc;
using SqlSugar;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Admin.Core.Model.ViewModels;
using System.Windows.Media;
/*
*
*/
@ -36,7 +39,7 @@ namespace Aucma.Core.CodeBinding.ViewModels
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(IndexPageViewModel));
private readonly ICodeBindingRecordServices? _codeBindingRecordServices;
private readonly IBaseBomInfoServices? _baseBomInfoServices;
private static string code1Str = string.Empty;
public IndexPageViewModel()
{
_codeBindingRecordServices = App.ServiceProvider.GetService<ICodeBindingRecordServices>();
@ -54,6 +57,13 @@ namespace Aucma.Core.CodeBinding.ViewModels
#region 加载DataGrid数据
private async void LoadData()
{
// 赋值
Code1 = "B236000007811023002";
Code1Time = "2023-10-23 16:05:23";
Code2 = "B236000007811023002";
Code2Time = "2023-10-23 16:05:23";
BindingInfo = "条码[B236000007811023002]和SN条码[B236000007811023002]绑定成功!";
LoadCharts();
List<CodeBindingRecord> records = null;
records = await _codeBindingRecordServices.QueryAsync(x => x.BoxCode != null && x.RecordTime1 >= System.DateTime.Now.AddDays(-3), "RECORD_TIME1 desc");
if (records != null)
@ -69,6 +79,26 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
}
// 之后修改为统计近一天或者几天
private async void LoadCharts()
{
List<CodeBindCharts> list = await _codeBindingRecordServices.QueryCharts();
// 图表赋值
ChartValues<double> achievement = new ChartValues<double>();
List<string> chartList = new List<string>();
foreach(CodeBindCharts item in list)
{
achievement.Add(item.Amount);
chartList.Add(item.BoxName);
}
var column = new ColumnSeries();
column.DataLabels = true;
column.Title = "型号";
column.Values = achievement;
ModelStatistics.Add(column);
ProductionHourList = chartList;
}
// 测试方法
private async void add()
{
@ -148,6 +178,32 @@ namespace Aucma.Core.CodeBinding.ViewModels
OnPropertyChanged(nameof(BindingInfo));
}
}
#region 日产量柱状图X轴日期
/// <summary>
/// 日产量柱状图X轴日期
/// </summary>
private List<string> productionHourList;
public List<string> ProductionHourList
{
get { return productionHourList; }
set { productionHourList = value; }
}
#endregion
#region 型号统计柱状图
/// <summary>
/// 型号统计柱状图
/// </summary>
private SeriesCollection modelStatistics = new SeriesCollection();
public SeriesCollection ModelStatistics
{
get { return modelStatistics; }
set { modelStatistics = value; }
}
#endregion
#endregion
#region 初始化datagrid
@ -208,26 +264,28 @@ namespace Aucma.Core.CodeBinding.ViewModels
DateTime time = System.DateTime.Now;
string strTime = time.ToString();
// 1.刷新界面条码信息
// 全局变量赋值SN码扫描后使用
code1Str = code1;
RefreshCode1(code1, strTime);
#region
// 2.创建任务更新数据库条码1
CodeBindingRecord codeRecord = new CodeBindingRecord();
codeRecord.BoxCode = code1;
codeRecord.BoxName = "去别的数据库查询";
// CodeBindingRecord codeRecord = new CodeBindingRecord();
// codeRecord.BoxCode = code1;
// codeRecord.BoxName = "去别的数据库查询";
//List<BaseBomInfo> bomInfo = await _baseBomInfoServices.QueryAsync(x => x.MaterialCode == code);
//string aa = bomInfo.FirstOrDefault().MaterialName;
codeRecord.RecordTime1 = time;
int a = await _codeBindingRecordServices.AddAsync(codeRecord);
// codeRecord.RecordTime1 = time;
// int a = await _codeBindingRecordServices.AddAsync(codeRecord);
// 页面刷新ListItems
//await Application.Current.Dispatcher.InvokeAsync(() =>
//{
// // 在 UI 线程上操作列表
// ListItems.Insert(0, new ReaderInfo() { No = codeRecord.ObjId, BoxCode = codeRecord.BoxCode, RecordTime = codeRecord.RecordTime1.ToString() });
//});
log.Info("条码1记录更新");
//log.Info("条码1记录更新");
#endregion
}
/// <summary>
/// 条码绑定,条码2处理
/// </summary>
@ -235,21 +293,30 @@ namespace Aucma.Core.CodeBinding.ViewModels
private async void receiveCode2(string code2)
{
log.Info("进入条码2处理函数receiveCode1,code2:" + code2);
// 1.数据库匹配条码1并绑定
// 取之前读出来的code1
string code1 = code1Str;
if (string.IsNullOrEmpty(code1))
{
log.Error("code1还未扫码");
return;
}
// 1.数据库查询各个工序质检结果,不合格报警
// 查询条码2为null的最新记录
List<CodeBindingRecord> list = await _codeBindingRecordServices.QueryByTime();
// 2.查询条码绑定记录表绑定SN码
List<CodeBindingRecord> list = await _codeBindingRecordServices.QueryAsync(x=> x.BoxCode==code1);
CodeBindingRecord record = list.FirstOrDefault();
record.ProductCode = code2;
record.RecordTime2 = System.DateTime.Now;
record.BindingResult = "成功";
// List<CodeBindingRecord> list = await _codeBindingRecordServices.QueryByTime();
// CodeBindingRecord record = list.FirstOrDefault();
record.ProductCode = code2;
record.RecordTime2 = System.DateTime.Now;
record.BindingResult = "成功";
await _codeBindingRecordServices.UpdateAsync(record);
// 2.刷新界面信息
RefreshCode2(record);
// 产品入库
// 3.下发plc放行信号
SendPlcPass();
code1Str = string.Empty;
}

@ -87,11 +87,11 @@ namespace Aucma.Core.CodeBinding.ViewModels
}
else if (string.IsNullOrEmpty(result.BeginTime))
{
list = await _codeBindingRecordServices.QueryAllByTime(result.BeginTime, null);
list = await _codeBindingRecordServices.QueryAllByTime(null, result.EndTime);
}
else if (string.IsNullOrEmpty(result.EndTime))
{
list = await _codeBindingRecordServices.QueryAllByTime(null, result.EndTime);
list = await _codeBindingRecordServices.QueryAllByTime(result.BeginTime, null);
}
else
{

@ -8,7 +8,7 @@
mc:Ignorable="d"
d:DesignHeight="800"
d:DesignWidth="1000" >
<UserControl.Resources>
<Style x:Key="DataGridTextColumnCenterSytle" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
@ -20,93 +20,97 @@
</UserControl.Resources>
<Grid Margin="1 5 1 0" >
<Grid.RowDefinitions>
<RowDefinition Height="0.1*"/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<!--扫描信息-->
<Border Grid.Row="0" BorderBrush="#0288d1" BorderThickness="1" CornerRadius="5" Background="Transparent" Margin="3,1,5,5">
<Border Grid.Row="0" BorderThickness="1" BorderBrush="#0288d1" CornerRadius="4" Background="Transparent" Width="100" Height="30" VerticalAlignment="Top" HorizontalAlignment="Center">
<TextBlock Text="扫描信息" FontSize="20" FontWeight="Bold" Foreground="#0288d1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<Border Grid.Row="1" BorderBrush="#0288d1" BorderThickness="1" CornerRadius="5" Background="Transparent" Margin="3,1,5,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.3*"/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderThickness="1" BorderBrush="#0288d1" CornerRadius="4" Background="Transparent" Width="100" Height="30" VerticalAlignment="Top" HorizontalAlignment="Center">
<TextBlock Text="扫描信息" FontSize="20" FontWeight="Bold" Foreground="#0288d1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<Grid Grid.Row="1" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="5*"/>
</Grid.ColumnDefinitions>
<Label Content="条码信息" HorizontalAlignment="Right" Margin="139,0,0,0" VerticalAlignment="Center" Width="67"/>
<Label Content="SN码信息" HorizontalAlignment="Right" Margin="139,0,0,0" Grid.Row="1" VerticalAlignment="Center" Width="67"/>
<Border Grid.Column="1" HorizontalAlignment="Left" BorderBrush="#0288d1" BorderThickness="1" Height="23" Width="208" Grid.ColumnSpan="2">
<TextBlock Grid.Column="1" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Code1}" VerticalAlignment="Center" Height="23" Width="194"/>
</Border>
<Border Margin="208 0 0 0" BorderBrush="#0288d1" BorderThickness="1" Height="23" Width="208" Grid.ColumnSpan="2" >
<TextBlock Grid.Column="1" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Code1Time}" VerticalAlignment="Top" Height="23" Width="194"/>
</Border>
<Border Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" BorderBrush="#0288d1" BorderThickness="1" Height="23" Width="208" Grid.ColumnSpan="2" >
<TextBlock Grid.Column="1" HorizontalAlignment="Center" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Code2}" VerticalAlignment="Center" Width="188"/>
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" >
<Label Content="条码信息 " FontSize="15" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" Text="{Binding Code1}" Width="200" FontSize="15" Foreground="#FFFFFF"/>
<!--Text="{Binding Code1}"-->
<TextBox Text="{Binding Code1Time}" Width="200" Foreground="#FFFFFF" />
<!--Text="{Binding Code1Time}"-->
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" >
<Label Content="SN码信息 " FontSize="15" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" Text="{Binding Code2}" Width="200" FontSize="15" Foreground="#FFFFFF"/>
<!--Text="{Binding Code2}"-->
<TextBox Text="{Binding Code2Time}" Width="200" Foreground="#FFFFFF"/>
<!--Text="{Binding Code2Time}"-->
</StackPanel>
<Grid Grid.Row="2">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" >
<Label Content="绑定信息 " FontSize="15" Foreground="#FFFFFF"/>
<TextBox TextWrapping="Wrap" Text="{Binding BindingInfo}" Width="420" Height="150" FontSize="15" Foreground="#FFFFFF"/>
</StackPanel>
<!--Text="{Binding BindingInfo}"-->
</Grid>
</Grid>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="#0288d1" BorderThickness="0,0,0,1" CornerRadius="0" Background="Transparent" Margin="1,1,5,5" >
<TextBlock Text="扫描型号统计" FontSize="15" FontWeight="Bold" Foreground="#0288d1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<Border Grid.Row="1" Margin="208 0 0 0" BorderBrush="#0288d1" BorderThickness="1" Height="23" Width="208" Grid.ColumnSpan="2" >
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Code2Time}" VerticalAlignment="Top" Width="173"/>
<Border Grid.Row="1" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" >
<lvc:CartesianChart Series="{Binding ModelStatistics, UpdateSourceTrigger=PropertyChanged}" Margin="5" Foreground="White">
<lvc:CartesianChart.AxisX>
<lvc:Axis Labels="{Binding ProductionHourList}" FontSize="15"/>
</lvc:CartesianChart.AxisX>
<lvc:CartesianChart.AxisY>
<lvc:Axis FontSize="15">
</lvc:Axis>
</lvc:CartesianChart.AxisY>
</lvc:CartesianChart>
</Border>
</Grid>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="5*"/>
</Grid.ColumnDefinitions>
<Label Content="绑定信息" HorizontalAlignment="Right" Margin="153,30,0,0" VerticalAlignment="Top" Width="63"/>
<Border Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" Margin="0,30,0,0" Height="80" Width="460" BorderBrush="#0288d1" BorderThickness="1" Grid.ColumnSpan="2" >
<TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="0,0,0,0" Text="{Binding BindingInfo}" TextWrapping="Wrap" Height="93" Width="392"/>
</Border>
</Grid>
</Grid>
</Border>
<!--日志信息-->
<Border Grid.Row="0" Grid.Column="1" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="3,1,3,5">
</Border>
<!--扫描记录-->
<Border Grid.Row="1" Grid.ColumnSpan="2" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="3,1,3,5">
<Border Grid.Row="2" Grid.ColumnSpan="2" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="3,1,3,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="#0288d1" CornerRadius="0" Background="Transparent" Margin="1,1,5,5" >
<Border Grid.Row="0" BorderThickness="1" BorderBrush="#0288d1" CornerRadius="4" Background="Transparent" Width="100" Height="30" VerticalAlignment="Top" HorizontalAlignment="Center" >
<TextBlock Text="扫描纪录" FontSize="20" FontWeight="Bold" Foreground="#0288d1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<!--扫描纪录-->
<Border x:Name="ScanPanel" Grid.Row="1" Grid.Column="0" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="1,1,5,5">
<DataGrid Grid.Row="0" ItemsSource="{Binding ListItems}" Background="#00000000"
ColumnHeaderHeight="35"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0" AlternationCount="2"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True"
Foreground="Gray" >
Foreground="White" >
<!-- 表头剧中-->
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center">
</Setter>
<Setter Property="Background" Value="Transparent" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.CellStyle>

@ -28,6 +28,10 @@ namespace Aucma.Core.CodeBinding.Views
InitializeComponent();
this.DataContext = new IndexPageViewModel();
}
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}

@ -5,54 +5,70 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
Background="#ffffff"
Title="澳柯玛生产控制系统"
MinHeight="700" MinWidth="1300" WindowState="Maximized"
WindowStartupLocation="CenterScreen"
>
<Border CornerRadius="5" >
Title="SCADA" Height="1080" Width="1920" Icon="/Assets/images/Icon.png"
WindowState="Maximized" WindowStyle="None" ResizeMode="NoResize" Topmost="True">
<Window.Background>
<ImageBrush ImageSource="/Assets/images/background.jpg" />
</Window.Background>
<Border Margin="5" Background="Transparent" CornerRadius="10" >
<Border.Effect>
<DropShadowEffect Color="Gray" ShadowDepth="0" BlurRadius="5" Opacity="0.3" Direction="0"></DropShadowEffect>
</Border.Effect>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="6*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="7*"/>
<RowDefinition Height="0.7*"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<materialDesign:ColorZone Padding="15 10 0 0"
materialDesign:ElevationAssist.Elevation="Dp4"
DockPanel.Dock="Top"
Mode="PrimaryMid">
<DockPanel Height="60" >
<Image Height="46" VerticalAlignment="Top" Source="/Assets/Images/Newlog.png" />
<StackPanel Height="50" Margin="15 0 0 0" >
<StackPanel Orientation="Horizontal" >
<TextBlock Text="澳柯玛生产控制系统" Foreground="White" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Border Grid.Row="0" BorderBrush="Red" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="2,2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="7*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<!--<StackPanel Grid.Row="0" >
-->
<!--<TextBlock Text="AUCMA" FontSize="50" Foreground="Red" FontWeight="Bold"/>
<TextBlock Text="澳云数智" FontSize="30" Foreground="White" FontWeight="Bold"/>-->
<!--
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="AUCMA" FontSize="50" Foreground="Red" FontWeight="Bold"/>
</StackPanel>
<StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="澳云数智" FontSize="30" Foreground="White" FontWeight="Bold"/>
</StackPanel>
</StackPanel>
<!--右侧信息-->
<DockPanel HorizontalAlignment="Right" VerticalAlignment="Stretch">
<TextBlock x:Name="TestTB" Text="白班" VerticalAlignment="Center" Foreground="White" FontSize="15" Margin="10,0"/>
<TextBlock Text="|" VerticalAlignment="Center" Foreground="White" FontSize="15" Margin="10,0"/>
<TextBlock x:Name="loginUser" Text="李四" VerticalAlignment="Center" Foreground="White" FontSize="15" Margin="10,0"/>
</DockPanel>
</DockPanel>
</materialDesign:ColorZone>
</DockPanel>
</Grid>
</StackPanel>-->
<StackPanel Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="澳柯玛生产控制系统" FontSize="50" Foreground="White" FontWeight="Bold"/>
</StackPanel>
<DockPanel Grid.Row="1">
<!--<ScrollViewer x:Name="MainScrollViewer"
materialDesign:ScrollViewerAssist.IsAutoHideEnabled="True">-->
<ContentControl Content="{Binding UserContent}" Height="auto" />
<!--</ScrollViewer>-->
</DockPanel>
<StackPanel Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Right">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="白班" FontSize="25" Foreground="White" FontWeight="Bold" Margin="0,0,30,0"/>
<TextBlock Grid.Column="1" Text="|" FontSize="25" Foreground="White" FontWeight="Bold" Margin="0,0,30,0"/>
<TextBlock Grid.Column="2" Text="SCADA" FontSize="25" Foreground="White" FontWeight="Bold" Margin="0,0,10,0"/>
</Grid>
</StackPanel>
</Grid>
</Border>
<Border Grid.Row="1" BorderBrush="Red" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="2,25,2,2">
<ContentControl Content="{Binding UserContent}"/>
</Border>
<DockPanel Grid.Row="2" Margin="5 0 5 3">
<Border BorderBrush="#0288d1" BorderThickness="1" CornerRadius="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom">

@ -125,11 +125,12 @@
<RowDefinition Height="8*"/>
</Grid.RowDefinitions>
<WrapPanel Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock Text="开始时间" Margin="10 0" Foreground="Gray" FontSize="15" VerticalAlignment="Center"/>
<TextBlock Text="开始时间" Margin="10 0" Foreground="White" FontSize="15" VerticalAlignment="Center"/>
<DatePicker
x:Name="BeginTime"
Width="200" Margin="10 0" Text="2023-10-09 00:00"
materialDesign:CalendarAssist.IsHeaderVisible="False"
Foreground="DarkBlue"
materialDesign:HintAssist.Hint="开始日期">
<DatePicker.SelectedDate>
<Binding
@ -141,10 +142,10 @@
</DatePicker.SelectedDate>
</DatePicker>
<TextBlock Text="结束时间" Margin="10 0" Foreground="Gray" FontSize="15" VerticalAlignment="Center"/>
<TextBlock Text="结束时间" Margin="10 0" Foreground="White" FontSize="15" VerticalAlignment="Center"/>
<DatePicker
x:Name="EndTime" Margin="10 0" Text="2023-10-09"
Width="200"
Width="200" Foreground="DarkBlue"
materialDesign:CalendarAssist.IsHeaderVisible="False"
materialDesign:HintAssist.Hint="结束日期">
<DatePicker.SelectedDate>
@ -168,22 +169,20 @@
</Button>
</WrapPanel>
<UniformGrid Grid.Row="1">
<DataGrid ItemsSource="{Binding ListItems}" Background="#00000000"
ColumnHeaderHeight="35"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0"
<DataGrid ItemsSource="{Binding ListItems}" Background="Transparent"
FontSize="15" ColumnHeaderHeight="35"
RowHeight="31" AutoGenerateColumns="False" RowHeaderWidth="0" AlternationCount="2"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True"
Foreground="Gray" >
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False"
Foreground="White">
<!-- 表头剧中-->
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center">
</Setter>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="Transparent" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

@ -27,6 +27,8 @@ using System.Data.Common;
using static Org.BouncyCastle.Math.EC.ECCurve;
using Admin.Core.IRepository;
using Admin.Core.Service;
using System.Windows.Forms.VisualStyles;
using Microsoft.IdentityModel.Logging;
/*
*
@ -40,18 +42,70 @@ namespace Aucma.Core.ProductOffLine.ViewModels
private readonly IBaseOrderInfoServices _baseOrderInfoServices;
private readonly IProductPlanInfoServices? _productPlanInfoServices;
private readonly IProductOffLineServices ? _productOffLineServices;
System.Timers.Timer timer = new System.Timers.Timer(1000);
int a = 0;
public IndexPageViewModel()
{
_productOffLineServices = App.ServiceProvider.GetService<IProductOffLineServices>();
_baseOrderInfoServices = App.ServiceProvider.GetService<IBaseOrderInfoServices>();
_productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
_productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
MvCodeHelper.ReceiveCodeEvent += ReceiveCode;
test33();
// test33();
StartPlcTimer();
InitEveryDayMethod();
//*** test2();
test2();
}
/// <summary>
/// 开启plc读取定时器
/// </summary>
private void StartPlcTimer()
{
if (!timer.Enabled)
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(readPlcStatus);
timer.AutoReset = true;
timer.Enabled = false;
timer.Start();
}
}
/// <summary>
/// 定时读取plc扫码信号放行完成反馈信号
/// </summary>
private void readPlcStatus(object source, System.Timers.ElapsedEventArgs e)
{
startGrab();
}
/// <summary>
/// 读取开启扫码信号
/// </summary>
private void startGrab()
{
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc"));
if (obj != null)
{
if (obj.plc.IsConnected)
{
// 扫码器1开启扫码信号
if (obj.plc.ReadInt32("D300") == 1)
{
obj.plc.WriteInt32("D300", 0);
// string code = MvCodeHelper.StartGrabByPlc(Appsettings.app("Middleware", "Scanner1", "Ip"));
//if (string.IsNullOrEmpty(code)) return;
string code = "11111";
ReceiveCode(code, 1);
}// 扫码器2开启扫码信号
else if (obj.plc.ReadInt32("D302") == 2)
{
obj.plc.WriteInt32("D302", 0);
//string code = MvCodeHelper.StartGrabByPlc(Appsettings.app("Middleware", "Scanner1", "Ip"));
//if (string.IsNullOrEmpty(code)) return;
string code = "11111";
ReceiveCode(code, 2);
}
}
}
}
#region 扫描信息
@ -222,84 +276,92 @@ namespace Aucma.Core.ProductOffLine.ViewModels
/// </summary>
/// <param name="code"></param>
/// <param name="direction">扫码器方向1左边分A库2右边分B库</param>
private async void ReceiveCode(string code, int scannerNo)
private async void ReceiveCode(string code, int scannerNo)
{
//1.扫描的SN条码去条码系统查询GET_BARCODE_DATA
//条码系统返回校验数据
//string result = _productOffLineServices.QueryChecked(code).Result
string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000000807@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01";
// 如果校验失败,下发报警
if("N".Equals(result.Substring(0,1)))
//1.扫描的SN条码去条码系统查询GET_BARCODE_DATA
//条码系统返回校验数据
// string result = await _productOffLineServices.QueryChecked(code);
string result = "Y@1104@16160030000000910780@000010034895@@ @000000@000000009000000807@BCD-160C,家电下乡@@BCD-160C@皓月白-家电下乡@161601300@160@1-00版@家电下乡产品@默认@2010-09-01";
// 如果校验失败,下发报警
if ("N".Equals(result.Substring(0, 1)))
{
sendPlcError();
// 刷新页面提示信息 result.Substring(2)
return;
}
//2.查询到的数据分割处理,结果中用"@"号分隔刷新页面显示并存到scada数据库(表待建)
string[] resultArray = result.Split('@');
// 输出结果
foreach (string item in resultArray)
{
Console.WriteLine(item);
}
//3.分垛A,B库逻辑(先左边读到的条码分A库右边读到的B库==>预留分库逻辑)
//4.下发plc信号
bool flag = SendPlcPass(scannerNo);
if (!flag)
{
log.Error("获取plc反馈失败");
return;
}
Console.WriteLine(code);
return;
//5.调条码系统保存入库接口SaveBarcodeInfo
string saveResult = await _productOffLineServices.SaveBarcodeInfo("333", "ILS_SORT","11111", 1);
if (string.IsNullOrEmpty(saveResult) ||"E".Equals(saveResult.Substring(0, 1)))
{
log.Error("条码系统保存接口出错");
sendPlcError();
// 刷新页面提示信息 result.Substring(2)
return;
}
//2.查询到的数据分割处理,结果中用"@"号分隔刷新页面显示并存到scada数据库(表待建)
string[] resultArray = result.Split('@');
// 输出结果
foreach (string item in resultArray)
{
Console.WriteLine(item);
}
//3.调条码系统保存接口入库SaveBarcodeInfo
_productOffLineServices.SaveBarcodeInfo();
//4.更新mes数据库完成数量和时间(BASE_ORDERINFO,PRODUCT_PLANINFO) 注意:查询的字段可能需要修改,确保数据一致
//6.更新mes数据库完成数量和时间(BASE_ORDERINFO,PRODUCT_PLANINFO) 注意:查询的字段可能需要修改,确保数据一致
//4.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理
//6.1截取订单号去查询更新BASE_ORDERINFO,全放到service处理
string orderCode = "11215484";
List<BaseOrderInfo> orders = await _baseOrderInfoServices.QueryAsync(x => x.OrderCode == orderCode);
List<BaseOrderInfo> orders = await _baseOrderInfoServices.QueryAsync(x => x.OrderCode == orderCode);
BaseOrderInfo order = orders.FirstOrDefault();
if (order.CompleteAmount == 0)
{
order.CompleteAmount++;
order.BeginDate = DateTime.Now;
}
if(order.CompleteAmount==order.OrderAmount)
if (order.CompleteAmount == order.OrderAmount)
{
order.EndDate = DateTime.Now;
}
order.UpdatedTime = DateTime.Now;
_baseOrderInfoServices.UpdateAsync(order);
//4.2根据订单号去更新PRODUCT_PLANINFO
List<ProductPlanInfo> productInfos =await _productPlanInfoServices.QueryAsync(x => x.OrderCode == orderCode);
//6.2根据订单号去更新PRODUCT_PLANINFO
List<ProductPlanInfo> productInfos = await _productPlanInfoServices.QueryAsync(x => x.OrderCode == orderCode);
ProductPlanInfo productInfo = productInfos.FirstOrDefault();
if (productInfo.CompleteAmount == 0)
{
productInfo.CompleteAmount++;
productInfo.BeginTime = DateTime.Now;
}
if(productInfo.CompleteAmount==productInfo.PlanAmount)
if (productInfo.CompleteAmount == productInfo.PlanAmount)
{
productInfo.EndTime = DateTime.Now;
}
productInfo.UpdatedTime = DateTime.Now;
await _productPlanInfoServices.UpdateAsync(productInfo);
//5.分垛A,B库逻辑(先左边读到的条码分A库右边读到的B库==>预留分库逻辑)
//6.下发plc信号
SendPlcPass(scannerNo);
}
#region plc交互
// private SemaphoreSlim semaphore = new SemaphoreSlim(0);
private SemaphoreSlim semaphore = new SemaphoreSlim(0);
/// <summary>
/// 下发plc放行信号,根据接收到的scannerNo不同两条道的plc信号地址也不同
/// </summary>
/// <param name="materialType"></param>
private bool SendPlcPass(int scannerNo)
private bool SendPlcPass(int scannerNo)
{
bool result = false;
try
{
{
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc"));
if (obj != null)
{
@ -322,7 +384,7 @@ namespace Aucma.Core.ProductOffLine.ViewModels
// 等待plc反馈信号
waitPlcSignal(scannerNo);
// semaphore.Wait();
// semaphore.Wait();
result = true;
}
else
@ -349,12 +411,9 @@ namespace Aucma.Core.ProductOffLine.ViewModels
{
try
{
lock (string.Empty)
{
bool isFlag = true;
var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("成品下线Plc"));
Task.Run(() =>
{
if (obj != null && obj.plc.IsConnected)
{
do
@ -385,17 +444,14 @@ namespace Aucma.Core.ProductOffLine.ViewModels
}
Thread.Sleep(1000);
} while (isFlag);
// 释放信号量
// semaphore.Release();
// 释放信号量
//semaphore.Release();
}
else
{
log.Info("成品下线plc连接失败");
}
});
}
}
catch (Exception ex)
{
@ -465,9 +521,12 @@ namespace Aucma.Core.ProductOffLine.ViewModels
Task.Run(() =>
{
Thread.Sleep(2000);
SendPlcPass(1);
Thread.Sleep(1000);
SendPlcPass(2);
ReceiveCode("123456", 1);
});
Task.Run(() =>
{
Thread.Sleep(3000);
ReceiveCode("654321", 2);
});
}
}

@ -78,7 +78,7 @@ namespace Aucma.Core.Scanner
#region 获取并创建设备列表
/// <summary>
/// 获取设备列表
/// 获取并创建设备列表
/// </summary>
public static void DeviceListAcq()
{
@ -260,12 +260,11 @@ namespace Aucma.Core.Scanner
#region (先不使用此方法,待测试) 通过plc触发单个扫码器接收条码处理业务
/// <summary>
/// 根据plc信号地址区分扫码器Ip,再获取指定扫码器条码
/// 根据plc信号地址区分扫码器Ip,再获取指定扫码器条码,返回条码
/// </summary>
/// <param name="ip"></param>
public async void StartGrabByPlc(string ip)
public static string StartGrabByPlc(string ip)
{
int nRet = MvCodeReader.MV_CODEREADER_OK;
try
{
foreach (KeyValuePair<MvCodeReader, string> hashmap in m_cMyDevices)
@ -273,28 +272,26 @@ namespace Aucma.Core.Scanner
// 1.找到指定相机 hashmap.Key
if (hashmap.Value == ip)
{
await Task.Run(() =>
{
// 2.打开相机开启扫描
int nRet = hashmap.Key.MV_CODEREADER_OpenDevice_NET();//打开设备
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
log.Error("打开扫码器设备失败,销毁设备,ip:" + ip);
hashmap.Key.MV_CODEREADER_DestroyHandle_NET();
return ;
return null;
}
// ch:设置触发模式为off || en:set trigger mode as off
if (MvCodeReader.MV_CODEREADER_OK != hashmap.Key.MV_CODEREADER_SetEnumValue_NET("TriggerMode", 0))
{
log.Error("设置扫码器设备触发模式失败ip:" + ip);
return;
return null;
}
// ch:开启抓图 | en:start grab
nRet = hashmap.Key.MV_CODEREADER_StartGrabbing_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
log.Error("设置扫码器设备开启抓图失败ip:" + ip);
return;
return null;
}
// 3.开启抓图
int nCount = 0;
@ -320,6 +317,7 @@ namespace Aucma.Core.Scanner
// string strCode = System.Text.Encoding.Default.GetString(stBcrResult.stBcrInfoEx2[i].chCode);
string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode);
log.Info("bIsValidUTF8:: Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]");
return null;
}
else
{
@ -332,39 +330,17 @@ namespace Aucma.Core.Scanner
log.Info("相机ip:" + hashmap.Value + " Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode + "]");
if (!string.IsNullOrEmpty(strCode))
{
// 处理业务
// 扫码器1处理扫码器1的业务
if (ip.Equals(Appsettings.app("Middleware", "Scanner1", "Ip")))
{
#region 条码绑定业务处理
ReceiveCode1Event?.Invoke(strCode);
#endregion
}
else if (ip.Equals(Appsettings.app("Middleware", "Scanner2", "Ip"))) // 扫码器2处理扫码器2的业务
{
#region 条码绑定业务处理
ReceiveCode2Event?.Invoke(strCode);
#endregion
}
// 获取到条码就跳出扫码
return;
// 关闭设备
CloseDevice(hashmap);
// 获取到条码就跳出扫码
return strCode ;
}
}
}
}
Thread.Sleep(800);
}
if (nCount == 10)
{
log.Error("扫码器扫码失败");
return;
}
});
// Thread.Sleep(500);
}
}
}
}
@ -372,12 +348,13 @@ namespace Aucma.Core.Scanner
{
log.Error("扫码异常:" + ex);
}
return null;
}
#endregion
#region 关闭设备
public static void CloseDevice()
#region 关闭所有设备
public static void CloseAllDevice()
{
try
{
@ -419,6 +396,35 @@ namespace Aucma.Core.Scanner
}
#endregion
#region 关闭指定设备
public static void CloseDevice(KeyValuePair<MvCodeReader, string> hashmap)
{
try
{
int nRet = MvCodeReader.MV_CODEREADER_OK;
// ch:停止抓图 | en:Stop grab image
nRet = hashmap.Key.MV_CODEREADER_StopGrabbing_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
log.Error("设备ip:" + hashmap.Value + "停止抓图失败");
Console.WriteLine("Stop grabbing failed{0:x8}", nRet);
return;
}
// ch:关闭设备 | en:Close device
nRet = hashmap.Key.MV_CODEREADER_CloseDevice_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
log.Error("设备ip:" + hashmap.Value + "关闭失败");
return;
}
}
catch (Exception ex)
{
log.Error("设备关闭异常:" + ex);
}
}
#endregion
#region 判断字符编码
/// <summary>

@ -22,7 +22,7 @@ namespace Aucma.Core.Scanner
catch (Exception ex)
{
log.Error(ex.Message);
MvCodeHelper.CloseDevice();
MvCodeHelper.CloseAllDevice();
await StartScannerAsync();
}

Loading…
Cancel
Save