添加项目文件。

This commit is contained in:
maqiao 2024-02-27 09:01:14 +08:00
commit 3f40aa0f35
227 changed files with 30976 additions and 0 deletions

63
.gitattributes vendored Normal file
View File

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

363
.gitignore vendored Normal file
View File

@ -0,0 +1,363 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd

13
Common/Common.csproj Normal file
View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Prism.Wpf" Version="8.1.97" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,75 @@
using Microsoft.Xaml.Behaviors;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace Common.ValidatRules
{
public class ValidationErrorMappingBehavior : Behavior<FrameworkElement>
{
#region Properties
public static readonly DependencyProperty ValidationErrorsProperty =
DependencyProperty.Register("ValidationErrors", typeof(ObservableCollection<ValidationError>),
typeof(ValidationErrorMappingBehavior), new PropertyMetadata(new ObservableCollection<ValidationError>()));
public ObservableCollection<ValidationError> ValidationErrors
{
get { return (ObservableCollection<ValidationError>)this.GetValue(ValidationErrorsProperty); }
set { this.SetValue(ValidationErrorsProperty, value); }
}
public static readonly DependencyProperty HasValidationErrorProperty = DependencyProperty.Register("HasValidationError",
typeof(bool), typeof(ValidationErrorMappingBehavior), new PropertyMetadata(false));
public bool HasValidationError
{
get { return (bool)this.GetValue(HasValidationErrorProperty); }
set { this.SetValue(HasValidationErrorProperty, value); }
}
#endregion
#region Constructors
public ValidationErrorMappingBehavior()
: base()
{ }
#endregion
#region Events & Event Methods
private void Validation_Error(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
this.ValidationErrors.Add(e.Error);
}
else
{
this.ValidationErrors.Remove(e.Error);
}
this.HasValidationError = this.ValidationErrors.Count > 0;
}
#endregion
#region Support Methods
protected override void OnAttached()
{
base.OnAttached();
Validation.AddErrorHandler(this.AssociatedObject, Validation_Error);
}
protected override void OnDetaching()
{
base.OnDetaching();
Validation.RemoveErrorHandler(this.AssociatedObject, Validation_Error);
}
#endregion
}
}

View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Prism.Wpf" Version="8.1.97" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,75 @@
using Microsoft.Xaml.Behaviors;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace DM_Weight.Commons.ValidatRules
{
public class ValidationErrorMappingBehavior : Behavior<FrameworkElement>
{
#region Properties
public static readonly DependencyProperty ValidationErrorsProperty =
DependencyProperty.Register("ValidationErrors", typeof(ObservableCollection<ValidationError>),
typeof(ValidationErrorMappingBehavior), new PropertyMetadata(new ObservableCollection<ValidationError>()));
public ObservableCollection<ValidationError> ValidationErrors
{
get { return (ObservableCollection<ValidationError>)this.GetValue(ValidationErrorsProperty); }
set { this.SetValue(ValidationErrorsProperty, value); }
}
public static readonly DependencyProperty HasValidationErrorProperty = DependencyProperty.Register("HasValidationError",
typeof(bool), typeof(ValidationErrorMappingBehavior), new PropertyMetadata(false));
public bool HasValidationError
{
get { return (bool)this.GetValue(HasValidationErrorProperty); }
set { this.SetValue(HasValidationErrorProperty, value); }
}
#endregion
#region Constructors
public ValidationErrorMappingBehavior()
: base()
{ }
#endregion
#region Events & Event Methods
private void Validation_Error(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
this.ValidationErrors.Add(e.Error);
}
else
{
this.ValidationErrors.Remove(e.Error);
}
this.HasValidationError = this.ValidationErrors.Count > 0;
}
#endregion
#region Support Methods
protected override void OnAttached()
{
base.OnAttached();
Validation.AddErrorHandler(this.AssociatedObject, Validation_Error);
}
protected override void OnDetaching()
{
base.OnDetaching();
Validation.RemoveErrorHandler(this.AssociatedObject, Validation_Error);
}
#endregion
}
}

31
DM_Weight.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.3.32922.545
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DM_Weight", "DM_Weight\DM_Weight.csproj", "{439FA76B-F874-40DB-BAF2-E3647CD55B10}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DM_Weight.Commons", "DM_Weight.Commons\DM_Weight.Commons.csproj", "{CBB05319-9054-4D93-86B3-C9B4395CE909}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{439FA76B-F874-40DB-BAF2-E3647CD55B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{439FA76B-F874-40DB-BAF2-E3647CD55B10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{439FA76B-F874-40DB-BAF2-E3647CD55B10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{439FA76B-F874-40DB-BAF2-E3647CD55B10}.Release|Any CPU.Build.0 = Release|Any CPU
{CBB05319-9054-4D93-86B3-C9B4395CE909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CBB05319-9054-4D93-86B3-C9B4395CE909}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CBB05319-9054-4D93-86B3-C9B4395CE909}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CBB05319-9054-4D93-86B3-C9B4395CE909}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E50E8179-1102-41F1-92F5-2905C75898A6}
EndGlobalSection
EndGlobal

81
DM_Weight/App.config Normal file
View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<!-- 数据库连接字符串 -->
<!--<add name="database" connectionString="server=127.0.0.1;database=wpf_dm_program;userid=root;password=qq1223" />-->
<add name="database" connectionString="server=127.0.0.1;port=3306;database=xichang_db;userid=root;password=root" />
</connectionStrings>
<!--<runtime>
--><!--配置之后Appdomain.CurrentDomain.UnhandledException 事件的 IsTerminating 就变成了 false 啦!也就是说,程序并不会因为这次的异常而崩溃退出。--><!--
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>-->
<appSettings>
<!-- 设备id -->
<add key="machineId" value="DM1" />
<!--2023/7/13 药房代码 有则写无则空 -->
<add key="storage" value="" />
<!-- 登录模式 1单人登录2双人登录 -->
<add key="loginMode" value="2" />
<!-- 登录顺序,指定先登录的人的名称有效值只有在登录模式等于2时才会生效 发药人【operator】审核人【reviewer】 -->
<add key="firstLogin" value="operator" />
<!-- 按处方还药或者按取药记录还药 1:处方ReturnDrugWindow22药品ReturnDrugWindow-->
<add key="returnDrugMode" value="1" />
<!-- 自动退出时间单位秒为0时不自动退出 -->
<add key="autoExit" value="0"/>
<add key="gridConnectionString" value="MYSQL; Database=xichang_db; Password=root; Port=3306; Server=127.0.0.1; User=root;"/>
<!-- 查询处方是orderNo还是orderGroupNo -->
<add key="OrderNoName" value="orderNo" />
<!-- 后门耗材板地址 没有则填写0-->
<add key="DoorAddr" value="1" />
<!-- 是否有can总线串口-->
<add key="CanBusExsit" value="true" />
<!-- 单支抽屉储物箱有则写地址无则为0-->
<add key="StorageBoxAddr" value="1" />
<!-- 抽屉串口使用的协议232或者485 -->
<add key="DrawerProtocol" value="485" />
<!-- 抽屉串口的串口号 -->
<add key="DrawerPortPath" value="COM6" />
<!-- can总线串口的串口号 -->
<add key="CanBusPortPath" value="COM17" />
<!-- 条码枪串口的串口号 -->
<add key="ScanCodePortPath" value="COM8" />
<!-- 冰箱的串口号 -->
<add key="FridgePortPath" value="COM7" />
<!-- 抽屉串口的串口号 --><!--
<add key="DrawerPortPath" value="COM11" />
--><!-- can总线串口的串口号 --><!--
<add key="CanBusPortPath" value="COM12" />
--><!-- 条码枪串口的串口号 --><!--
<add key="ScanPortPath" value="COM7" />-->
<!-- 指纹机类型 1无屏幕2有屏幕 -->
<add key="machineType" value="2"/>
<!-- 指纹机号码 -->
<add key="machineNumber" value="1"/>
<!-- 指纹机ip -->
<add key="fingerIp" value="192.168.1.201"/>
<!-- 多处方取药 0:不启用 1启用-->
<add key="MultiOrder" value="0"/>
<!-- 多批次抽屉加药 0:不启用 1启用
启用channel_list记录库位信息 -->
<add key="MultiBatch" value="0"/>
<!-- 称重抽屉号 -->
<add key="WeightDrawerNumber" value="4,5,6,7"/>
<!--冰箱抽屉温度区间-->
<add key="temperatureRange" value="2-8"/>
<!--冰箱抽屉温度-->
<add key="temperatureValue" value="3.2"/>
<!--温度查询定时执行时间-->
<add key="Interval" value="60000"/>
<!--冰箱状态1关闭0打开-->
<add key="FridgeState" value="0"/>
<!--报警状态1关闭0打开-->
<add key="AlarmState" value="0"/>
</appSettings>
</configuration>

19
DM_Weight/App.xaml Normal file
View File

@ -0,0 +1,19 @@
<prism:PrismApplication x:Class="DM_Weight.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
d1p1:Ignorable="d"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:local="clr-namespace:DM_Weight"
xmlns:prism="http://prismlibrary.com/" Startup="PrismApplication_Startup_1">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="Indigo" SecondaryColor="Cyan" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</prism:PrismApplication>

278
DM_Weight/App.xaml.cs Normal file
View File

@ -0,0 +1,278 @@
using DM_Weight.Finger;
using DM_Weight.Port;
using DM_Weight.util.TabTip;
using DM_Weight.util;
using DM_Weight.ViewModels;
using DM_Weight.Views.Dialog;
using DM_Weight.Views;
using log4net.Config;
using Prism.Ioc;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using Prism.Unity;
using log4net;
using System.Windows.Interop;
using System.Windows.Threading;
using System.Timers;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace DM_Weight
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : PrismApplication
{
private readonly ILog logger = LogManager.GetLogger(typeof(App));
public App()
{
TabTipAutomation.IgnoreHardwareKeyboard = HardwareKeyboardIgnoreOptions.IgnoreAll;
TabTipAutomation.BindTo<TextBox>();
TabTipAutomation.BindTo<PasswordBox>();
}
protected override Window CreateShell()
{
//UI线程未捕获异常处理事件
this.DispatcherUnhandledException += OnDispatcherUnhandledException;
//Task线程内未捕获异常处理事件
TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;
//多线程异常
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
return Container.Resolve<MainWindow>();
}
void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
logger.Error($"发生错误:{e.Exception.Message}");
e.Handled = true;
}
void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
foreach (Exception item in e.Exception.InnerExceptions)
{
logger.Error($"异常类型:{item.GetType()}{Environment.NewLine}来自:{item.Source}{Environment.NewLine}异常内容:{item.Message}");
}
//将异常标识为已经观察到
e.SetObserved();
}
void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
logger.Error($"Unhandled exception.{e.ToString()}");
}
protected override void InitializeShell(Window shell)
{
base.InitializeShell(shell);
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// 注入日志
XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
//containerRegistry.RegisterInstance<ILog>(LogManager.GetLogger(""));
// 串口工具
containerRegistry.RegisterSingleton<PortUtil>();
// 指纹机工具
containerRegistry.RegisterSingleton<FingerprintUtil>();
// 组态屏工具
containerRegistry.RegisterSingleton<ScreenUtil>();
containerRegistry.Register<IDialogService, MaterialDialogService>();
// 主窗口
containerRegistry.Register<MainWindow>();
containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>();
// 分页
//containerRegistry.Register<Pagination>();
//containerRegistry.Register<PaginationViewModel>();
// 登录页面
containerRegistry.RegisterForNavigation<LoginWindow, LoginWindowViewModel>();
// 布局页面
containerRegistry.RegisterForNavigation<HomeWindow, HomeWindowViewModel>();
// 录入指纹模态框
containerRegistry.RegisterDialog<FingerprintDialog>();
containerRegistry.RegisterForNavigation<FingerprintDialog, FingerprintDialogViewModel>();
#region
// 处方取药页面
containerRegistry.RegisterForNavigation<OrderTakeDrugWindow, OrderTakeDrugWindowViewModel>();
// 处方取药模态框
containerRegistry.RegisterDialog<OrderTakeDialog>();
containerRegistry.RegisterForNavigation<OrderTakeDialog, OrderTakeDialogViewModel>();
// 调拨取药页面
containerRegistry.RegisterForNavigation<InvoiceOutWindow, InvoiceOutWindowViewModel>();
// 调拨取药模态框
containerRegistry.RegisterDialog<InvoiceTakeDialog>();
containerRegistry.RegisterForNavigation<InvoiceTakeDialog, InvoiceTakeDialogViewModel>();
// 抽屉取药页面
containerRegistry.RegisterForNavigation<DrawerTakeDrugWindow, DrawerTakeDrugWindowViewModel>();
// 自选取药模态框
containerRegistry.RegisterDialog<SelfTakeDialog>();
containerRegistry.RegisterForNavigation<SelfTakeDialog, SelfTakeDialogViewModel>();
// 自选取药页面
containerRegistry.RegisterForNavigation<SelfTakeDrugWindow, SelfTakeDrugWindowViewModel>();
//多处方取药
containerRegistry.RegisterForNavigation<MultiOrderTakeDrugWindow, MultiOrderTakeDrugWindowViewModel>();
containerRegistry.RegisterDialog<MultiOrderTakeDialog>();
containerRegistry.RegisterForNavigation<MultiOrderTakeDialog,MultiOrderTakeDialogViewModel>();
#endregion
#region
// 自选加药页面
containerRegistry.RegisterForNavigation<SelfAddWindow, SelfAddWindowViewModel>();
// 调拨加药页面
containerRegistry.RegisterForNavigation<InvoiceInWindow, InvoiceInWindowViewModel>();
// 调拨取药模态框
containerRegistry.RegisterDialog<InvoiceAddDialog>();
containerRegistry.RegisterForNavigation<InvoiceAddDialog, InvoiceAddDialogViewModel>();
// 抽屉加药页面
containerRegistry.RegisterForNavigation<DrawerAddDrugWindow, DrawerAddDrugWindowViewModel>();
// 自选加药模态框
containerRegistry.RegisterDialog<SelfAddDialog>();
containerRegistry.RegisterForNavigation<SelfAddDialog, SelfAddDialogViewModel>();
//多批次抽屉加药
containerRegistry.RegisterForNavigation<AddDrugControl, AddDrugControlViewModel>();
#endregion
#region
// 还药页面
containerRegistry.RegisterForNavigation<ReturnDrugWindow, ReturnDrugWindowViewModel>();
// 按记录归还药品模态框
containerRegistry.RegisterDialog<ReturnDrugDialog>();
containerRegistry.RegisterForNavigation<ReturnDrugDialog, ReturnDrugDialogViewModel>();
// 还药页面2
containerRegistry.RegisterForNavigation<ReturnDrugWindow2, ReturnDrugWindow2ViewModel>();
// 按处方归还药品模态框
containerRegistry.RegisterDialog<OrderReturnDialog>();
containerRegistry.RegisterForNavigation<OrderReturnDialog, OrderReturnDialogViewModel>();
// 还空瓶页面
containerRegistry.RegisterForNavigation<ReturnEmptyWindow, ReturnEmptyWindowViewModel>();
// 归还空瓶模态框
containerRegistry.RegisterDialog<ReturnEmptyDialog>();
containerRegistry.RegisterForNavigation<ReturnEmptyDialog, ReturnEmptyDialogViewModel>();
#endregion
#region
// 库存列表页面
containerRegistry.RegisterForNavigation<StockListWindow, StockListWindowViewModel>();
// 库位绑定模态框
containerRegistry.RegisterDialog<BindingChannelDialog>();
containerRegistry.RegisterForNavigation<BindingChannelDialog, BindingChannelDialogViewModel>();
//同一药品多批次库位绑定
containerRegistry.RegisterForNavigation<BindingChannelNewDialog, BindingChannelNewDialogViewModel>();
// 库存盘点页面
containerRegistry.RegisterForNavigation<CheckStockWindow, CheckStockWindowViewModel>();
// 药品列表页面
containerRegistry.RegisterForNavigation<DrugListWindow, DrugListWindowViewModel>();
// 称重标定页面
containerRegistry.RegisterForNavigation<BiaoDingWindow, BiaoDingWindowViewModel>();
#endregion
#region
// 用户管理页面
containerRegistry.RegisterForNavigation<UserManagerWindow, UserManagerWindowViewModel>();
// 编辑用户模态框
containerRegistry.RegisterDialog<EditUserDialog>();
containerRegistry.RegisterForNavigation<EditUserDialog, EditUserDialogViewModel>();
// 角色管理页面
containerRegistry.RegisterForNavigation<RoleManagerWindow, RoleManagerWindowViewModel>();
// 系统设置
containerRegistry.RegisterForNavigation<SettingWindow, SettingWindowViewModel>();
// 调试页面
containerRegistry.RegisterForNavigation<DebugWindow, DebugWindowViewModel>();
//主设置页面
containerRegistry.RegisterForNavigation<SettingMainWindow, SettingMainWindowViewModel>();
//冰箱抽屉设置页面
containerRegistry.RegisterForNavigation<FridgeWindow, FridgeWindowViewModel>();
#endregion
// 设备记录页面
containerRegistry.RegisterForNavigation<MachineRecordWindow, MachineRecordWindowViewModel>();
containerRegistry.RegisterForNavigation<ShowMessageDialog, ShowMessageDialogViewModel>();
}
private void PrismApplication_Startup(object sender, StartupEventArgs e)
{
//获取欲启动程序名
string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
//检查程序是否已经启动,已经启动则显示提示退出程序
if (System.Diagnostics.Process.GetProcessesByName(processName).Length > 1)
{
//系统在运行
RaiseOtherProcess();
Application.Current.Shutdown();
return;
}
}
private static void RaiseOtherProcess()
{
Process proc = Process.GetCurrentProcess();
foreach (Process otherProc in Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
{
if (proc.Id != otherProc.Id)
{
IntPtr hWnd = otherProc.MainWindowHandle;
if (IsIconic(hWnd))
{
ShowWindowAsync(hWnd, 9);
}
SetForegroundWindow(hWnd);
break;
}
}
}
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
private void PrismApplication_Startup_1(object sender, StartupEventArgs e)
{
//获取欲启动程序名
string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
//检查程序是否已经启动,已经启动则显示提示退出程序
if (System.Diagnostics.Process.GetProcessesByName(processName).Length > 1)
{
//系统在运行
RaiseOtherProcess();
Application.Current.Shutdown();
return;
}
}
}
}

10
DM_Weight/AssemblyInfo.cs Normal file
View File

@ -0,0 +1,10 @@
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

View File

@ -0,0 +1,35 @@
using DM_Weight.Converter;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace DM_Weight.Common
{
public class AddQuantityRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var addQuantity = value.ToString();
if(string.IsNullOrEmpty(addQuantity)) { return new ValidationResult(false,"数量不能为空"); }
bool flag = int.TryParse(addQuantity,out int iAddQuantity);
string tips = string.Empty;
if(flag)
{
if(iAddQuantity<=0)
{
tips = "添加数量不能小于0";
}
}
else
{
tips = "请输入正确数值";
}
flag=tips.Length > 0?false:true;
return new ValidationResult(flag,tips);
}
}
}

View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Common
{
/// <summary>
///
/// </summary>
public enum BoardTypeEnum
{
//物理隔断
separation = 1,
//单支计数
single = 2,
//管控药盒
box = 3,
//储物箱
storage = 4,
//智能显示
smart = 5,
//称重计数
weigh = 6,
//称重+管控药盒
weighBox=63,
//称重+智能显示+管控药盒
weighSmartBox = 653,
//冰箱抽屉
fridge=7
}
/// <summary>
/// 抽屉类型
/// </summary>
public enum DrawerTypeEnum
{
//与BoardType同类型抽屉
drawerTypeOne = 1,
//与BoardType同类型内置回收
drawerTypeTwo = 2,
//回收箱抽屉
recyle=3
}
}

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Common
{
public class CRC16MODBUS
{
/// Name: CRC-16/MODBUS x16+x15+x2+1
/// Poly: 0x8005
/// Init: 0xFFFF
/// Refin: true
/// Refout: true
/// Xorout: 0x0000
///******************************添加数据CRC16MODBUS校验位*******************************************
public static byte[] CrcModBus(byte[] buffer, int start = 0, int len = 0)
{
if (buffer == null || buffer.Length == 0) return null;
if (start < 0) return null;
if (len == 0) len = buffer.Length - start;
int length = start + len;
if (length > buffer.Length) return null;
ushort crc = 0xFFFF;// Initial value
for (int i = start; i < length; i++)
{
crc ^= buffer[i];
for (int j = 0; j < 8; j++)
{
if ((crc & 1) > 0)
crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005
else
crc = (ushort)(crc >> 1);
}
}
byte[] ret = BitConverter.GetBytes(crc);
//Array.Reverse(ret);
return ret;
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace DM_Weight.Common
{
public class CommonClass
{
//手动实现调用配置的逻辑 规避修改配置文件后不起作用的问题
public static string ReadAppSetting(string key)
{
string xPath = "/configuration/appSettings//add[@key='" + key + "']";
XmlDocument doc = new XmlDocument();
string exeFileName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
doc.Load(exeFileName + ".dll.config");
XmlNode node = doc.SelectSingleNode(xPath);
return node.Attributes["value"].Value;
}
public static void SaveAppSetting(string key,string value)
{
Configuration _configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
_configuration.AppSettings.Settings[key].Value = value;
_configuration.Save();
ConfigurationManager.RefreshSection(key);
}
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Common
{
public class PrismManager
{
///// <summary>
///// 主页面区域,主要呈现登录页及登录后页面
///// </summary>
//public static readonly string MainViewRegionName = "MainContent";
/// <summary>
/// 设置菜单页面跳转,主要呈现设置下子菜单
/// </summary>
public static readonly string SettingViewRegionName = "SettingViewContent";
///// <summary>
///// 主页面各菜单页
///// </summary>
//public static readonly string HomeViewRegionName = "HomeViewContent";
}
}

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Common
{
public class StaticClass
{
public static byte[] StrToHexByte(string hexString)
{
if (string.IsNullOrEmpty(hexString))
{
return null;
}
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0) hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
return returnBytes;
}
}
}

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DM_Weight.Port;
using log4net;
namespace DM_Weight.Common
{
public class Temperature
{
private readonly static ILog logger = LogManager.GetLogger(typeof(Temperature));
/// <summary>
/// 将收到的返回转换成具体温度数值
/// </summary>
/// <param name="receiveData"></param>
/// <returns></returns>
public static string GetResultWD(string receiveData)
{
try
{
string newStrWD = receiveData.Substring(10, 4);
logger.Info($"截取后数据newStrWD{newStrWD}");
int iWD = Convert.ToInt32(newStrWD, 16);
logger.Info($"截取后数据iWD{iWD}");
float fWD = 0;
if (iWD != 0)
{
fWD = iWD * 1.0f / 10;
}
logger.Info($"截取后数据fWD{fWD}");
string strRet = $"冰箱抽屉当前温度:{fWD}℃;";
return strRet;
}
catch (Exception ex)
{
logger.Info("GetResultWD异常", new Exception($"{ex.ToString()}"));
}
return "数据异常";
}
}
}

View File

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
namespace DM_Weight.Common
{
//设置冰箱温度规则
public class TemperatureRangeRule : ValidationRule
{
//冰箱温度设置区间为取自配置文件2~8度
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
bool flag = false;
string tips = string.Empty;
try
{
string[] rang = value.ToString().Split('-');
if (rang.Length >= 2)
{
bool bSRange = int.TryParse(rang[0], out int sRange);
bool bERange = int.TryParse(rang[1], out int eRange);
if (bSRange && bERange)
{
if (sRange < 2 || eRange > 8)
{
tips = "温度区间设置2-8度请检查输入";
return new ValidationResult(flag, tips);
}
else
{
flag = true;
}
}
else
{
tips = "请输入正确的数值";
return new ValidationResult(flag, tips);
}
}
else
{
tips = "请输入正确的数值";
return new ValidationResult(flag, tips);
}
return new ValidationResult(flag, tips);
}
catch (Exception ex)
{
tips = $"校验异常{ex.ToString()}";
return new ValidationResult(flag, tips);
}
}
}
}

View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
namespace DM_Weight.Common
{
//设置冰箱温度规则
public class TemperatureRule : ValidationRule
{
//冰箱温度设置区间为取自配置文件2~8度
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
bool flag = false;
string tips = string.Empty;
try
{
bool bValue = decimal.TryParse(value.ToString(), out decimal mValue);
if (!bValue)
{
tips = "请输入正确的数值";
return new ValidationResult(flag, tips);
}
decimal f = Math.Abs(mValue - (int)mValue);
if (f.ToString().Length > 3)
{
tips = "温度区间设置保留小数点后一位,请检查输入";
return new ValidationResult(flag, tips);
}
string[] temperatureRange = CommonClass.ReadAppSetting("temperatureRange").Split('-');
if (temperatureRange.Length > 0)
{
int iMin = int.Parse(temperatureRange[0]);
int iMax = int.Parse(temperatureRange[1]);
if (mValue < iMin || mValue > iMax)
{
tips = $"温度区间设置为{iMin}~{iMax}度,保留小数点后一位,请检查输入";
}
else
{
flag = true;
}
}
return new ValidationResult(flag, tips);
}
catch (Exception ex)
{
tips = $"校验异常{ex.ToString()}";
return new ValidationResult(flag, tips);
}
}
}
}

View File

@ -0,0 +1,43 @@
<UserControl x:Class="DM_Weight.Components.pagination.Pagination"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:DM_Weight.Components.pagination"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes">
<Grid>
<StackPanel Margin="0 6 20 6" HorizontalAlignment="Right" Orientation="Horizontal">
<TextBlock x:Name="InfoBlock" Padding="0 0 6 0" VerticalAlignment="Center" />
<Button
ToolTip="首页"
Style="{StaticResource MaterialDesignIconForegroundButton}"
Command="{x:Static local:Pagination.FirstCommand}"
Name="First"
Content="{materialDesign:PackIcon PageFirst}" />
<Button
ToolTip="上一页"
Style="{StaticResource MaterialDesignIconForegroundButton}"
Command="{x:Static local:Pagination.PrevCommand}"
Name="Prve"
Content="{materialDesign:PackIcon ChevronLeft}"/>
<TextBlock x:Name="CurrentPageText" Padding="6 0 6 0" VerticalAlignment="Center" />
<Button
ToolTip="下一页"
Style="{StaticResource MaterialDesignIconForegroundButton}"
Command="{x:Static local:Pagination.NextCommand}"
Name="Next"
Content="{materialDesign:PackIcon ChevronRight}"/>
<Button
ToolTip="末页"
Style="{StaticResource MaterialDesignIconForegroundButton}"
Command="{x:Static local:Pagination.EndCommand}"
Name="End"
Content="{materialDesign:PackIcon PageLast}" />
</StackPanel>
</Grid>
</UserControl>

View File

@ -0,0 +1,265 @@
using NetTaste;
using Prism.Commands;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
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.Navigation;
using System.Windows.Shapes;
namespace DM_Weight.Components.pagination
{
/// <summary>
/// Pagination.xaml 的交互逻辑
/// </summary>
public partial class Pagination : UserControl
{
public Pagination()
{
InitializeComponent();
ResetInfoText();
ResetCurrentPageText();
}
static Pagination()
{
InitializeCommands();
}
private static readonly Type _typeofSelf = typeof(Pagination);
private static void InitializeCommands()
{
FirstCommand = new RoutedCommand("First", _typeofSelf);
PrevCommand = new RoutedCommand("Prev", _typeofSelf);
NextCommand = new RoutedCommand("Next", _typeofSelf);
EndCommand = new RoutedCommand("End", _typeofSelf);
CommandManager.RegisterClassCommandBinding(_typeofSelf,
new CommandBinding(FirstCommand, OnFirstComman, OnCanFirstComman));
CommandManager.RegisterClassCommandBinding(_typeofSelf,
new CommandBinding(PrevCommand, OnPrevCommand, OnCanPrevCommand));
CommandManager.RegisterClassCommandBinding(_typeofSelf,
new CommandBinding(NextCommand, OnNextCommand, OnCanNextCommand));
CommandManager.RegisterClassCommandBinding(_typeofSelf,
new CommandBinding(EndCommand, OnEndCommand, OnCanEndCommand));
}
public static RoutedCommand FirstCommand { get; private set; }
private static void OnFirstComman(object sender, RoutedEventArgs e)
{
var ctrl = sender as Pagination;
ctrl.CurrentPage = 1;
}
private static void OnCanFirstComman(object sender, CanExecuteRoutedEventArgs e)
{
var ctrl = sender as Pagination;
e.CanExecute = ctrl.CurrentPage > 1;
}
public static RoutedCommand PrevCommand { get; private set; }
private static void OnPrevCommand(object sender, RoutedEventArgs e)
{
var ctrl = sender as Pagination;
ctrl.CurrentPage--;
}
private static void OnCanPrevCommand(object sender, CanExecuteRoutedEventArgs e)
{
var ctrl = sender as Pagination;
e.CanExecute = ctrl.CurrentPage > 1;
}
public static RoutedCommand NextCommand { get; private set; }
private static void OnNextCommand(object sender, RoutedEventArgs e)
{
var ctrl = sender as Pagination;
ctrl.CurrentPage++;
}
private static void OnCanNextCommand(object sender, CanExecuteRoutedEventArgs e)
{
var ctrl = sender as Pagination;
e.CanExecute = ctrl.CurrentPage < ctrl.PageCount;
}
public static RoutedCommand EndCommand { get; private set; }
private static void OnEndCommand(object sender, RoutedEventArgs e)
{
var ctrl = sender as Pagination;
ctrl.CurrentPage = ctrl.PageCount;
}
private static void OnCanEndCommand(object sender, CanExecuteRoutedEventArgs e)
{
var ctrl = sender as Pagination;
e.CanExecute = ctrl.CurrentPage < ctrl.PageCount;
}
// 默认当前页码
public static int DefaultCurrentPage = 1;
// 默认总条数
public static int DefaultTotalPages = 0;
// 默认每页条数列表
public static List<int> DefaultPageSizeList = new List<int> { 10, 20, 50, 100 };
// 是否显示页码条数信息
public static bool DefaultInfoTextIsEnabel = true;
// 默认每页条数
public static int DefaultPageSize = 10;
public static readonly DependencyProperty CurrentPageProperty = DependencyProperty
.Register("CurrentPage",
typeof(int),
typeof(Pagination),
new FrameworkPropertyMetadata(DefaultCurrentPage, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static readonly DependencyProperty PageSizeProperty = DependencyProperty
.Register("PageSize",
typeof(int),
typeof(Pagination),
new FrameworkPropertyMetadata(DefaultPageSize, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static readonly DependencyProperty TotalPagesProperty = DependencyProperty
.Register("TotalPages",
typeof(int),
typeof(Pagination),
new FrameworkPropertyMetadata(DefaultTotalPages, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnItemsSourceChanged)));
public static readonly DependencyProperty InfoTextIsEnabelProperty = DependencyProperty
.Register("InfoTextIsEnabel",
typeof(bool),
typeof(Pagination),
new FrameworkPropertyMetadata(DefaultInfoTextIsEnabel, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Pagination p = (Pagination)d;
p.ResetInfoText();
}
[Bindable(true)]
[Category("Appearance")]
public int CurrentPage
{
get { return (int)GetValue(CurrentPageProperty); }
set
{
SetValue(CurrentPageProperty, value);
if (InfoTextIsEnabel)
{
ResetInfoText();
}
ResetCurrentPageText();
}
}
//private static void OnCurrentPageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
//{
// Pagination p = d as Pagination;
// if (p != null)
// {
// Console.WriteLine(e.NewValue);
// }
//}
[Bindable(true)]
[Category("Appearance")]
public int PageSize
{
get { return (int)GetValue(PageSizeProperty); }
set
{
SetValue(PageSizeProperty, value);
if (InfoTextIsEnabel)
{
ResetInfoText();
}
ResetCurrentPageText();
}
}
[Bindable(true)]
[Category("Appearance")]
public int TotalPages
{
get { return (int)GetValue(TotalPagesProperty); }
set
{
SetValue(TotalPagesProperty, value);
if (InfoTextIsEnabel)
{
ResetInfoText();
}
ResetCurrentPageText();
}
}
public bool InfoTextIsEnabel
{
get { return (bool)GetValue(InfoTextIsEnabelProperty); }
set { SetValue(InfoTextIsEnabelProperty, value); }
}
public int PageCount
{
get => (int)Math.Ceiling((double)TotalPages / PageSize);
}
public void ResetInfoText()
{
this.Dispatcher.BeginInvoke(() =>
{
if (InfoTextIsEnabel)
{
if (TotalPages <= PageSize)
{
this.InfoBlock.Text = $"1-{TotalPages}/{TotalPages}";
if (TotalPages == 0)
{
this.InfoBlock.Text = $"0-{TotalPages}/{TotalPages}";
}
} else
{
this.InfoBlock.Text = ((CurrentPage - 1) * PageSize + 1) + "-" + (CurrentPage * PageSize > TotalPages ? TotalPages : CurrentPage * PageSize) + "/" + TotalPages;
}
} else
{
this.InfoBlock.Visibility = Visibility.Visible;
}
});
}
public void ResetCurrentPageText()
{
this.Dispatcher.BeginInvoke(() =>
{
this.CurrentPageText.Text = CurrentPage + "";
});
}
}
}

View File

@ -0,0 +1,81 @@
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace DM_Weight.Components.pagination
{
public class PaginationViewModel: BindableBase, IRegionMemberLifetime
{
public static readonly DependencyProperty PageSizeProperty = DependencyProperty
.Register("CurrentPage",
typeof(int),
typeof(Pagination),
new FrameworkPropertyMetadata(10));
// 每页条数
private int _pageSize = 10;
// 当前页码
private int _currentPage = 1;
// 总条数
private int _totalPages = 0;
public int PageSize { get=> _pageSize; set => SetProperty(ref _pageSize, value); }
public int CurrentPage { get => _currentPage; set => SetProperty(ref _currentPage, value); }
public int TotalPages { get => _totalPages; set => SetProperty(ref _totalPages, value); }
// 总页数
public int PageCount
{
get => (int)Math.Ceiling((double)TotalPages/ PageSize);
}
public string InfoText
{
get => ((CurrentPage - 1) * PageSize + 1) + "-" + (CurrentPage * PageSize > TotalPages ? TotalPages : CurrentPage * PageSize) + "/" + TotalPages;
}
public bool KeepAlive => false;
public DelegateCommand ToFirst
{
get => new(() =>
{
CurrentPage = 1;
});
}
public DelegateCommand ToPrve
{
get => new(() =>
{
CurrentPage -= 1;
});
}
public DelegateCommand ToNext
{
get => new(() =>
{
CurrentPage += 1;
});
}
public DelegateCommand ToEnd
{
get => new(() =>
{
CurrentPage = PageCount;
});
}
}
}

View File

@ -0,0 +1,122 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace DM_Weight.Converter
{
public class BiaoDingStatusConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool bValue=int.TryParse(value.ToString(),out int bStatus);
string param= parameter?.ToString();
//显示是否标定状态
if(bValue&& param.Equals("BiaoDingStatus"))
{
if(bStatus >= 1)
{
return "已标定";
}
else if (bStatus == 0)
{
return "待标定";
}
}
//标定按钮状态
if(bValue&&param.Equals("BiaoDingBtnFlag"))
{
if (bStatus == 0)
{
return true;
}
else
{
return false;
}
}
//标定按钮加载状态
if(bValue&&param.Equals("BiaoDingLoading"))
{
if(bStatus == 2)
{
return true;
}
else
{
return false;
}
}
//确认按钮是否显示
if(bValue&&param.Equals("ConfirmVisibi"))
{
if (bStatus == 3|| bStatus == 4)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
//确认按钮是否显示
if(bValue&&param.Equals("ConfirmIsEnabled"))
{
if (bStatus == 4)
{
return false;
}
else
{
return true;
}
}
//确认按钮加载状态
if(bValue&&param.Equals("ConfirmLoading"))
{
if(bStatus == 4)
{
return true;
}
else
{
return false;
}
}
//取消按钮是否显示
if(bValue&&param.Equals("CancelVisibi"))
{
if(bStatus !=0&&bStatus!=1)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
//添加数量是否可用
if(bValue&&param.Equals("AddQuantityEnabled"))
{
if(bStatus>0)
{
return false;
}
else
{
return true;
}
}
return "";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,147 @@
using DM_Weight.Common;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace DM_Weight.Converter
{
public class BoardTypeConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
int BoardType = int.Parse(value[0].ToString());
int DrawerType = int.Parse(value[1].ToString());
switch (BoardType)
{
case (Int32)BoardTypeEnum.separation:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "物理隔断";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "内置回收";
}
else
{
return "外置回收";
}
case (Int32)BoardTypeEnum.single:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "单支计数";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "计数回收(内置)";
}
else
{
return "计数回收(外置)";
}
case (Int32)BoardTypeEnum.box:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "管控药盒";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "药盒回收(内置)";
}
else
{
return "外置回收";
}
case (Int32)BoardTypeEnum.storage:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "储物箱";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "内置回收";
}
else
{
return "外置回收";
}
case (Int32)BoardTypeEnum.smart:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "智能显示";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "内置回收";
}
else
{
return "外置回收";
}
case (Int32)BoardTypeEnum.weigh:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "称重计数";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "称重回收(内置)";
}
else
{
return "计数回收(外置)";
}
case (Int32)BoardTypeEnum.weighSmartBox:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "称重计数药盒带标签";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "称重计数药盒标签回收(内置)";
}
else
{
return "计数回收(外置)";
}
case (Int32)BoardTypeEnum.weighBox:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "称重计数药盒";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "称重计数药盒回收(内置)";
}
else
{
return "计数回收(外置)";
}
case (Int32)BoardTypeEnum.fridge:
if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
{
return "冰箱抽屉";
}
else if (DrawerType == (Int32)DrawerTypeEnum.drawerTypeTwo)
{
return "冰箱回收(内置)";
}
else
{
return "冰箱回收(外置)";
}
}
return "";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace DM_Weight.Converter
{
/// <summary>
/// 标定页面抽屉按钮是否可用
/// </summary>
public class DrawerBtnVisiConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string[] strBtnNumber = ConfigurationManager.AppSettings["WeightDrawerNumber"]?.ToString().Split(',');
if(strBtnNumber.Contains(parameter.ToString()))
{
return true;
}
else
{
return false;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace DM_Weight.Converter
{
internal class DrawerSelectConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
int ButtonDrawerNo = int.Parse(value[0].ToString());
int SelectedDrawerNo = int.Parse(value[1].ToString());
return ButtonDrawerNo == SelectedDrawerNo;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using DM_Weight.Models;
namespace DM_Weight.Converter
{
public class GroupSumConverter : IValueConverter
{
#region
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var total = 0;
// DataGrid分组后对应的组及组内元素CollectionViewGroup.Items 类型是ReadOnlyObservableCollection<object>
if (value is ReadOnlyObservableCollection<object> items)
{
foreach (var item in items)
{
var de = item as ChannelStock;
total += de.Quantity;
}
}
return "总库存:" + total;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}

View File

@ -0,0 +1,27 @@
using DM_Weight.Common;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace DM_Weight.Converter
{
public class InputQuantityConverter : IValueConverter
{
public bool ReadOnlyValue { get; set; } = true;
public bool NotReadOnlyValue { get; set; } = false;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return int.Parse(value.ToString()) == (Int32)BoardTypeEnum.single || int.Parse(value.ToString()) == (Int32)BoardTypeEnum.weigh || int.Parse(value.ToString()) == (Int32)BoardTypeEnum.weighSmartBox ? ReadOnlyValue : NotReadOnlyValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows;
namespace DM_Weight.Converter
{
public class NullableToEnabelConverter : IValueConverter
{
public bool NullValue { get; set; } = false;
public bool NotNullValue { get; set; } = true;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? NullValue : NotNullValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
}

View File

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace DM_Weight.Converter
{
public class OrderStatusConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string strRet = string.Empty;
switch (value.ToString())
{
case "0":
strRet = "待取药";
break;
case "1":
strRet = "已取药";
break;
case "2":
strRet = "已退回";
break;
default:
break;
}
return strRet;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace DM_Weight.Converter
{
public class PaginationConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string type = values[0].ToString();
if (!string.IsNullOrEmpty(type) && "First".Equals(type))
{
int CurrentPage = int.Parse(values[1].ToString());
return CurrentPage > 1;
}
if (!string.IsNullOrEmpty(type) && "Prve".Equals(type))
{
int CurrentPage = int.Parse(values[1].ToString());
return CurrentPage > 1;
}
if (!string.IsNullOrEmpty(type) && "Next".Equals(type))
{
int CurrentPage = int.Parse(values[1].ToString());
int PageCount = int.Parse(values[2].ToString());
return PageCount > CurrentPage;
}
if (!string.IsNullOrEmpty(type) && "End".Equals(type))
{
int CurrentPage = int.Parse(values[1].ToString());
int PageCount = int.Parse(values[2].ToString());
return PageCount > CurrentPage;
}
if (!string.IsNullOrEmpty(type) && "InfoText".Equals(type))
{
int CurrentPage = int.Parse(values[1].ToString());
int PageCount = int.Parse(values[2].ToString());
int PageSize = int.Parse(values[3].ToString());
int TotalPages = int.Parse(values[4].ToString());
return ((CurrentPage - 1) * PageSize + 1) + "-" + (CurrentPage * PageSize > TotalPages ? TotalPages : CurrentPage * PageSize) + "/" + TotalPages; ;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace DM_Weight.Converter
{
public class QuantityCountConverter : IValueConverter
{
public bool IsEnabled { get; set; } = true;
public bool NotIsEnabled { get; set; } = false;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return int.Parse(value.ToString()) <= 0 ? IsEnabled : NotIsEnabled;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace DM_Weight.Converter
{
internal class StatusConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int status = int.Parse(value.ToString());
//完成
if (parameter.ToString().Equals("CompleteBtn"))
{
if (status == 3)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
//关闭
if (parameter.ToString().Equals("CloseBtn"))
{
if (status > 0 && status < 3)
{
return false;
}
else
{
return true;
}
}
if (parameter.ToString().Equals("opearBtnLoading"))
{
if (status > 0 && status < 3)
{
return true;
}
else
{
return false;
}
}
//取药
if (parameter.ToString().Equals("opearBtnVisible"))
{
if (status < 3)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
//取消
if (parameter.ToString().Equals("CancelBtn"))
{
if (status > 0)
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight
{
public sealed class MessageAttribute : Attribute
{
public MessageAttribute()
{
}
public MessageAttribute(int value)
{
}
}
}

126
DM_Weight/DM_Weight.csproj Normal file
View File

@ -0,0 +1,126 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<PackageIcon></PackageIcon>
<Product>毒麻管理程序</Product>
<ApplicationIcon>Images\favicon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<None Remove="Images\body-bg.jpg" />
<None Remove="Images\box-16.jpg" />
<None Remove="Images\box.png" />
<None Remove="Images\favicon.ico" />
<None Remove="Images\finger-bg-r.png" />
<None Remove="Images\logo.png" />
<None Remove="Images\TbExit.png" />
<None Remove="Images\TbJiay.png" />
<None Remove="Images\TbKuc.png" />
<None Remove="Images\TbQyao.png" />
<None Remove="Images\TbSet.png" />
<None Remove="Images\TbTuiy.png" />
</ItemGroup>
<ItemGroup>
<COMReference Include="zkemkeeper">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>0</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>fe9ded34-e159-408e-8490-b720a5e632c7</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>False</EmbedInteropTypes>
</COMReference>
<COMReference Include="gregn6Lib">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>0</VersionMinor>
<VersionMajor>6</VersionMajor>
<Guid>4018f953-1bfe-441e-8a04-dc8ba1ff060e</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>False</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<Content Include="Images\favicon.ico" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\body-bg.jpg" />
<Resource Include="Images\box-16.jpg" />
<Resource Include="Images\box.png" />
<Resource Include="Images\favicon.ico" />
<Resource Include="Images\finger-bg-r.png" />
<Resource Include="Images\logo.png" />
<Resource Include="Images\TbExit.png" />
<Resource Include="Images\TbJiay.png" />
<Resource Include="Images\TbKuc.png" />
<Resource Include="Images\TbQyao.png" />
<Resource Include="Images\TbSet.png" />
<Resource Include="Images\TbTuiy.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.39" />
<PackageReference Include="Prism.Unity" Version="8.1.97" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
<PackageReference Include="SuperSimpleTcp" Version="3.0.10" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
<PackageReference Include="System.IO.Ports" Version="7.0.0" />
<PackageReference Include="System.Management" Version="7.0.1" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Speech" Version="7.0.0" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DM_Weight.Commons\DM_Weight.Commons.csproj" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Update="App.xaml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</ApplicationDefinition>
</ItemGroup>
<ItemGroup>
<None Update="App.config">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="log4net.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ReportTemp\account_book_temp.grf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ReportTemp\machine_log_check.grf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ReportTemp\machine_log_return.grf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ReportTemp\machine_log_add.grf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ReportTemp\machine_log_take.grf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ReportTemp\stock_template.grf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Page Update="Views\Dialog\InvoiceTakeDialog.xaml">
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
</Page>
</ItemGroup>
</Project>

View File

@ -0,0 +1,182 @@
using log4net;
using log4net.Repository.Hierarchy;
using Microsoft.Data.SqlClient.Server;
using Newtonsoft.Json;
using Prism.Events;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.util;
using zkemkeeper;
namespace DM_Weight.Finger
{
public class FingerprintUtil
{
private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil));
public zkemkeeper.CZKEMClass axCZKEM1; //= new zkemkeeper.CZKEMClass();
public bool bIsConnected = false;
private string fingerIp = ConfigurationManager.AppSettings["fingerIp"].ToString();
private int fingerPort = 4370;
private int machineNumber = Convert.ToInt32(ConfigurationManager.AppSettings["machineNumber"].ToString());
private int machineType = Convert.ToInt32(ConfigurationManager.AppSettings["machineType"].ToString());
private readonly IEventAggregator _eventAggregator;
public FingerprintUtil(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
logger.Info($"进入构造器,开始连接指纹机");
// Task.Run(() =>
//{
ConnectionMain();
//});
}
public void ConnectionMain()
{
try
{
axCZKEM1 = new CZKEMClass();
bIsConnected = axCZKEM1.Connect_Net(fingerIp, fingerPort);
logger.Info($"连接指纹机,IP:{fingerIp},端口:{fingerPort},机器号:{machineNumber},连接结果:{bIsConnected}");
if (bIsConnected)
{
if (axCZKEM1.RegEvent(machineNumber, 65535))
{
this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
//this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);
this.axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
}
}
_eventAggregator.GetEvent<FingerprintEvent>().Publish(new FingerprintMsg()
{
Message = "CONNECT",
Result = bIsConnected,
});
}
catch(Exception ex)
{
logger.Info($"连接指纹机异常{ex.Message.ToString()}");
}
}
//If your fingerprint(or your card) passes the verification,this event will be triggered
private void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode)
{
FingerprintMsg message = new FingerprintMsg()
{
Message = "LOGIN",
Id = Convert.ToInt32(sEnrollNumber),
VerifyMethod = iVerifyMethod
};
logger.Info($"触发用户验证通过事件用户id:{sEnrollNumber}验证方式:{iVerifyMethod}");
_eventAggregator.GetEvent<FingerprintEvent>().Publish(message);
}
//When you are enrolling your finger,this event will be triggered.
private void axCZKEM1_OnEnrollFinger(int iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
{
FingerprintMsg message = new FingerprintMsg()
{
Message = "INS_FINGER",
Id = iEnrollNumber,
FingerIndex = iFingerIndex
};
axCZKEM1.StartIdentify();
axCZKEM1.RefreshData(1);
logger.Info($"触发用户登记指纹事件用户id:{iEnrollNumber}指纹索引:{iFingerIndex}登记结果:{(iActionResult == 0)}");
message.Result = (iActionResult == 0);
_eventAggregator.GetEvent<FingerprintEvent>().Publish(message);
}
private void axCZKEM1_OnEnrollFingerEx(string iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength)
{
FingerprintMsg message = new FingerprintMsg()
{
Message = "INS_FINGER",
Id = Convert.ToInt32(iEnrollNumber),
FingerIndex = iFingerIndex
};
axCZKEM1.StartIdentify();
axCZKEM1.RefreshData(1);
logger.Info($"触发用户登记指纹事件1用户id:{iEnrollNumber}指纹索引:{iFingerIndex}登记结果:{(iActionResult == 0)}");
message.Result = (iActionResult == 0);
_eventAggregator.GetEvent<FingerprintEvent>().Publish(message);
}
/**
*
*/
public bool DelUser(int Id)
{
bool result = false;
axCZKEM1.EnableDevice(machineNumber, false);
if (machineType == 1)
{
result = axCZKEM1.DeleteEnrollData(machineNumber, Id, machineNumber, 12);
}
else
{
result = axCZKEM1.SSR_DeleteEnrollData(machineNumber, Id.ToString(), 12);
}
axCZKEM1.RefreshData(machineNumber);
axCZKEM1.EnableDevice(machineNumber, true);
return result;
}
/**
*
*/
public bool SaveUser(UserList User)
{
bool result = false;
axCZKEM1.SetStrCardNumber(User.UserBarcode);
if (machineType == 1)
{
result = axCZKEM1.SetUserInfo(machineNumber, User.Id, User.Nickname, "123456", 0, true);
}
else
{
result = axCZKEM1.SSR_SetUserInfo(machineNumber, User.Id.ToString(), User.Nickname, "123456", 0, true);
}
return result;
}
/**
*
*/
public bool SaveFingerprint(int Id, int FingerIndex)
{
bool result = false;
// 取消其他操作
bool res2 = axCZKEM1.CancelOperation();
if (machineType == 1)
{
// 删除源指纹
bool res = axCZKEM1.DelUserTmp(machineNumber, Id, FingerIndex);
}
else
{
// 删除源指纹
bool res = axCZKEM1.SSR_DelUserTmp(machineNumber, Id.ToString(), FingerIndex);
}
// 添加新指纹
result = axCZKEM1.StartEnrollEx(Id.ToString(), FingerIndex, 3);
return result;
}
}
}

BIN
DM_Weight/Images/TbExit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
DM_Weight/Images/TbJiay.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
DM_Weight/Images/TbKuc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
DM_Weight/Images/TbQyao.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
DM_Weight/Images/TbSet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
DM_Weight/Images/TbTuiy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
DM_Weight/Images/box-16.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
DM_Weight/Images/box.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
DM_Weight/Images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,200 @@
using Prism.Commands;
using Prism.Mvvm;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[SugarTable("channel_list")]
public class ChannelList : BindableBase
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "chnguid", IsPrimaryKey = true)]
//[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "machine_id")]
public string MachineId { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "row_no")]
public int DrawerNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "col_no")]
public int ColNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "pos_no")]
public int PosNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "drug_id")]
public string DrugId { get; set; }
///// <summary>
/////
///// 默认值: NULL
/////</summary>
//[SugarColumn(ColumnName = "manu_no")]
//public string ManuNo { get; set; }
///// <summary>
/////
///// 默认值: NULL
/////</summary>
//[SugarColumn(ColumnName = "eff_date")]
//public string EffDate { get; set; }
///// <summary>
/////
///// 默认值: NULL
/////</summary>
//[SugarColumn(ColumnName = "quantity")]
//public int Quantity { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "drawer_type")]
public int DrawerType { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "board_type")]
public int BoardType { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "state")]
public int? State { get; set; }
[SugarColumn(IsIgnore = true)]
public bool IsSelected { get; set; }
[SugarColumn(IsIgnore = true)]
public InOutInvoice Invoice { get; set; }
[SugarColumn(IsIgnore = true)]
public string Location
{
get => DrawerNo + "-" + ColNo;
}
//private int _addQuantity = 0;
//[SugarColumn(IsIgnore = true)]
//public int AddQuantity
//{
// get => _addQuantity;
// set
// {
// SetProperty(ref _addQuantity, value);
// }
//}
//private int _takeQuantity = 0;
//[SugarColumn(IsIgnore = true)]
//public int TakeQuantity
//{
// get => _takeQuantity;
// set
// {
// if (value > Quantity)
// {
// throw new ArgumentException("取药数量不能大于库存");
// }
// SetProperty(ref _takeQuantity, value);
// }
//}
//private int _returnQuantity = 0;
//[SugarColumn(IsIgnore = true)]
//public int ReturnQuantity
//{
// get => _returnQuantity;
// set
// {
// SetProperty(ref _returnQuantity, value);
// }
//}
//private int _checkQuantity = 0;
//[SugarColumn(IsIgnore = true)]
//public int CheckQuantity
//{
// get => _checkQuantity;
// set
// {
// if (value < 0)
// {
// throw new ArgumentException("盘点数量不能是负数");
// }
// SetProperty(ref _checkQuantity, value);
// }
//}
//[SugarColumn(IsIgnore = true)]
//public int? CanReturnQuantity { get; set; }
private DrugInfo? _DrugInfo;
[Navigate(NavigateType.ManyToOne, nameof(DrugId))]
public DrugInfo Drug { get => _DrugInfo; set => SetProperty(ref _DrugInfo, value); }
//[SugarColumn(IsIgnore = true)]
//public int process { get; set; } = 0;
private DrugManuNo? _drugManuNo;
[SugarColumn(IsIgnore = true)]
public DrugManuNo? drugManuNo { get => _drugManuNo; set => SetProperty(ref _drugManuNo, value); }
private List<ChannelStock>? _channelStocks;
[Navigate(NavigateType.OneToMany, nameof(ChannelStock.Chnguid))]
public List<ChannelStock> channelStocks { get => _channelStocks; set => SetProperty(ref _channelStocks, value); }
//private DelegateCommand<ChannelList> _addManunoCommand;
//[SugarColumn(IsIgnore = true)]
//public DelegateCommand<ChannelList> AddManunoCommand
//{
// get
// {
// if (_addManunoCommand == null)
// _addManunoCommand = new DelegateCommand<ChannelList>(o => DoDelete(o));
// return _addManunoCommand;
// }
//}
//private void DoDelete(ChannelList parameter)
//{
//}
//药品规格
private string _drugSpec;
[SugarColumn(ColumnName = "drug_manu_no")]
public string DrugSpec { get=> _drugSpec;set=>SetProperty(ref _drugSpec, value); }
}
}

View File

@ -0,0 +1,191 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
using DM_Weight.Common;
using Prism.Mvvm;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[SugarTable("channel_stock")]
public class ChannelStock : BindableBase
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "chsguid", IsPrimaryKey = true)]
//[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "chnguid")]
public string Chnguid { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "machine_id")]
public string MachineId { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "row_no")]
public int DrawerNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "col_no")]
public int ColNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "pos_no")]
public int PosNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "drug_id")]
public string DrugId { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "manu_no")]
public string ManuNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "eff_date")]
public string EffDate { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "quantity")]
public int Quantity { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "drawer_type")]
public int DrawerType { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "board_type")]
public int BoardType { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "state")]
public int? State { get; set; }
[SugarColumn(IsIgnore = true)]
public bool IsSelected { get; set; }
[SugarColumn(IsIgnore = true)]
public InOutInvoice Invoice { get; set; }
[SugarColumn(IsIgnore = true)]
public string Location
{
get => DrawerNo + "-" + ColNo;
}
private int _addQuantity = 0;
[SugarColumn(IsIgnore = true)]
public int AddQuantity
{
get => _addQuantity;
set
{
SetProperty(ref _addQuantity, value);
}
}
private int _takeQuantity = 0;
[SugarColumn(IsIgnore = true)]
public int TakeQuantity
{
get => _takeQuantity;
set
{
if (value > Quantity)
{
throw new ArgumentException("取药数量不能大于库存");
}
SetProperty(ref _takeQuantity, value);
}
}
//private string _tipMessage=string.Empty;
//[SugarColumn(IsIgnore = true)]
//public string TipMessage
//{
// get => _tipMessage;
// set
// {
// SetProperty(ref _tipMessage, value);
// }
//}
private int _returnQuantity = 0;
[SugarColumn(IsIgnore = true)]
public int ReturnQuantity
{
get => _returnQuantity;
set
{
SetProperty(ref _returnQuantity, value);
}
}
private int _checkQuantity = 0;
[SugarColumn(IsIgnore = true)]
public int CheckQuantity
{
get => _checkQuantity;
set
{
if (value < 0)
{
throw new ArgumentException("盘点数量不能是负数");
}
SetProperty(ref _checkQuantity, value);
}
}
[SugarColumn(IsIgnore = true)]
public int? CanReturnQuantity { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(DrugId))]
public DrugInfo DrugInfo { get; set; }
[SugarColumn(IsIgnore = true)]
public int process { get; set; } = 0;
[SugarColumn(IsIgnore = true)]
public DrugManuNo? drugManuNo { get; set; }
private ChannelList? _channelList;
[Navigate(NavigateType.ManyToOne, nameof(Chnguid))]
public ChannelList ChannelLst { get => _channelList; set => SetProperty(ref _channelList, value); }
}
}

View File

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[SugarTable("drug_info")]
public class DrugInfo
{
/// <summary>
///
///</summary>
//[SugarColumn(ColumnName = "pharmacy")]
//public string Pharmacy { get; set; }
/// <summary>
/// ҩƷID
///</summary>
[SugarColumn(ColumnName = "drug_id", IsPrimaryKey = true)]
public long DrugId { get; set; }
/// <summary>
/// ƴ
///</summary>
[SugarColumn(ColumnName = "py_code")]
public string PyCode { get; set; }
/// <summary>
///
///</summary>
//[SugarColumn(ColumnName = "BD_code")]
//public string BdCode { get; set; }
/// <summary>
/// ҩƷ
///</summary>
[SugarColumn(ColumnName = "drug_barcode")]
public string DrugBarcode { get; set; }
/// <summary>
/// ҩƷ<D2A9><C6B7><EFBFBD><EFBFBD>
///</summary>
[SugarColumn(ColumnName = "drug_name")]
public string DrugName { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "drug_brand_name")]
public string DrugBrandname { get; set; }
/// <summary>
/// ҩƷ<D2A9><C6B7><EFBFBD>
///</summary>
[SugarColumn(ColumnName = "drug_spec")]
public string DrugSpec { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD>
///</summary>
[SugarColumn(ColumnName = "dosage")]
public string Dosage { get; set; }
/// <summary>
/// <20><>װ<EFBFBD><D7B0>λ
///</summary>
[SugarColumn(ColumnName = "pack_unit")]
public string PackUnit { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///</summary>
[SugarColumn(ColumnName = "manufactory")]
public string Manufactory { get; set; }
/// <summary>
/// <20><><EFBFBD>ҩ<EFBFBD><D2A9>
///</summary>
[SugarColumn(ColumnName = "max_stock")]
public int? MaxStock { get; set; }
//[SugarColumn(IsIgnore=true)]
[Navigate(NavigateType.OneToMany, nameof(ChannelStock.DrugId), nameof(DrugId))]//BookA表中的studenId
public List<ChannelStock> channelStocks { get; set; }
[Navigate(NavigateType.OneToMany, nameof(DrugManuNo.DrugId))]//BookA表中的studenId
public List<DrugManuNo>? DrugManuNos { get; set; }
[SugarColumn(IsIgnore = true)]
public int? StockQuantity { get; set; }
}
}

View File

@ -0,0 +1,35 @@
using Prism.Mvvm;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[SugarTable("drug_manu_no")]
public class DrugManuNo : BindableBase
{
private string _id;
[SugarColumn(ColumnName = "dmnguid", IsPrimaryKey = true)]
public string Id { get => _id; set => SetProperty(ref _id, value); }
private string _drugId;
[SugarColumn(ColumnName = "drug_id")]
public string DrugId { get => _drugId; set => SetProperty(ref _drugId, value); }
private string _manuNo;
[SugarColumn(ColumnName = "manu_no")]
public string ManuNo { get => _manuNo; set => SetProperty(ref _manuNo, value); }
private string _manuDate;
[SugarColumn(ColumnName = "manu_date")]
public string ManuDate { get => _manuDate; set => SetProperty(ref _manuDate, value); }
private string _effDate;
[SugarColumn(ColumnName = "eff_date")]
public string EffDate { get => _effDate; set => SetProperty(ref _effDate, value); }
}
}

View File

@ -0,0 +1,149 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[SugarTable("in_out_invoice")]
public class InOutInvoice
{
/// <summary>
/// 主键(序号)
/// </summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity =true)]
public int Id { get; set; }
[SugarColumn(ColumnName = "in_pharmacy_id")]
public string InPharmacyId { get; set; }
[SugarColumn(ColumnName = "out_pharmacy_id")]
public string OutPharmacyId { get; set; }
/// <summary>
/// 库存管理单位(入库单位代码)
/// </summary>
[SugarColumn(ColumnName = "storage")]
public string storage { get; set; }
/// <summary>
/// 单据号
/// </summary>
[SugarColumn(ColumnName = "invoice_no")]
public string InvoiceNo { get; set; }
[SugarColumn(ColumnName = "invoice_date")]
public string InvoiceDate { get; set; }
/// <summary>
/// 药品id
/// </summary>
[SugarColumn(ColumnName = "drug_id")]
public string DrugId { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(DrugId))]
public DrugInfo DrugInfo { get; set; }
/// <summary>
/// 药品规格
/// </summary>
[SugarColumn(ColumnName = "drug_spec")]
public string DrugSpec { get; set; }
/// <summary>
/// 计算单位
/// </summary>
[SugarColumn(ColumnName = "units")]
public string Units { get; set; }
/// <summary>
/// 厂商标识
/// </summary>
[SugarColumn(ColumnName = "firm_id")]
public string FirmId { get; set; }
/// <summary>
/// 包装规格反映药品含量及包装信息如0.25g*30
/// </summary>
[SugarColumn(ColumnName = "package_spec")]
public string PackageSpec { get; set; }
/// <summary>
/// 数量(以包装单位所计的数量)
/// </summary>
[SugarColumn(ColumnName = "quantity")]
public int quantity { get; set; }
/// <summary>
/// 计量单位,可使用任一级管理上方便的包装
/// </summary>
[SugarColumn(ColumnName = "package_units")]
public string PackageUnits { get; set; }
/// <summary>
/// 药品批次
/// </summary>
[SugarColumn(ColumnName = "drug_manu_no")]
public string DrugManuNo { get; set; }
/// <summary>
/// 创建时间(入库日期)
/// </summary>
[SugarColumn(ColumnName = "create_time")]
public DateTime CreateTime { get; set; }
/// <summary>
/// 1.请领入库 0.其它
/// </summary>
[SugarColumn(ColumnName = "type")]
public int Type { get; set; }
/// <summary>
/// 类型描述
/// </summary>
[SugarColumn(ColumnName = "type_describe")]
public string TypeDescribe { get; set; }
/// <summary>
/// 供货方
/// </summary>
[SugarColumn(ColumnName = "supplier")]
public string Supplier { get; set; }
/// <summary>
/// 操作人
/// </summary>
[SugarColumn(ColumnName = "operator")]
public string Operator { get; set; }
/// <summary>
/// 存放库房
/// </summary>
[SugarColumn(ColumnName = "sub_storage")]
public string SubStorage { get; set; }
/// <summary>
/// 备注
/// </summary>
[SugarColumn(ColumnName = "memos")]
public string Memos { get; set; }
[SugarColumn(ColumnName = "status")]
public int Status { get; set; }
[SugarColumn(ColumnName = "drug_eff_date")]
public string DrugEffDate { get; set; }
[SugarColumn(ColumnName = "his_id")]
public string HisId { get; set; }
[SugarColumn(ColumnName = "cancel_flag")]
public int CancelFlag { get; set; }
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[Serializable]
public class Invoice
{
public string InvoiceNo { get; set; }
public string InvoiceDate { get; set; }
public int Count { get; set; }
public int Quantity { get; set; }
public int Status { get; set; }
public string PharmacyName1 { get; set; }
public string PharmacyName2 { get; set; }
}
}

View File

@ -0,0 +1,147 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[SugarTable("dm_machine_record")]
public class MachineRecord
{
/// <summary>
/// 主键
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 设备id
///</summary>
[SugarColumn(ColumnName = "machine_id")]
public string MachineId { get; set; }
/// <summary>
/// 药品id
///</summary>
[SugarColumn(ColumnName = "drug_id")]
public string DrugId { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(DrugId))]
public DrugInfo DrugInfo { get; set; }
/// <summary>
/// 数量
///</summary>
[SugarColumn(ColumnName = "quantity")]
public int Quantity { get; set; }
[SugarColumn(ColumnName = "stock_quantity")]
public int? StockQuantity { get; set; }
[SugarColumn(ColumnName = "check_quantity")]
public int? CheckQuantity { get; set; }
/// <summary>
/// 批号
///</summary>
[SugarColumn(ColumnName = "manu_no")]
public string ManuNo { get; set; }
/// <summary>
/// 操作人id
///</summary>
[SugarColumn(ColumnName = "operator")]
public int? Operator { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(Operator))]
public UserList User { get; set; }
/// <summary>
/// 审核人id
///</summary>
[SugarColumn(ColumnName = "reviewer")]
public int? Reviewer { get; set; }
/// <summary>
/// 操作时间
/// 默认值: CURRENT_TIMESTAMP
///</summary>
[SugarColumn(ColumnName = "operation_time")]
public DateTime OperationTime { get; set; }
/// <summary>
/// 效期
///</summary>
[SugarColumn(ColumnName = "eff_date")]
public DateTime? EffDate { get; set; }
/// <summary>
/// 出库入库类型(1入库2出库31还药32还空瓶)
///</summary>
[SugarColumn(ColumnName = "type")]
public int Type { get; set; }
/// <summary>
/// 出入库调拨单id
///</summary>
[SugarColumn(ColumnName = "invoice_id")]
public string InvoiceId { get; set; }
/// <summary>
/// 列号
///</summary>
[SugarColumn(ColumnName = "col_no")]
public int ColNo { get; set; }
/// <summary>
/// 抽屉号
///</summary>
[SugarColumn(ColumnName = "drawer_no")]
public int DrawerNo { get; set; }
/// <summary>
/// 取药科室
///</summary>
[SugarColumn(ColumnName = "department_id")]
public string DepartmentId { get; set; }
/// <summary>
/// 是否已经退药(0:没有1:还了部分2:完成)
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "status", IsOnlyIgnoreInsert = true)]
public int Status { get; set; }
/// <summary>
/// 退药量
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "return_quantity1", IsOnlyIgnoreInsert = true)]
public int ReturnQuantity1 { get; set; }
/// <summary>
/// 退空瓶量
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "return_quantity2", IsOnlyIgnoreInsert = true)]
public int ReturnQuantity2 { get; set; }
/// <summary>
/// 取药记录id
///</summary>
[SugarColumn(ColumnName = "get_id")]
public int? GetId { get; set; }
/// <summary>
/// 是否已经销毁
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "is_destroy", IsOnlyIgnoreInsert = true)]
public int? IsDestroy { get; set; }
[SugarColumn(IsIgnore = true)]
public int CanReturnQuantity
{
get => Quantity - ReturnQuantity1 - ReturnQuantity2;
}
[SugarColumn(IsIgnore = true)]
public bool IsSelected { get; set; }
// <summary>
/// 药品对应批号库存
/// </summary>
[SugarColumn(ColumnName = "manunoQuantity")]
public int? ManunoQuantity { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
public class OrderDepartment : BindableBase
{
//科室
public string _deptName="全部";
public string DeptName { get=>_deptName; set { SetProperty(ref _deptName, value); } }
}
}

View File

@ -0,0 +1,131 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[SugarTable("order_detail")]
public class OrderDetail
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "order_id")]
//public int? OrderId { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "patient_id")]
public string PatientId { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "order_no")]
public string OrderNo { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "charge_date")]
public DateTime ChargeDate { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "serial_no")]
//public int? SerialNo { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "drug_id")]
public string DrugId { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(DrugId))]
public DrugInfo DrugInfo { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "quantity")]
public int Quantity { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "order_unit")]
public string OrderUnit { get; set; }
/// <summary>
///
/// 默认值: 1
///</summary>
[SugarColumn(ColumnName = "unit_convercoef")]
public int? UnitConvercoef { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "set_manu_no")]
public string SetManuNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "set_eff_date")]
public string SetEffDate { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "price")]
//public string Price { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "total_price")]
//public string TotalPrice { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "use_discrip")]
public string UseDiscrip { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "use_frequ")]
public string UseFrequ { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "use_once")]
public string UseOnce { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "use_by")]
public string UseBy { get; set; }
/// <summary>
///
/// 默认值: '0'
///</summary>
[SugarColumn(ColumnName = "use_self")]
public string UseSelf { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "use_dosage")]
public string UseDosage { get; set; }
}
}

View File

@ -0,0 +1,32 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[SugarTable("hkc_order_finish")]
public class OrderFinish
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
public int Id { get; set; }
[SugarColumn(ColumnName = "pharmacy")]
public string Pharmacy { get; set; }
[SugarColumn(ColumnName = "patient_id")]
public string PatientId { get; set; }
[SugarColumn(ColumnName = "order_no")]
public string OrderNo { get; set; }
[SugarColumn(ColumnName = "state")]
public int State { get; set; }
[SugarColumn(ColumnName = "operator")]
public string Operator { get; set; }
}
}

View File

@ -0,0 +1,202 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[SugarTable("order_info")]
public class OrderInfo
{
/// <summary>
/// 是否选中
/// </summary>
[SugarColumn(IsIgnore = true)]
public bool ItemIsChecked { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "order_id", IsPrimaryKey = true, IsIdentity = true)]
public int OrderId { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "pharmacy")]
public string Pharmacy { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "order_no")]
public string OrderNo { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "patient_id")]
public string PatientId { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "p_name")]
public string PName { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "sex")]
public string Sex { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "age")]
public string Age { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "id_number")]
public string IdNumber { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "patient_card")]
public string PatientCard { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "invoice_no")]
public string InvoiceNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "patient_no")]
public string PatientNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "doctor_name")]
public string DoctorName { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "order_date")]
public DateTime OrderDate { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "charge_date")]
public DateTime ChargeDate { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "recv_date")]
public DateTime RecvDate { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "dept_name")]
public string DeptName { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "disease")]
public string Disease { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "order_type")]
public string OrderType { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "charge_type")]
public string ChargeType { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "state")]
public int State { get; set; }
/// <summary>
///
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "his_disp_flag")]
public int? HisDispFlag { get; set; }
/// <summary>
///
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "cancel_flag")]
public int? CancelFlag { get; set; }
/// <summary>
///
/// 默认值: 0
///</summary>
[SugarColumn(ColumnName = "dm_status")]
public int? DmStatus { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "agent_name")]
//public string AgentName { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "agent_id_no")]
//public string AgentIdNo { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
[SugarColumn(ColumnName = "costs")]
public decimal? Costs { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "payments")]
//public decimal? Payments { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "dispensary")]
//public string Dispensary { get; set; }
/// <summary>
///
/// 默认值: NULL
///</summary>
//[SugarColumn(ColumnName = "identity")]
//public string Identity { get; set; }
}
}

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[Serializable]
public class PremissionDm
{
/// <summary>
/// 主键
///</summary>
public int Id { get; set; }
/// <summary>
/// 菜单名
///</summary>
public string PremissionName { get; set; }
/// <summary>
/// 菜单路径
///</summary>
public string PremissionPath { get; set; }
/// <summary>
/// 图片source
///</summary>
public string PremissionImage { get; set; }
public ObservableCollection<PremissionDm>? Children { get; set; }
}
}

View File

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[SugarTable("role")]
public class RoleDm
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="id" ,IsPrimaryKey = true ,IsIdentity = true )]
public int? Id { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="role_name" )]
public string RoleName { get; set; }
/// <summary>
///
///</summary>
//[SugarColumn(ColumnName="role_des" )]
//public string RoleDes { get; set; }
/// <summary>
///
///</summary>
///[SugarColumn(ColumnName="permissions" )]
[SugarColumn(ColumnName = "permissions", ColumnDataType = "varchar(4000)" /*可以设置类型*/, IsJson = true)]//必填
public List<PremissionDm> Permissions { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="machine_id" )]
public string MachineId { get; set; }
}
}

View File

@ -0,0 +1,56 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.Models
{
[SugarTable("SettingPage")]
public class SettingPage
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 页面名称
/// </summary>
[SugarColumn(ColumnName = "Name")]
public string Name { get; set; }
/// <summary>
/// 页面连接
/// </summary>
[SugarColumn(ColumnName = "Url")]
public string Url { get; set; }
/// <summary>
///可用标志
/// </summary>
[SugarColumn(ColumnName = "Flag")]
public string Flag { get; set; }
/// <summary>
/// view名称
/// </summary>
[SugarColumn(ColumnName = "ViewName")]
public string ViewName { get; set; }
/// <summary>
/// 图标名称
/// </summary>
[SugarColumn(ColumnName = "IconName")]
public string Icon { get; set; }
/// <summary>
/// 层级
/// </summary>
[SugarColumn(ColumnName = "Level")]
public int Level { get; set; }
/// <summary>
/// 父级id
/// </summary>
[SugarColumn(ColumnName = "Parentid")]
public int Parentid { get; set; }
/// <summary>
/// 0可用1不可用
/// </summary>
[SugarColumn(ColumnName = "State")]
public int State { get; set; }
}
}

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace DM_Weight.Models
{
/// <summary>
///
///</summary>
[SugarTable("user_list")]
public class UserList
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="id" ,IsPrimaryKey = true ,IsIdentity = true )]
public int Id { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="user_id" )]
public string UserName { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="user_name" )]
public string Nickname { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="pass_word" )]
public string PassWord { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="user_barcode" )]
public string UserBarcode { get; set; }
/// <summary>
///
///</summary>
//[SugarColumn(ColumnName="status" )]
//public int? Status { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="machine_role_id" )]
public int? RoleId { get; set; }
[Navigate(NavigateType.ManyToOne, nameof(RoleId))]
public RoleDm? Role { get; set; }
/// <summary>
///
///</summary>
//[SugarColumn(ColumnName="user_card" )]
// public string UserCard { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="machine_id" )]
public string MachineId { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName="sign" )]
public byte[] Sign { get; set; }
public override string ToString()
{
return "userList = [UserName:" + Nickname + ", UserId:" + UserName + "]";
}
}
}

1685
DM_Weight/Port/PortUtil.cs Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,171 @@
using DM_Weight.Models;
using log4net;
using SuperSimpleTcp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;
using System.Windows.Markup;
namespace DM_Weight.Port
{
public class ScreenUtil
{
private readonly ILog logger = LogManager.GetLogger(typeof(ScreenUtil));
SimpleTcpServer server = new SimpleTcpServer("0.0.0.0:8888");
string ipport { get; set; } = "";
public ScreenUtil()
{
server.Events.ClientConnected += (object sender, ConnectionEventArgs e) =>
{
ipport = e.IpPort;
logger.Info($"[{e.IpPort}] client connected");
};
server.Events.ClientDisconnected += (object sender, ConnectionEventArgs e) =>
{
logger.Info($"[{e.IpPort}] client disconnected: {e.Reason}");
};
server.Events.DataReceived += (object sender, DataReceivedEventArgs e) =>
{
logger.Info($"[{e.IpPort}]: {e.Data.Array}");
};
// let's go!
server.Start();
}
private byte[] head = new byte[] { 0xee, 0xb1, 0x12 };
private byte[] end = new byte[] { 0xFF, 0xFC, 0xFF, 0xFF };
public void SetStockInfo(ChannelStock channel, int screenId)
{
// 添加画面id
byte[] a = Copy2NewArr(head, HighLow(screenId));
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//if (channel.DrugInfo.DrugName != null)
//{
byte[] content = Encoding.GetEncoding("gb2312").GetBytes(channel.DrugInfo?.DrugName??"");
a = WriteInfo(a, content, channel.ColNo * 10 + 1);
//}
//if (channel.DrugInfo.Manufactory != null)
//{
byte[] content1 = Encoding.GetEncoding("gb2312").GetBytes(channel.DrugInfo?.Manufactory?? "");
a = WriteInfo(a, content1, channel.ColNo * 10 + 2);
//}
//if (channel.DrugInfo.DrugSpec != null)
//{
byte[] content2 = Encoding.GetEncoding("gb2312").GetBytes(channel.DrugInfo?.DrugSpec ?? "");
a = WriteInfo(a, content2, channel.ColNo * 10 + 3);
//}
//if (channel.ManuNo != null)
//{
byte[] content3 = Encoding.GetEncoding("gb2312").GetBytes(channel.ManuNo);
a = WriteInfo(a, content3, channel.ColNo * 10 + 4);
//}
//if (channel.EffDate != null)
//{
byte[] content4 = Encoding.GetEncoding("gb2312").GetBytes(channel.EffDate);
a = WriteInfo(a, content4, channel.ColNo * 10 + 5);
//}
//if (channel.Quantity != null)
//{
byte[] content5 = Encoding.GetEncoding("gb2312").GetBytes(channel.Quantity.ToString());
a = WriteInfo(a, content5, channel.ColNo * 10 + 6);
//}
// 添加结束块
byte[] b = Copy2NewArr(a, end);
server.Send(ipport, b);
}
public void TellChange(int d)
{
byte[] buffer = new byte[] { 0xee, 0xb5, 0x01, 0x00, 0xFF, 0xFC, 0xFF, 0xFF };
}
public void SetStockInfo(List<ChannelStock> channels, int screenId)
{
// 添加画面id
byte[] a = Copy2NewArr(head, HighLow(screenId));
for (int i = 0; i < channels.Count; i++)
{
ChannelStock channel = channels[i];
if (channel.DrugInfo.DrugName != null)
{
byte[] content = Encoding.ASCII.GetBytes(channel.DrugInfo.DrugName);
a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 1);
}
if (channel.DrugInfo.Manufactory != null)
{
byte[] content = Encoding.ASCII.GetBytes(channel.DrugInfo.Manufactory);
a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 2);
}
if (channel.DrugInfo.DrugSpec != null)
{
byte[] content = Encoding.ASCII.GetBytes(channel.DrugInfo.DrugSpec);
a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 3);
}
if (channel.ManuNo != null)
{
byte[] content = Encoding.ASCII.GetBytes(channel.ManuNo);
a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 4);
}
if (channel.EffDate != null)
{
byte[] content = Encoding.ASCII.GetBytes(channel.EffDate);
a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 5);
}
if (channel.Quantity != null)
{
byte[] content = Encoding.ASCII.GetBytes(channel.Quantity.ToString());
a = WriteInfo(a, content, channels[0].DrawerNo * 10 + 6);
}
}
// 添加结束块
byte[] b = Copy2NewArr(a, end);
server.Send(ipport, b);
}
public byte[] WriteInfo(byte[] a, byte[] content, int id)
{
// 添加控件id
byte[] b = Copy2NewArr(a, HighLow(id));
// 添加需要向控件内写入的字节长度
byte[] c = Copy2NewArr(b, HighLow(content.Length));
// 写入内容
return Copy2NewArr(c, content);
}
public byte[] HighLow(int data)
{
byte high = Convert.ToByte((data >> 8) & 0x00ff); //位运算右移8位
byte low = Convert.ToByte(data & 0x00ff); //去掉高位
return new byte[] {high, low};
}
public byte[] Copy2NewArr(byte[] source1, byte[] source2)
{
byte[] target = new byte[source1.Length + source2.Length];
Buffer.BlockCopy(source1, 0, target, 0, source1.Length);
Buffer.BlockCopy(source2, 0, target, source1.Length, source2.Length);
return target;
}
}
}

View File

@ -0,0 +1,175 @@
using gregn6Lib;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DM_Weight.Models;
using System.Configuration;
using DM_Weight.util;
namespace DM_Weight.Report
{
public class GridReportUtil
{
// 定义Grid++Report报表主对象
public static GridppReport Report = new GridppReport();
public static string gridConnectionString = ConfigurationManager.AppSettings["gridConnectionString"];
/**
*
* tempname:
* data:
*/
public static void PrintReport(string tempname, object data)
{
// 定义Grid++Report报表主对象
GridppReport Report = new GridppReport();
// 加载模板文件
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + tempname);
string s = JsonConvert.SerializeObject(data);
// 加载数据
Report.LoadDataFromXML(JsonConvert.SerializeObject(data));
Report.PrintPreview(true);
}
public static void PrintReportStock()
{
// 定义Grid++Report报表主对象
GridppReport Report = new GridppReport();
//Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(() =>
//{
// Report.ParameterByName("machine_id").Value = (ConfigurationManager.AppSettings["machineId"] ?? "DM1");
//});
string machine_id=(ConfigurationManager.AppSettings["machineId"] ?? "DM1");
string SQL = $@"SELECT cl.`row_no` AS drawerNo,cl.`col_no` AS colNo,cl.`quantity` AS quantity,cl.`manu_no` AS manuNo,cl.`eff_date` AS effDate,
di.`drug_name` AS drugName,di.`drug_spec` AS drugSpec,di.`pack_unit` AS packUnit,di.`manufactory` AS manuFactory,di.`max_stock` AS baseQuantity,
cl.`drug_id` AS drugId FROM channel_stock cl INNER JOIN drug_info di ON di.`drug_id` = cl.`drug_id` WHERE cl.`machine_id` = '{machine_id}' AND cl.`drawer_type` = 1 ORDER BY cl.`drug_id`";
// 加载模板文件
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + "stock_template.grf");
Report.DetailGrid.Recordset.ConnectionString = gridConnectionString;
Report.DetailGrid.Recordset.QuerySQL = SQL;
Report.PrintPreview(true);
}
public static void PrintReportAccountBook(DateTime? startDate, DateTime? endDate)
{
DateTime? p_startDate = startDate ?? Convert.ToDateTime("2010-1-1");
DateTime? p_endDate = endDate ?? DateTime.Now.AddDays(1);
string p_machine_id= (ConfigurationManager.AppSettings["machineId"] ?? "DM1");
// 定义Grid++Report报表主对象
GridppReport Report = new GridppReport();
// 加载模板文件
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + "account_book_temp.grf");
string SQL = string.Empty;
Report.DetailGrid.Recordset.ConnectionString = gridConnectionString;
//Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(() =>
//{
// Report.ParameterByName("machine_id").Value = (ConfigurationManager.AppSettings["machineId"] ?? "DM1");
// Report.ParameterByName("startDate").Value = startDate ?? Convert.ToDateTime("2010-1-1");
// Report.ParameterByName("endDate").Value = endDate ?? DateTime.Now.AddDays(1);
//});
//Report.DetailGrid.Recordset.QuerySQL = SQL;
SQL = $@"SELECT mr.`stock_quantity` AS `stockQuantity`, IF(mr.`type` IN (1, 31), mr.`quantity`, IF(mr.`type` = 4 AND mr.`quantity` > 0, mr.`quantity`, 0))
AS `inQuantity`, IF(mr.`type` = 2, mr.`quantity`, IF(mr.`type` = 4 AND mr.`quantity` < 0, (0 - mr.`quantity`), 0)) AS `outQuantity`,
mr.`operation_time` AS `operationTime`, mr.`invoice_id` AS `invoiceId`, di.`drug_name` AS `drugName`, di.`drug_id` AS `drugId`,
di.`drug_spec` AS `drugSpec`, di.`pack_unit` AS `packUnit`, di.`dosage` AS `dosage`, di.`manufactory` AS `manufactory`,
mr.`manu_no` AS `manuNo`, mr.`eff_date` AS `effDate`, u1.`user_name` AS `operatorName`, u2.`user_name` AS `reviewerName` FROM
dm_machine_record mr LEFT JOIN drug_info di ON mr.`drug_id` = di.`drug_id` LEFT JOIN user_list u1 ON mr.`operator` = u1.`id`
LEFT JOIN user_list u2 ON mr.`reviewer` = u2.`id` WHERE mr.`machine_id` = '{p_machine_id}' AND mr.`operation_time` > '{p_startDate}'
AND mr.`operation_time` < '{p_endDate}' ORDER BY mr.`drug_id`, mr.`operation_time`, mr.`id`";
Report.DetailGrid.Recordset.QuerySQL = SQL;
Report.PrintPreview(true);
}
public static void PrintReportMechineRecord(int type, DateTime? startDate, DateTime? endDate)
{
// 定义Grid++Report报表主对象
GridppReport Report = new GridppReport();
DateTime? p_startDate = startDate ?? Convert.ToDateTime("2010-1-1");
DateTime? p_endDate = endDate ?? DateTime.Now.AddDays(1);
string p_machine_id = (ConfigurationManager.AppSettings["machineId"] ?? "DM1");
string SQL = string.Empty;
//Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(() =>
//{
// Report.ParameterByName("machine_id").Value = (ConfigurationManager.AppSettings["machineId"] ?? "DM1");
// Report.ParameterByName("startDate").Value = startDate??DateTime.Now.AddYears(-10);
// Report.ParameterByName("endDate").Value = endDate??DateTime.Now.AddDays(1);
//});
// 加载模板文件
if (type == 1)
{
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + "machine_log_add.grf");
SQL = $@"SELECT dmr.`drawer_no` AS drawerNo,dmr.`col_no` AS colNo,dmr.`type` AS `type`,dmr.`quantity` AS quantity,
dmr.`manu_no` AS manuNo,dmr.`eff_date` AS effDate,dmr.`operation_time` AS operationTime,
di.`drug_name` AS drugName,di.`drug_spec` AS drugSpec,di.`pack_unit` AS packUnit,
di.`manufactory` AS manuFactory,di.`max_stock` AS baseQuantity,dmr.`drug_id` AS drugId,
ul.`user_name` AS nickname FROM dm_machine_record dmr LEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`
LEFT JOIN user_list ul ON ul.`id` = dmr.`Operator` WHERE dmr.`type` = 1 AND dmr.`machine_id` = '{p_machine_id}'
AND dmr.`operation_time` > '{p_startDate}' AND dmr.`operation_time` < '{p_endDate}'";
}
else if (type == 2)
{
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + "machine_log_take.grf");
SQL = $@" SELECT dmr.`drawer_no` AS drawerNo,dmr.`col_no` AS colNo,dmr.`type` AS `type`,dmr.`quantity` AS quantity,
dmr.`manu_no` AS manuNo,dmr.`eff_date` AS effDate,dmr.`operation_time` AS operationTime,
di.`drug_name` AS drugName,di.`drug_spec` AS drugSpec,di.`pack_unit` AS packUnit,
di.`manufactory` AS manuFactory,di.`max_stock` AS baseQuantity,dmr.`drug_id` AS drugId,
ul.`user_name` AS nickname FROM dm_machine_record dmr LEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`
LEFT JOIN user_list ul ON ul.`id` = dmr.`Operator` WHERE dmr.`type` = 2
AND dmr.`machine_id` ='{p_machine_id}' AND dmr.`operation_time` > '{p_startDate}'
AND dmr.`operation_time` < '{p_endDate}'";
}
else if (type == 3)
{
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + "machine_log_return.grf");
SQL = $@" SELECT dmr.`drawer_no` AS drawerNo,dmr.`col_no` AS colNo,dmr.`type` AS `type`,
CONCAT(dmr.`quantity`,IF(dmr.`type`=32,""()"","""")) AS quantity,dmr.`manu_no` AS manuNo,
dmr.`eff_date` AS effDate,dmr.`operation_time` AS operationTime,di.`drug_name` AS drugName,
di.`drug_spec` AS drugSpec,di.`pack_unit` AS packUnit,
di.`manufactory` AS manuFactory,di.`max_stock` AS baseQuantity,
dmr.`drug_id` AS drugId,ul.`user_name` AS nickname FROM dm_machine_record dmr
LEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id` LEFT JOIN user_list ul ON ul.`id` = dmr.`Operator`
WHERE dmr.`type` in (31, 32) AND dmr.`machine_id` = '{p_machine_id}' AND dmr.`operation_time` > '{p_startDate}'
AND dmr.`operation_time` < '{p_endDate}'";
}
else
{
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//" + "machine_log_check.grf");
SQL = $@" SELECT dmr.`drawer_no` AS drawerNo,dmr.`col_no` AS colNo,dmr.`type` AS `type`,dmr.`quantity` AS quantity,
dmr.`manu_no` AS manuNo,dmr.`eff_date` AS effDate,dmr.`operation_time` AS operationTime,
di.`drug_name` AS drugName,di.`drug_spec` AS drugSpec,di.`pack_unit` AS packUnit,
di.`manufactory` AS manuFactory,di.`max_stock` AS baseQuantity,dmr.`drug_id` AS drugId,
ul.`user_name` AS nickname FROM dm_machine_record dmr LEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`
LEFT JOIN user_list ul ON ul.`id` = dmr.`Operator` WHERE dmr.`type` = 4
AND dmr.`machine_id` = '{p_machine_id}' AND dmr.`operation_time` > '{p_startDate}'
AND dmr.`operation_time` < '{p_endDate}'";
}
Report.DetailGrid.Recordset.ConnectionString = gridConnectionString;
Report.DetailGrid.Recordset.QuerySQL= SQL;
Report.PrintPreview(true);
}
/**
*
* tempname:
* data:
*/
public static void PrintMachineRecordReport(List<MachineRecord> data)
{
// 定义Grid++Report报表主对象
GridppReport Report = new GridppReport();
// 加载模板文件
Report.LoadFromFile(new FileInfo(AppDomain.CurrentDomain.BaseDirectory) + "ReportTemp//machine_log.grf");
// 加载数据
Report.ParameterByName("type").AsInteger = 1;
Report.PrintPreview(true);
}
}
}

View File

@ -0,0 +1,613 @@
{
"Version":"6.3.0.1",
"Font":{
"Name":"宋体",
"Size":105000,
"Weight":400,
"Charset":134
},
"Printer":{
"Oriention":"Landscape",
"LeftMargin":1,
"TopMargin":1.42875,
"RightMargin":1,
"BottomMargin":1.8
},
"DetailGrid":{
"CenterView":true,
"AppendBlankRow":true,
"Recordset":{
"Field":[
{
"Name":"日期",
"Type":"DateTime",
"Format":"M/d",
"DBFieldName":"operationTime"
},
{
"Name":"操作类型",
"DBFieldName":"type"
},
{
"Name":"批号",
"DBFieldName":"manuNo"
},
{
"Name":"上次批次结存",
"Type":"Integer",
"DBFieldName":"beforeManuQuan"
},
{
"Name":"入库数量",
"Type":"Integer",
"DBFieldName":"inQuantity"
},
{
"Name":"出库数量",
"Type":"Integer",
"DBFieldName":"outQuantity"
},
{
"Name":"批号结存",
"Type":"Integer",
"DBFieldName":"manuQuantity"
},
{
"Name":"总结存",
"Type":"Integer",
"DBFieldName":"stockQuantity"
},
{
"Name":"收/发药人",
"DBFieldName":"operatorName"
},
{
"Name":"复核人",
"DBFieldName":"reviewerName"
},
{
"Name":"药品名称",
"DBFieldName":"drugName"
},
{
"Name":"规格",
"DBFieldName":"drugSpec"
},
{
"Name":"单位",
"DBFieldName":"packUnit"
},
{
"Name":"剂型",
"DBFieldName":"dosage"
},
{
"Name":"厂家",
"DBFieldName":"manuFactory"
},
{
"Name":"有效期",
"Type":"DateTime",
"Format":"yy/M/d",
"DBFieldName":"effDate"
},
{
"Name":"sign1",
"Type":"Binary"
},
{
"Name":"sign2",
"Type":"Binary"
},
{
"Name":"drugId"
},
{
"Name":"Field1"
}
]
},
"Column":[
{
"Name":"日期",
"Width":1.77271
},
{
"Name":"操作类型",
"Width":2.19604
},
{
"Name":"批号",
"Width":3.99521
},
{
"Name":"有效期",
"Width":2.43417
},
{
"Name":"入库数量",
"Width":1.79917
},
{
"Name":"出库数量",
"Width":1.79917
},
{
"Name":"Column4",
"Width":1.98438
},
{
"Name":"收/发药人",
"Width":2.80458
},
{
"Name":"复核人",
"Width":2.80458
},
{
"Name":"Column2",
"Width":2.35479
},
{
"Name":"Column3",
"Width":2.38125
}
],
"ColumnContent":{
"Height":0.85,
"ColumnContentCell":[
{
"Column":"日期",
"TextAlign":"MiddleCenter",
"DataField":"日期"
},
{
"Column":"操作类型",
"FreeCell":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox10",
"Dock":"Fill",
"TextAlign":"MiddleCenter"
}
]
},
{
"Column":"批号",
"TextAlign":"MiddleCenter",
"DataField":"批号"
},
{
"Column":"有效期",
"TextAlign":"MiddleCenter",
"DataField":"有效期"
},
{
"Column":"入库数量",
"TextAlign":"MiddleCenter",
"DataField":"入库数量"
},
{
"Column":"出库数量",
"TextAlign":"MiddleCenter",
"DataField":"出库数量"
},
{
"Column":"Column4",
"TextAlign":"MiddleCenter",
"DataField":"总结存"
},
{
"Column":"收/发药人",
"FreeCell":true,
"Control":[
{
"Type":"FieldBox",
"Name":"FieldBox12",
"Dock":"Fill",
"TextAlign":"MiddleCenter",
"DataField":"收/发药人"
}
]
},
{
"Column":"复核人",
"FreeCell":true,
"Control":[
{
"Type":"FieldBox",
"Name":"FieldBox13",
"Dock":"Fill",
"TextAlign":"MiddleCenter",
"DataField":"复核人"
}
]
},
{
"Column":"Column2",
"FreeCell":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox6",
"Dock":"Fill",
"TextAlign":"MiddleCenter",
"Text":"药库"
}
]
},
{
"Column":"Column3",
"FreeCell":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox7",
"Dock":"Fill",
"TextAlign":"MiddleCenter",
"Text":"门诊药房"
}
]
}
]
},
"ColumnTitle":{
"Height":1.19063,
"RepeatStyle":"OnGroupHeaderPage",
"ColumnTitleCell":[
{
"GroupTitle":false,
"Column":"日期",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"日期"
},
{
"GroupTitle":false,
"Column":"操作类型",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"凭证号"
},
{
"GroupTitle":false,
"Column":"批号",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"批号"
},
{
"GroupTitle":false,
"Column":"有效期",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"有效\r\n期"
},
{
"GroupTitle":false,
"Column":"入库数量",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"借入\r\n数量"
},
{
"GroupTitle":false,
"Column":"出库数量",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"发出\r\n数量"
},
{
"GroupTitle":false,
"Column":"Column4",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"总结存"
},
{
"GroupTitle":false,
"Column":"收/发药人",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"发药人"
},
{
"GroupTitle":false,
"Column":"复核人",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"复核人"
},
{
"GroupTitle":false,
"Column":"Column2",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"供应单位"
},
{
"GroupTitle":false,
"Column":"Column3",
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"领用部门"
}
]
},
"Group":[
{
"Name":"Group1",
"ByFields":"drugId",
"GroupHeader":{
"PrintGridBorder":false,
"RepeatOnPage":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox15",
"Left":28.3898,
"Top":0.238125,
"Width":2.01083,
"Height":0.79375,
"Text":"生产厂家:"
},
{
"Type":"MemoBox",
"Name":"MemoBox11",
"Left":30.3742,
"Top":0.211667,
"Width":5.3975,
"Height":0.79375,
"Text":"[#manuFactory#]"
},
{
"Type":"StaticBox",
"Name":"StaticBox16",
"Top":0.0529167,
"Width":1.19063,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"Text":"品名:"
},
{
"Type":"FieldBox",
"Name":"FieldBox7",
"Left":1.16417,
"Top":0.0529167,
"Width":5.63563,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"DataField":"药品名称"
},
{
"Type":"StaticBox",
"Name":"StaticBox17",
"Left":6.93208,
"Top":0.0529167,
"Width":1.11125,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"Text":"规格:"
},
{
"Type":"FieldBox",
"Name":"FieldBox8",
"Left":8.01688,
"Top":0.0529167,
"Width":3.175,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"DataField":"规格"
},
{
"Type":"StaticBox",
"Name":"StaticBox18",
"Left":11.5888,
"Top":0.0529167,
"Width":1.21708,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"Text":"单位:"
},
{
"Type":"FieldBox",
"Name":"FieldBox9",
"Left":12.7794,
"Top":0.0529167,
"Width":1.87854,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"DataField":"单位"
},
{
"Type":"StaticBox",
"Name":"StaticBox19",
"Left":15.3988,
"Top":0.0529167,
"Width":1.16417,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"Text":"剂型:"
},
{
"Type":"FieldBox",
"Name":"FieldBox10",
"Left":16.5365,
"Top":0.0529167,
"Width":2.83104,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"DataField":"剂型"
},
{
"Type":"StaticBox",
"Name":"StaticBox20",
"Left":19.7379,
"Top":0.0529167,
"Width":2.01083,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"Text":"生产厂家:"
},
{
"Type":"FieldBox",
"Name":"FieldBox11",
"Left":21.7223,
"Top":0.05,
"Width":5.92667,
"Height":0.978958,
"Font":{
"Name":"宋体",
"Size":105000,
"Bold":true,
"Charset":134
},
"DataField":"厂家"
}
],
"NewPageColumn":"Before"
},
"GroupFooter":{
"Visible":false
}
}
]
},
"Parameter":[
{
"Name":"machine_id"
},
{
"Name":"startDate",
"DataType":"DateTime"
},
{
"Name":"endDate",
"DataType":"DateTime"
}
],
"ReportHeader":[
{
"Name":"ReportHeader1",
"Height":1.79917,
"Control":[
{
"Type":"MemoBox",
"Name":"MemoBox1",
"Dock":"Fill",
"Center":"Both",
"Font":{
"Name":"宋体",
"Size":262500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"麻醉、精神药品逐笔专用账册"
}
],
"RepeatOnPage":true
}
]
}

View File

@ -0,0 +1,283 @@
{
"Version":"6.3.0.1",
"Font":{
"Name":"宋体",
"Size":105000,
"Weight":400,
"Charset":134
},
"Printer":{
"LeftMargin":0.3175,
"TopMargin":0.899583,
"RightMargin":0.396875
},
"DetailGrid":{
"CenterView":true,
"AppendBlankRow":true,
"Recordset":{
"QuerySQL":"SELECT \r\n dmr.`drawer_no` AS drawerNo,\r\n dmr.`col_no` AS colNo,\r\n dmr.`type` AS `type`,\r\n dmr.`quantity` AS quantity,\r\n dmr.`manu_no` AS manuNo,\r\n dmr.`eff_date` AS effDate,\r\n dmr.`operation_time` AS operationTime,\r\n di.`drug_name` AS drugName,\r\n di.`drug_spec` AS drugSpec,\r\n di.`pack_unit` AS packUnit,\r\n di.`manufactory` AS manuFactory,\r\n di.`max_stock` AS baseQuantity,\r\n dmr.`drug_id` AS drugId,\r\n ul.`user_name` AS nickname\r\nFROM\r\n dm_machine_record dmr\r\nLEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`\r\nLEFT JOIN user_list ul ON ul.`id` = dmr.`Operator`\r\nWHERE dmr.`type` = 1 \r\n AND dmr.`machine_id` = :machine_id\r\n AND dmr.`operation_time` > :startDate\r\n AND dmr.`operation_time` < :endDate",
"Field":[
{
"Name":"操作人",
"DBFieldName":"Nickname"
},
{
"Name":"时间",
"Type":"DateTime",
"Format":"yyyy/MM/dd HH:mm:ss",
"DBFieldName":"operationTime"
},
{
"Name":"药品名称",
"DBFieldName":"DrugName"
},
{
"Name":"数量",
"DBFieldName":"quantity"
},
{
"Name":"批次",
"DBFieldName":"manuNo"
},
{
"Name":"效期",
"Type":"DateTime",
"Format":"yyyy/MM/dd",
"DBFieldName":"effDate"
},
{
"Name":"库位",
"DBFieldName":"drawerNo"
},
{
"Name":"colNo"
},
{
"Name":"type2",
"Type":"Integer",
"DBFieldName":"type"
}
]
},
"Column":[
{
"Name":"操作人",
"Width":2.38125
},
{
"Name":"时间",
"Width":3.78354
},
{
"Name":"药品名称",
"Width":4.63021
},
{
"Name":"数量",
"Width":1.98438
},
{
"Name":"批次",
"Width":2.61938
},
{
"Name":"效期",
"Width":2.38125
},
{
"Name":"库位",
"Width":2.59292
}
],
"ColumnContent":{
"Height":1.00542,
"ColumnContentCell":[
{
"Column":"操作人",
"TextAlign":"MiddleCenter",
"DataField":"操作人"
},
{
"Column":"时间",
"TextAlign":"MiddleCenter",
"DataField":"时间"
},
{
"Column":"药品名称",
"TextAlign":"MiddleCenter",
"DataField":"药品名称"
},
{
"Column":"数量",
"TextAlign":"MiddleCenter",
"DataField":"数量"
},
{
"Column":"批次",
"TextAlign":"MiddleCenter",
"DataField":"批次"
},
{
"Column":"效期",
"TextAlign":"MiddleCenter",
"DataField":"效期"
},
{
"Column":"库位",
"FreeCell":true,
"Control":[
{
"Type":"FieldBox",
"Name":"FieldBox1",
"Left":9.60438,
"Top":-2.16958,
"Width":2.80458,
"Height":0.661458
},
{
"Type":"MemoBox",
"Name":"MemoBox1",
"Dock":"Fill",
"Center":"Both",
"TextAlign":"MiddleCenter",
"Text":"[#库位#] - [#colNo#]"
}
]
}
]
},
"ColumnTitle":{
"Height":1.40229,
"RepeatStyle":"OnPage",
"ColumnTitleCell":[
{
"GroupTitle":false,
"Column":"操作人",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"操作人"
},
{
"GroupTitle":false,
"Column":"时间",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"时间"
},
{
"GroupTitle":false,
"Column":"药品名称",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"药品名称"
},
{
"GroupTitle":false,
"Column":"数量",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"数量"
},
{
"GroupTitle":false,
"Column":"批次",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"批次"
},
{
"GroupTitle":false,
"Column":"效期",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"效期"
},
{
"GroupTitle":false,
"Column":"库位",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"库位"
}
]
}
},
"Parameter":[
{
"Name":"startDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/1/1"
},
{
"Name":"endDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/4/28 23:59:59"
},
{
"Name":"machine_id",
"Value":"DM1"
}
],
"ReportHeader":[
{
"Name":"ReportHeader1",
"Height":1.79917,
"Control":[
{
"Type":"MemoBox",
"Name":"MemoBox2",
"Left":7.59354,
"Top":0.211667,
"Width":5.60917,
"Height":1.19063,
"Font":{
"Name":"宋体",
"Size":217500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"入库记录"
}
],
"RepeatOnPage":true
}
]
}

View File

@ -0,0 +1,283 @@
{
"Version":"6.3.0.1",
"Font":{
"Name":"宋体",
"Size":105000,
"Weight":400,
"Charset":134
},
"Printer":{
"LeftMargin":0.3175,
"TopMargin":0.899583,
"RightMargin":0.396875
},
"DetailGrid":{
"CenterView":true,
"AppendBlankRow":true,
"Recordset":{
"QuerySQL":"SELECT \r\n dmr.`drawer_no` AS drawerNo,\r\n dmr.`col_no` AS colNo,\r\n dmr.`type` AS `type`,\r\n dmr.`quantity` AS quantity,\r\n dmr.`manu_no` AS manuNo,\r\n dmr.`eff_date` AS effDate,\r\n dmr.`operation_time` AS operationTime,\r\n di.`drug_name` AS drugName,\r\n di.`drug_spec` AS drugSpec,\r\n di.`pack_unit` AS packUnit,\r\n di.`manufactory` AS manuFactory,\r\n di.`max_stock` AS baseQuantity,\r\n dmr.`drug_id` AS drugId,\r\n ul.`user_name` AS nickname\r\nFROM\r\n dm_machine_record dmr\r\nLEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`\r\nLEFT JOIN user_list ul ON ul.`id` = dmr.`Operator`\r\nWHERE dmr.`type` = 4 \r\n AND dmr.`machine_id` = :machine_id\r\n AND dmr.`operation_time` > :startDate\r\n AND dmr.`operation_time` < :endDate",
"Field":[
{
"Name":"操作人",
"DBFieldName":"Nickname"
},
{
"Name":"时间",
"Type":"DateTime",
"Format":"yyyy/MM/dd HH:mm:ss",
"DBFieldName":"operationTime"
},
{
"Name":"药品名称",
"DBFieldName":"DrugName"
},
{
"Name":"数量",
"DBFieldName":"quantity"
},
{
"Name":"批次",
"DBFieldName":"manuNo"
},
{
"Name":"效期",
"Type":"DateTime",
"Format":"yyyy/MM/dd",
"DBFieldName":"effDate"
},
{
"Name":"库位",
"DBFieldName":"drawerNo"
},
{
"Name":"colNo"
},
{
"Name":"type2",
"Type":"Integer",
"DBFieldName":"type"
}
]
},
"Column":[
{
"Name":"操作人",
"Width":2.38125
},
{
"Name":"时间",
"Width":3.78354
},
{
"Name":"药品名称",
"Width":4.63021
},
{
"Name":"数量",
"Width":1.98438
},
{
"Name":"批次",
"Width":2.61938
},
{
"Name":"效期",
"Width":2.38125
},
{
"Name":"库位",
"Width":2.59292
}
],
"ColumnContent":{
"Height":1.00542,
"ColumnContentCell":[
{
"Column":"操作人",
"TextAlign":"MiddleCenter",
"DataField":"操作人"
},
{
"Column":"时间",
"TextAlign":"MiddleCenter",
"DataField":"时间"
},
{
"Column":"药品名称",
"TextAlign":"MiddleCenter",
"DataField":"药品名称"
},
{
"Column":"数量",
"TextAlign":"MiddleCenter",
"DataField":"数量"
},
{
"Column":"批次",
"TextAlign":"MiddleCenter",
"DataField":"批次"
},
{
"Column":"效期",
"TextAlign":"MiddleCenter",
"DataField":"效期"
},
{
"Column":"库位",
"FreeCell":true,
"Control":[
{
"Type":"FieldBox",
"Name":"FieldBox1",
"Left":9.60438,
"Top":-2.16958,
"Width":2.80458,
"Height":0.661458
},
{
"Type":"MemoBox",
"Name":"MemoBox1",
"Dock":"Fill",
"Center":"Both",
"TextAlign":"MiddleCenter",
"Text":"[#库位#] - [#colNo#]"
}
]
}
]
},
"ColumnTitle":{
"Height":1.40229,
"RepeatStyle":"OnPage",
"ColumnTitleCell":[
{
"GroupTitle":false,
"Column":"操作人",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"操作人"
},
{
"GroupTitle":false,
"Column":"时间",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"时间"
},
{
"GroupTitle":false,
"Column":"药品名称",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"药品名称"
},
{
"GroupTitle":false,
"Column":"数量",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"数量"
},
{
"GroupTitle":false,
"Column":"批次",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"批次"
},
{
"GroupTitle":false,
"Column":"效期",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"效期"
},
{
"GroupTitle":false,
"Column":"库位",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"库位"
}
]
}
},
"Parameter":[
{
"Name":"startDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/1/1"
},
{
"Name":"endDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/4/28 23:59:59"
},
{
"Name":"machine_id",
"Value":"DM1"
}
],
"ReportHeader":[
{
"Name":"ReportHeader1",
"Height":1.79917,
"Control":[
{
"Type":"MemoBox",
"Name":"MemoBox2",
"Left":7.59354,
"Top":0.211667,
"Width":5.60917,
"Height":1.19063,
"Font":{
"Name":"宋体",
"Size":217500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"盘点记录"
}
],
"RepeatOnPage":true
}
]
}

View File

@ -0,0 +1,283 @@
{
"Version":"6.3.0.1",
"Font":{
"Name":"宋体",
"Size":105000,
"Weight":400,
"Charset":134
},
"Printer":{
"LeftMargin":0.3175,
"TopMargin":0.899583,
"RightMargin":0.396875
},
"DetailGrid":{
"CenterView":true,
"AppendBlankRow":true,
"Recordset":{
"QuerySQL":"SELECT \r\n dmr.`drawer_no` AS drawerNo,\r\n dmr.`col_no` AS colNo,\r\n dmr.`type` AS `type`,\r\n CONCAT(dmr.`quantity`,IF(dmr.`type`=32,\"(空瓶)\",\"\")) AS quantity,\r\n dmr.`manu_no` AS manuNo,\r\n dmr.`eff_date` AS effDate,\r\n dmr.`operation_time` AS operationTime,\r\n di.`drug_name` AS drugName,\r\n di.`drug_spec` AS drugSpec,\r\n di.`pack_unit` AS packUnit,\r\n di.`manufactory` AS manuFactory,\r\n di.`max_stock` AS baseQuantity,\r\n dmr.`drug_id` AS drugId,\r\n ul.`user_name` AS nickname\r\nFROM\r\n dm_machine_record dmr\r\nLEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`\r\nLEFT JOIN user_list ul ON ul.`id` = dmr.`Operator`\r\nWHERE dmr.`type` in (31, 32)\r\n AND dmr.`machine_id` = :machine_id\r\n AND dmr.`operation_time` > :startDate\r\n AND dmr.`operation_time` < :endDate",
"Field":[
{
"Name":"操作人",
"DBFieldName":"Nickname"
},
{
"Name":"时间",
"Type":"DateTime",
"Format":"yyyy/MM/dd HH:mm:ss",
"DBFieldName":"operationTime"
},
{
"Name":"药品名称",
"DBFieldName":"DrugName"
},
{
"Name":"数量",
"DBFieldName":"quantity"
},
{
"Name":"批次",
"DBFieldName":"manuNo"
},
{
"Name":"效期",
"Type":"DateTime",
"Format":"yyyy/MM/dd",
"DBFieldName":"effDate"
},
{
"Name":"库位",
"DBFieldName":"drawerNo"
},
{
"Name":"colNo"
},
{
"Name":"type2",
"Type":"Integer",
"DBFieldName":"type"
}
]
},
"Column":[
{
"Name":"操作人",
"Width":2.38125
},
{
"Name":"时间",
"Width":3.78354
},
{
"Name":"药品名称",
"Width":4.63021
},
{
"Name":"数量",
"Width":1.98438
},
{
"Name":"批次",
"Width":2.61938
},
{
"Name":"效期",
"Width":2.38125
},
{
"Name":"库位",
"Width":2.59292
}
],
"ColumnContent":{
"Height":1.00542,
"ColumnContentCell":[
{
"Column":"操作人",
"TextAlign":"MiddleCenter",
"DataField":"操作人"
},
{
"Column":"时间",
"TextAlign":"MiddleCenter",
"DataField":"时间"
},
{
"Column":"药品名称",
"TextAlign":"MiddleCenter",
"DataField":"药品名称"
},
{
"Column":"数量",
"TextAlign":"MiddleCenter",
"DataField":"数量"
},
{
"Column":"批次",
"TextAlign":"MiddleCenter",
"DataField":"批次"
},
{
"Column":"效期",
"TextAlign":"MiddleCenter",
"DataField":"效期"
},
{
"Column":"库位",
"FreeCell":true,
"Control":[
{
"Type":"FieldBox",
"Name":"FieldBox1",
"Left":9.60438,
"Top":-2.16958,
"Width":2.80458,
"Height":0.661458
},
{
"Type":"MemoBox",
"Name":"MemoBox1",
"Dock":"Fill",
"Center":"Both",
"TextAlign":"MiddleCenter",
"Text":"[#库位#] - [#colNo#]"
}
]
}
]
},
"ColumnTitle":{
"Height":1.40229,
"RepeatStyle":"OnPage",
"ColumnTitleCell":[
{
"GroupTitle":false,
"Column":"操作人",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"操作人"
},
{
"GroupTitle":false,
"Column":"时间",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"时间"
},
{
"GroupTitle":false,
"Column":"药品名称",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"药品名称"
},
{
"GroupTitle":false,
"Column":"数量",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"数量"
},
{
"GroupTitle":false,
"Column":"批次",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"批次"
},
{
"GroupTitle":false,
"Column":"效期",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"效期"
},
{
"GroupTitle":false,
"Column":"库位",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"库位"
}
]
}
},
"Parameter":[
{
"Name":"startDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/1/1"
},
{
"Name":"endDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/4/28 23:59:59"
},
{
"Name":"machine_id",
"Value":"DM1"
}
],
"ReportHeader":[
{
"Name":"ReportHeader1",
"Height":1.79917,
"Control":[
{
"Type":"MemoBox",
"Name":"MemoBox2",
"Left":7.59354,
"Top":0.211667,
"Width":5.60917,
"Height":1.19063,
"Font":{
"Name":"宋体",
"Size":217500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"归还记录"
}
],
"RepeatOnPage":true
}
]
}

View File

@ -0,0 +1,283 @@
{
"Version":"6.3.0.1",
"Font":{
"Name":"宋体",
"Size":105000,
"Weight":400,
"Charset":134
},
"Printer":{
"LeftMargin":0.3175,
"TopMargin":0.899583,
"RightMargin":0.396875
},
"DetailGrid":{
"CenterView":true,
"AppendBlankRow":true,
"Recordset":{
"QuerySQL":"SELECT \r\n dmr.`drawer_no` AS drawerNo,\r\n dmr.`col_no` AS colNo,\r\n dmr.`type` AS `type`,\r\n dmr.`quantity` AS quantity,\r\n dmr.`manu_no` AS manuNo,\r\n dmr.`eff_date` AS effDate,\r\n dmr.`operation_time` AS operationTime,\r\n di.`drug_name` AS drugName,\r\n di.`drug_spec` AS drugSpec,\r\n di.`pack_unit` AS packUnit,\r\n di.`manufactory` AS manuFactory,\r\n di.`max_stock` AS baseQuantity,\r\n dmr.`drug_id` AS drugId,\r\n ul.`user_name` AS nickname\r\nFROM\r\n dm_machine_record dmr\r\nLEFT JOIN drug_info di ON di.`drug_id` = dmr.`drug_id`\r\nLEFT JOIN user_list ul ON ul.`id` = dmr.`Operator`\r\nWHERE dmr.`type` = 2 \r\n AND dmr.`machine_id` = :machine_id\r\n AND dmr.`operation_time` > :startDate\r\n AND dmr.`operation_time` < :endDate",
"Field":[
{
"Name":"操作人",
"DBFieldName":"Nickname"
},
{
"Name":"时间",
"Type":"DateTime",
"Format":"yyyy/MM/dd HH:mm:ss",
"DBFieldName":"operationTime"
},
{
"Name":"药品名称",
"DBFieldName":"DrugName"
},
{
"Name":"数量",
"DBFieldName":"quantity"
},
{
"Name":"批次",
"DBFieldName":"manuNo"
},
{
"Name":"效期",
"Type":"DateTime",
"Format":"yyyy/MM/dd",
"DBFieldName":"effDate"
},
{
"Name":"库位",
"DBFieldName":"drawerNo"
},
{
"Name":"colNo"
},
{
"Name":"type2",
"Type":"Integer",
"DBFieldName":"type"
}
]
},
"Column":[
{
"Name":"操作人",
"Width":2.38125
},
{
"Name":"时间",
"Width":3.78354
},
{
"Name":"药品名称",
"Width":4.63021
},
{
"Name":"数量",
"Width":1.98438
},
{
"Name":"批次",
"Width":2.61938
},
{
"Name":"效期",
"Width":2.38125
},
{
"Name":"库位",
"Width":2.59292
}
],
"ColumnContent":{
"Height":1.00542,
"ColumnContentCell":[
{
"Column":"操作人",
"TextAlign":"MiddleCenter",
"DataField":"操作人"
},
{
"Column":"时间",
"TextAlign":"MiddleCenter",
"DataField":"时间"
},
{
"Column":"药品名称",
"TextAlign":"MiddleCenter",
"DataField":"药品名称"
},
{
"Column":"数量",
"TextAlign":"MiddleCenter",
"DataField":"数量"
},
{
"Column":"批次",
"TextAlign":"MiddleCenter",
"DataField":"批次"
},
{
"Column":"效期",
"TextAlign":"MiddleCenter",
"DataField":"效期"
},
{
"Column":"库位",
"FreeCell":true,
"Control":[
{
"Type":"FieldBox",
"Name":"FieldBox1",
"Left":9.60438,
"Top":-2.16958,
"Width":2.80458,
"Height":0.661458
},
{
"Type":"MemoBox",
"Name":"MemoBox1",
"Dock":"Fill",
"Center":"Both",
"TextAlign":"MiddleCenter",
"Text":"[#库位#] - [#colNo#]"
}
]
}
]
},
"ColumnTitle":{
"Height":1.40229,
"RepeatStyle":"OnPage",
"ColumnTitleCell":[
{
"GroupTitle":false,
"Column":"操作人",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"操作人"
},
{
"GroupTitle":false,
"Column":"时间",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"时间"
},
{
"GroupTitle":false,
"Column":"药品名称",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"药品名称"
},
{
"GroupTitle":false,
"Column":"数量",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"数量"
},
{
"GroupTitle":false,
"Column":"批次",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"批次"
},
{
"GroupTitle":false,
"Column":"效期",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"效期"
},
{
"GroupTitle":false,
"Column":"库位",
"Font":{
"Name":"宋体",
"Size":120000,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"库位"
}
]
}
},
"Parameter":[
{
"Name":"startDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/1/1"
},
{
"Name":"endDate",
"DataType":"DateTime",
"Format":"yyyy-MM-dd hh:mm:ss",
"Value":"2023/4/28 23:59:59"
},
{
"Name":"machine_id",
"Value":"DM1"
}
],
"ReportHeader":[
{
"Name":"ReportHeader1",
"Height":1.79917,
"Control":[
{
"Type":"MemoBox",
"Name":"MemoBox2",
"Left":7.59354,
"Top":0.211667,
"Width":5.60917,
"Height":1.19063,
"Font":{
"Name":"宋体",
"Size":217500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"出库记录"
}
],
"RepeatOnPage":true
}
]
}

View File

@ -0,0 +1,346 @@
{
"Version":"6.3.0.1",
"Font":{
"Name":"宋体",
"Size":105000,
"Weight":400,
"Charset":134
},
"Printer":{
"Oriention":"Landscape"
},
"DetailGrid":{
"CenterView":true,
"PrintAdaptMethod":"ResizeToFit",
"AppendBlankRow":true,
"Recordset":{
"QuerySQL":"SELECT \r\n cl.`row_no` AS drawerNo,\r\n cl.`col_no` AS colNo,\r\n cl.`quantity` AS quantity,\r\n cl.`manu_no` AS manuNo,\r\n cl.`eff_date` AS effDate,\r\n di.`drug_name` AS drugName,\r\n di.`drug_spec` AS drugSpec,\r\n di.`pack_unit` AS packUnit,\r\n di.`manufactory` AS manuFactory,\r\n di.`max_stock` AS baseQuantity,\r\n cl.`drug_id` AS drugId\r\nFROM\r\n channel_stock cl\r\nINNER JOIN drug_info di ON di.`drug_id` = cl.`drug_id`\r\nWHERE cl.`machine_id` = :machine_id\r\n AND cl.`drawer_type` = 1\r\n ORDER BY cl.`drug_id`",
"Field":[
{
"Name":"drugName"
},
{
"Name":"drugSpec"
},
{
"Name":"manuFactory"
},
{
"Name":"quantityCount"
},
{
"Name":"manuNo"
},
{
"Name":"effDate"
},
{
"Name":"quantity",
"Type":"Integer",
"Format":"0"
},
{
"Name":"drawerNo"
},
{
"Name":"drugId"
},
{
"Name":"baseQuantity",
"Type":"Integer"
}
]
},
"Column":[
{
"Name":"drugName",
"Width":5.37104
},
{
"Name":"drugSpec"
},
{
"Name":"manuFactory",
"Width":4.60375
},
{
"Name":"Column1"
},
{
"Name":"quantityCount",
"Width":2.59292
},
{
"Name":"manuNo"
},
{
"Name":"effDate"
},
{
"Name":"quantity",
"Width":2.43417
}
],
"ColumnContent":{
"Height":0.79375,
"ColumnContentCell":[
{
"Column":"drugName",
"TextAlign":"MiddleCenter",
"DataField":"drugName"
},
{
"Column":"drugSpec",
"TextAlign":"MiddleCenter",
"DataField":"drugSpec"
},
{
"Column":"manuFactory",
"TextAlign":"MiddleCenter",
"DataField":"manuFactory"
},
{
"Column":"Column1",
"FreeCell":true
},
{
"Column":"quantityCount",
"FreeCell":true
},
{
"Column":"manuNo",
"TextAlign":"MiddleCenter",
"DataField":"manuNo"
},
{
"Column":"effDate",
"TextAlign":"MiddleCenter",
"DataField":"effDate"
},
{
"Column":"quantity",
"TextAlign":"MiddleCenter",
"DataField":"quantity"
}
]
},
"ColumnTitle":{
"Height":1.19063,
"RepeatStyle":"OnPage",
"ColumnTitleCell":[
{
"GroupTitle":false,
"Column":"drugName",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"药品名称"
},
{
"GroupTitle":false,
"Column":"drugSpec",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"规格"
},
{
"GroupTitle":false,
"Column":"manuFactory",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"厂家"
},
{
"GroupTitle":false,
"Column":"Column1",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"基数"
},
{
"GroupTitle":false,
"Column":"quantityCount",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"总库存"
},
{
"GroupTitle":false,
"Column":"manuNo",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"批次"
},
{
"GroupTitle":false,
"Column":"effDate",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"效期"
},
{
"GroupTitle":false,
"Column":"quantity",
"Font":{
"Name":"宋体",
"Size":142500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"数量"
}
]
},
"Group":[
{
"Name":"drugId",
"ByFields":"drugId",
"GroupHeader":{
"Visible":false,
"Height":0.79375,
"RepeatOnPage":true,
"OccupyColumn":true,
"IncludeFooter":true,
"OccupiedColumns":"drugName;drugSpec;manuFactory;quantityCount;Column1",
"VAlign":"Middle"
},
"GroupFooter":{
"Visible":false,
"Height":0.396875
}
},
{
"Name":"Group1",
"ByFields":"drugId",
"GroupHeader":{
"Control":[
{
"Type":"MemoBox",
"Name":"MemoBox3",
"AlignColumn":"drugName",
"Width":5.3975,
"Height":1.19063,
"TextAlign":"MiddleCenter",
"Text":"[#drugName#]"
},
{
"Type":"MemoBox",
"Name":"MemoBox4",
"AlignColumn":"drugSpec",
"Left":5.37104,
"Width":3.01625,
"Height":1.19063,
"TextAlign":"MiddleCenter",
"Text":"[#drugSpec#]"
},
{
"Type":"MemoBox",
"Name":"MemoBox5",
"AlignColumn":"manuFactory",
"Left":8.36083,
"Width":4.63021,
"Height":1.19063,
"TextAlign":"MiddleCenter",
"Text":"[#manuFactory#]"
},
{
"Type":"MemoBox",
"Name":"MemoBox6",
"AlignColumn":"Column1",
"Left":12.9646,
"Width":3.01625,
"Height":1.19063,
"TextAlign":"MiddleCenter",
"Text":"[#baseQuantity#]"
},
{
"Type":"SummaryBox",
"Name":"SummaryBox1",
"AlignColumn":"quantityCount",
"Left":15.9544,
"Width":2.61938,
"Height":1.19063,
"TextAlign":"MiddleCenter",
"DataField":"quantity",
"Format":"0"
}
],
"OccupyColumn":true,
"SameAsColumn":false,
"OccupiedColumns":"Column1;drugName;drugSpec;manuFactory;quantityCount",
"VAlign":"Middle"
},
"GroupFooter":{
"Visible":false
}
}
]
},
"Parameter":[
{
"Name":"machine_id",
"Value":"DM1"
}
],
"ReportHeader":[
{
"Name":"ReportHeader1",
"Height":2.40771,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox1",
"Center":"Horizontal",
"Left":8.89,
"Top":0.608542,
"Width":9.18104,
"Height":1.21708,
"Font":{
"Name":"宋体",
"Size":217500,
"Bold":true,
"Charset":134
},
"TextAlign":"MiddleCenter",
"Text":"毒麻药品库存信息"
}
],
"RepeatOnPage":true
}
]
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace DM_Weight.Validation
{
public class NotEmptyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return string.IsNullOrWhiteSpace((value ?? "").ToString())
? new ValidationResult(false, "字段不能为空")
: ValidationResult.ValidResult;
}
}
}

View File

@ -0,0 +1,535 @@
using DM_Weight.Common;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Drawing.Printing;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Documents;
namespace DM_Weight.ViewModels
{
public class AddDrugControlViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(DrawerAddDrugWindowViewModel));
private List<int> _drawerNoList = new List<int>();
public static AddDrugControlViewModel vm;
//凭证号
//private string _pzh;
//public string PZH { get => _pzh; set { SetProperty(ref _pzh, value); } }
private List<ChannelList>? _channelLsts;
public List<ChannelList>? ChannelLsts
{
get => _channelLsts;
set => SetProperty(ref _channelLsts, value);
}
private List<ChannelStock> __channelStocks = new List<ChannelStock>();
public List<ChannelStock> ChannelStocks
{
get => __channelStocks;
set => SetProperty(ref __channelStocks, value);
}
private ChannelStock? _channelStock;
public ChannelStock? CStock
{
get => _channelStock;
set => SetProperty(ref _channelStock, value);
}
//private ChannelList? _channelList;
//public ChannelList? ChannelLst
//{
// get => _channelList;
// set => SetProperty(ref _channelList, value);
//}
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
IDialogService _dialogService;
public AddDrugControlViewModel(IDialogService DialogService, PortUtil portUtil, IEventAggregator eventAggregator)
{
_dialogService = DialogService;
_portUtil = portUtil;
_eventAggregator = eventAggregator;
vm = this;
}
public DelegateCommand SelectionChangedCommand => new DelegateCommand(selectionAction);
private async void selectionAction()
{
if (CStock != null)
{
// 此处延时1毫秒等待页面渲染
await Task.Delay(TimeSpan.FromMilliseconds(1));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("addManuno", CStock);
DialogServiceExtensions.ShowDialogHost(_dialogService, "AddManunoDialog", dialogParameters, DoDialogResult, "RootDialog");
}
}
private void DoDialogResult(IDialogResult dialogResult)
{
// 委托 被动执行 被子窗口执行
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
//if(dialogResult.Result == ButtonResult.OK)
//{
CStock = null;
RequestData();
//}
//MessageBox.Show("返回值:" + dialogResult.Result.ToString());
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "DrawerAddDrugWindow")
{
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
Status = 2;
}
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 2)
{
Status = 3;
}
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 2)
{
//ChannelStocks.ForEach(it => it.AddQuantity = msg.Quantitys[it.ColNo - 1]);
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
if (msg.WindowName == "AddDrugControl")
{
}
}
private int _status;
public int Status { get => _status; set => SetProperty(ref _status, value); }
private int _drawerNo = 1;
public int DrawerNo
{
get => _drawerNo;
set => SetProperty(ref _drawerNo, value);
}
private bool _is8Drawer = true;
public bool Is8Drawer { get => _is8Drawer; set => SetProperty(ref _is8Drawer, value); }
private bool _is16Drawer = false;
public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
private bool _is17Drawer = false;
public bool Is17Drawer { get => _is17Drawer; set => SetProperty(ref _is17Drawer, value); }
public DelegateCommand<string> UpdateDrawerNo
{
get => new DelegateCommand<string>((DrawerNo) =>
{
this.DrawerNo = Convert.ToInt32(DrawerNo);
RequestData();
}, (DrawerNo) => Status == 0
);
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(() =>
{
Status = 1;
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
try
{
//List<ChannelStock> singleChannels = ChannelStocks.FindAll(it => it.BoardType != 1);
List<ChannelList> singleChannels = ChannelLsts.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
_portUtil.WindowName = "DrawerAddDrugWindow";
_portUtil.Operate = true;
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
//_portUtil.Stocks = singleChannels.Select(it => it.Quantity).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}
catch (Exception ex)
{
logger.Info($"OpenDrawer异常{ex.Message}");
}
}, () => Status == 0).ObservesProperty(() => Status);
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
foreach (ChannelList lst in ChannelLsts)
{
ChannelStocks.AddRange(lst.channelStocks);
}
List<ChannelStock> record = ChannelStocks.FindAll(it => it.AddQuantity != 0).ToList();
if (record.Count > 0)
{
string InvoiceId = "DRAWER_" + CurrentTimeMillis();
//string InvoiceId = PZH;
//List<string> repeatList = new List<string>();
List<ChannelStock> stockRepeats = new List<ChannelStock>();
var f = SqlSugarHelper.Db.UseTran(() =>
{
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
it.ManuNo = it.drugManuNo.ManuNo;
it.EffDate = it.drugManuNo.EffDate;
if (it.Id != null)
{
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity + it.AddQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
}
else
{
//如果批号重复则不让添加
List<ChannelStock> csCount = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerNo == it.DrawerNo && cs.ManuNo == it.ManuNo && cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).ToList();
if (csCount.Count > 0)
{
//repeatList.Add(it.ManuNo);
stockRepeats.Add(it);
continue;
}
// 更新数据 库存信息
SqlSugarHelper.Db.Insertable(new ChannelStock()
{
Quantity = it.AddQuantity,
Chnguid = it.Chnguid,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
DrawerType = it.DrawerType,
BoardType = it.BoardType,
Id = Guid.NewGuid().ToString(),
MachineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1"
}).ExecuteCommand();
}
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 入库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer=HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.AddQuantity,
Type = 1,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
}
return true;
});
ChannelStocks.Clear();
//if (record.Count == repeatList.Count)
if (stockRepeats.Count == record.Count)
{
AlertMsg alertMsg = new AlertMsg
{
Message = $"该抽屉已存在此药品批次{string.Join(',', stockRepeats.Select(r=>r.ManuNo).ToArray())},请选择其他批次",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
else
{
//if (repeatList.Count > 0)
//{
// AlertMsg alertMsg = new AlertMsg
// {
// Message = $"该抽屉已存在此药品批次{string.Join(',', repeatList)},请选择其他批次",
// Type = MsgType.ERROR
// };
// _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
//}
if (f.Data)
{
string msg = string.Empty;
MsgType type = MsgType.SUCCESS;
//if (repeatList.Count > 0)
if (stockRepeats.Count > 0)
{
msg = $"该抽屉下批次{string.Join(',', stockRepeats.Select(r => r.ManuNo).ToArray())}已存在,不可重复添加,其他批次加药完成,库存已更新";
foreach(var stockRpt in stockRepeats)
{
//移除重复的信息,以免更新屏显库存时更新了重复数据
record.Remove(stockRpt);
}
type = MsgType.WARING;
}
else
{
msg = "抽屉加药完成,库存已更新";
}
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart|| (singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.weighSmartBox)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + it.AddQuantity);
});
}
RequestData();
AlertMsg alertMsg = new AlertMsg
{
Message = msg,
Type = type,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "更新库存失败",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
Status = 0;
_isFinishClick = false;
//PZH = string.Empty;
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "没有填写加药数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
});
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//添加批次
public void AddAction(ChannelList channelLS)
{
if (channelLS != null)
{
ChannelStock cls = new ChannelStock();
DrugManuNo drugManu = new DrugManuNo();
cls.DrugInfo = channelLS.Drug;
if (channelLS.channelStocks.Count > 0)
{
//drugManu = channelLS.channelStocks[0].DrugInfo.DrugManuNos[0];
cls.drugManuNo = channelLS.channelStocks[0].drugManuNo;
}
else
{
//drugManu= cls.DrugInfo.DrugManuNos[0];
if (cls.DrugInfo.DrugManuNos.Count > 0)
{
cls.drugManuNo = cls.DrugInfo.DrugManuNos[0];
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "该药品下没有批次,请先添加批次",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return;
}
}
//cls.Id = "";
cls.Chnguid = channelLS.Id;
cls.MachineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1";
cls.DrawerNo = channelLS.DrawerNo;
cls.BoardType = channelLS.BoardType;
cls.DrawerType = channelLS.DrawerType;
cls.ColNo = channelLS.ColNo;
cls.DrugId = channelLS.DrugId;
cls.AddQuantity = 0;
//string sqlStr = @"select drug_id,manu_no,manu_date,eff_date from drug_manu_no where drug_id=@drugId
// and manu_no not in(select manu_no from channel_stock where drug_id=@drugId) ";
//cls.DrugInfo.DrugManuNos=SqlSugarHelper.Db.SqlQueryable<dynamic>(sqlStr).AddParameters(new
//{
// drugId = channelLS.DrugId
//})
//.Select(it => new DrugManuNo()).ToList();
List<ChannelStock> stockList = new List<ChannelStock>();
stockList.AddRange(channelLS.channelStocks);
stockList.Add(cls);
channelLS.channelStocks = stockList;
}
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
public bool KeepAlive => false;
public void FindDrawerCount()
{
int count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
Is8Drawer = count < 9;
Is16Drawer = count >= 16;
Is17Drawer = count > 16;
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
List<ChannelList> queryData = SqlSugarHelper.Db.Queryable<ChannelList>()
.Includes(cl => cl.Drug, di => di.DrugManuNos)
.Includes(cl => cl.channelStocks, dr => dr.DrugInfo, d => d.DrugManuNos)
.Where(cl => cl.DrawerNo == DrawerNo)
.Where(cl => cl.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cl => cl.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.Where(cl => cl.DrugId != null)
.OrderBy(cl => cl.ColNo)
.ToList();
ChannelLsts = queryData.Select(cl =>
{
cl.channelStocks = cl.channelStocks.Select(cs =>
{
cs.drugManuNo = cl.Drug.DrugManuNos.Find(it => it.ManuNo.Equals(cs.ManuNo));
return cs;
}).ToList();
return cl;
}).ToList();
//ChannelLsts = new ObservableCollection<ChannelList>(queryData);
ChannelLsts.ForEach(cl => cl.channelStocks.ForEach(cs => cs.DrugInfo = cl.Drug));
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
_eventAggregator.GetEvent<AddDrugEvent>().Subscribe(AddAction);
FindDrawerCount();
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
_eventAggregator.GetEvent<AddDrugEvent>().Unsubscribe(AddAction);
}
}
}

View File

@ -0,0 +1,544 @@
using DM_Weight.Common;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using log4net;
using NetTaste;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace DM_Weight.ViewModels
{
public class BiaoDingWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(BiaoDingWindowViewModel));
private List<int> _drawerNoList = new List<int>();
/// <summary>
/// 抽屉号按钮是否可用
/// </summary>
private string _btnVisibil;
public string BtnVisibil
{
get => _btnVisibil; set
{
SetProperty(ref _btnVisibil, value);
}
}
//状态,抽屉下的库位有库存为0的则可标定否则不可标定
private int _status;
public int Status { get => _status; set => SetProperty(ref _status, value); }
//凭证号
private string _pzh;
public string PZH { get => _pzh; set { SetProperty(ref _pzh, value); } }
private ObservableCollection<ChannelStock>? _channelStocks;
public ObservableCollection<ChannelStock>? ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private ChannelStock? _channelStock;
public ChannelStock? CStock
{
get => _channelStock;
set => SetProperty(ref _channelStock, value);
}
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
IDialogService _dialogService;
public BiaoDingWindowViewModel(IDialogService DialogService, PortUtil portUtil, IEventAggregator eventAggregator)
{
_dialogService = DialogService;
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
public DelegateCommand SelectionChangedCommand => new DelegateCommand(selectionAction);
private async void selectionAction()
{
if (CStock != null)
{
// 此处延时1毫秒等待页面渲染
await Task.Delay(TimeSpan.FromMilliseconds(1));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("addManuno", CStock);
DialogServiceExtensions.ShowDialogHost(_dialogService, "AddManunoDialog", dialogParameters, DoDialogResult, "RootDialog");
}
}
private void DoDialogResult(IDialogResult dialogResult)
{
CStock = null;
RequestData();
}
//void DoMyPrismEvent(DeviceMsg msg)
//{
// if (msg.WindowName == "DrawerAddDrugWindow")
// {
// switch (msg.EventType)
// {
// // 抽屉打开
// //case EventType.DRAWEROPEN:
// // if (Status == 1)
// // {
// // Status = 2;
// // }
// // break;
// //// 抽屉关闭
// //case EventType.DRAWERCLOSE:
// // if (Status == 2)
// // {
// // Status = 3;
// // }
// // break;
// // 数量变化
// //case EventType.UPDATEQUANTITY:
// // if (Status == 4)
// // {
// // ChannelStocks.ToList().ForEach(it => it.AddQuantity = msg.Quantitys[it.ColNo - 1]);
// // }
// // break;
// // 打开失败
// //case EventType.OPENERROR:
// // AlertMsg alertMsg = new AlertMsg
// // {
// // Message = msg.Message,
// // Type = MsgType.ERROR,
// // };
// // _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
// // Status = 0;
// // break;
// }
// }
//}
private int _drawerNo = Convert.ToInt32(ConfigurationManager.AppSettings["WeightDrawerNumber"].Split(',')[0]);
public int DrawerNo
{
get => _drawerNo;
set => SetProperty(ref _drawerNo, value);
}
private bool _is8Drawer = true;
public bool Is8Drawer { get => _is8Drawer; set => SetProperty(ref _is8Drawer, value); }
private bool _is16Drawer = false;
public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
private bool _is17Drawer = false;
public bool Is17Drawer { get => _is17Drawer; set => SetProperty(ref _is17Drawer, value); }
public DelegateCommand<string> UpdateDrawerNo
{
get => new DelegateCommand<string>((DrawerNo) =>
{
//BtnStatus = 0;
this.DrawerNo = Convert.ToInt32(DrawerNo);
RequestData();
});
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(OpenDrawerMethod
// async () =>
//{
// try
// {
// List<ChannelStock> singleChannels = ChannelStocks.ToList().FindAll(it => it.BoardType == (Int32)BoardTypeEnum.weighBox && it.PosNo == 0 && it.Quantity == 0 && it.AddQuantity > 0);
// if (singleChannels.Count > 0)
// {
// ChannelStocks = new ObservableCollection<ChannelStock> (singleChannels);
// Status = 2;
// _portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
// //发送称重25指令
// await SendClearCount(singleChannels);
// _portUtil.Operate = true;
// _portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
// _portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
// //_portUtil.Stocks = singleChannels.Select(it => it.Quantity).ToArray();
// _portUtil.DrawerNo = DrawerNo;
// //_portUtil.Start();
// byte[] buffer = await _portUtil.OpenDrawer();
// int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
// logger.Info($"OpenDrawer{string.Join(",", r)}");
// if (DrawerState(r))
// {
// _portUtil.BoxLockLightOn2();
// }
// Status = 3;
// }
// else
// {
// _isFinishClick = false;
// AlertMsg alertMsg = new AlertMsg
// {
// Message = "请填写药品数量",
// Type = MsgType.ERROR
// };
// _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
// }
// }
// catch (Exception ex)
// {
// _portUtil.ResetData();
// logger.Info($"OpenDrawer异常{ex.Message}");
// _isFinishClick = false;
// AlertMsg alertMsg = new AlertMsg
// {
// Message = $"异常:{ex.Message}",
// Type = MsgType.ERROR
// };
// _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
// //Status = 1;
// }
// //finally { BiaoDingLoading = false;}
//}
);
}
private void OpenDrawerMethod()
{
_portUtil.Operate = true;
OpenDrawerMethodAction();
}
private async void OpenDrawerMethodAction()
{
try
{
if (_portUtil.Operate)
{
List<ChannelStock> singleChannels = ChannelStocks.ToList().FindAll(it => it.BoardType == (Int32)BoardTypeEnum.weighBox && it.PosNo == 0 && it.Quantity == 0 && it.AddQuantity > 0);
if (singleChannels.Count > 0)
{
ChannelStocks = new ObservableCollection<ChannelStock>(singleChannels);
Status = 2;
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
//发送称重25指令
await SendClearCount(singleChannels);
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
//_portUtil.Stocks = singleChannels.Select(it => it.Quantity).ToArray();
_portUtil.DrawerNo = DrawerNo;
//_portUtil.Start();
byte[] buffer = await _portUtil.OpenDrawer();
int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
logger.Info($"OpenDrawer{string.Join(",", r)}");
if (DrawerState(r))
{
_portUtil.BoxLockLightOn2();
}
Status = 3;
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "请填写药品数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
}
catch (Exception ex)
{
_portUtil.ResetData();
logger.Info($"OpenDrawer异常{ex.Message}");
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = $"异常:{ex.Message}",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
//Status = 1;
}
}
//抽屉返回状态
private bool DrawerState(int[] r)
{
int index = DrawerNo > 8 ? DrawerNo - 7 : DrawerNo + 1;
return r[index] == 0;
}
/// <summary>
/// 发送计数清零25指令
/// </summary>
/// <returns></returns>
private async Task SendClearCount(List<ChannelStock> channels)
{
//发送计数清零指令25
if (channels.Count > 0)
{
for (int i = 0; i < channels.Count; i++)
{
ChannelStock it = channels[i];
_portUtil.ClearCount(it.DrawerNo, it.ColNo);
await Task.Delay(50);
}
await Task.Delay(3000);
}
}
private bool _isFinishClick = false;
// 确认按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(async () =>
{
Status = 4;
//ConfirmLoading = true;
if (!_isFinishClick)
{
await Task.Delay(5000);
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.ToList().FindAll(it => it.AddQuantity != 0).ToList();
if (record.Count > 0)
{
string InvoiceId = "BiaoDing_" + CurrentTimeMillis();
//string InvoiceId = PZH;
var f = SqlSugarHelper.Db.UseTran(() =>
{
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
//it.ManuNo = it.drugManuNo.ManuNo;
//it.EffDate = it.drugManuNo.EffDate;
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity + it.AddQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
PosNo = 1
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate, it.PosNo }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 入库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
OperationTime = DateTime.Now,
Quantity = it.AddQuantity,
Type = 1,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity),
ManunoQuantity = nowChannels.FindAll(it2 => it2.ManuNo == it.ManuNo).Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox || it.BoardType == (Int32)BoardTypeEnum.weighBox)
{
Thread.Sleep(1000);
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
}
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart || (singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.weighSmartBox)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + it.AddQuantity);
});
}
RequestData();
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉标定完成,请关闭抽屉",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "标定更新库存失败",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
//Status = 0;
_isFinishClick = false;
//ConfirmVisibi = Visibility.Collapsed;
//CancelVisibi = Visibility.Collapsed;
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "没有填写药品数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
_portUtil.ResetData();
}
});
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
//ConfirmVisibi = Visibility.Collapsed;
//CancelVisibi = Visibility.Collapsed;
RequestData();
//Status = 0;
//BtnStatus = 0;
//BiaoDingBtnFlag = false;
});
}
//选中批次
public DelegateCommand ComboboxSelected
{
get => new DelegateCommand(() =>
{
ChannelStocks.Where(it => it.Location == "").Select(it => it.ManuNo = "12").ToList();
});
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
public bool KeepAlive => false;
public void FindDrawerCount()
{
int count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
Is8Drawer = count < 9;
Is16Drawer = count >= 16;
Is17Drawer = count > 16;
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
List<ChannelStock> queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes(cs => cs.DrugInfo, di => di.DrugManuNos)
.Where(cs => cs.DrawerNo == DrawerNo)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.Where(cs => cs.DrugId != null)
.OrderBy(cs => cs.ColNo)
.ToList();
ChannelStocks = new ObservableCollection<ChannelStock>(queryData.Select(cs =>
{
cs.drugManuNo = cs.DrugInfo.DrugManuNos.Find(it => it.ManuNo.Equals(cs.ManuNo));
return cs;
}).ToList());
ChannelStock cs = ChannelStocks.FirstOrDefault(cs => cs.Quantity <= 0);
if (cs != null && cs.Id != null && !string.IsNullOrEmpty(cs.Id))
{
//BiaoDingBtnFlag = true;
Status = 0;
}
else
{
Status = 1;
//BiaoDingBtnFlag = false;
//CancelVisibi = Visibility.Visible;
}
//ConfirmVisibi = Visibility.Collapsed;
//obChannelStock = new ObservableCollection<ChannelStock>(ChannelStocks);
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
//_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
FindDrawerCount();
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
//_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
}
}

View File

@ -0,0 +1,408 @@
using MaterialDesignThemes.Wpf;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using log4net;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class BindingChannelDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
public static BindingChannelDialogViewModel vm;
public string Title => "库位绑定";
public event Action<IDialogResult> RequestClose;
private int _drawerNo = 0;
private SolidColorBrush _colorBrush;
public SolidColorBrush SnackbarBackground
{
get => _colorBrush;
set => SetProperty(ref _colorBrush, value);
}
private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
public ISnackbarMessageQueue SnackbarMessageQueue
{
get => _snackbarMessageQueue;
set => SetProperty(ref _snackbarMessageQueue, value);
}
IEventAggregator _eventAggregator;
PortUtil _portUtil;
//ScreenUtil _screenUtil;
public BindingChannelDialogViewModel(IEventAggregator eventAggregator, PortUtil portUtil//, ScreenUtil screenUtil
)
{
_eventAggregator = eventAggregator;
_portUtil = portUtil;
//_screenUtil = screenUtil;
vm = this;
}
public int DrawerNo
{
get => _drawerNo;
set
{
SetProperty(ref _drawerNo, value);
GetChannelsByDrawerNo();
}
}
private DrugInfo? _drugInfo;
public DrugInfo? DrugInfo
{
get => _drugInfo;
set
{
SetProperty(ref _drugInfo, value);
if (_drugInfo != null)
{
//DrugManuNos = _drugInfo.DrugManuNos;
DrugManuNos = SqlSugarHelper.Db.Queryable<DrugManuNo>().Where(m => m.DrugId == _drugInfo.DrugId.ToString()).ToList();
}
}
}
private List<DrugInfo>? _drugInfos;
public List<DrugInfo>? DrugInfos
{
get => _drugInfos;
set => SetProperty(ref _drugInfos, value);
}
private DrugManuNo? _drugManuNo;
public DrugManuNo? DrugManuNo
{
get => _drugManuNo;
set => SetProperty(ref _drugManuNo, value);
}
private List<DrugManuNo>? _drugManuNos;
public List<DrugManuNo>? DrugManuNos
{
get => _drugManuNos;
set => SetProperty(ref _drugManuNos, value);
}
private List<ChannelStock>? _channels;
public List<ChannelStock>? Channels
{
get => _channels;
set => SetProperty(ref _channels, value);
}
private int _totalCount = 0;
public int TotalCount { get => _totalCount; set => SetProperty(ref _totalCount, value); }
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
GetChannelsByDrawerNo();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 9;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
private void GetAllDrugInfos()
{
var list = SqlSugarHelper.Db.Queryable<DrugInfo>().Includes<DrugManuNo>(di => di.DrugManuNos).OrderBy(di => di.DrugId).ToList();
DrugInfos = list;
}
private void GetChannelsByDrawerNo()
{
Channels?.Clear();
int totalCount = 0;
var list = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes<DrugInfo>(cs => cs.DrugInfo)
.WhereIF(DrawerNo > 0, cs => cs.DrawerNo == DrawerNo)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.OrderBy(cs => cs.DrawerNo)
.OrderBy(cs => cs.ColNo)
.ToPageList(PageNum, PageSize, ref totalCount);
Channels = list;
TotalCount = totalCount;
}
public void OnDialogOpened(IDialogParameters parameters)
{
if (parameters.ContainsKey("DrawerNo"))
{
DrawerNo = parameters.GetValue<int>("DrawerNo");
}
GetAllDrugInfos();
GetChannelsByDrawerNo();
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
}
public DelegateCommand Query
{
get => new DelegateCommand(() =>
{
GetChannelsByDrawerNo();
});
}
public DelegateCommand BindingDrug
{
get => new DelegateCommand(async () =>
{
var SelectChannels = Channels.FindAll(item => item.IsSelected && item.Quantity == 0);
if (SelectChannels.All(it => it.DrawerType != (Int32)DrawerTypeEnum.drawerTypeOne))
{
if (SelectChannels.Count == 1)
{
if (DrugInfo != null)
{
int count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrugId.Equals(DrugInfo.DrugId.ToString())).Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).Count();
if (count == 0)
{
var item = SelectChannels[0];
if (item.DrugId == null || !DrugInfo.DrugId.ToString().Equals(item.DrugId))
{
item.PosNo = 0;
}
item.DrugId = DrugInfo.DrugId.ToString();
SqlSugarHelper.Db.Updateable(item).UpdateColumns(it => new { it.DrugId, it.PosNo }).ExecuteCommand();
GetChannelsByDrawerNo();
if (item.BoardType == (Int32)BoardTypeEnum.smart|| item.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
_portUtil.WindowName = "BindingChannelDialog";
// 向显示屏写入库位信息
_portUtil.WriteChannelInfo(1, DrugInfo.DrugName, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(2, DrugInfo.DrugSpec, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(8, DrugInfo.Manufactory, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.ShowContent(item.DrawerNo, item.ColNo);
}
//_screenUtil.SetStockInfo(item, 1);
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue($"药品【{DrugInfo.DrugName}】已经绑定了回收库位不可再次绑定");
}
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("请选择库位需要绑定的药品信息");
}
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("每种药品只能绑定一个回收库位");
}
}
else
{
if (DrugInfo != null && DrugManuNo != null)
{
var c = SelectChannels.Count;
if (c > 0)
{
SelectChannels.ForEach(async (item) =>
{
if (item.DrugId == null || !DrugInfo.DrugId.ToString().Equals(item.DrugId))
{
item.PosNo = 0;
}
item.DrugId = DrugInfo.DrugId.ToString();
item.ManuNo = DrugManuNo.ManuNo;
item.DrugInfo = DrugInfo;
item.EffDate = String.Format("{0:yyyy-MM-dd}", DrugManuNo.EffDate);
SqlSugarHelper.Db.Updateable(item).UpdateColumns(it => new { it.DrugId, it.ManuNo, it.EffDate, it.PosNo }).ExecuteCommand();
if (item.BoardType == (Int32)BoardTypeEnum.smart || item.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
_portUtil.WindowName = "BindingChannelDialog";
// 向显示屏写入库位信息
_portUtil.WriteChannelInfo(1, DrugInfo.DrugName, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(2, DrugInfo.DrugSpec, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(8, DrugInfo.Manufactory, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(6, DrugManuNo.ManuNo, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(5, String.Format("{0:yyyy-MM-dd}", DrugManuNo.EffDate), item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.ShowContent(item.DrawerNo, item.ColNo);
}
//_screenUtil.SetStockInfo(item, 1);
});
GetChannelsByDrawerNo();
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("所选库位中无可绑定库位【库位还存在药品】");
}
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("请选择库位需要绑定的药品及批次信息");
}
}
});
}
public DelegateCommand RemoveBinding
{
get => new DelegateCommand(async () =>
{
var SelectChannels = Channels.FindAll(item => item.IsSelected && item.Quantity == 0);
var c = SelectChannels.Count;
if (c > 0)
{
SelectChannels.ForEach(async item =>
{
item.DrugId = null;
item.ManuNo = null;
item.EffDate = null;
item.DrugInfo = null;
SqlSugarHelper.Db.Updateable(item).UpdateColumns(it => new { it.DrugId, it.ManuNo, it.EffDate }).ExecuteCommand();
if (item.BoardType == (Int32)BoardTypeEnum.smart || item.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
// 清除显示屏库位信息
_portUtil.ClearContent(item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.ShowContent(item.DrawerNo, item.ColNo);
}
//_screenUtil.SetStockInfo(item, 1);
});
GetChannelsByDrawerNo();
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("所选库位中无可解绑库位【库位还存在药品】");
}
});
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
string message = string.Empty;
private void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "BindingChannelDialog")
{
switch (msg.EventType)
{
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
if (message != msg.Message)
{
message = msg.Message;
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
break;
}
}
}
public void UpdateComboBoxItems(string text)
{
string str = @"SELECT d.drug_id,d.py_code,d.drug_barcode,d.drug_name,d.drug_brand_name,d.drug_spec,d.dosage,d.pack_unit,
d.manufactory,d.max_stock,CONCAT(drug_name,' ',drug_spec)as drug_name_spec FROM `drug_info` d";
if(string.IsNullOrEmpty(text))
{
DrugInfos = SqlSugarHelper.Db.SqlQueryable<DrugInfo>(str).OrderBy(di => di.DrugName).OrderBy(di => di.DrugId).ToList();
return;
}
if(DrugInfos!=null)
{
DrugInfos.Clear();
}
DrugInfos = SqlSugarHelper.Db.SqlQueryable<DrugInfo>(str).Where(di => di.DrugName.Contains(text) || di.PyCode.Contains(text)).OrderBy(di => di.DrugName).OrderBy(di => di.DrugId).ToList();
}
}
}

View File

@ -0,0 +1,485 @@
using MaterialDesignThemes.Wpf;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using log4net;
using System.Threading;
using System.Reflection.Metadata.Ecma335;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class BindingChannelNewDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
public static BindingChannelNewDialogViewModel vm;
public string Title => "库位绑定";
public event Action<IDialogResult> RequestClose;
private int _drawerNo = 0;
private SolidColorBrush _colorBrush;
public SolidColorBrush SnackbarBackground
{
get => _colorBrush;
set => SetProperty(ref _colorBrush, value);
}
private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
public ISnackbarMessageQueue SnackbarMessageQueue
{
get => _snackbarMessageQueue;
set => SetProperty(ref _snackbarMessageQueue, value);
}
IEventAggregator _eventAggregator;
PortUtil _portUtil;
//ScreenUtil _screenUtil;
public BindingChannelNewDialogViewModel(IEventAggregator eventAggregator, PortUtil portUtil//, ScreenUtil screenUtil
)
{
_eventAggregator = eventAggregator;
_portUtil = portUtil;
//_screenUtil = screenUtil;
vm = this;
}
public int DrawerNo
{
get => _drawerNo;
set
{
SetProperty(ref _drawerNo, value);
GetChannelsByDrawerNo();
}
}
private DrugInfo? _drugInfo;
public DrugInfo? DrugInfo
{
get => _drugInfo;
set
{
SetProperty(ref _drugInfo, value);
//if (_drugInfo != null)
//{
// DrugManuNos = _drugInfo.DrugManuNos.OrderByDescending(dm => dm.ManuNo).ToList();
//}
}
}
//拼音码对应药品实体
//private DrugInfo? _durgInfo_for_py;
//public DrugInfo? DrugInfo_Py
//{
// get => _durgInfo_for_py;
// set
// {
// SetProperty(ref _durgInfo_for_py, value);
// if (_durgInfo_for_py != null)
// {
// DrugInfos = GetDrugByDrugPY(_durgInfo_for_py.PyCode);
// }
// else
// {
// DrugInfos = GetDrugByDrugPY("");
// }
// }
//}
//#region 根据药品拼音码查询药品名称
//private List<DrugInfo> GetDrugByDrugPY(string pycode)
//{
// List<DrugInfo> DrugList = null;
// if (!string.IsNullOrEmpty(pycode))
// {
// DrugList = SqlSugarHelper.Db.Queryable<DrugInfo>().Includes<DrugManuNo>(di => di.DrugManuNos).Where(di => di.PyCode.Contains(pycode)).OrderBy(di => di.DrugId).ToList();
// }
// else
// {
// DrugList = SqlSugarHelper.Db.Queryable<DrugInfo>().Includes<DrugManuNo>(di => di.DrugManuNos).OrderBy(di => di.DrugId).ToList();
// }
// return DrugList;
//}
//private List<DrugInfo>? _drugInfos_py;
//public List<DrugInfo>? DrugInfos_PY
//{
// get => _drugInfos_py;
// set => SetProperty(ref _drugInfos_py, value);
//}
//#endregion 根据药品拼音码查询药品名称
private List<DrugInfo>? _drugInfos;
public List<DrugInfo>? DrugInfos
{
get => _drugInfos;
set => SetProperty(ref _drugInfos, value);
}
//private DrugManuNo? _drugManuNo;
//public DrugManuNo? DrugManuNo
//{
// get => _drugManuNo;
// set => SetProperty(ref _drugManuNo, value);
//}
//private List<DrugManuNo>? _drugManuNos;
//public List<DrugManuNo>? DrugManuNos
//{
// get => _drugManuNos;
// set => SetProperty(ref _drugManuNos, value);
//}
private List<ChannelList>? _channels;
public List<ChannelList>? Channels
{
get => _channels;
set => SetProperty(ref _channels, value);
}
private int _totalCount = 0;
public int TotalCount { get => _totalCount; set => SetProperty(ref _totalCount, value); }
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
GetChannelsByDrawerNo();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
private void GetAllDrugInfos()
{
var list = SqlSugarHelper.Db.Queryable<DrugInfo>().Includes<DrugManuNo>(di => di.DrugManuNos).OrderBy(di => di.DrugId).ToList();
DrugInfos = list;
//DrugInfos_PY = list;
}
private void GetChannelsByDrawerNo()
{
Channels?.Clear();
int totalCount = 0;
var list = SqlSugarHelper.Db.Queryable<ChannelList>()
.Includes<DrugInfo>(cl => cl.Drug)
//.Includes<ChannelStock>(cs => cs.channelStock)
.WhereIF(DrawerNo > 0, cl => cl.DrawerNo == DrawerNo)
.Where(cl => cl.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.OrderBy(cl => cl.DrawerNo)
.OrderBy(cl => cl.ColNo)
.ToPageList(PageNum, PageSize, ref totalCount);
Channels = list;
TotalCount = totalCount;
}
public void OnDialogOpened(IDialogParameters parameters)
{
if (parameters.ContainsKey("DrawerNo"))
{
DrawerNo = parameters.GetValue<int>("DrawerNo");
}
GetAllDrugInfos();
GetChannelsByDrawerNo();
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
}
public DelegateCommand Query
{
get => new DelegateCommand(() =>
{
GetChannelsByDrawerNo();
});
}
public DelegateCommand BindingDrug
{
get => new DelegateCommand(async () =>
{
var SelectChannels = Channels.FindAll(item => item.IsSelected);
if (SelectChannels.All(it => it.DrawerType != (Int32)DrawerTypeEnum.drawerTypeOne))
{
if (SelectChannels.Count == 1)
{
if (DrugInfo != null)
{
int count = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cs => cs.DrugId.Equals(DrugInfo.DrugId.ToString())).Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).Count();
if (count == 0)
{
var item = SelectChannels[0];
if (item.DrugId == null || !DrugInfo.DrugId.ToString().Equals(item.DrugId))
{
item.PosNo = 0;
}
item.DrugId = DrugInfo.DrugId.ToString();
item.DrugSpec= DrugInfo.DrugSpec.ToString();
SqlSugarHelper.Db.Updateable(item).UpdateColumns(it => new { it.DrugId, it.PosNo,it.DrugSpec }).ExecuteCommand();
GetChannelsByDrawerNo();
if (item.BoardType == (Int32)BoardTypeEnum.smart)
{
_portUtil.WindowName = "BindingChannelDialog";
// 向显示屏写入库位信息
_portUtil.WriteChannelInfo(1, DrugInfo.DrugName, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(2, DrugInfo.DrugSpec, item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.WriteChannelInfo(8, DrugInfo.Manufactory, item.DrawerNo, item.ColNo);
await Task.Delay(200);
//_portUtil.WriteChannelInfo(6, DrugManuNo.EffDate==null?"": DrugManuNo.EffDate, item.DrawerNo, item.ColNo);
//await Task.Delay(200);
//_portUtil.WriteChannelInfo(5, DrugManuNo.ManuNo, item.DrawerNo, item.ColNo);
//await Task.Delay(200);
_portUtil.ShowContent(item.DrawerNo, item.ColNo);
}
//_screenUtil.SetStockInfo(item, 1);
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue($"药品【{DrugInfo.DrugName}】已经绑定了回收库位不可再次绑定");
}
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("请选择库位需要绑定的药品信息");
}
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("每种药品只能绑定一个回收库位");
}
}
else
{
//if (DrugInfo != null && DrugManuNo != null)
//{
var c = SelectChannels.Count;
if (c > 0)
{
for (int i = 0; i < SelectChannels.Count; i++)
{
var item = SelectChannels[i];
var channelStock = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.Chnguid == item.Id&&cs.Quantity>0).ToList();
if(channelStock.Count>0)
{
//有库存,不能解绑
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue($"库位{item.DrawerNo}-{item.ColNo}中还存在药品,不能绑定其他药品");
continue;
}
if (item.DrugId == null || !DrugInfo.DrugId.ToString().Equals(item.DrugId))
{
item.PosNo = 0;
}
item.DrugId = DrugInfo.DrugId.ToString();
//item.ManuNo = DrugManuNo.ManuNo;
item.Drug = DrugInfo;
item.DrugSpec = DrugInfo.DrugSpec.ToString();
//item.EffDate = String.Format("{0:yyyy-MM-dd}", DrugManuNo.EffDate);
SqlSugarHelper.Db.Updateable(item).UpdateColumns(it => new { it.DrugId, it.PosNo,it.DrugSpec }).ExecuteCommand();
if (item.BoardType == (Int32)BoardTypeEnum.smart || item.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
_portUtil.WindowName = "BindingChannelDialog";
// 向显示屏写入库位信息
_portUtil.WriteChannelInfo(1, DrugInfo.DrugName, item.DrawerNo, item.ColNo);
//await Task.Delay(200);
Thread.Sleep(200);
_portUtil.WriteChannelInfo(2, DrugInfo.DrugSpec, item.DrawerNo, item.ColNo);
//await Task.Delay(200);
Thread.Sleep(200);
_portUtil.WriteChannelInfo(8, DrugInfo.Manufactory, item.DrawerNo, item.ColNo);
//await Task.Delay(200);
Thread.Sleep(200);
//_portUtil.WriteChannelInfo(6, DrugManuNo.ManuNo, item.DrawerNo, item.ColNo);
//await Task.Delay(200);
//Thread.Sleep(200);
//_portUtil.WriteChannelInfo(5, String.Format("{0:yyyy-MM-dd}", DrugManuNo.EffDate), item.DrawerNo, item.ColNo);
////await Task.Delay(200);
//Thread.Sleep(200);
_portUtil.ShowContent(item.DrawerNo, item.ColNo);
}
}
GetChannelsByDrawerNo();
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("所选库位中无可绑定库位【库位还存在药品】");
}
//}
//else
//{
// SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
// SnackbarMessageQueue.Enqueue("请选择库位需要绑定的药品及批次信息");
//}
}
});
}
public DelegateCommand RemoveBinding
{
get => new DelegateCommand(async () =>
{
var SelectChannels = Channels.FindAll(item => item.IsSelected && item.DrugId != null);
var c = SelectChannels.Count;
if (c > 0)
{
SelectChannels.ForEach(async item =>
{
var channelStock = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.Chnguid == item.Id && cs.Quantity > 0).ToList();
if (channelStock.Count > 0)
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("所选库位中无可解绑药品【库位还存在药品】");
//该药品下的批次还有库存则不能解绑
return;
}
item.DrugId = null;
//item.ManuNo = null;
//item.EffDate = null;
item.Drug = null;
item.DrugSpec = null;
SqlSugarHelper.Db.Updateable(item).UpdateColumns(it => new { it.DrugId,it.DrugSpec }).ExecuteCommand();
if (item.BoardType == (Int32)BoardTypeEnum.smart || item.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
// 清除显示屏库位信息
_portUtil.ClearContent(item.DrawerNo, item.ColNo);
await Task.Delay(200);
_portUtil.ShowContent(item.DrawerNo, item.ColNo);
}
//_screenUtil.SetStockInfo(item, 1);
});
GetChannelsByDrawerNo();
}
else
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("所选库位中无可解绑药品");
}
});
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
string message = string.Empty;
private void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "BindingChannelDialog")
{
switch (msg.EventType)
{
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
if (message != msg.Message)
{
message = msg.Message;
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
break;
}
}
}
public void UpdateComboBoxItems(string text)
{
string str = @"SELECT d.drug_id,d.py_code,d.drug_barcode,d.drug_name,d.drug_brand_name,d.drug_spec,d.dosage,d.pack_unit,
d.manufactory,d.max_stock,CONCAT(drug_name,' ',drug_spec)as drug_name_spec FROM `drug_info` d";
if (string.IsNullOrEmpty(text))
{
DrugInfos = SqlSugarHelper.Db.SqlQueryable<DrugInfo>(str).OrderBy(di => di.DrugName).OrderBy(di => di.DrugId).ToList();
return;
}
if (DrugInfos != null)
{
DrugInfos.Clear();
}
DrugInfos = SqlSugarHelper.Db.SqlQueryable<DrugInfo>(str).Where(di => di.DrugName.Contains(text) || di.PyCode.Contains(text)).OrderBy(di => di.DrugName).OrderBy(di => di.DrugId).ToList();
}
}
}

View File

@ -0,0 +1,359 @@
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class CheckStockWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(CheckStockWindowViewModel));
private List<ChannelStock> _channelStocks = new();
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
public CheckStockWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "CheckStockWindow")
{
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
Status = 2;
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 2)
{
Status = 3;
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 2)
{
logger.Info($"抽屉【{DrawerNo}】库位药品数量【{msg.Quantitys}】");
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status;
public int Status { get => _status; set => SetProperty(ref _status, value); }
private int _drawerNo = 1;
public int DrawerNo
{
get => _drawerNo;
set => SetProperty(ref _drawerNo, value);
}
private bool _is8Drawer = true;
public bool Is8Drawer { get => _is8Drawer; set => SetProperty(ref _is8Drawer, value); }
private bool _is16Drawer = false;
public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
private bool _is17Drawer = false;
public bool Is17Drawer { get => _is17Drawer; set => SetProperty(ref _is17Drawer, value); }
public DelegateCommand<string> UpdateDrawerNo
{
get => new DelegateCommand<string>((DrawerNo) =>
{
this.DrawerNo = Convert.ToInt32(DrawerNo);
RequestData();
}, (DrawerNo) => Status == 0
);
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(() =>
{
Status = 1;
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = ChannelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
_portUtil.WindowName = "CheckStockWindow";
_portUtil.Operate = true;
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}, () => Status == 0).ObservesProperty(() => Status);
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.FindAll(it => it.Quantity != it.CheckQuantity).ToList();
if (record.Count > 0)
{
string InvoiceId = "CHECK_" + CurrentTimeMillis();
var f = SqlSugarHelper.Db.UseTran(() =>
{
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.CheckQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 盘点记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.CheckQuantity - it.Quantity,
Type = 4,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity),
CheckQuantity = it.CheckQuantity
}).ExecuteCommand();
logger.Info($"库存盘点->库位【{it.DrawerNo}-{it.ColNo}】药品【{it.DrugInfo.DrugName}】盘点前库存【{it.Quantity}】,更改后【{it.CheckQuantity}】");
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart|| (singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.weighSmartBox)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.CheckQuantity);
});
}
RequestData();
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉盘点完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
if (!f.IsSuccess)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉盘点完成,库存更新失败!",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "盘点完成,库存无改变",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
_isFinishClick = false;
}
}, () => Status == 3 && !_isFinishClick).ObservesProperty(() => Status);
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float temperature = await _portUtil.GetFridgeTemperature();
if (temperature > Convert.ToSingle(iTempertureRange[0]) && temperature < Convert.ToSingle(iTempertureRange[1]))
{
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
}
}
}
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
public bool KeepAlive => false;
public void FindDrawerCount()
{
int count = 0;
if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
{
count = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
else
{
count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
Is8Drawer = count < 9;
Is16Drawer = count >= 16;
Is17Drawer = count > 16;
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
List<ChannelStock> queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes(cs => cs.DrugInfo)
.Where(cs => cs.DrawerNo == DrawerNo)
.Where(cs => cs.DrugId != null)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.OrderBy(cs => cs.ColNo)
.ToList();
ChannelStocks = queryData.Select(it => { it.CheckQuantity = it.Quantity; return it; }).ToList();
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
FindDrawerCount();
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
}
}

View File

@ -0,0 +1,6 @@
namespace DM_Weight.ViewModels
{
internal class CollectionViewGroupInternal
{
}
}

View File

@ -0,0 +1,40 @@
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.ViewModels
{
public class DebugWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
public bool KeepAlive => false;
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
}

View File

@ -0,0 +1,388 @@
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Common;
using System.Threading;
namespace DM_Weight.ViewModels
{
public class DrawerAddDrugWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(DrawerAddDrugWindowViewModel));
private List<int> _drawerNoList = new List<int>();
private List<ChannelStock>? _channelStocks;
public List<ChannelStock>? ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
public DrawerAddDrugWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "DrawerAddDrugWindow")
{
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
Status = 2;
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 2)
{
Status = 3;
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 2)
{
ChannelStocks.ForEach(it => it.AddQuantity = msg.Quantitys[it.ColNo - 1]);
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status;
public int Status { get => _status; set => SetProperty(ref _status, value); }
private int _drawerNo = 1;
public int DrawerNo
{
get => _drawerNo;
set => SetProperty(ref _drawerNo, value);
}
private bool _is8Drawer = true;
public bool Is8Drawer { get => _is8Drawer; set => SetProperty(ref _is8Drawer, value); }
private bool _is16Drawer = false;
public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
private bool _is17Drawer = false;
public bool Is17Drawer { get => _is17Drawer; set => SetProperty(ref _is17Drawer, value); }
public DelegateCommand<string> UpdateDrawerNo
{
get => new DelegateCommand<string>((DrawerNo) =>
{
this.DrawerNo = Convert.ToInt32(DrawerNo);
RequestData();
}, (DrawerNo) => Status == 0
);
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(() =>
{
Status = 1;
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
try
{
List<ChannelStock> singleChannels = ChannelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
_portUtil.WindowName = "DrawerAddDrugWindow";
_portUtil.Operate = true;
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}
catch (Exception ex)
{
logger.Info($"OpenDrawer异常{ex.Message}");
}
}, () => Status == 0).ObservesProperty(() => Status);
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.FindAll(it => it.AddQuantity != 0).ToList();
if (record.Count > 0)
{
string InvoiceId = "DRAWER_" + CurrentTimeMillis();
var f = SqlSugarHelper.Db.UseTran(() =>
{
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
it.ManuNo = it.drugManuNo==null?it.ManuNo: it.drugManuNo.ManuNo;
it.EffDate = it.drugManuNo == null? it.EffDate: it.drugManuNo.EffDate;
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity + it.AddQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 入库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.AddQuantity,
Type = 1,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
Thread.Sleep(80);
}
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != 1 && (it.BoardType == (Int32)BoardTypeEnum.smart || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox));
//if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : 1) == (Int32)BoardTypeEnum.smart || (singleChannels.Count > 0 ? singleChannels[0].BoardType : 1) == (Int32)BoardTypeEnum.weighSmartBox)
if (singleChannels.Count > 0)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + it.AddQuantity);
});
}
RequestData();
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉加药完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "更新库存失败",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "没有填写加药数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
});
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (ChannelStocks[0].BoardType == (Int32)BoardTypeEnum.fridge)
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (ChannelStocks[0].BoardType == (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float temperature = await _portUtil.GetFridgeTemperature();
if (temperature > Convert.ToSingle(iTempertureRange[0]) && temperature < Convert.ToSingle(iTempertureRange[1]))
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
public bool KeepAlive => false;
public void FindDrawerCount()
{
int count = 0;
if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
{
count = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
else
{
count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
Is8Drawer = count < 9;
Is16Drawer = count >= 16;
Is17Drawer = count > 16;
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
List<ChannelStock> queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes(cs => cs.DrugInfo, di => di.DrugManuNos)
.Where(cs => cs.DrawerNo == DrawerNo)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.Where(cs => cs.DrugId != null)
.OrderBy(cs => cs.ColNo)
.ToList();
ChannelStocks = queryData.Select(cs =>
{
cs.drugManuNo = cs.DrugInfo.DrugManuNos.Find(it => it.ManuNo.Equals(cs.ManuNo));
return cs;
}).ToList();
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
FindDrawerCount();
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
}
}

View File

@ -0,0 +1,378 @@
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
using System.Windows.Controls;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class DrawerTakeDrugWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(DrawerTakeDrugWindowViewModel));
private List<ChannelStock> _channelStocks = new List<ChannelStock>();
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
public DrawerTakeDrugWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "DrawerTakeDrugWindow")
{
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
Status = 2;
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 2)
{
Status = 3;
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 2)
{
ChannelStocks.ForEach(it => it.TakeQuantity = msg.Quantitys[it.ColNo - 1]);
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status;
public int Status { get => _status; set => SetProperty(ref _status, value); }
private int _drawerNo = 1;
public int DrawerNo
{
get => _drawerNo;
set => SetProperty(ref _drawerNo, value);
}
private bool _is8Drawer = true;
public bool Is8Drawer { get => _is8Drawer; set => SetProperty(ref _is8Drawer, value); }
private bool _is16Drawer = false;
public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
private bool _is17Drawer = false;
public bool Is17Drawer { get => _is17Drawer; set => SetProperty(ref _is17Drawer, value); }
public DelegateCommand<string> UpdateDrawerNo
{
get => new DelegateCommand<string>((DrawerNo) =>
{
this.DrawerNo = Convert.ToInt32(DrawerNo);
RequestData();
}, (DrawerNo) => Status == 0
);
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(() =>
{
if (Status == 0)
{
Status = 1;
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = ChannelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
_portUtil.WindowName = "DrawerTakeDrugWindow";
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, () => _portUtil.Start())
;
}
});
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.FindAll(it => it.TakeQuantity != 0).ToList();
logger.Info("点击完成按钮,库位数据:" + JsonConvert.SerializeObject(record));
if (record.Count > 0)
{
string InvoiceId = "DRAWER_" + CurrentTimeMillis();
var f = SqlSugarHelper.Db.UseTran(() =>
{
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity - it.TakeQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 出库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.TakeQuantity,
Type = 2,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
logger.Info($"抽屉取药保存->库位【{it.DrawerNo}-{it.ColNo}】取出药品【{it.DrugInfo.DrugName}】个数【{it.TakeQuantity}】,取药前库存【{it.Quantity}】");
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != 1);
if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : 1) == (Int32)BoardTypeEnum.smart|| (singleChannels.Count > 0 ? singleChannels[0].BoardType : 1) == (Int32)BoardTypeEnum.weighSmartBox)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity - it.TakeQuantity);
});
}
RequestData();
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉取药完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
if (!f.IsSuccess)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉取药完成,库存更新失败!",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "没有填写取药数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
});
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if(ChannelStocks!=null&& ChannelStocks.Count>0)
{
if (_portUtil.BoardType==(Int32)BoardTypeEnum.fridge)
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType== (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float retT= await _portUtil.GetFridgeTemperature();
if (retT > Convert.ToSingle(iTempertureRange[0]) && retT < Convert.ToSingle(iTempertureRange[1]))
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
public bool KeepAlive => false;
public void FindDrawerCount()
{
int count = 0;
if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
{
count = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
else
{
count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
Is8Drawer = count < 9;
Is16Drawer = count >= 16;
Is17Drawer = count > 16;
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
List<ChannelStock> queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes(cs => cs.DrugInfo)
.Where(cs => cs.DrawerNo == DrawerNo)
.Where(cs => cs.DrugId != null)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.Quantity > 0)
.OrderBy(cs => cs.ColNo)
.ToList();
ChannelStocks = queryData;
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
FindDrawerCount();
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求, 不让走
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
}
}

View File

@ -0,0 +1,283 @@
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Models;
using DM_Weight.select;
using DM_Weight.util;
using log4net.Repository.Hierarchy;
using log4net;
namespace DM_Weight.ViewModels
{
public class DrugListWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
RequestData();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
private int _totalCount = 0;
public int TotalCount
{
get => _totalCount;
set
{
SetProperty(ref _totalCount, value);
}
}
private List<DrugInfo> _drugInfos;
public List<DrugInfo> DrugInfos
{
get { return _drugInfos; }
set { SetProperty(ref _drugInfos, value); }
}
private DrugInfo _selectedDrug = new();
public DrugInfo SelectedDrug
{
get { return _selectedDrug; }
set
{
if (value != null)
{
SetProperty(ref _selectedDrug, value);
GetManuNos();
}
else
{
SetProperty(ref _selectedDrug, new());
Manunos = null;
}
}
}
public static List<OrderTakeSelect> StaticSelects = new()
{
new OrderTakeSelect
{
Code = "DrugName",
Name = "药品名称"
},
new OrderTakeSelect
{
Code = "PyCode",
Name = "拼音码"
},
new OrderTakeSelect
{
Code = "DrugBarcode",
Name = "药品条码"
},
new OrderTakeSelect
{
Code = "DrugId",
Name = "药品编码"
}
};
private List<OrderTakeSelect> _selects = StaticSelects;
public List<OrderTakeSelect> Selects
{
get { return _selects; }
set
{
SetProperty(ref _selects, value);
}
}
private OrderTakeSelect _selectedItem = StaticSelects[0];
/// <summary>
/// 查询条件 查询字段
/// </summary>
public OrderTakeSelect SelectedItem
{
get { return _selectedItem; }
set
{
SetProperty(ref _selectedItem, value);
RequestData();
}
}
private string? _searchValue;
/// <summary>
/// 查询条件 查询字段值
/// </summary>
public string? SearchValue
{
get { return _searchValue; }
set
{
SetProperty(ref _searchValue, value);
RequestData();
}
}
private List<DrugManuNo> _manunos;
public List<DrugManuNo> Manunos
{
get { return _manunos; }
set { SetProperty(ref _manunos, value); }
}
private DrugManuNo _selectedManuno = new DrugManuNo();
public DrugManuNo SelectedManuno
{
get { return _selectedManuno; }
set { SetProperty(ref _selectedManuno, value ?? new()); }
}
public bool KeepAlive => false;
public DelegateCommand Query
{
get => new DelegateCommand(() =>
{
RequestData();
});
}
public DelegateCommand AddDrugCommand
{
get => new DelegateCommand(() =>
{
try
{
//SelectedDrug.DrugId = 0;
SqlSugarHelper.Db.Insertable(SelectedDrug).ExecuteCommand();
RequestData();
}
catch (Exception ex)
{
ILog logger = LogManager.GetLogger(typeof(DrugListWindowViewModel));
logger.Info($"添加数据异常:{ex.ToString()}");
return;
}
});
}
public DelegateCommand EditDrugCommand
{
get => new DelegateCommand(() =>
{
SqlSugarHelper.Db.Updateable(SelectedDrug).UpdateColumns(d => new { d.DrugName, d.Manufactory, d.PyCode, d.PackUnit, d.MaxStock, d.DrugSpec }).ExecuteCommand();
RequestData();
}, () => SelectedDrug.DrugId > 0).ObservesProperty(() => SelectedDrug);
}
public DelegateCommand AddManuCommand
{
get => new DelegateCommand(() =>
{
if (!string.IsNullOrEmpty(SelectedManuno.EffDate) && !string.IsNullOrEmpty(SelectedManuno.ManuNo))
{
SelectedManuno.Id = Guid.NewGuid().ToString();
SelectedManuno.DrugId = SelectedDrug.DrugId.ToString();
SelectedManuno.EffDate = DateTime.Parse(SelectedManuno.EffDate).ToString("yyyy-MM-dd");
SqlSugarHelper.Db.Insertable(SelectedManuno).ExecuteCommand();
GetManuNos();
}
}, () => SelectedDrug.DrugId > 0).ObservesProperty(() => SelectedDrug);
}
public DelegateCommand EditManuCommand
{
get => new DelegateCommand(() =>
{
SelectedManuno.EffDate = DateTime.Parse(SelectedManuno.EffDate).ToString("yyyy-MM-dd");
SqlSugarHelper.Db.Updateable(SelectedManuno).UpdateColumns(m => new { m.ManuNo, m.EffDate }).ExecuteCommand();
GetManuNos();
}, () => !string.IsNullOrEmpty(SelectedManuno.DrugId)).ObservesProperty(() => SelectedManuno);
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
//查询表格数据
RequestData();
}
void GetManuNos()
{
Manunos = SqlSugarHelper.Db.Queryable<DrugManuNo>()
.WhereIF(SelectedDrug != null, (di) => di.DrugId.Equals(SelectedDrug.DrugId))
.Select(di => di)
.ToList();
}
void RequestData()
{
int totalCount = 0;
DrugInfos = SqlSugarHelper.Db.Queryable<DrugInfo>()
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugId"), (di) => di.DrugId.ToString().Contains(SearchValue))
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugName"), (di) => di.DrugName.Contains(SearchValue))
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PyCode"), (di) => di.PyCode.Contains(SearchValue))
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (di) => di.DrugBarcode.Contains(SearchValue))
.Select(di => di)
.ToPageList(PageNum, PageSize, ref totalCount)
;
TotalCount = totalCount;
PageCount = (int)Math.Ceiling((double)TotalCount / PageSize);
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}

View File

@ -0,0 +1,210 @@
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Finger;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.util;
namespace DM_Weight.ViewModels
{
public class EditUserDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly FingerprintUtil _fingerprintUtil;
IEventAggregator _eventAggregator;
public EditUserDialogViewModel(FingerprintUtil fingerprintUtil, IEventAggregator eventAggregator)
{
_fingerprintUtil = fingerprintUtil;
_eventAggregator = eventAggregator;
}
private UserList _userList = new UserList();
public UserList UserList
{
get => _userList;
set => SetProperty(ref _userList, value);
}
public List<RoleDm> Roles { get; set; }
private string _oldPass;
public string OldPass
{
get => _oldPass;
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("请输入原密码");
}
if (!MD5.GetMD5Hash(value).ToLower().Equals(UserList.PassWord.ToLower()))
{
throw new ArgumentException("旧密码错误");
}
SetProperty(ref _oldPass, value);
}
}
private string _newPass;
public string NewPass
{
get => _newPass; set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("请输入新密码");
}
SetProperty(ref _newPass, value);
}
}
private bool _onlyPassword = false;
private bool _editUser = true;
public bool OnlyPassword { get => _onlyPassword; set => SetProperty(ref _onlyPassword, value); }
public bool EditUser { get => _editUser; set => SetProperty(ref _editUser, value); }
public event Action<IDialogResult> RequestClose;
public bool KeepAlive => false;
private string _title = "编辑用户";
public string Title
{
get => _title;
set => SetProperty(ref _title, value);
}
public DelegateCommand SaveUser
{
get => new DelegateCommand(() =>
{
try
{
// 修改密码
if (OnlyPassword)
{
if (MD5.GetMD5Hash(OldPass).ToLower().Equals(UserList.PassWord.ToLower()))
{
// 旧密码输入正确
UserList.PassWord = MD5.GetMD5Hash(NewPass);
SqlSugarHelper.Db.Updateable<UserList>(UserList).UpdateColumns(u => new { u.PassWord }).ExecuteCommand();
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
else
{
}
}
// 保存用户
else
{
if (UserList.Id > 0)
{
// 更新
// 没有写密码
if (string.IsNullOrEmpty(NewPass))
{
SqlSugarHelper.Db.Updateable<UserList>(UserList).UpdateColumns(u => new { u.Nickname, u.UserName, u.UserBarcode, u.RoleId }).ExecuteCommand();
}
// 更改了密码
else
{
UserList.PassWord = MD5.GetMD5Hash(NewPass);
SqlSugarHelper.Db.Updateable<UserList>(UserList).UpdateColumns(u => new { u.Nickname, u.UserName, u.PassWord, u.UserBarcode, u.RoleId }).ExecuteCommand();
}
}
else
{
UserList.PassWord = MD5.GetMD5Hash(NewPass);
UserList.MachineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1";
// 插入
SqlSugarHelper.Db.Insertable<UserList>(UserList).InsertColumns(u => new { u.Id, u.Nickname, u.UserName, u.PassWord, u.UserBarcode, u.RoleId, u.MachineId }).ExecuteCommand();
}
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
}
catch (Exception ex)
{
AlertMsg alertMsg = new AlertMsg
{
Message = $"保存用户信息异常{ex.Message}",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
});
}
void GetAllRole()
{
Roles = SqlSugarHelper.Db.Queryable<RoleDm>().Where(r => r.MachineId == (ConfigurationManager.AppSettings["machineId"] ?? "DM1")).OrderBy(r => r.Id).ToList();
RaisePropertyChanged("Roles");
}
public DelegateCommand CancelCommand
{
get => new DelegateCommand(() =>
{
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
}
public void OnDialogOpened(IDialogParameters parameters)
{
if (parameters.ContainsKey("EditPass"))
{
UserList = parameters.GetValue<UserList>("User");
OnlyPassword = parameters.GetValue<bool>("EditPass");
EditUser = false;
Title = "修改密码";
}
else
{
if (parameters.ContainsKey("User"))
{
UserList = parameters.GetValue<UserList>("User");
}
if (UserList.Id == null)
{
Title = "添加用户";
}
GetAllRole();
}
}
}
}

View File

@ -0,0 +1,133 @@
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Finger;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
namespace DM_Weight.ViewModels
{
public class FingerprintDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintDialogViewModel));
private FingerprintUtil _fingerprintUtil;
EventAggregator _eventAggregator;
public FingerprintDialogViewModel(FingerprintUtil fingerprintUtil, EventAggregator eventAggregator)
{
_fingerprintUtil = fingerprintUtil;
_eventAggregator = eventAggregator;
}
public UserList UserList { get; set; }
public Dictionary<string, int> FingerIndexs
{
get
{
Dictionary<string, int> l = new Dictionary<string, int>();
l.Add("左小拇指", 0);
l.Add("左无名指", 1);
l.Add("左中指", 2);
l.Add("左食指", 3);
l.Add("左大拇指", 4);
l.Add("右小拇指", 5);
l.Add("右无名指", 6);
l.Add("右中指", 7);
l.Add("右食指", 8);
l.Add("右大拇指", 9);
return l;
}
}
private int _fingerIndex = 0;
public event Action<IDialogResult> RequestClose;
public int FingerIndex
{
get => _fingerIndex;
set => SetProperty(ref _fingerIndex, value);
}
public bool KeepAlive => false;
private int _status = 0;
public int Status
{
get => _status;
set => SetProperty(ref _status, value);
}
public string Title => "录入指纹";
public DelegateCommand StartInsert
{
get => new DelegateCommand(() => {
Status = 1;
_fingerprintUtil.SaveUser(UserList);
_fingerprintUtil.SaveFingerprint(UserList.Id, FingerIndex);
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}, () => Status == 0).ObservesProperty(() => Status);
}
public DelegateCommand CancelCommand
{
get => new DelegateCommand(() =>
{
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool CanCloseDialog()
{
return true;
}
public void OnDialogClosed()
{
_eventAggregator.GetEvent<FingerprintEvent>().Unsubscribe(RegEvent1);
}
public void OnDialogOpened(IDialogParameters parameters)
{
UserList = parameters.GetValue<UserList>("User");
_eventAggregator.GetEvent<FingerprintEvent>().Subscribe(RegEvent1);
}
void RegEvent1(FingerprintMsg msg)
{
logger.Info(msg.ToString()); ;
if (Status == 1)
{
if (msg.Message.Equals("INS_FINGER"))
{
if (msg.Result)
{
Status = 0;
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
}
}
}
}
}

View File

@ -0,0 +1,263 @@
using DM_Weight.Common;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Xml;
namespace DM_Weight.ViewModels
{
public class FridgeWindowViewModel : BindableBase, IRegionMemberLifetime, INavigationAware
{
//温度区间
private string _temperatureRange = CommonClass.ReadAppSetting("temperatureRange").ToString();
public string TemperatureRange
{
get => _temperatureRange;
set
{
SetProperty(ref _temperatureRange, value);
//更新配置文件中冰箱温度区间
CommonClass.SaveAppSetting("temperatureRange", _temperatureRange);
}
}
private float defaultValue = Convert.ToSingle(CommonClass.ReadAppSetting("temperatureValue"));
//温度值
private float _temperatureValue = Convert.ToSingle(CommonClass.ReadAppSetting("temperatureValue"));
public float TemperatureValue
{
get => _temperatureValue;
set => SetProperty(ref _temperatureValue, value);
}
/// <summary>
/// 根据冰箱温度控制保存按钮是否可点击
/// </summary>
private bool _isInvalid;
public bool IsInvalid
{
get => _isInvalid;
set
{
SetProperty(ref _isInvalid, value);
BtnIsEnable = !IsInvalid;
}
}
/// <summary>
/// 根据冰箱温度控制保存按钮是否可用
/// </summary>
private bool _btnIsEnable = true;
public bool BtnIsEnable
{
get => _btnIsEnable;
set => SetProperty(ref _btnIsEnable, value);
}
//冰箱状态:true关;false开
private bool _fridgeState;
public bool FridgeState
{
get => _fridgeState;
set => SetProperty(ref _fridgeState, value);
}
//报警状态:true关;false开
private bool _alarmState;
public bool AlarmState
{
get => _alarmState;
set => SetProperty(ref _alarmState, value);
}
private int _defaultLoginMode;//1开0关
private int _defaultAlarmMode;//1开0关
private float retTemperature = Convert.ToSingle(ConfigurationManager.AppSettings["temperatureValue"]);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
public FridgeWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
/// <summary>
/// 保存按钮
/// </summary>
public DelegateCommand SaveCommand { get => new DelegateCommand(SaveAction, () => !IsInvalid); }
public bool KeepAlive => false;
private async void SaveAction()
{
try
{
_portUtil.FridgeOperate = true;
//设置温度值验证不通过则直接返回不保存
//获取冰箱温度
//if (_fridgeState != _defaultLoginMode.Equals(1))
//{
// ConfigurationManager.RefreshSection("FridgeState");
//发送冰箱使能/失能指令
if (_fridgeState)
{
await _portUtil.FridgeOff();
Thread.Sleep(100);
CommonClass.SaveAppSetting("FridgeState", "0");
}
else
{
await _portUtil.FridegOpen();
Thread.Sleep(100);
CommonClass.SaveAppSetting("FridgeState", "1");
}
//}
//温度报警设定
//if (AlarmState != _defaultAlarmMode.Equals(1))
//{
//发送警报使能/失能指令
if (_alarmState)
{
await _portUtil.FridgeAlarmOff();
Thread.Sleep(100);
CommonClass.SaveAppSetting("AlarmState", "0");
}
else
{
await _portUtil.FridgeAlarmOn();
Thread.Sleep(100);
CommonClass.SaveAppSetting("AlarmState", "1");
}
//}
//if (retTemperature != TemperatureValue)
//{
// //设定冰箱温度
// await _portUtil.SetFridgeTemperature(TemperatureValue);
// CommonClass.SaveAppSetting("temperatureValue", TemperatureValue.ToString());
//}
//设定冰箱温度区间
string[] range = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
string[] newRange = TemperatureRange.Split('-');
if (range.Length >= 2)
{
bool bMix = float.TryParse(range[0], out float Min);
bool bMax = float.TryParse(range[1], out float Max);
if (bMix && bMax)
{
if (Min != Convert.ToSingle(newRange[0]))
{
//设定冰箱温度最小值
await _portUtil.FridgeMinSetting(Convert.ToSingle(newRange[0]));
Thread.Sleep(100);
}
if (Max != Convert.ToSingle(newRange[1]))
{
Thread.Sleep(100);
//设定冰箱温度最有值
await _portUtil.FridgeMaxSetting(Convert.ToSingle(newRange[1]));
Thread.Sleep(100);
}
}
}
_portUtil.FridgeOperate = false;
AlertMsg alertMsg = new AlertMsg
{
Message = $"保存成功",
Type = MsgType.SUCCESS
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
//_fridgeState = ReadAppSetting("FridgeState").Equals(1);
//_defaultLoginMode = ReadAppSetting("FridgeState");
//_defaultAlarmMode = ReadAppSetting("AlarmState");
//_alarmState = ReadAppSetting("AlarmState").Equals(1);
//_temperatureRange = CommonClass.ReadAppSetting("temperatureRange");
//_temperatureValue = Convert.ToSingle(CommonClass.ReadAppSetting("temperatureValue"));
}
catch (Exception ex)
{
AlertMsg alertMsg = new AlertMsg
{
Message = $"保存异常{ex.ToString}",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
_portUtil.FridgeOperate = false;
}
}
public FridgeWindowViewModel()
{
}
//手动实现调用配置的逻辑 规避修改配置文件后不起作用的问题
public int ReadAppSetting(string key)
{
string xPath = "/configuration/appSettings//add[@key='" + key + "']";
XmlDocument doc = new XmlDocument();
string exeFileName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
doc.Load(exeFileName + ".dll.config");
XmlNode node = doc.SelectSingleNode(xPath);
return Convert.ToInt32(node.Attributes["value"].Value);
}
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
_fridgeState = ReadAppSetting("FridgeState").Equals(0);
_defaultLoginMode = ReadAppSetting("FridgeState");
_defaultAlarmMode = ReadAppSetting("AlarmState");
_alarmState = ReadAppSetting("AlarmState").Equals(0);
GetTemperature();
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
//public void OnNavigatedTo(NavigationContext navigationContext)
//{
// GetTemperature();
//}
//public bool IsNavigationTarget(NavigationContext navigationContext)
//{
// return true;
//}
//public void OnNavigatedFrom(NavigationContext navigationContext)
//{
//}
//获取冰箱温度值,如有更改则保存更改
private async Task GetTemperature()
{
//float retT = await _portUtil.GetFridgeTemperature();
}
}
}

View File

@ -0,0 +1,425 @@
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using DM_Weight.Models;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Views;
using System.Timers;
using Unity;
using System.Windows.Threading;
using Newtonsoft.Json.Linq;
using DM_Weight.msg;
using DM_Weight.Common;
using Microsoft.IdentityModel.Logging;
using System.Threading;
namespace DM_Weight.ViewModels
{
public class HomeWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(HomeWindowViewModel));
private readonly IDialogService _dialogService;
private UserList? _userList;
private UserList? _userList2;
/// <summary>
/// 冰箱温度
/// </summary>
private string _wd = "恒温冷藏抽屉当前温度2.8(非真实数据)";
public string WD { get => _wd; set => SetProperty(ref _wd, value); }
System.Timers.Timer WDTimer;
private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1");
public bool MultiLogin
{
get => loginMode == 2;
}
private PremissionDm? _selectedMenu;
private PremissionDm? _selectedChildMenu;
private List<PremissionDm>? _premissionDmList;
public PremissionDm? SelectedChildMenu
{
get { return _selectedChildMenu; }
set
{
if (!_portUtil.Operate)
{
if (value != null)
{
if (value.PremissionPath.Equals("TakeRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 2);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (value.PremissionPath.Equals("AddRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 1);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (value.PremissionPath.Equals("ReturnRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 3);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else if (value.PremissionPath.Equals("RetrunEmptyRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 3);
_regionManager.RequestNavigate("ContentRegion", value.PremissionPath, keys);
}
else if (value.PremissionPath.Equals("CheckRecordWindow"))
{
//定义传参变量
NavigationParameters keys = new NavigationParameters();
//添加参数,键值对格式
keys.Add("Type", 4);
_regionManager.RequestNavigate("ContentRegion", "MachineRecordWindow", keys);
}
else
{
if (value.PremissionPath.Equals("ReturnDrugWindow") || value.PremissionPath.Equals("ReturnDrugWindow2"))
{
if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
{
_regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow2");
}
else
{
_regionManager.RequestNavigate("ContentRegion", "ReturnDrugWindow");
}
}
else
{
_regionManager.RequestNavigate("ContentRegion", value.PremissionPath);
}
}
}
SetProperty(ref _selectedChildMenu, value);
}
}
}
public PremissionDm? SelectedMenu
{
get { return _selectedMenu; }
set
{
//if (value != null)
//{
// if (value.PremissionName == "退出")
// {
// logger.Info($"用户【{Operator?.Nickname}】退出登录");
// Operator = null;
// Reviewer = null;
// _regionManager.RequestNavigate("MainRegion", "LoginWindow");
// }
// else
// {
// SelectedChildMenu = value.Children[0];
// }
//}
SetProperty(ref _selectedMenu, value);
}
}
private DelegateCommand<ListBox> _selectionCommon;
public DelegateCommand<ListBox> SelectionCommon
{
get => _selectionCommon ?? (_selectionCommon = new DelegateCommand<ListBox>(SelectionMethod));
}
private void SelectionMethod(ListBox viewName)
{
SelectedMenu = viewName.SelectedItem as PremissionDm;
if (SelectedMenu.PremissionName == "退出")
{
logger.Info($"用户【{Operator?.Nickname}】退出登录");
Operator = null;
Reviewer = null;
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
}
else
{
//SelectedMenu.Children = SelectedMenu.Children;
SelectedChildMenu = SelectedMenu.Children[0];
}
}
public List<PremissionDm> PremissionDmList { get { return _premissionDmList; } set { SetProperty(ref _premissionDmList, value); } }
public UserList UserList { get { return _userList; } set { SetProperty(ref _userList, value); } }
public UserList UserList2 { get { return _userList2; } set { SetProperty(ref _userList2, value); } }
public static UserList? Operator;
public static UserList? Reviewer;
IRegionManager _regionManager;
IUnityContainer _container;
private bool _is16Drawer;
public bool Is16Drawer { get => _is16Drawer; set => SetProperty(ref _is16Drawer, value); }
public bool KeepAlive => false;
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
public HomeWindowViewModel(IRegionManager iRegionManager, PortUtil portUtil, IDialogService dialogService, IUnityContainer container, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_regionManager = iRegionManager;
_dialogService = dialogService;
_container = container;
this._eventAggregator = eventAggregator;
}
public DelegateCommand<string> OpenFingerDialog
{
get => new DelegateCommand<string>((string Type) =>
{
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer);
DialogServiceExtensions.ShowDialogHost(_dialogService, "FingerprintDialog", dialogParameters, DoDialogResult, "RootDialog");
});
}
public DelegateCommand OpenRecoverCommand
{
get => new DelegateCommand(async () =>
{
try
{
_portUtil.WindowName = "HomeWindow";
_portUtil.Operate = true;
await _portUtil.OpenStorage();
_portUtil.ResetData();
}
catch (Exception ex)
{
logger.Info($"OpenRecoverCommand异常{ex.Message}");
}
});
}
public DelegateCommand<string> OpenEditPasswordDialog
{
get => new DelegateCommand<string>((string Type) =>
{
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("EditPass", true);
dialogParameters.Add("User", Type.Equals("Operator") ? Operator : Reviewer);
DialogServiceExtensions.ShowDialogHost(_dialogService, "EditUserDialog", dialogParameters, DoDialogResult, "RootDialog");
});
}
private void DoDialogResult(IDialogResult dialogResult)
{
// 委托 被动执行 被子窗口执行
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
if (dialogResult.Result == ButtonResult.OK)
{
}
}
public void FindDrawerCount()
{
int count = 0;
if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
{
count = SqlSugarHelper.Db.Queryable<ChannelList>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
else
{
count = SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType != (Int32)DrawerTypeEnum.recyle)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrawerNo).Select(cs => SqlFunc.AggregateCount(cs.DrawerNo)).Count();
}
Is16Drawer = count == 16;
}
/// <summary>
/// 获取温度信息
/// </summary>
private async void GetWD(object sender, ElapsedEventArgs e)
{
if (!_portUtil.FridgeOperate)
{
string retStr = string.Empty;
byte[] data = null;
float retT = await _portUtil.GetFridgeTemperature();
Thread.Sleep(80);
WD = $"恒温冷藏抽屉当前温度:{Math.Round((retT - 1.5), 2)}℃";
}
}
private async void GetWD()
{
if (!_portUtil.FridgeOperate)
{
string retStr = string.Empty;
byte[] data = null;
float retT = await _portUtil.GetFridgeTemperature();
Thread.Sleep(80);
WD = $"恒温冷藏抽屉当前温度:{Math.Round((retT-1.5),2)}℃";
}
}
/// <summary>
/// 将收到的返回转换成具体温度数值
/// </summary>
/// <param name="receiveData"></param>
/// <returns></returns>
public string GetResultWD(string receiveData)
{
try
{
//string newStrWD = receiveData.Substring(10, 4);
//logger.Info($"截取后数据newStrWD{newStrWD}");
int iWD = Convert.ToInt32(receiveData, 16);
logger.Info($"截取后数据iWD{iWD}");
float fWD = 0;
if (iWD != 0)
{
fWD = iWD * 1.0f / 10;
}
logger.Info($"截取后数据fWD{fWD}");
string strRet = $"恒温冷藏抽屉当前温度:{fWD}℃;";
return strRet;
}
catch (Exception ex)
{
logger.Info("GetResultWD异常", new Exception($"{ex.ToString()}"));
}
return "数据异常";
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
_portUtil.dateTime = DateTime.Now;
//取出user
UserList = navigationContext.Parameters.GetValue<UserList>("operator");
Operator = UserList;
logger.Info($"发药人【{Operator.Nickname}】登录");
if (navigationContext.Parameters.ContainsKey("reviewer"))
{
UserList2 = navigationContext.Parameters.GetValue<UserList>("reviewer");
Reviewer = UserList2;
logger.Info($"审核人【{Reviewer.Nickname}】登录");
}
List<PremissionDm> premissions = UserList.Role.Permissions;
if (premissions.Count <= 0)
{
Operator = null;
Reviewer = null;
Application.Current.Dispatcher.Invoke(() =>
{
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
});
AlertMsg alertMsg = new AlertMsg
{
Message = $"用户{UserList.Nickname}或还未设置权限,请联系管理员",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return;
}
//SqlSugarHelper.Db.SqlQueryable<PremissionDm>(sql)
//.ToTree(pd => pd.Children, pd => pd.ParentId, 0);
PremissionDmList = premissions;
SelectedMenu = premissions[0];
SelectedChildMenu = premissions[0].Children[0];
FindDrawerCount();
int autoExit = Convert.ToInt32(ConfigurationManager.AppSettings["autoExit"] ?? "0");
if (autoExit > 0)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += (sender, e) =>
{
// 串口无人操作
if (!_portUtil.Operate)
{
// 30秒内无人操作鼠标键盘
if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > autoExit && CheckComputerFreeState.GetLastInputTime() > autoExit)
{
logger.Info($"设备30秒内无人操作用户【{Operator?.Nickname}】自动退出登录");
Operator = null;
Reviewer = null;
Application.Current.Dispatcher.Invoke(() =>
{
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
timer.Stop();
});
}
}
};
timer.Start();
}
#region
int interval = Convert.ToInt32(ConfigurationManager.AppSettings["Interval"]);
if (interval > 0)
{
WDTimer = new System.Timers.Timer();
WDTimer.Elapsed += new System.Timers.ElapsedEventHandler(GetWD);
WDTimer.Interval = interval;
WDTimer.Start();
//WDTimer.AutoReset = true;
//WDTimer.Enabled = true;
}
#endregion
GetWD();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
navigationContext.NavigationService.Region.RegionManager.Regions.Remove(PrismManager.SettingViewRegionName);
}
}
}

View File

@ -0,0 +1,404 @@
using DM_Weight.Common;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Views;
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DM_Weight.ViewModels
{
public class InvoiceAddDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(InvoiceAddDialogViewModel));
public string Title => "调拨加药";
public event Action<IDialogResult> RequestClose;
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private string WindowName = "InvoiceAddWindow";
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
public InvoiceAddDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator)
{
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName.Equals(WindowName))
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
if (channelStocks[0].process == 1)
{
channelStocks.ForEach(it => it.process = 2);
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 1)
{
if (channelStocks[0].process == 2)
{
channelStocks.ForEach(it => it.process = 3);
}
IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
int DrawerNoBefore = groupingBefore.Key;
if (enumerator.MoveNext())
{
IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
int DrawerNoAfter = groupingAfter.Key;
if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
{
Thread.Sleep(50);
}
OpenOneByOne();
}
// 已经全部取出
else
{
Status = 3;
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 1)
{
logger.Info($"抽屉【{DrawerNo}】库位药品数量【{msg.Quantitys}】");
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status = 0;
public int Status
{
get => _status; set => SetProperty(ref _status, value);
}
private Invoice? _invoic;
public Invoice? Invoice
{
get => _invoic;
set => SetProperty(ref _invoic, value);
}
private List<ChannelStock> _channelStocks;
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
public bool CanCloseDialog()
{
return Status == 0;
}
public void OnDialogClosed()
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
public void OnDialogOpened(IDialogParameters parameters)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
List<ChannelStock> channelStocks = parameters.GetValue<List<ChannelStock>>("ChannelStocks");
Invoice o = parameters.GetValue<Invoice>("invoice");
Invoice = o;
ChannelStocks = channelStocks;
RequestData();
}
public void RequestData()
{
enumerable = ChannelStocks.GroupBy(cs => cs.DrawerNo, cs => cs);
enumerator = enumerable.GetEnumerator();
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(() =>
{
if (Status == 0)
{
enumerator.MoveNext();
Status = 1;
OpenOneByOne();
}
});
}
private async void OpenOneByOne()
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
channelStocks.ForEach(it => it.process = 1);
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
_portUtil.WindowName = WindowName;
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart|| (singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.weighSmartBox)
{
// 发送加药数量
singleChannels.ForEach(it =>
{
_portUtil.TakeQuantity(DrawerNo, it.ColNo, it.AddQuantity, it.Quantity + it.AddQuantity);
});
}
//if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.weigh)
//{
// for (int i = 0; i < singleChannels.Count; i++)
// {
// ChannelStock it = singleChannels[i];
// _portUtil.ClearCount(it.DrawerNo, it.ColNo);
// await Task.Delay(50);
// }
//}
_portUtil.Start();
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(async () =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.ToList();
string InvoiceId = Invoice.InvoiceNo;
var f = SqlSugarHelper.Db.UseTran(() =>
{
SqlSugarHelper.Db.Updateable(new InOutInvoice()
{
Status = 1,
InvoiceNo = Invoice.InvoiceNo
}).UpdateColumns(it => new { it.Status }).WhereColumns(it => new { it.InvoiceNo }).ExecuteCommand();
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
if (it.BoardType == (Int32)BoardTypeEnum.weigh && it.PosNo == 0)
{
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
}
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity + it.AddQuantity,
PosNo = 1,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate, it.PosNo }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 出/入库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.AddQuantity,
Type = 1,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
Thread.Sleep(80);
}
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation&& (it.BoardType == (Int32)BoardTypeEnum.smart || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox));
//if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart || (singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.weighSmartBox)
if (singleChannels.Count > 0 )
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + it.AddQuantity);
});
}
AlertMsg alertMsg = new AlertMsg
{
Message = "操作完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
if (!f.IsSuccess)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "库存更新失败!",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
});
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
RequestData();
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float temperature = await _portUtil.GetFridgeTemperature();
if (temperature > Convert.ToSingle(iTempertureRange[0]) && temperature < Convert.ToSingle(iTempertureRange[1]))
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
if (Status != 0)
{
_portUtil.ResetData();
Status = 0;
}
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
}
}

View File

@ -0,0 +1,385 @@
using DM_Weight.Common;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.select;
using DM_Weight.util;
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows.Markup;
namespace DM_Weight.ViewModels
{
public class InvoiceInWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(InvoiceInWindowViewModel));
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
RequestData();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
private int _totalCount = 0;
public int TotalCount
{
get => _totalCount;
set
{
SetProperty(ref _totalCount, value);
}
}
IDialogService _dialogService;
IEventAggregator _eventAggregator;
private DelegateCommand _rowSelected;
public DelegateCommand RowSelected => _rowSelected ??= new DelegateCommand(GetChannelByInvoice);
public InvoiceInWindowViewModel(IDialogService DialogService, IEventAggregator eventAggregator)
{
_dialogService = DialogService;
_eventAggregator = eventAggregator;
}
public static List<OrderTakeSelect> StaticOrderTakeSelects = new()
{
new OrderTakeSelect
{
Code = "invoiceNo",
Name = "凭证单号"
}
};
private List<OrderTakeSelect> _orderTakeSelects = StaticOrderTakeSelects;
public List<OrderTakeSelect> OrderTakeSelects
{
get { return _orderTakeSelects; }
set
{
SetProperty(ref _orderTakeSelects, value);
}
}
private OrderTakeSelect _selectedItem = StaticOrderTakeSelects[0];
/// <summary>
/// 查询条件 查询字段
/// </summary>
public OrderTakeSelect SelectedItem
{
get { return _selectedItem; }
set
{
SetProperty(ref _selectedItem, value);
RequestData();
}
}
private Invoice? _selectedInvoice;
public Invoice? SelectedInvoice
{
get { return _selectedInvoice; }
set
{
SetProperty(ref _selectedInvoice, value);
//OpenOrderDialog();
}
}
private string _orderDate = DateTime.Now.ToString("yyyy-MM-dd");
/// <summary>
/// 查询条件 处方日期
/// </summary>
public string OrderDate
{
get { return _orderDate; }
set
{
if (!String.IsNullOrEmpty(value))
{
SetProperty(ref _orderDate, DateTime.Parse(value).ToString("yyyy-MM-dd"));
}
else
{
SetProperty(ref _orderDate, value);
}
RequestData();
}
}
private string? _searchValue;
/// <summary>
/// 查询条件 查询字段值
/// </summary>
public string? SearchValue
{
get { return _searchValue; }
set
{
SetProperty(ref _searchValue, value);
RequestData();
}
}
private List<Invoice> _invoices = new();
public List<Invoice> Invoices { get { return _invoices; } set { SetProperty(ref _invoices, value); } }
private List<InOutInvoice> _inOutInvoices = new();
public List<InOutInvoice> InOutInvoices { get { return _inOutInvoices; } set { SetProperty(ref _inOutInvoices, value); } }
public bool KeepAlive => false;
private List<ChannelStock> _channelStocks = new();
public List<ChannelStock> ChannelStocks { get { return _channelStocks; } set { SetProperty(ref _channelStocks, value); } }
private List<ChannelStock> _addChannels = new();
public List<ChannelStock> AddChannels { get { return _addChannels; } set { SetProperty(ref _addChannels, value); } }
public void GetChannelByInvoice()
{
ChannelStocks.Clear();
InOutInvoices.Clear();
List<ChannelStock> i = new List<ChannelStock>();
if (SelectedInvoice != null)
{
var invoices = SqlSugarHelper.Db.Queryable<InOutInvoice>()
.Includes<DrugInfo>(i => i.DrugInfo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (i, t) => i.DrugId == t.DrugId)
.Where(i => i.InvoiceNo == SelectedInvoice.InvoiceNo)
.ToList();
foreach (var invoice in invoices)
{
List<ChannelStock> q = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes<DrugInfo>(cs => cs.DrugInfo)
.WhereIF(!string.IsNullOrEmpty(invoice.DrugEffDate), cs => cs.EffDate.Equals(invoice.DrugEffDate))
.WhereIF(!string.IsNullOrEmpty(invoice.DrugManuNo), cs => cs.ManuNo.Equals(invoice.DrugManuNo))
.Where(cs => cs.DrugId == invoice.DrugId)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.OrderBy(cs => cs.DrugId)
.OrderBy(cs => cs.DrawerNo)
.OrderBy(cs => cs.ColNo)
.ToList();
for (int j = 0; j < q.Count;j++)
{
ChannelStock item = q[j];
if(j == 0)
{
item.AddQuantity = invoice.quantity;
}
item.Invoice = invoice;
i.Add(item);
}
InOutInvoice copy = TransExpV2<InOutInvoice, InOutInvoice>.Trans(invoice);
InOutInvoices.Add(copy);
}
}
ICollectionView vw = CollectionViewSource.GetDefaultView(i);
vw.GroupDescriptions.Add(new PropertyGroupDescription("Invoice"));
ChannelStocks = i;
}
public DelegateCommand OpenInvoiceAdd
{
get => new DelegateCommand(() =>
{
bool flag = true;
for (int i = 0; i < InOutInvoices.Count; i++)
{
InOutInvoice invoices = InOutInvoices[i];
if (invoices.quantity != ChannelStocks.FindAll(it => it.DrugId == invoices.DrugId).Sum(it => it.AddQuantity))
{
flag = false;
break;
}
}
if (flag)
{
AddChannels = ChannelStocks.FindAll(it => it.AddQuantity != 0);
AddChannels.Sort((a, b) =>
{
if ((a.DrawerNo - b.DrawerNo) == 0)
{
return a.ColNo - b.ColNo;
}
return a.DrawerNo - b.DrawerNo;
});
OpenOrderDialog();
} else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "库位添加数量小于应添加数量",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
},() => SelectedInvoice !=null).ObservesProperty(() => SelectedInvoice);
}
public async void OpenOrderDialog()
{
if (SelectedInvoice != null && SelectedInvoice.Status == 0)
{
// 此处延时1毫秒等待页面渲染
await Task.Delay(TimeSpan.FromMilliseconds(1));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("invoice", SelectedInvoice);
dialogParameters.Add("ChannelStocks", AddChannels);
DialogServiceExtensions.ShowDialogHost(_dialogService, "InvoiceAddDialog", dialogParameters, DoDialogResult, "RootDialog");
}
}
public DelegateCommand QueryCommand
{
get => new DelegateCommand(() =>
{
RequestData();
});
}
private void DoDialogResult(IDialogResult dialogResult)
{
// 委托 被动执行 被子窗口执行
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
//if (dialogResult.Result == ButtonResult.OK)
{
SelectedInvoice = null;
RequestData();
}
//MessageBox.Show("返回值:" + dialogResult.Result.ToString());
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
Invoices.Clear();
int totalCount = 0;
var sb = new StringBuilder();
sb.Append("select i.invoice_no as InvoiceNo, i.invoice_date as InvoiceDate, COUNT(i.id) as `Count`, SUM(i.quantity) as quantity, p1.pharmacy_name as PharmacyName1, p2.pharmacy_name as PharmacyName2 from in_out_invoice i");
sb.Append(" inner join ( select c.drug_id as drug_id from channel_stock c where c.machine_id = '" + (ConfigurationManager.AppSettings["machineId"] ?? "DM1") + "' group by c.drug_id ) di on di.drug_id = i.drug_id");
sb.Append(" left join pharmacy_info p1 on p1.pharmacy_id = i.in_pharmacy_id");
sb.Append(" left join pharmacy_info p2 on p2.pharmacy_id = i.out_pharmacy_id");
sb.Append(" where i.status=@Status ");
sb.Append(" and i.type!=@type ");
sb.Append(" and i.cancel_flag=@CancelFlag ");
if (OrderDate != null)
{
sb.Append(" and i.invoice_date = @CreateTime ");
}
if (!String.IsNullOrEmpty(SearchValue))
{
sb.Append(" and i.invoice_no = @InvoiceNo ");
}
if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["storage"]))
{
sb.Append(" and i.in_pharmacy_id = @OutPharmacyId ");
}
sb.Append(" group by i.invoice_no");
sb.Append(" order by i.invoice_date ");
Invoices = SqlSugarHelper.Db.SqlQueryable<dynamic>(sb.ToString())
.AddParameters(new
{
Status = 0,
type = 2,
CancelFlag = 0,
CreateTime = OrderDate,
InvoiceNo = SearchValue,
OutPharmacyId = ConfigurationManager.AppSettings["storage"]
})
.Select(it => new Invoice())
.Select("*")
.ToPageList(PageNum, PageSize, ref totalCount);
TotalCount = totalCount;
PageCount = (int)Math.Ceiling((double)TotalCount / PageSize);
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}

View File

@ -0,0 +1,270 @@
using DM_Weight.Models;
using DM_Weight.select;
using DM_Weight.util;
using Newtonsoft.Json;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.ViewModels
{
public class InvoiceOutWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
RequestData();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
private int _totalCount = 0;
public int TotalCount
{
get => _totalCount;
set
{
SetProperty(ref _totalCount, value);
}
}
IDialogService _dialogService;
private DelegateCommand _rowSelected;
public DelegateCommand RowSelected => _rowSelected ??= new DelegateCommand(OpenOrderDialog);
public InvoiceOutWindowViewModel(IDialogService DialogService)
{
_dialogService = DialogService;
}
public static List<OrderTakeSelect> StaticOrderTakeSelects = new()
{
new OrderTakeSelect
{
Code = "invoiceNo",
Name = "凭证单号"
}
};
private List<OrderTakeSelect> _orderTakeSelects = StaticOrderTakeSelects;
public List<OrderTakeSelect> OrderTakeSelects
{
get { return _orderTakeSelects; }
set
{
SetProperty(ref _orderTakeSelects, value);
}
}
private OrderTakeSelect _selectedItem = StaticOrderTakeSelects[0];
/// <summary>
/// 查询条件 查询字段
/// </summary>
public OrderTakeSelect SelectedItem
{
get { return _selectedItem; }
set
{
SetProperty(ref _selectedItem, value);
RequestData();
}
}
private Invoice? _selectedInvoice;
public Invoice? SelectedInvoice
{
get { return _selectedInvoice; }
set
{
SetProperty(ref _selectedInvoice, value);
//OpenOrderDialog();
}
}
private string _orderDate = DateTime.Now.ToString("yyyy-MM-dd");
/// <summary>
/// 查询条件 处方日期
/// </summary>
public string OrderDate
{
get { return _orderDate; }
set
{
if (!String.IsNullOrEmpty(value))
{
SetProperty(ref _orderDate, DateTime.Parse(value).ToString("yyyy-MM-dd"));
}
else
{
SetProperty(ref _orderDate, value);
}
RequestData();
}
}
private string? _searchValue;
/// <summary>
/// 查询条件 查询字段值
/// </summary>
public string? SearchValue
{
get { return _searchValue; }
set
{
SetProperty(ref _searchValue, value);
RequestData();
}
}
private List<Invoice> _invoices = new();
public List<Invoice> Invoices { get { return _invoices; } set { SetProperty(ref _invoices, value); } }
public bool KeepAlive => false;
public async void OpenOrderDialog()
{
if (SelectedInvoice != null && SelectedInvoice.Status == 0)
{
// 此处延时1毫秒等待页面渲染
await Task.Delay(TimeSpan.FromMilliseconds(1));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("invoice", SelectedInvoice);
DialogServiceExtensions.ShowDialogHost(_dialogService, "InvoiceTakeDialog", dialogParameters, DoDialogResult, "RootDialog");
RequestData();
}
}
public DelegateCommand QueryCommand
{
get => new DelegateCommand(() =>
{
RequestData();
});
}
private void DoDialogResult(IDialogResult dialogResult)
{
// 委托 被动执行 被子窗口执行
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
//if (dialogResult.Result == ButtonResult.OK)
{
SelectedInvoice = null;
RequestData();
}
//MessageBox.Show("返回值:" + dialogResult.Result.ToString());
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public void RequestData()
{
Invoices.Clear();
int totalCount = 0;
var sb = new StringBuilder();
sb.Append("select i.invoice_no as InvoiceNo, i.invoice_date as InvoiceDate, COUNT(i.id) as `Count`, SUM(i.quantity) as quantity, p1.pharmacy_name as PharmacyName1, p2.pharmacy_name as PharmacyName2 from in_out_invoice i");
sb.Append(" inner join ( select c.drug_id as drug_id from channel_stock c where c.machine_id = '" + (ConfigurationManager.AppSettings["machineId"] ?? "DM1") + "' group by c.drug_id ) di on di.drug_id = i.drug_id");
sb.Append(" left join pharmacy_info p1 on p1.pharmacy_id = i.in_pharmacy_id");
sb.Append(" left join pharmacy_info p2 on p2.pharmacy_id = i.out_pharmacy_id");
sb.Append(" where i.status=@Status ");
sb.Append(" and i.type!=@type ");
sb.Append(" and i.cancel_flag=@CancelFlag ");
if (OrderDate != null)
{
sb.Append(" and i.invoice_date = @CreateTime ");
}
if (!String.IsNullOrEmpty(SearchValue))
{
sb.Append(" and i.invoice_no = @InvoiceNo ");
}
if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["storage"]))
{
sb.Append(" and i.out_pharmacy_id = @OutPharmacyId ");
}
sb.Append(" group by i.invoice_no");
sb.Append(" order by i.invoice_date ");
Invoices = SqlSugarHelper.Db.SqlQueryable<dynamic>(sb.ToString())
.AddParameters(new
{
Status = 0,
type = 1,
CancelFlag = 0,
CreateTime = OrderDate,
InvoiceNo = SearchValue,
OutPharmacyId = ConfigurationManager.AppSettings["storage"]
})
.Select(it => new Invoice())
.Select("*")
.ToPageList(PageNum, PageSize, ref totalCount);
TotalCount = totalCount;
PageCount = (int)Math.Ceiling((double)TotalCount / PageSize);
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}

View File

@ -0,0 +1,473 @@
using log4net;
using Microsoft.Xaml.Behaviors;
using NetTaste;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.select;
using DM_Weight.util;
using System.Threading;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class InvoiceTakeDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(InvoiceTakeDialogViewModel));
public string Title => "调拨出库";
public event Action<IDialogResult> RequestClose;
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
IDialogService _dialogService;
public InvoiceTakeDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService)
{
_dialogService = DialogService;
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "InvoiceTakeDrugWindow")
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
if (channelStocks[0].process == 1)
{
channelStocks.ForEach(it => it.process = 2);
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 1)
{
if (channelStocks[0].process == 2)
{
channelStocks.ForEach(it => it.process = 3);
}
IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
int DrawerNoBefore = groupingBefore.Key;
if (enumerator.MoveNext())
{
IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
int DrawerNoAfter = groupingAfter.Key;
if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
{
Thread.Sleep(50);
}
OpenOneByOne();
}
// 已经全部取出
else
{
Status = 3;
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 1)
{
logger.Info($"抽屉【{DrawerNo}】库位取药数量【{msg.Quantitys}】");
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status = 0;
public int Status
{
get => _status; set => SetProperty(ref _status, value);
}
private Invoice? _invoic;
public Invoice? Invoice
{
get => _invoic;
set => SetProperty(ref _invoic, value);
}
private List<InOutInvoice> invoices { get; set; }
private List<ChannelStock> _channelStocks;
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
public bool CanCloseDialog()
{
return Status == 0;
}
public void OnDialogClosed()
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
public void OnDialogOpened(IDialogParameters parameters)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
Invoice o = parameters.GetValue<Invoice>("invoice");
Invoice = o;
RequestData();
}
public void RequestData()
{
invoices = SqlSugarHelper.Db.Queryable<InOutInvoice>()
.Includes<DrugInfo>(i => i.DrugInfo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs =>cs.DrugId),(i,t) => i.DrugId == t.DrugId)
.Where(i => i.InvoiceNo == Invoice.InvoiceNo)
.ToList();
List<ChannelStock> channelStocks = new List<ChannelStock>();
List<string> msg = new List<string>();
for (int i = 0; i < invoices.Count; i++)
{
InOutInvoice invoice = invoices[i];
List<ChannelStock> HasQChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes<DrugInfo>(cs => cs.DrugInfo)
.Where(cs => cs.Quantity > 0)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.WhereIF(!string.IsNullOrEmpty(invoice.DrugEffDate), cs => cs.EffDate.Equals(invoice.DrugEffDate))
.WhereIF(!string.IsNullOrEmpty(invoice.DrugManuNo), cs => cs.ManuNo.Equals(invoice.DrugManuNo))
.Where(cs => cs.DrugId == invoice.DrugId)
.OrderBy(cs => cs.EffDate)
.ToList();
int total = HasQChannels.Sum(it => it.Quantity);
int TakeQ = invoice.quantity;
// 说明数量足够
if (total >= TakeQ)
{
for (int j = 0; TakeQ > 0; j++)
{
ChannelStock stock = HasQChannels[j];
if (TakeQ > stock.Quantity)
{
stock.TakeQuantity = stock.Quantity;
channelStocks.Add(stock);
TakeQ -= stock.Quantity;
}
else
{
stock.TakeQuantity = TakeQ;
channelStocks.Add(stock);
TakeQ = 0;
}
}
}
else
{
msg.Add($"药品【{invoice.DrugInfo.DrugName}】库存不足,应取【{TakeQ}】库存【{total}】");
}
}
if(msg.Count > 0)
{
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
//MessageBox.Show(string.Join("\n", msg));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("msgInfo", msg);
DialogServiceExtensions.ShowDialogHost(_dialogService, "ShowMessageDialog", dialogParameters, "RootDialog");
}
else
{
channelStocks.Sort((a, b) =>
{
if ((a.DrawerNo - b.DrawerNo) == 0)
{
return a.ColNo - b.ColNo;
}
return a.DrawerNo - b.DrawerNo;
});
ChannelStocks = channelStocks;
}
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(async () =>
{
if (Status == 0)
{
enumerable = ChannelStocks.GroupBy(cs => cs.DrawerNo, cs => cs);
enumerator = enumerable.GetEnumerator();
enumerator.MoveNext();
Status = 1;
OpenOneByOne();
}
});
}
private void OpenOneByOne()
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
channelStocks.ForEach(it => it.process = 1);
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
// 发送取药数量
singleChannels.ForEach(it =>
{
_portUtil.TakeQuantity(DrawerNo, it.ColNo, it.TakeQuantity, it.Quantity - it.TakeQuantity);
});
_portUtil.WindowName = "InvoiceTakeDrugWindow";
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.FindAll(it => it.TakeQuantity > 0).ToList();
if (record.Count > 0)
{
string InvoiceId = Invoice.InvoiceNo;
var f = SqlSugarHelper.Db.UseTran(() =>
{
SqlSugarHelper.Db.Updateable(new InOutInvoice()
{
Status = 1,
InvoiceNo = Invoice.InvoiceNo
}).UpdateColumns(it => new { it.Status }).WhereColumns(it => new { it.InvoiceNo }).ExecuteCommand();
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity - it.TakeQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 出库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.TakeQuantity,
Type = 2,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
Thread.Sleep(80);
}
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation && (it.BoardType == (Int32)BoardTypeEnum.smart || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox));
//if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart)
if (singleChannels.Count > 0)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity - it.TakeQuantity);
});
}
AlertMsg alertMsg = new AlertMsg
{
Message = "调拨取药完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
if (!f.IsSuccess)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "调拨取药完成,库存更新失败!",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "没有填写取药数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
});
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float temperature = await _portUtil.GetFridgeTemperature();
if (temperature > Convert.ToSingle(iTempertureRange[0]) && temperature < Convert.ToSingle(iTempertureRange[1]))
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
if (Status != 0)
{
_portUtil.ResetData();
Status = 0;
}
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
}
}

View File

@ -0,0 +1,383 @@
using log4net;
using log4net.Core;
using log4net.Repository.Hierarchy;
using Prism.Commands;
using Prism.Events;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Finger;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Views;
using System.Collections.ObjectModel;
using Microsoft.Win32;
using System.Xml;
using System.Diagnostics;
namespace DM_Weight.ViewModels
{
public class LoginWindowViewModel : BindableBase, IRegionMemberLifetime, IConfirmNavigationRequest
{
private readonly ILog logger = LogManager.GetLogger(typeof(LoginWindowViewModel));
private string username;
private string password;
private Boolean _loginBtnEnable = true;
IRegionManager _regionManager;
IEventAggregator _eventAggregator;
private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1");
private string firstLogin = ConfigurationManager.AppSettings["firstLogin"]?.ToString() ?? "operator";
public bool SingleLogin
{
get => ReadAppSetting("loginMode") == "1";
//get => loginMode == 1;
}
public bool MultiLogin
{
//get => loginMode == 2;
get => ReadAppSetting("loginMode") == "2";
}
private FingerprintUtil _fingerprintUtil;
private PortUtil _portUtil;
public Boolean LoginBtnEnable { get { return _loginBtnEnable; } set { SetProperty(ref _loginBtnEnable, value); } }
public string Password { get { return password; } set { SetProperty(ref password, value); } }
public string Username { get { return username; } set { SetProperty(ref username, value); } }
public UserList Operator { get; set; }
public UserList Reviewer { get; set; }
public bool DrawerPortMsg
{
get => !_portUtil.drawerSerial.IsOpen;
}
public bool CanBusPortMsg
{
get => _portUtil._canBusExsit && !_portUtil.canBusSerial.IsOpen;
}
private bool _fingerMsg;
public bool FingerMsg
{
get => _fingerMsg;
set => SetProperty(ref _fingerMsg, value);
}
public bool FridgePortMsg
{
get=>!_portUtil.fridgeSerial.IsOpen;
}
//public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil, FingerprintUtil fingerprintUtil)
//{
// _fingerprintUtil = fingerprintUtil;
// _portUtil = portUtil;
// _regionManager = regionManager;
// _eventAggregator = eventAggregator;
//}
public LoginWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, PortUtil portUtil)
{
//_fingerprintUtil = fingerprintUtil;
_portUtil = portUtil;
_regionManager = regionManager;
_eventAggregator = eventAggregator;
}
private DelegateCommand? _loginCommand;
private DelegateCommand? _exitCommand;
public DelegateCommand LoginCommand =>
_loginCommand ??= new DelegateCommand(Login);
public DelegateCommand ExitCommand =>
_exitCommand ??= new DelegateCommand(Exit);
public bool KeepAlive => false;
void Login()
{
LoginBtnEnable = false;
if (!string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password))
{
if (Username.Equals("hkcadmin") && Password.Equals("hkc123"))
{
ObservableCollection<PremissionDm> defaultAll = RoleManagerWindowViewModel.defaultAll;
PremissionDm[] a = new PremissionDm[defaultAll.Count];
Array.Copy(defaultAll.ToArray(), 0, a, 0, defaultAll.Count);
a[4].Children.Add(new PremissionDm()
{
Id = 54,
PremissionName = "调试页面",
PremissionPath = "DebugWindow",
});
//添加参数,键值对格式
keys.Add("operator", new UserList()
{
UserName = Username,
Nickname = "华康测试账号",
Id = 9999,
Role = new RoleDm()
{
Id = 9999,
RoleName = "hkcadmin",
Permissions = a.ToList()
},
});
_regionManager.RequestNavigate("MainRegion", "HomeWindow", keys);
}
else
{
UserList userList = SqlSugarHelper.Db.Queryable<UserList>()
.Includes<RoleDm>(u => u.Role)
.First(u => u.UserName == username && ConfigurationManager.AppSettings["machineId"].ToString().Equals(u.MachineId));
if (userList == null)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "无此用户",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Username = "";
Password = "";
}
else if (userList.Role == null|| userList.Role.Permissions.Count<=0)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "用户还未设置权限,请联系管理员",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Username = "";
Password = "";
}
else
{
if (userList.PassWord == MD5.GetMD5Hash(Password))
{
SetUser(userList);
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "密码错误",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Password = "";
}
}
}
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "请输入账号或密码",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
LoginBtnEnable = true;
}
private NavigationParameters keys = new NavigationParameters();
void SetUser(UserList user)
{
// 单人登录模式
if (SingleLogin)
{
//添加参数,键值对格式
keys.Add("operator", user);
System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
{
_regionManager.RequestNavigate("MainRegion", "HomeWindow", keys);
}));
}
// 双人登录模式
else
{
// 如果已经录入了发药人,已经有一个用户登录
if (keys.ContainsKey("operator"))
{
if (keys.GetValue<UserList>("operator").Id != user.Id)
{
keys.Add("reviewer", user);
Reviewer = user;
RaisePropertyChanged("Reviewer");
System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
{
_regionManager.RequestNavigate("MainRegion", "HomeWindow", keys);
}));
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "该发药人账号已登录,请输入不同账号",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
// 如果已经录入了审核人, 已经有一个用户登录
else if (keys.ContainsKey("reviewer"))
{
if (keys.GetValue<UserList>("reviewer").Id != user.Id)
{
keys.Add("operator", user);
Operator = user;
RaisePropertyChanged("Operator");
System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
{
_regionManager.RequestNavigate("MainRegion", "HomeWindow", keys);
}));
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "该审核人账号已登录,请输入不同账号",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
// 第一个用户登录
else
{
if (firstLogin.Equals("operator"))
{
keys.Add("operator", user);
Operator = user;
RaisePropertyChanged("Operator");
}
else
{
keys.Add("reviewer", user);
Reviewer = user;
RaisePropertyChanged("Reviewer");
}
Username = string.Empty;
Password =string.Empty;
}
}
}
void Exit()
{
Process.GetCurrentProcess().Kill();
Environment.Exit(0);
}
void LoginEvent(FingerprintMsg msg)
{
logger.Info(msg.ToString());
if (msg.Message.Equals("CONNECT"))
{
FingerMsg = !msg.Result;
}
if (LoginBtnEnable)
{
if (msg.Message.Equals("LOGIN"))
{
UserList userList = SqlSugarHelper.Db.Queryable<UserList>()
.Includes<RoleDm>(u => u.Role)
.First(u => u.Id == msg.Id);
if (userList == null)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "无此用户",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Username = "";
Password = "";
}
else if (userList.Role == null)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "用户还未设置权限,请联系管理员",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Username = "";
Password = "";
}
else
{
SetUser(userList);
}
}
}
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
FingerMsg = false;// !_fingerprintUtil.bIsConnected;
_eventAggregator.GetEvent<FingerprintEvent>().Subscribe(LoginEvent);
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<FingerprintEvent>().Unsubscribe(LoginEvent);
}
//手动实现调用配置的逻辑 规避修改配置文件后不起作用的问题
public string ReadAppSetting(string key)
{
string xPath = $"/configuration/appSettings//add[@key='{key}']";
XmlDocument doc = new XmlDocument();
string exeFileName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
doc.Load(exeFileName + ".dll.config");
XmlNode node = doc.SelectSingleNode(xPath);
return node.Attributes["value"].Value.ToString();
}
}
}

View File

@ -0,0 +1,210 @@
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Models;
using DM_Weight.Port;
using DM_Weight.Report;
using DM_Weight.util;
using gregn6Lib;
using Newtonsoft.Json;
using System.IO;
using System.Configuration;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class MachineRecordWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
RequestData();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
private int _totalCount = 0;
public int TotalCount
{
get => _totalCount;
set
{
SetProperty(ref _totalCount, value);
}
}
private DateTime? _startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
public DateTime? StartDate
{
get => _startDate;
set
{
if (value != null)
{
SetProperty(ref _startDate, new DateTime(value?.Year ?? 0, value?.Month ?? 0, value?.Day ?? 0 ));
} else
{
SetProperty(ref _startDate, value);
}
RequestData();
}
}
private DateTime? _endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23,59,59);
public DateTime? EndDate
{
get => _endDate;
set{
if (value != null)
{
TimeSpan ershisi = new TimeSpan(23, 59, 59);
SetProperty(ref _endDate, new DateTime(value?.Year ?? 0, value?.Month ?? 0, value?.Day ?? 0, 23, 59, 59));
}
else
{
SetProperty(ref _endDate, value);
}
RequestData();
}
}
private int _type;
public int Type
{
get { return _type; }
set
{
SetProperty(ref _type, value);
}
}
private List<MachineRecord>? machineRecords;
public List<MachineRecord>? MachineRecords
{
get { return machineRecords; }
set { SetProperty(ref machineRecords, value); }
}
public MachineRecordWindowViewModel()
{
}
public bool KeepAlive => false;
public DelegateCommand Query
{
get => new DelegateCommand(() =>
{
RequestData();
});
}
public DelegateCommand Download
{
get => new DelegateCommand(() =>
{
GridReportUtil.PrintReportMechineRecord(Type, StartDate, EndDate);
});
}
public DelegateCommand DownloadAccountBook
{
get => new DelegateCommand(() =>
{
GridReportUtil.PrintReportAccountBook(StartDate, EndDate);
});
}
void ReportInitialize()
{
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
//取出Type决定页面显示内容
Type = navigationContext.Parameters.GetValue<int>("Type");
//查询表格数据
RequestData();
}
void RequestData()
{
int totalCount = 0;
string machineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1";
MachineRecords = SqlSugarHelper.Db.Queryable<MachineRecord>()
.Includes<DrugInfo>(mr => mr.DrugInfo)
.Includes<UserList>(mr => mr.User)
.Where(mr => mr.MachineId == machineId)
.WhereIF(Type == (Int32)DrawerTypeEnum.recyle, (mr) => new int[] { 31, 32 }.Contains(mr.Type))
.WhereIF(Type != (Int32)DrawerTypeEnum.recyle, (mr) => mr.Type == Type )
.WhereIF(StartDate !=null, (mr) => mr.OperationTime > StartDate)
.WhereIF(EndDate!=null, (mr) => mr.OperationTime < EndDate)
//.Select(mr => mr)
.ToPageList(PageNum, PageSize, ref totalCount);
//.ToList();
TotalCount = totalCount;
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
}

View File

@ -0,0 +1,129 @@
using MaterialDesignThemes.Wpf;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using DM_Weight.Finger;
using DM_Weight.Views;
using Unity;
using System.Threading;
using System.Timers;
namespace DM_Weight.ViewModels
{
internal class MainWindowViewModel : BindableBase
{
private string _title = "Prism App"; //标题
private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
private SolidColorBrush _colorBrush;
//private PortUtil _portUtil;
private ScreenUtil _screenUtil;
public SolidColorBrush Background
{
get => _colorBrush;
set => SetProperty(ref _colorBrush, value);
}
public ISnackbarMessageQueue SnackbarMessageQueue
{
get => _snackbarMessageQueue;
set => SetProperty(ref _snackbarMessageQueue, value);
}
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
IEventAggregator eventAggregator;
//public MainWindowViewModel(IEventAggregator eventAggregator, PortUtil portUtil, ScreenUtil screenUtil)
//{
// _portUtil = portUtil;
// this.eventAggregator = eventAggregator;
// this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
// _screenUtil = screenUtil;
//}
private FingerprintUtil _fingerprintUtil;
IRegionManager _regionManager;
IUnityContainer _container;
PortUtil _portUtil;
public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, ScreenUtil screenUtil, PortUtil portUtil)
{
_portUtil = portUtil;
this.eventAggregator = eventAggregator;
this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
_screenUtil = screenUtil;
_fingerprintUtil = fingerprintUtil;
_regionManager = regionManager;
_container = container;
System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
{
_container.RegisterType<object, LoginWindow>("LoginWindow");
_regionManager.RequestNavigate("MainRegion", "LoginWindow");
}));
#region
int interval = 60000;
if (interval > 0)
{
System.Timers.Timer doorTimer = new System.Timers.Timer();
doorTimer.Elapsed += new System.Timers.ElapsedEventHandler(doorStatus);
doorTimer.Interval = interval;
doorTimer.Start();
}
#endregion
}
/// <summary>
/// 监测后门是否打开
/// </summary>
private async void doorStatus(object sender, ElapsedEventArgs e)
{
if (!_portUtil.Operate)
{
//监测后门是否打开
_portUtil.GetSingleBoardBackDoorState();
}
}
void doMyPrismEvent2(AlertMsg msg)
{
switch (msg.Type)
{
case MsgType.INFO:
this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00e676"));
break;
case MsgType.ERROR:
this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
break;
default:
this.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00e676"));
break;
}
SnackbarMessageQueue.Enqueue(msg.Message);
}
}
}

View File

@ -0,0 +1,498 @@
using DM_Weight.Common;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.util;
using log4net;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DM_Weight.ViewModels
{
public class MultiOrderTakeDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(OrderTakeDialogViewModel));
public string Title => "多处方取药";
public event Action<IDialogResult> RequestClose;
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
IDialogService _dialogService;
public MultiOrderTakeDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService)
{
_dialogService = DialogService;
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "OrderTakeDrugWindow")
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
if (channelStocks[0].process == 1)
{
channelStocks.ForEach(it => it.process = 2);
}
}
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 1)
{
if (channelStocks[0].process == 2)
{
channelStocks.ForEach(it => it.process = 3);
}
IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
int DrawerNoBefore = groupingBefore.Key;
if (enumerator.MoveNext())
{
IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
int DrawerNoAfter = groupingAfter.Key;
if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
{
Thread.Sleep(50);
}
OpenOneByOne();
}
// 已经全部取出
else
{
Status = 3;
}
}
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 1)
{
logger.Info($"抽屉【{DrawerNo}】库位取药数量【{msg.Quantitys}】");
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status = 0;
public int Status
{
get => _status; set => SetProperty(ref _status, value);
}
//多处方的处方号
private string _multiOrderNo = "处方号:";
public string MultiOrderNo
{
get => _multiOrderNo;
set => SetProperty(ref _multiOrderNo, value);
}
private ObservableCollection<OrderInfo>? _orderInfo;
public ObservableCollection<OrderInfo>? OrderInfo
{
get => _orderInfo;
set => SetProperty(ref _orderInfo, value);
}
private List<OrderDetail> orderDetails { get; set; }
private List<ChannelStock> _channelStocks;
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
public bool CanCloseDialog()
{
return Status == 0;
}
public void OnDialogClosed()
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
public void OnDialogOpened(IDialogParameters parameters)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
OrderInfo = parameters.GetValue<ObservableCollection<OrderInfo>>("orderInfo");
MultiOrderNo += string.Join(", ", OrderInfo.Select(o => o.OrderNo));
RequestData();
}
public async void RequestData()
{
orderDetails = SqlSugarHelper.Db.Queryable<OrderDetail>()
//.Includes<DrugInfo>(od => od.DrugInfo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (od, t) => od.DrugId == t.DrugId)
.Where(od => OrderInfo.Select(o => o.OrderNo).Contains(od.OrderNo)).GroupBy(od => od.DrugId)
.Select(od => new OrderDetail { DrugId = od.DrugId, SetEffDate = od.SetEffDate, SetManuNo = od.SetManuNo, Quantity = SqlFunc.AggregateSum(od.Quantity) })
//.Where(od => od.OrderNo. OrderInfo.OrderNo)
.ToList();
List<ChannelStock> channelStocks = new List<ChannelStock>();
List<string> msg = new List<string>();
for (int i = 0; i < orderDetails.Count; i++)
{
OrderDetail orderDetail = orderDetails[i];
List<ChannelStock> HasQChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes<DrugInfo>(cs => cs.DrugInfo)
.Where(cs => cs.Quantity > 0)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.WhereIF(!string.IsNullOrEmpty(orderDetail.SetEffDate), cs => cs.EffDate.Equals(orderDetail.SetEffDate))
.WhereIF(!string.IsNullOrEmpty(orderDetail.SetManuNo), cs => cs.ManuNo.Equals(orderDetail.SetManuNo))
.Where(cs => cs.DrugId == orderDetail.DrugId)
.OrderBy(cs => cs.EffDate)
.OrderBy(cs => cs.DrawerNo)
.ToList();
int total = HasQChannels.Sum(it => it.Quantity);
int TakeQ = orderDetail.Quantity;
int multiTakeQ = orderDetail.Quantity;
List<ChannelStock> multiTake = new List<ChannelStock>();
//multiTakeQ = orderDetails.Where(c => c.DrugId == orderDetail.DrugId).Sum(c => c.Quantity);
// 说明数量足够
if (total >= multiTakeQ)
{
for (int j = 0; TakeQ > 0; j++)
{
ChannelStock stock = HasQChannels[j];
if (TakeQ > stock.Quantity)
{
//#region 存在该库存且库存数量大于待取数量则把取药数量加上
//var varChannelStock = channelStocks.Where(c => c.Location == stock.Location && c.Quantity > c.TakeQuantity + TakeQ).ToList();
//if (varChannelStock != null && varChannelStock.Count > 0)
//{
// channelStocks.Where(c => c.Location == stock.Location).Select(c => c.TakeQuantity += TakeQ).ToList();
// break;
//}
//#endregion
stock.TakeQuantity = stock.Quantity;
channelStocks.Add(stock);
TakeQ -= stock.Quantity;
}
else
{
//#region 存在该库存且库存数量大于待取数量则把取药数量加上
//var varChannelStock = channelStocks.Where(c => c.Location == stock.Location && c.Quantity > c.TakeQuantity + TakeQ).ToList();
//if (varChannelStock != null && varChannelStock.Count > 0)
//{
// channelStocks.Where(c => c.Location == stock.Location).Select(c => c.TakeQuantity += TakeQ).ToList();
// break;
//}
//#endregion
stock.TakeQuantity = TakeQ;
channelStocks.Add(stock);
TakeQ = 0;
}
}
}
else
{
//msg.Add($"药品【{orderDetail.DrugInfo.DrugName}】库存不足,应取【{TakeQ}】库存【{total}】");
msg.Add($"药品【{HasQChannels[0].DrugInfo.DrugName}】库存不足,应取【{TakeQ}】库存【{total}】");
}
}
if (msg.Count > 0)
{
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
//MessageBox.Show(string.Join("\n", msg));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("msgInfo", msg);
DialogServiceExtensions.ShowDialogHost(_dialogService, "ShowMessageDialog", dialogParameters, "RootDialog");
}
else
{
channelStocks.Sort((a, b) =>
{
if ((a.DrawerNo - b.DrawerNo) == 0)
{
return a.ColNo - b.ColNo;
}
return a.DrawerNo - b.DrawerNo;
});
ChannelStocks = channelStocks;
}
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(async () =>
{
if (Status == 0)
{
enumerable = ChannelStocks.GroupBy(cs => cs.DrawerNo, cs => cs);
enumerator = enumerable.GetEnumerator();
enumerator.MoveNext();
Status = 1;
OpenOneByOne();
}
});
}
private void OpenOneByOne()
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
channelStocks.ForEach(it => it.process = 1);
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != 1);
// 发送取药数量
singleChannels.ForEach(it =>
{
try
{
_portUtil.TakeQuantity(DrawerNo, it.ColNo, it.TakeQuantity, it.Quantity - it.TakeQuantity);
}
catch (Exception ex)
{
AlertMsg alertMsg = new AlertMsg
{
Message = $"打开抽屉异常{ex.Message}",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
});
_portUtil.WindowName = "OrderTakeDrugWindow";
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.FindAll(it => it.TakeQuantity > 0).ToList();
//根据处方单数量分别更新处方状态、写记录信息
if (OrderInfo.Count > 0)
{
for (int j = 0; j < OrderInfo.Count; j++)
{
string InvoiceId = OrderInfo[j].OrderNo;
var f = SqlSugarHelper.Db.UseTran(() =>
{
//SqlSugarHelper.Db.Updateable(new OrderInfo()
//{
// DmStatus = 1,
// OrderNo = OrderInfo[j].OrderNo
//}).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.OrderNo }).ExecuteCommand();
SqlSugarHelper.Db.Insertable(new OrderFinish()
{
OrderNo = OrderInfo[j].OrderNo,
PatientId = OrderInfo[j].PatientId,
Pharmacy = OrderInfo[j].Pharmacy,
State = 1,
Operator = HomeWindowViewModel.Operator?.Nickname,
});
for (int i = 0; i < record.Count; i++)
{
List<OrderDetail> orderDet = SqlSugarHelper.Db.Queryable<OrderDetail>().Where(od => od.OrderNo == OrderInfo[j].OrderNo && od.DrugId == record[i].DrugId).ToList();
//该对方没有这个药,跳出循环
if (orderDet == null || orderDet.Count <= 0)
continue;
int orderTakeQuantity = orderDet[0].Quantity;
ChannelStock it = record[i];
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity - it.TakeQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 出库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = orderTakeQuantity,
Type = 2,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
Thread.Sleep(80);
}
}
//更新处方状态
SqlSugarHelper.Db.Updateable(new OrderInfo()
{
DmStatus = 1,
OrderNo = OrderInfo[j].OrderNo
}).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.OrderNo }).ExecuteCommand();
return true;
});
if (f.Data)
{
//});
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation && (it.BoardType == (Int32)BoardTypeEnum.smart || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox));
//if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart)
if (singleChannels.Count > 0)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity - it.TakeQuantity);
});
}
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉取药完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
if (!f.IsSuccess)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉取药完成,库存更新失败!",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
Status = 0;
_isFinishClick = false;
//RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
}
});
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
if (Status != 0)
{
_portUtil.ResetData();
Status = 0;
}
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
}
}

View File

@ -0,0 +1,381 @@
using DM_Weight.Common;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.select;
using DM_Weight.util;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.ViewModels
{
public class MultiOrderTakeDrugWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
public static MultiOrderTakeDrugWindowViewModel vm;
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
RequestData();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
private int _totalCount = 0;
public int TotalCount
{
get => _totalCount;
set
{
SetProperty(ref _totalCount, value);
}
}
IDialogService _dialogService;
IEventAggregator _eventAggregator;
public MultiOrderTakeDrugWindowViewModel(IDialogService DialogService, IEventAggregator eventAggregator)
{
_dialogService = DialogService;
_eventAggregator = eventAggregator;
vm = this;
}
//public static ObservableCollection<OrderTakeSelect> StaticOrderTakeSelects = new()
//{
// new OrderTakeSelect
// {
// Code = "OrderNo",
// Name = "处方号"
// },
// new OrderTakeSelect
// {
// Code = "PatientId",
// Name = "患者编号"
// }
//};
//private ObservableCollection<OrderTakeSelect> _orderTakeSelects = StaticOrderTakeSelects;
//public ObservableCollection<OrderTakeSelect> OrderTakeSelects
//{
// get { return _orderTakeSelects; }
// set
// {
// SetProperty(ref _orderTakeSelects, value);
// }
//}
//private OrderTakeSelect _selectedItem = StaticOrderTakeSelects[0];
///// <summary>
///// 查询条件 查询字段
///// </summary>
//public OrderTakeSelect SelectedItem
//{
// get { return _selectedItem; }
// set
// {
// SetProperty(ref _selectedItem, value);
// RequestData();
// }
//}
//private OrderInfo? _selectedOrder;
//public OrderInfo? SelectedOrder
//{
// get { return _selectedOrder; }
// set
// {
// SetProperty(ref _selectedOrder, value);
// //OpenOrderDialog();
// }
//}
private string _orderDate = DateTime.Now.ToString("yyyy-MM-dd");
/// <summary>
/// 查询条件 处方日期
/// </summary>
public string OrderDate
{
get { return _orderDate; }
set
{
if (!String.IsNullOrEmpty(value))
{
SetProperty(ref _orderDate, DateTime.Parse(value).ToString("yyyy-MM-dd"));
}
else
{
SetProperty(ref _orderDate, value);
}
RequestData();
}
}
//private string? _searchValue;
///// <summary>
///// 查询条件 查询字段值
///// </summary>
//public string? SearchValue
//{
// get { return _searchValue; }
// set
// {
// SetProperty(ref _searchValue, value);
// RequestData();
// }
//}
/// <summary>
///全选
/// </summary>
private bool _allChecked = false;
public bool IsAllChecked
{
get { return _allChecked; }
set
{
SetProperty(ref _allChecked, value);
if (!IsItemCheck)
{
RequestData();
//根据全选或反选设置其后的选中状态
OrderInfos.ToList().ForEach(oi => oi.ItemIsChecked = _allChecked);
}
else
{
IsItemCheck = false;
}
}
}
public bool _isItemCheck = false;
public bool IsItemCheck
{
get => _isItemCheck;
set
{
SetProperty(ref _isItemCheck, value);
if (OrderInfos.ToList().Where(od => od.ItemIsChecked == false).Count() <= 0)
{
IsAllChecked = true;
}
}
}
//private bool _itemIsChecked = false;
//public bool ItemIsChecked
//{
// get => _itemIsChecked;
// set
// {
// SetProperty(ref _itemIsChecked, value);
// }
//}
//多处方取药
public DelegateCommand BtnTakeOrder { get => new DelegateCommand(TakeByMultiOrder); }
private void TakeByMultiOrder()
{
OrderInfos = new ObservableCollection<OrderInfo>(OrderInfos.Where(o => o.ItemIsChecked == true).ToList());
if (OrderInfos != null && OrderInfos.Count() > 0)
{
// 此处延时1毫秒等待页面渲染
//await Task.Delay(TimeSpan.FromMilliseconds(1));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("orderInfo", OrderInfos);
DialogServiceExtensions.ShowDialogHost(_dialogService, "MultiOrderTakeDialog", dialogParameters, DoDialogResult, "RootDialog");
}
else
{
//请勾选要取药的处方信息
AlertMsg alertMsg = new AlertMsg
{
Message = "请勾选要取药的处方信息",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
IsAllChecked = false;
}
private ObservableCollection<OrderInfo> _orderInfos = new();
public ObservableCollection<OrderInfo> OrderInfos
{
get { return _orderInfos; }
set
{
SetProperty(ref _orderInfos, value);
}
}
//部门
private ObservableCollection<OrderDepartment> _orderDepartments = new ObservableCollection<OrderDepartment>();
public ObservableCollection<OrderDepartment> OrderDepartments
{
get => _orderDepartments;
set
{
SetProperty(ref _orderDepartments, value);
}
}
private OrderDepartment _orderDepartment = new OrderDepartment();
public OrderDepartment OrderDepartment
{
get => _orderDepartment;
set
{
SetProperty(ref _orderDepartment, value);
RequestData();
}
}
public bool KeepAlive => false;
private void DoDialogResult(IDialogResult dialogResult)
{
// 委托 被动执行 被子窗口执行
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
//if(dialogResult.Result == ButtonResult.OK)
//{
//SelectedOrder = null;
RequestData();
//}
//MessageBox.Show("返回值:" + dialogResult.Result.ToString());
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public DelegateCommand QueryCommand
{
get => new DelegateCommand(() =>
{
RequestData();
});
}
public void RequestData()
{
OrderInfos.Clear();
int totalCount = 0;
//string SearchValue = null;
//if (SearchValue != null)
//{
// strSearchValue = SearchValue.Trim().Replace("\r", "");
//}
List<OrderInfo> queryData = SqlSugarHelper.Db.Queryable<OrderInfo>()
.InnerJoin<OrderDetail>((oi, od) => oi.OrderNo == od.OrderNo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (oi, od, t) => od.DrugId == t.DrugId)
.WhereIF(OrderDate != null, oi => oi.OrderDate.ToString("yyyy-MM-dd") == OrderDate)
.WhereIF(!(OrderDepartment.DeptName.Equals("全部")), oi => oi.DeptName == OrderDepartment.DeptName)
//.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PatientId"), oi => oi.PatientId == SearchValue)
.WhereIF(!String.IsNullOrEmpty(ConfigurationManager.AppSettings["storage"]), oi => oi.Pharmacy == ConfigurationManager.AppSettings["storage"])
.Where(oi => oi.DmStatus == 0)
.Where(oi => oi.HisDispFlag == 0)
.Where(oi => oi.CancelFlag == 0)
.GroupBy(oi => oi.OrderDate)
.Select(oi => oi)
.ToPageList(PageNum, PageSize, ref totalCount);
//.ToList();
OrderInfos = new ObservableCollection<OrderInfo>(queryData);
if (OrderDepartments.Where(d => d.DeptName == "全部").ToList().Count <= 0)
{
OrderDepartment deptDefault = new OrderDepartment();
deptDefault.DeptName = "全部";
OrderDepartments.Add(deptDefault);
}
var orderDeparts = queryData.GroupBy(o=>o.DeptName).ToList();
for (int i = 0; i < orderDeparts.Count; i++)
{
OrderDepartment dept = new OrderDepartment();
if (orderDeparts[i].Key != null && orderDeparts[i].Key != string.Empty&& OrderDepartments.Where(d => d.DeptName == orderDeparts[i].Key).ToList().Count<=0)
{
dept.DeptName = orderDeparts[i].Key;
OrderDepartments.Add(dept);
}
}
TotalCount = totalCount;
PageCount = (int)Math.Ceiling((double)TotalCount / PageSize);
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
//_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
//_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
void DoMyPrismEvent(DeviceMsg msg)
{
//if (msg.EventType == EventType.CODESCAN)
//{
// SearchValue = msg.Code;
//}
}
}
}

View File

@ -0,0 +1,459 @@
using log4net;
using log4net.Repository.Hierarchy;
using Microsoft.Xaml.Behaviors;
using NetTaste;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.select;
using DM_Weight.util;
using System.Threading;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class OrderReturnDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(OrderReturnDialogViewModel));
public string Title => "处方退药";
public event Action<IDialogResult> RequestClose;
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
IDialogService _dialogService;
public OrderReturnDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService)
{
_dialogService = DialogService;
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "ReturnDrug1Window")
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
if (channelStocks[0].process == 1)
{
channelStocks.ForEach(it => it.process = 2);
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 1)
{
if (channelStocks[0].process == 2)
{
channelStocks.ForEach(it => it.process = 3);
}
IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
int DrawerNoBefore = groupingBefore.Key;
if (enumerator.MoveNext())
{
IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
int DrawerNoAfter = groupingAfter.Key;
if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
{
Thread.Sleep(50);
}
OpenOneByOne();
}
// 已经全部取出
else
{
Status = 3;
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 1)
{
logger.Info($"抽屉【{DrawerNo}】库位取药数量【{msg.Quantitys}】");
//channelStocks.ForEach(it => it.ReturnQuantity = msg.Quantitys[it.ColNo - 1]);
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status = 0;
public int Status
{
get => _status; set => SetProperty(ref _status, value);
}
private OrderInfo? _orderInfo;
public OrderInfo? OrderInfo
{
get => _orderInfo;
set => SetProperty(ref _orderInfo, value);
}
private List<OrderDetail> orderDetails { get; set; }
private List<ChannelStock> _channelStocks;
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
public bool CanCloseDialog()
{
return Status == 0;
}
public void OnDialogClosed()
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
public void OnDialogOpened(IDialogParameters parameters)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
OrderInfo o = parameters.GetValue<OrderInfo>("orderInfo");
OrderInfo = o;
RequestData();
}
public void RequestData()
{
orderDetails = SqlSugarHelper.Db.Queryable<OrderDetail>()
.Includes<DrugInfo>(od => od.DrugInfo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (od, t) => od.DrugId == t.DrugId)
.Where(od => od.OrderNo == OrderInfo.OrderNo)
.ToList();
List<ChannelStock> channelStocks = new List<ChannelStock>();
List<string> msg = new List<string>();
for (int i = 0; i < orderDetails.Count; i++)
{
OrderDetail orderDetail = orderDetails[i];
List<ChannelStock> HasQChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes<DrugInfo>(cs => cs.DrugInfo)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.WhereIF(!string.IsNullOrEmpty(orderDetail.SetEffDate), cs => cs.EffDate.Equals(orderDetail.SetEffDate))
.WhereIF(!string.IsNullOrEmpty(orderDetail.SetManuNo), cs => cs.ManuNo.Equals(orderDetail.SetManuNo))
.Where(cs => cs.DrugId == orderDetail.DrugId)
.OrderBy(cs => cs.EffDate)
.ToList();
// 有库位
if (HasQChannels.Count > 0)
{
ChannelStock singleChannel = HasQChannels.Find(it => (it.BoardType == (Int32)BoardTypeEnum.single && (25 - it.Quantity >= orderDetail.Quantity)));
ChannelStock otherChannel = HasQChannels.Find(it => it.BoardType != (Int32)BoardTypeEnum.single);
if ((singleChannel ?? otherChannel) != null)
{
//(singleChannel ?? otherChannel).TakeQuantity = orderDetail.Quantity;
(singleChannel ?? otherChannel).ReturnQuantity = orderDetail.Quantity;
channelStocks.Add(singleChannel ?? otherChannel);
}
else
{
msg.Add($"药品【{orderDetail.DrugInfo.DrugName}】现有库位不足以放置药品");
}
}
else
{
msg.Add($"药品【{orderDetail.DrugInfo.DrugName}】无库位");
}
}
if (msg.Count > 0)
{
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
//MessageBox.Show(string.Join("\n", msg));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("msgInfo", msg);
DialogServiceExtensions.ShowDialogHost(_dialogService, "ShowMessageDialog", dialogParameters, "RootDialog");
}
else
{
channelStocks.Sort((a, b) =>
{
if ((a.DrawerNo - b.DrawerNo) == 0)
{
return a.ColNo - b.ColNo;
}
return a.DrawerNo - b.DrawerNo;
});
ChannelStocks = channelStocks;
}
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(async () =>
{
if (Status == 0)
{
enumerable = ChannelStocks.GroupBy(cs => cs.DrawerNo, cs => cs);
enumerator = enumerable.GetEnumerator();
enumerator.MoveNext();
Status = 1;
OpenOneByOne();
}
});
}
private void OpenOneByOne()
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
channelStocks.ForEach(it => it.process = 1);
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
// 发送还药数量
singleChannels.ForEach(it =>
{
_portUtil.TakeQuantity(DrawerNo, it.ColNo, it.TakeQuantity, it.Quantity + it.TakeQuantity);
});
_portUtil.WindowName = "ReturnDrug1Window";
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
//List<ChannelStock> record = ChannelStocks.FindAll(it => it.TakeQuantity > 0).ToList
List<ChannelStock> record = ChannelStocks.ToList();
//if (record.Count > 0)
//{
string InvoiceId = OrderInfo.OrderNo;
var f = SqlSugarHelper.Db.UseTran(() =>
{
SqlSugarHelper.Db.Updateable(new OrderInfo()
{
DmStatus = 2,
OrderNo = OrderInfo.OrderNo
}).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.OrderNo }).ExecuteCommand();
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
//Quantity = it.Quantity + it.TakeQuantity,
Quantity = it.Quantity + it.ReturnQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == 1)
.ToList();
// 保存数据 还药记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
//Quantity = it.TakeQuantity,
Quantity = it.ReturnQuantity,
Type = 31,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
Thread.Sleep(80);
}
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation && (it.BoardType == (Int32)BoardTypeEnum.smart || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox));
//if ((singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation) == (Int32)BoardTypeEnum.smart)
if (singleChannels.Count > 0)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + it.TakeQuantity);
});
}
AlertMsg alertMsg = new AlertMsg
{
Message = "处方退药完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
//}
//else
//{
// _isFinishClick = false;
// AlertMsg alertMsg = new AlertMsg
// {
// Message = "没有填写取药数量",
// Type = MsgType.ERROR
// };
// _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
//}
}
});
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null&& ChannelStocks.Count>0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float temperature = await _portUtil.GetFridgeTemperature();
if (temperature > Convert.ToSingle(iTempertureRange[0]) && temperature < Convert.ToSingle(iTempertureRange[1]))
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
if (Status != 0)
{
_portUtil.ResetData();
Status = 0;
}
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
}
}

View File

@ -0,0 +1,493 @@
using log4net;
using Microsoft.Xaml.Behaviors;
using NetTaste;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Models;
using DM_Weight.msg;
using DM_Weight.Port;
using DM_Weight.select;
using DM_Weight.util;
using System.Threading;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class OrderTakeDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
{
private readonly ILog logger = LogManager.GetLogger(typeof(OrderTakeDialogViewModel));
public string Title => "处方取药";
public event Action<IDialogResult> RequestClose;
private static readonly DateTime Jan1st1970 = new DateTime
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private PortUtil _portUtil;
IEventAggregator _eventAggregator;
IDialogService _dialogService;
public OrderTakeDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService)
{
_dialogService = DialogService;
_portUtil = portUtil;
_eventAggregator = eventAggregator;
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.WindowName == "OrderTakeDrugWindow")
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
switch (msg.EventType)
{
// 抽屉打开
case EventType.DRAWEROPEN:
if (Status == 1)
{
if (channelStocks[0].process == 1)
{
channelStocks.ForEach(it => it.process = 2);
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeOpen();
break;
// 抽屉关闭
case EventType.DRAWERCLOSE:
if (Status == 1)
{
if (channelStocks[0].process == 2)
{
channelStocks.ForEach(it => it.process = 3);
}
IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
int DrawerNoBefore = groupingBefore.Key;
if (enumerator.MoveNext())
{
IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
int DrawerNoAfter = groupingAfter.Key;
if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
{
Thread.Sleep(50);
}
OpenOneByOne();
}
// 已经全部取出
else
{
Status = 3;
}
}
//是冰箱抽屉则开冰箱抽屉时发送延迟报警指令
CheckIsFridgeClose();
break;
// 数量变化
case EventType.UPDATEQUANTITY:
if (Status == 1)
{
logger.Info($"抽屉【{DrawerNo}】库位取药数量【{msg.Quantitys}】");
}
break;
// 打开失败
case EventType.OPENERROR:
AlertMsg alertMsg = new AlertMsg
{
Message = msg.Message,
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
Status = 0;
break;
}
}
}
private int _status = 0;
public int Status
{
get => _status; set => SetProperty(ref _status, value);
}
private OrderInfo? _orderInfo;
public OrderInfo? OrderInfo
{
get => _orderInfo;
set => SetProperty(ref _orderInfo, value);
}
private List<OrderDetail> orderDetails { get; set; }
private List<ChannelStock> _channelStocks;
public List<ChannelStock> ChannelStocks
{
get => _channelStocks;
set => SetProperty(ref _channelStocks, value);
}
private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
public bool CanCloseDialog()
{
return Status == 0;
}
public void OnDialogClosed()
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
public void OnDialogOpened(IDialogParameters parameters)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
OrderInfo o = parameters.GetValue<OrderInfo>("orderInfo");
OrderInfo = o;
RequestData();
}
public async void RequestData()
{
orderDetails = SqlSugarHelper.Db.Queryable<OrderDetail>()
.Includes<DrugInfo>(od => od.DrugInfo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (od, t) => od.DrugId == t.DrugId)
.Where(od => od.OrderNo == OrderInfo.OrderNo)
.ToList();
List<ChannelStock> channelStocks = new List<ChannelStock>();
List<string> msg = new List<string>();
for (int i = 0; i < orderDetails.Count; i++)
{
OrderDetail orderDetail = orderDetails[i];
List<ChannelStock> HasQChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Includes<DrugInfo>(cs => cs.DrugInfo)
.Where(cs => cs.Quantity > 0)
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1"))
.WhereIF(!string.IsNullOrEmpty(orderDetail.SetEffDate), cs => cs.EffDate.Equals(orderDetail.SetEffDate))
.WhereIF(!string.IsNullOrEmpty(orderDetail.SetManuNo), cs => cs.ManuNo.Equals(orderDetail.SetManuNo))
.Where(cs => cs.DrugId == orderDetail.DrugId)
.OrderBy(cs => cs.EffDate)
.OrderBy(cs => cs.DrawerNo)
.ToList();
int total = HasQChannels.Sum(it => it.Quantity);
int TakeQ = orderDetail.Quantity;
// 说明数量足够
if (total >= TakeQ)
{
for (int j = 0; TakeQ > 0; j++)
{
ChannelStock stock = HasQChannels[j];
if (TakeQ > stock.Quantity)
{
stock.TakeQuantity = stock.Quantity;
channelStocks.Add(stock);
TakeQ -= stock.Quantity;
}
else
{
stock.TakeQuantity = TakeQ;
channelStocks.Add(stock);
TakeQ = 0;
}
}
}
else
{
msg.Add($"药品【{orderDetail.DrugInfo.DrugName}】库存不足,应取【{TakeQ}】库存【{total}】");
}
}
if (msg.Count > 0)
{
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
//MessageBox.Show(string.Join("\n", msg));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("msgInfo", msg);
DialogServiceExtensions.ShowDialogHost(_dialogService, "ShowMessageDialog", dialogParameters, "RootDialog");
}
else
{
channelStocks.Sort((a, b) =>
{
if ((a.DrawerNo - b.DrawerNo) == 0)
{
return a.ColNo - b.ColNo;
}
return a.DrawerNo - b.DrawerNo;
});
ChannelStocks = channelStocks;
}
}
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(async () =>
{
if (Status == 0)
{
enumerable = ChannelStocks.GroupBy(cs => cs.DrawerNo, cs => cs);
enumerator = enumerable.GetEnumerator();
enumerator.MoveNext();
Status = 1;
OpenOneByOne();
}
});
}
private void OpenOneByOne()
{
IGrouping<int, ChannelStock> grouping = enumerator.Current;
int DrawerNo = grouping.Key;
List<ChannelStock> channelStocks = grouping.ToList();
channelStocks.ForEach(it => it.process = 1);
_portUtil.SpeakAsync("正在打开" + DrawerNo + "号抽屉");
List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation);
// 发送取药数量
singleChannels.ForEach(it =>
{
try
{
_portUtil.TakeQuantity(DrawerNo, it.ColNo, it.TakeQuantity, it.Quantity - it.TakeQuantity);
}
catch (Exception ex)
{
AlertMsg alertMsg = new AlertMsg
{
Message = $"打开抽屉异常{ex.Message}",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
});
_portUtil.WindowName = "OrderTakeDrugWindow";
_portUtil.BoardType = singleChannels.Count > 0 ? singleChannels[0].BoardType : (Int32)BoardTypeEnum.separation;
_portUtil.ColNos = singleChannels.Select(it => it.ColNo).ToArray();
_portUtil.DrawerNo = DrawerNo;
_portUtil.Start();
}
private bool _isFinishClick = false;
// 完成按钮
public DelegateCommand TakeFinish
{
get => new DelegateCommand(() =>
{
if (!_isFinishClick)
{
_isFinishClick = true;
List<ChannelStock> record = ChannelStocks.FindAll(it => it.TakeQuantity > 0).ToList();
if (record.Count > 0)
{
string InvoiceId = OrderInfo.OrderNo;
var f = SqlSugarHelper.Db.UseTran(() =>
{
SqlSugarHelper.Db.Updateable(new OrderInfo()
{
DmStatus = 1,
OrderNo = OrderInfo.OrderNo
}).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.OrderNo }).ExecuteCommand();
SqlSugarHelper.Db.Insertable(new OrderFinish()
{
OrderNo = OrderInfo.OrderNo,
PatientId = OrderInfo.PatientId,
Pharmacy = OrderInfo.Pharmacy,
State = 1,
Operator = HomeWindowViewModel.Operator?.Nickname,
});
for (int i = 0; i < record.Count; i++)
{
ChannelStock it = record[i];
// 更新数据 库存信息
SqlSugarHelper.Db.Updateable(new ChannelStock()
{
Quantity = it.Quantity - it.TakeQuantity,
ManuNo = it.ManuNo,
EffDate = it.EffDate,
Id = it.Id,
}).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate }).ExecuteCommand();
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(it.MachineId))
.Where(cs => cs.DrugId.Equals(it.DrugId))
.Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne)
.ToList();
// 保存数据 出库记录
SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = it.MachineId,
DrawerNo = it.DrawerNo,
ColNo = it.ColNo,
DrugId = it.DrugId,
ManuNo = it.ManuNo,
EffDate = !String.IsNullOrEmpty(it.EffDate) ? DateTime.ParseExact(it.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
Reviewer = HomeWindowViewModel.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = it.TakeQuantity,
Type = 2,
InvoiceId = InvoiceId,
StockQuantity = nowChannels.Sum(it => it.Quantity)
}).ExecuteCommand();
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (it.BoardType == (Int32)BoardTypeEnum.weigh || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(it.DrawerNo, it.ColNo, it.AddQuantity);
Thread.Sleep(80);
}
}
return true;
});
if (f.Data)
{
// 更新屏显库存
List<ChannelStock> singleChannels = record.FindAll(it => it.BoardType != (Int32)BoardTypeEnum.separation && (it.BoardType == (Int32)BoardTypeEnum.smart || it.BoardType == (Int32)BoardTypeEnum.weighSmartBox));
if (singleChannels.Count > 0)
{
singleChannels.ForEach(it =>
{
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity - it.TakeQuantity);
});
}
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉取药完成,库存已更新",
Type = MsgType.SUCCESS,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
if(!f.IsSuccess)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "抽屉取药完成,库存更新失败!",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
Status = 0;
_isFinishClick = false;
//RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
}
else
{
_isFinishClick = false;
AlertMsg alertMsg = new AlertMsg
{
Message = "没有填写取药数量",
Type = MsgType.ERROR
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}
});
}
public long CurrentTimeMillis()
{
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}
// 取消按钮
public DelegateCommand CancleTake
{
get => new DelegateCommand(() =>
{
_portUtil.ResetData();
Status = 0;
});
}
//检查是否是冰箱抽屉(冰箱抽屉打开时需要发送冰箱延迟报警的指令)
public async Task CheckIsFridgeOpen()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
//检查是否是冰箱抽屉(冰箱抽屉关闭时需要查询冰箱温度如温度不在范围则发送冰箱延迟报警的指令)
public async Task CheckIsFridgeClose()
{
if (ChannelStocks != null && ChannelStocks.Count > 0)
{
if (_portUtil.BoardType == (Int32)BoardTypeEnum.fridge)
{
string[] iTempertureRange = ConfigurationManager.AppSettings["temperatureRange"].Split('-');
//发送查询冰箱温度的指令
float temperature = await _portUtil.GetFridgeTemperature();
if (temperature > Convert.ToSingle(iTempertureRange[0]) && temperature < Convert.ToSingle(iTempertureRange[1]))
{
_portUtil.FridgeOperate = true;
//发送冰箱延迟报警的指令
await _portUtil.FridgeDelayWarm();
_portUtil.FridgeOperate = false;
}
}
}
}
public DelegateCommand BtnCloseCommand
{
get => new DelegateCommand(() =>
{
if (Status != 0)
{
_portUtil.ResetData();
Status = 0;
}
//DialogParameters parameters = new DialogParameters();
//parameters.Add("",);
// 关闭当前窗口
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
});
}
public bool KeepAlive => false;
}
}

View File

@ -0,0 +1,275 @@
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using DM_Weight.Models;
using DM_Weight.select;
using DM_Weight.util;
using DM_Weight.msg;
using Prism.Events;
using DM_Weight.Common;
namespace DM_Weight.ViewModels
{
public class OrderTakeDrugWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private int _pageNum = 1;
public int PageNum
{
get => _pageNum;
set
{
SetProperty(ref _pageNum, value);
RequestData();
}
}
private int _pageCount = 1;
public int PageCount
{
get => _pageCount;
set
{
SetProperty(ref _pageCount, value);
}
}
private int _pageSize = 8;
public int PageSize
{
get => _pageSize;
set
{
SetProperty(ref _pageSize, value);
}
}
private int _totalCount = 0;
public int TotalCount
{
get => _totalCount;
set
{
SetProperty(ref _totalCount, value);
}
}
IDialogService _dialogService;
IEventAggregator _eventAggregator;
private DelegateCommand _rowSelected;
public DelegateCommand RowSelected => _rowSelected ??= new DelegateCommand(OpenOrderDialog);
public OrderTakeDrugWindowViewModel(IDialogService DialogService, IEventAggregator eventAggregator)
{
_dialogService = DialogService;
_eventAggregator = eventAggregator;
}
public static List<OrderTakeSelect> StaticOrderTakeSelects = new()
{
new OrderTakeSelect
{
Code = "OrderNo",
Name = "处方号"
},
new OrderTakeSelect
{
Code = "PatientId",
Name = "患者编号"
}
};
private List<OrderTakeSelect> _orderTakeSelects = StaticOrderTakeSelects;
public List<OrderTakeSelect> OrderTakeSelects
{
get { return _orderTakeSelects; }
set
{
SetProperty(ref _orderTakeSelects, value);
}
}
private OrderTakeSelect _selectedItem = StaticOrderTakeSelects[0];
/// <summary>
/// 查询条件 查询字段
/// </summary>
public OrderTakeSelect SelectedItem
{
get { return _selectedItem; }
set
{
SetProperty(ref _selectedItem, value);
RequestData();
}
}
private OrderInfo? _selectedOrder;
public OrderInfo? SelectedOrder
{
get { return _selectedOrder; }
set
{
SetProperty(ref _selectedOrder, value);
//OpenOrderDialog();
}
}
private string _orderDate = DateTime.Now.ToString("yyyy-MM-dd");
/// <summary>
/// 查询条件 处方日期
/// </summary>
public string OrderDate
{
get { return _orderDate; }
set
{
if (!String.IsNullOrEmpty(value))
{
SetProperty(ref _orderDate, DateTime.Parse(value).ToString("yyyy-MM-dd"));
}
else
{
SetProperty(ref _orderDate, value);
}
RequestData();
}
}
private string? _searchValue;
/// <summary>
/// 查询条件 查询字段值
/// </summary>
public string? SearchValue
{
get { return _searchValue; }
set
{
SetProperty(ref _searchValue, value);
RequestData();
}
}
private List<OrderInfo> _orderInfos = new();
public List<OrderInfo> OrderInfos { get { return _orderInfos; } set { SetProperty(ref _orderInfos, value); } }
public bool KeepAlive => false;
public async void OpenOrderDialog()
{
if (SelectedOrder != null && SelectedOrder.DmStatus == 0 && SelectedOrder.CancelFlag == 0 && SelectedOrder.HisDispFlag == 0)
{
// 此处延时1毫秒等待页面渲染
await Task.Delay(TimeSpan.FromMilliseconds(1));
DialogParameters dialogParameters = new DialogParameters();
dialogParameters.Add("orderInfo", SelectedOrder);
DialogServiceExtensions.ShowDialogHost(_dialogService, "OrderTakeDialog", dialogParameters, DoDialogResult, "RootDialog");
}
}
private void DoDialogResult(IDialogResult dialogResult)
{
// 委托 被动执行 被子窗口执行
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
//if(dialogResult.Result == ButtonResult.OK)
//{
SelectedOrder = null;
RequestData();
//}
//MessageBox.Show("返回值:" + dialogResult.Result.ToString());
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
public DelegateCommand QueryCommand
{
get => new DelegateCommand(() =>
{
RequestData();
});
}
public void RequestData()
{
OrderInfos.Clear();
int totalCount = 0;
//string SearchValue = null;
//if (SearchValue != null)
//{
// strSearchValue = SearchValue.Trim().Replace("\r", "");
//}
List<OrderInfo> queryData = SqlSugarHelper.Db.Queryable<OrderInfo>()
.InnerJoin<OrderDetail>((oi, od) => oi.OrderNo == od.OrderNo)
.InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == (Int32)DrawerTypeEnum.drawerTypeOne).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (oi, od, t) => od.DrugId == t.DrugId)
.WhereIF(OrderDate != null, oi => oi.OrderDate.ToString("yyyy-MM-dd") == OrderDate)
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("OrderNo"), oi => oi.OrderNo == SearchValue)
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PatientId"), oi => oi.PatientId == SearchValue)
.WhereIF(!String.IsNullOrEmpty(ConfigurationManager.AppSettings["storage"]), oi => oi.Pharmacy == ConfigurationManager.AppSettings["storage"])
.Where(oi => oi.DmStatus == 0)
.Where(oi => oi.HisDispFlag == 0)
.Where(oi => oi.CancelFlag == 0)
.GroupBy(oi => oi.OrderDate)
.Select(oi => oi)
.ToPageList(PageNum, PageSize, ref totalCount);
//.ToList();
OrderInfos = queryData;
TotalCount = totalCount;
PageCount = (int)Math.Ceiling((double)TotalCount / PageSize);
}
//接收导航传过来的参数 现在是在此处初始化了表格数据
public void OnNavigatedTo(NavigationContext navigationContext)
{
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
RequestData();
}
//每次导航的时候该实列用不用重新创建true是不重新创建,false是重新创建
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
//这个方法用于拦截请求
public void OnNavigatedFrom(NavigationContext navigationContext)
{
// 取消消息订阅
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
}
void DoMyPrismEvent(DeviceMsg msg)
{
if (msg.EventType == EventType.CODESCAN)
{
SearchValue = msg.Code;
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More