From 1a0aced391318fe78f8b184323c11447268785f9 Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Fri, 18 Apr 2025 11:01:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MasaBlazorApp3.sln | 25 + MasaBlazorApp3/App.razor | 15 + .../DataAccess/AppDataConnection.cs | 35 + .../DataAccess/ChannelStockWithDrawerCount.cs | 14 + .../DataAccess/Dao/IChannelListDao.cs | 33 + MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs | 34 + .../DataAccess/Dao/IDrugManuNoDao.cs | 19 + .../DataAccess/Dao/IInOutInvoiceDao.cs | 23 + .../DataAccess/Dao/IMachineRecordDao.cs | 30 + .../DataAccess/Dao/IOrderInfoDao.cs | 30 + MasaBlazorApp3/DataAccess/Dao/IRoleDao.cs | 18 + MasaBlazorApp3/DataAccess/Dao/ISelfTakeDao.cs | 17 + MasaBlazorApp3/DataAccess/Dao/IUserDao.cs | 23 + .../DataAccess/Impl/ChannelListDao.cs | 456 + MasaBlazorApp3/DataAccess/Impl/DrugInfoDao.cs | 132 + .../DataAccess/Impl/DrugManuNoDao.cs | 44 + .../DataAccess/Impl/InOutInvoiceDao.cs | 510 + .../DataAccess/Impl/MachineRecordDao.cs | 406 + .../DataAccess/Impl/OrderInfoDao.cs | 544 + MasaBlazorApp3/DataAccess/Impl/RoleDao.cs | 75 + MasaBlazorApp3/DataAccess/Impl/SelfTakeDao.cs | 300 + MasaBlazorApp3/DataAccess/Impl/UserDao.cs | 111 + MasaBlazorApp3/DataAccess/PageData.cs | 14 + MasaBlazorApp3/DataAccess/PageMultiData.cs | 15 + MasaBlazorApp3/Finger/FingerprintUtil.cs | 142 + MasaBlazorApp3/GlobalStateService.cs | 40 + MasaBlazorApp3/MasaBlazorApp3.csproj | 96 + MasaBlazorApp3/Pages/BiaoDing.razor | 288 + MasaBlazorApp3/Pages/ConfirmDialo.razor | 27 + MasaBlazorApp3/Pages/DrawerAdd.razor | 446 + MasaBlazorApp3/Pages/DrawerTake.razor | 445 + MasaBlazorApp3/Pages/DrugList.razor | 338 + MasaBlazorApp3/Pages/FingerRegDialog.razor | 70 + MasaBlazorApp3/Pages/Home.razor | 220 + MasaBlazorApp3/Pages/Index.razor | 234 + MasaBlazorApp3/Pages/InvoiceAdd.razor | 114 + MasaBlazorApp3/Pages/InvoiceAddDialog.razor | 300 + MasaBlazorApp3/Pages/InvoiceOut.razor | 114 + MasaBlazorApp3/Pages/InvoiceOutDialog.razor | 298 + MasaBlazorApp3/Pages/MachineRecordList.razor | 118 + MasaBlazorApp3/Pages/OrderDetailDialog.razor | 259 + .../Pages/OrderDetailReturnDialog.razor | 280 + MasaBlazorApp3/Pages/OrderReturn.razor | 118 + MasaBlazorApp3/Pages/OrderTake.razor | 118 + MasaBlazorApp3/Pages/RecordRetunDrug.razor | 144 + .../Pages/RecordReturnDrugDialog.razor | 309 + MasaBlazorApp3/Pages/RecordReturnEmpty.razor | 129 + .../Pages/RecordReturnEmptyDialog.razor | 305 + MasaBlazorApp3/Pages/ReturnRecord2.razor | 101 + MasaBlazorApp3/Pages/Role.razor | 268 + MasaBlazorApp3/Pages/SelfTake.razor | 294 + MasaBlazorApp3/Pages/SelfTakeDialog.razor | 247 + MasaBlazorApp3/Pages/SignatureDialog.razor | 66 + MasaBlazorApp3/Pages/StockBinding.razor | 290 + MasaBlazorApp3/Pages/StockCheck.razor | 307 + MasaBlazorApp3/Pages/StockList.razor | 90 + MasaBlazorApp3/Pages/TEST.razor | 87 + MasaBlazorApp3/Pages/User.razor | 306 + MasaBlazorApp3/Pojo/AccountBook.cs | 113 + MasaBlazorApp3/Pojo/ChannelList.cs | 48 + MasaBlazorApp3/Pojo/ChannelStock.cs | 83 + MasaBlazorApp3/Pojo/Config/DrawerConfig.cs | 17 + MasaBlazorApp3/Pojo/Config/FingerPojo.cs | 15 + MasaBlazorApp3/Pojo/Config/PortConfig.cs | 23 + MasaBlazorApp3/Pojo/Config/SettingConfig.cs | 19 + MasaBlazorApp3/Pojo/DrugInfo.cs | 62 + MasaBlazorApp3/Pojo/DrugManuNo.cs | 40 + MasaBlazorApp3/Pojo/InOutInvoice.cs | 146 + MasaBlazorApp3/Pojo/MachineRecord.cs | 149 + MasaBlazorApp3/Pojo/OrderDetail.cs | 133 + MasaBlazorApp3/Pojo/OrderFinish.cs | 33 + MasaBlazorApp3/Pojo/OrderInfo.cs | 159 + MasaBlazorApp3/Pojo/Premission.cs | 207 + MasaBlazorApp3/Pojo/Role.cs | 50 + MasaBlazorApp3/Pojo/User.cs | 39 + MasaBlazorApp3/Pojo/Vo/InvoiceVo.cs | 34 + MasaBlazorApp3/Pojo/Vo/OperationVo.cs | 37 + MasaBlazorApp3/Pojo/Vo/OrderTakeVo.cs | 32 + MasaBlazorApp3/Port/PortUtil.cs | 987 ++ MasaBlazorApp3/Port/ScreenUtil.cs | 171 + MasaBlazorApp3/Program.cs | 92 + MasaBlazorApp3/Report/GridReportUtil.cs | 38 + .../ReportTemp/account_book_temp.grf | 612 + MasaBlazorApp3/ReportTemp/machine_log_add.grf | 284 + .../ReportTemp/machine_log_check.grf | 284 + .../ReportTemp/machine_log_return.grf | 284 + .../ReportTemp/machine_log_take.grf | 284 + MasaBlazorApp3/ReportTemp/stock_template.grf | 348 + MasaBlazorApp3/Shared/EmptyLayout.razor | 6 + MasaBlazorApp3/Shared/MainLayout.razor | 154 + MasaBlazorApp3/Util/CheckComputerFreeState.cs | 53 + MasaBlazorApp3/Util/MD5.cs | 30 + MasaBlazorApp3/Util/PromiseUtil.cs | 44 + MasaBlazorApp3/Util/VirtualKeyboardHelper.cs | 342 + .../Validator/LoginModelValidator.cs | 22 + MasaBlazorApp3/_Imports.razor | 24 + MasaBlazorApp3/appsettings.json | 32 + MasaBlazorApp3/favicon.ico | Bin 0 -> 270398 bytes MasaBlazorApp3/i18ntext/MyText.en.json | 4 + MasaBlazorApp3/i18ntext/MyText.zh.json | 4 + MasaBlazorApp3/log4net.config | 53 + MasaBlazorApp3/wwwroot/css/app.css | 62 + .../wwwroot/css/bootstrap/bootstrap.min.css | 11599 ++++++++++++++++ .../css/bootstrap/bootstrap.min.css.map | 1 + MasaBlazorApp3/wwwroot/favicon.ico | Bin 0 -> 5430 bytes MasaBlazorApp3/wwwroot/images/TbExit.png | Bin 0 -> 5613 bytes MasaBlazorApp3/wwwroot/images/TbJiay.png | Bin 0 -> 5521 bytes MasaBlazorApp3/wwwroot/images/TbJjb.png | Bin 0 -> 3522 bytes MasaBlazorApp3/wwwroot/images/TbKuc.png | Bin 0 -> 20283 bytes MasaBlazorApp3/wwwroot/images/TbLsh.png | Bin 0 -> 5665 bytes MasaBlazorApp3/wwwroot/images/TbQyao.png | Bin 0 -> 5774 bytes MasaBlazorApp3/wwwroot/images/TbSet.png | Bin 0 -> 5554 bytes MasaBlazorApp3/wwwroot/images/TbTuiy.png | Bin 0 -> 5708 bytes MasaBlazorApp3/wwwroot/images/body-bg.jpg | Bin 0 -> 19588 bytes MasaBlazorApp3/wwwroot/images/body-bg.png | Bin 0 -> 140077 bytes MasaBlazorApp3/wwwroot/images/box-16.jpg | Bin 0 -> 18695 bytes MasaBlazorApp3/wwwroot/images/box.png | Bin 0 -> 5630 bytes MasaBlazorApp3/wwwroot/images/finger-bg-r.png | Bin 0 -> 54076 bytes MasaBlazorApp3/wwwroot/images/logo.png | Bin 0 -> 3660 bytes MasaBlazorApp3/wwwroot/images/no_auth.png | Bin 0 -> 1587 bytes MasaBlazorApp3/wwwroot/index.html | 37 + MasaBlazorApp3/wwwroot/signature.js | 1 + MasaBlazorApp3/wwwroot/signatureInit.js | 29 + 123 files changed, 27251 insertions(+) create mode 100644 MasaBlazorApp3.sln create mode 100644 MasaBlazorApp3/App.razor create mode 100644 MasaBlazorApp3/DataAccess/AppDataConnection.cs create mode 100644 MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IDrugManuNoDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IInOutInvoiceDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IMachineRecordDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IRoleDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/ISelfTakeDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IUserDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/DrugInfoDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/InOutInvoiceDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/MachineRecordDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/RoleDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/SelfTakeDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/UserDao.cs create mode 100644 MasaBlazorApp3/DataAccess/PageData.cs create mode 100644 MasaBlazorApp3/DataAccess/PageMultiData.cs create mode 100644 MasaBlazorApp3/Finger/FingerprintUtil.cs create mode 100644 MasaBlazorApp3/GlobalStateService.cs create mode 100644 MasaBlazorApp3/MasaBlazorApp3.csproj create mode 100644 MasaBlazorApp3/Pages/BiaoDing.razor create mode 100644 MasaBlazorApp3/Pages/ConfirmDialo.razor create mode 100644 MasaBlazorApp3/Pages/DrawerAdd.razor create mode 100644 MasaBlazorApp3/Pages/DrawerTake.razor create mode 100644 MasaBlazorApp3/Pages/DrugList.razor create mode 100644 MasaBlazorApp3/Pages/FingerRegDialog.razor create mode 100644 MasaBlazorApp3/Pages/Home.razor create mode 100644 MasaBlazorApp3/Pages/Index.razor create mode 100644 MasaBlazorApp3/Pages/InvoiceAdd.razor create mode 100644 MasaBlazorApp3/Pages/InvoiceAddDialog.razor create mode 100644 MasaBlazorApp3/Pages/InvoiceOut.razor create mode 100644 MasaBlazorApp3/Pages/InvoiceOutDialog.razor create mode 100644 MasaBlazorApp3/Pages/MachineRecordList.razor create mode 100644 MasaBlazorApp3/Pages/OrderDetailDialog.razor create mode 100644 MasaBlazorApp3/Pages/OrderDetailReturnDialog.razor create mode 100644 MasaBlazorApp3/Pages/OrderReturn.razor create mode 100644 MasaBlazorApp3/Pages/OrderTake.razor create mode 100644 MasaBlazorApp3/Pages/RecordRetunDrug.razor create mode 100644 MasaBlazorApp3/Pages/RecordReturnDrugDialog.razor create mode 100644 MasaBlazorApp3/Pages/RecordReturnEmpty.razor create mode 100644 MasaBlazorApp3/Pages/RecordReturnEmptyDialog.razor create mode 100644 MasaBlazorApp3/Pages/ReturnRecord2.razor create mode 100644 MasaBlazorApp3/Pages/Role.razor create mode 100644 MasaBlazorApp3/Pages/SelfTake.razor create mode 100644 MasaBlazorApp3/Pages/SelfTakeDialog.razor create mode 100644 MasaBlazorApp3/Pages/SignatureDialog.razor create mode 100644 MasaBlazorApp3/Pages/StockBinding.razor create mode 100644 MasaBlazorApp3/Pages/StockCheck.razor create mode 100644 MasaBlazorApp3/Pages/StockList.razor create mode 100644 MasaBlazorApp3/Pages/TEST.razor create mode 100644 MasaBlazorApp3/Pages/User.razor create mode 100644 MasaBlazorApp3/Pojo/AccountBook.cs create mode 100644 MasaBlazorApp3/Pojo/ChannelList.cs create mode 100644 MasaBlazorApp3/Pojo/ChannelStock.cs create mode 100644 MasaBlazorApp3/Pojo/Config/DrawerConfig.cs create mode 100644 MasaBlazorApp3/Pojo/Config/FingerPojo.cs create mode 100644 MasaBlazorApp3/Pojo/Config/PortConfig.cs create mode 100644 MasaBlazorApp3/Pojo/Config/SettingConfig.cs create mode 100644 MasaBlazorApp3/Pojo/DrugInfo.cs create mode 100644 MasaBlazorApp3/Pojo/DrugManuNo.cs create mode 100644 MasaBlazorApp3/Pojo/InOutInvoice.cs create mode 100644 MasaBlazorApp3/Pojo/MachineRecord.cs create mode 100644 MasaBlazorApp3/Pojo/OrderDetail.cs create mode 100644 MasaBlazorApp3/Pojo/OrderFinish.cs create mode 100644 MasaBlazorApp3/Pojo/OrderInfo.cs create mode 100644 MasaBlazorApp3/Pojo/Premission.cs create mode 100644 MasaBlazorApp3/Pojo/Role.cs create mode 100644 MasaBlazorApp3/Pojo/User.cs create mode 100644 MasaBlazorApp3/Pojo/Vo/InvoiceVo.cs create mode 100644 MasaBlazorApp3/Pojo/Vo/OperationVo.cs create mode 100644 MasaBlazorApp3/Pojo/Vo/OrderTakeVo.cs create mode 100644 MasaBlazorApp3/Port/PortUtil.cs create mode 100644 MasaBlazorApp3/Port/ScreenUtil.cs create mode 100644 MasaBlazorApp3/Program.cs create mode 100644 MasaBlazorApp3/Report/GridReportUtil.cs create mode 100644 MasaBlazorApp3/ReportTemp/account_book_temp.grf create mode 100644 MasaBlazorApp3/ReportTemp/machine_log_add.grf create mode 100644 MasaBlazorApp3/ReportTemp/machine_log_check.grf create mode 100644 MasaBlazorApp3/ReportTemp/machine_log_return.grf create mode 100644 MasaBlazorApp3/ReportTemp/machine_log_take.grf create mode 100644 MasaBlazorApp3/ReportTemp/stock_template.grf create mode 100644 MasaBlazorApp3/Shared/EmptyLayout.razor create mode 100644 MasaBlazorApp3/Shared/MainLayout.razor create mode 100644 MasaBlazorApp3/Util/CheckComputerFreeState.cs create mode 100644 MasaBlazorApp3/Util/MD5.cs create mode 100644 MasaBlazorApp3/Util/PromiseUtil.cs create mode 100644 MasaBlazorApp3/Util/VirtualKeyboardHelper.cs create mode 100644 MasaBlazorApp3/Validator/LoginModelValidator.cs create mode 100644 MasaBlazorApp3/_Imports.razor create mode 100644 MasaBlazorApp3/appsettings.json create mode 100644 MasaBlazorApp3/favicon.ico create mode 100644 MasaBlazorApp3/i18ntext/MyText.en.json create mode 100644 MasaBlazorApp3/i18ntext/MyText.zh.json create mode 100644 MasaBlazorApp3/log4net.config create mode 100644 MasaBlazorApp3/wwwroot/css/app.css create mode 100644 MasaBlazorApp3/wwwroot/css/bootstrap/bootstrap.min.css create mode 100644 MasaBlazorApp3/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100644 MasaBlazorApp3/wwwroot/favicon.ico create mode 100644 MasaBlazorApp3/wwwroot/images/TbExit.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbJiay.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbJjb.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbKuc.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbLsh.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbQyao.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbSet.png create mode 100644 MasaBlazorApp3/wwwroot/images/TbTuiy.png create mode 100644 MasaBlazorApp3/wwwroot/images/body-bg.jpg create mode 100644 MasaBlazorApp3/wwwroot/images/body-bg.png create mode 100644 MasaBlazorApp3/wwwroot/images/box-16.jpg create mode 100644 MasaBlazorApp3/wwwroot/images/box.png create mode 100644 MasaBlazorApp3/wwwroot/images/finger-bg-r.png create mode 100644 MasaBlazorApp3/wwwroot/images/logo.png create mode 100644 MasaBlazorApp3/wwwroot/images/no_auth.png create mode 100644 MasaBlazorApp3/wwwroot/index.html create mode 100644 MasaBlazorApp3/wwwroot/signature.js create mode 100644 MasaBlazorApp3/wwwroot/signatureInit.js diff --git a/MasaBlazorApp3.sln b/MasaBlazorApp3.sln new file mode 100644 index 0000000..6b2abd8 --- /dev/null +++ b/MasaBlazorApp3.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34024.191 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MasaBlazorApp3", "MasaBlazorApp3\MasaBlazorApp3.csproj", "{B589889C-FAEB-4394-A21D-DDCADF39382D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B589889C-FAEB-4394-A21D-DDCADF39382D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B589889C-FAEB-4394-A21D-DDCADF39382D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B589889C-FAEB-4394-A21D-DDCADF39382D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B589889C-FAEB-4394-A21D-DDCADF39382D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {304B4C57-445A-464F-829B-444D21AFE355} + EndGlobalSection +EndGlobal diff --git a/MasaBlazorApp3/App.razor b/MasaBlazorApp3/App.razor new file mode 100644 index 0000000..35e483c --- /dev/null +++ b/MasaBlazorApp3/App.razor @@ -0,0 +1,15 @@ +@namespace MasaBlazorApp3 + + + + + + + + + Sorry, there's nothing at this address. + + + + + diff --git a/MasaBlazorApp3/DataAccess/AppDataConnection.cs b/MasaBlazorApp3/DataAccess/AppDataConnection.cs new file mode 100644 index 0000000..a632a31 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/AppDataConnection.cs @@ -0,0 +1,35 @@ +using Google.Protobuf.Compiler; +using LinqToDB; +using LinqToDB.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MasaBlazorApp3.Pojo; + +namespace MasaBlazorApp3.DataAccess +{ + public class AppDataConnection : DataConnection + { + public AppDataConnection(DataOptions options) + : base(options.Options) + { + } + + public ITable User => this.GetTable(); + public ITable Role => this.GetTable(); + public ITable ChannelList => this.GetTable(); + public ITable ChannelStock => this.GetTable(); + public ITable DrugInfo => this.GetTable(); + public ITable DrugManuNo => this.GetTable(); + public ITable OrderInfo => this.GetTable(); + public ITable OrderDetail => this.GetTable(); + public ITable MachineRecord => this.GetTable(); + public ITable InOutInvoice => this.GetTable(); + public ITable AccountBook => this.GetTable(); + + + + } +} diff --git a/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs b/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs new file mode 100644 index 0000000..7f3eeb8 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess +{ + public class ChannelStockWithDrawerCount + { + public int[] DrawerArray { get; set; } + public List ChannelStocks { get; set; } = new List(); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs b/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs new file mode 100644 index 0000000..e240ea7 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs @@ -0,0 +1,33 @@ +using System; +using MasaBlazorApp3.Pojo; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IChannelListDao + { + public Task> GetAllChannelList(int DrawerType, string drugName, int? take, int? skip); + + public Task> GetChannelStockByDrugId(string DrugId); + public Task> GetChannelListByDrawerNo(int DrawerNo); + public Task> GetChannelStockByDrawerNo(int DrawerNo, int Quantity = 0); + + + public Task> GetAllDrugChannelStock(); + + public Task> GetAllDrugChannelList(); + + public Task DrawerOperationFinish(List Stocks, int type); + + public Task UnBind(string id); + + public Task Bind(ChannelStock Stock); + + + Task> GetAllChannelListWithDrug(int DrawerType, string drugName, int? take, int? skip); + + Task> GetChannelStockByDrawerNoWithDrawers(int DrawerNo, int Quantity = 0); + + //盘点 + public Task DrawerCheckFinish(List Stocks); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs b/MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs new file mode 100644 index 0000000..8675833 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs @@ -0,0 +1,34 @@ +using MasaBlazorApp3.Pojo; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IDrugInfoDao + { + Task> GetAllDrugAndStock(); + + + Task> GetAllDrug(); + + + Task> GetAllDrug(string drugId, string drugName, int? take, int? skip); + + + //Task> GetAllDrugAndStockList(); + + Task GetDrugManuNo(string drugId, string manuNo); + + + //添加药品信息 + int AddDrugInfo(DrugInfo drugInfo); + + //删除药品信息 + Task DeleteDrugInfo(string drugId); + //修改药品信息 + Task UpdateDrugInfo(DrugInfo drugInfo); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IDrugManuNoDao.cs b/MasaBlazorApp3/DataAccess/Dao/IDrugManuNoDao.cs new file mode 100644 index 0000000..953cd58 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IDrugManuNoDao.cs @@ -0,0 +1,19 @@ +using MasaBlazorApp3.Pojo; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IDrugManuNoDao + { + //添加批次 + int AddDrugManuNo(DrugManuNo drugManuNo); + //修改批次 + bool UpdateDrugManuNo(DrugManuNo drugManuNo); + //删除批次 + bool DeleteDrugManuNo(string id); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IInOutInvoiceDao.cs b/MasaBlazorApp3/DataAccess/Dao/IInOutInvoiceDao.cs new file mode 100644 index 0000000..182c63d --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IInOutInvoiceDao.cs @@ -0,0 +1,23 @@ +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Vo; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IInOutInvoiceDao + { + Task> GetAllInvoiceByType(string invoiceNo, DateTime invoiceDate, int? take, int? skip, int type); + + Task> getTakeInfoByInvoiceNo(string invoiceNo); + Task> getAddInfoByInvoiceNo(string invoiceNo); + + Task InvoiceOutFinish(List data); + + + Task InvoiceAddFinish(List data); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IMachineRecordDao.cs b/MasaBlazorApp3/DataAccess/Dao/IMachineRecordDao.cs new file mode 100644 index 0000000..cfbbd47 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IMachineRecordDao.cs @@ -0,0 +1,30 @@ +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Vo; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IMachineRecordDao + { + int InsertMachineRecord(MachineRecord record); + + Task> GetMachineRecordAsync(DateTime start, DateTime end, int operatorId, string drugId, int type, int? take, int? skip); + + Task> GetCanReturnRecords(DateTime start, DateTime end, int operatorId, string drugId, int? take, int? skip); + + Task>>> getReturnDrugInfoByRecords(List records); + + Task ReturnDrugFinish(List>> datas); + + Task> GetReturnEmpty(); + + Task> getReturnEmptyInfoByRecords(ChannelStock records); + + Task ReturnEmptyFinish(List datas,ChannelStock channelStock); + Task> GetReturnEmptyWithCanReturnQuantiy(); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs b/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs new file mode 100644 index 0000000..a5b0c7e --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs @@ -0,0 +1,30 @@ +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Vo; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IOrderInfoDao + { + public Task> GetAllOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip); + + + public Task> GetAllCanReturnOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip); + + public Task> getDetailByOrderNo(string OrderrNo); + + + public Task> getTakeInfoByOrderNo(string OrderrNo); + + public Task OrderTakeFinish(List datas); + + + public Task OrderReturnFinish(List> datas, string OrderrNo); + + public Task>> getReturnInfoByOrderNo(string OrderrNo); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IRoleDao.cs b/MasaBlazorApp3/DataAccess/Dao/IRoleDao.cs new file mode 100644 index 0000000..c1574d1 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IRoleDao.cs @@ -0,0 +1,18 @@ +using MasaBlazorApp3.Pojo; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IRoleDao + { + int InsertRole(Role role); + Task GetRoleById(int id); + + bool UpdateRole(Role role); + bool DeleteRole(int id); + + Task> GetRolesByName(string name, int? take, int? skip); + + Task> GetAllRoles(); + + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/ISelfTakeDao.cs b/MasaBlazorApp3/DataAccess/Dao/ISelfTakeDao.cs new file mode 100644 index 0000000..987fdef --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/ISelfTakeDao.cs @@ -0,0 +1,17 @@ +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Vo; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + interface ISelfTakeDao + { + Task> GetChannelStocksByDrug(List drugInfos); + Task> getTakeInfoByOrderNo(List orderDetails); + Task OrderTakeFinish(List datas,OrderInfo order); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IUserDao.cs b/MasaBlazorApp3/DataAccess/Dao/IUserDao.cs new file mode 100644 index 0000000..11e41a4 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IUserDao.cs @@ -0,0 +1,23 @@ +using MasaBlazorApp3.Pojo; + +namespace MasaBlazorApp3.DataAccess.Dao +{ + public interface IUserDao + { + int InsertUser(User user); + + Task> GetAllByNickname(string nickname, int? take, int? skip); + + User GetById(int id); + + User GetByUsername(string username); + + bool UpdateUser(User user); + + bool DeleteeUser(int id); + //重置用户密码 + bool ResetPassword(int id); + + Task UpdateSign(int id, string sign); + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs b/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs new file mode 100644 index 0000000..33366ad --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs @@ -0,0 +1,456 @@ + +using LinqToDB; +using log4net; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using MasaBlazorApp3.Pojo.Vo; +using MasaBlazorApp3.Port; +using Microsoft.Extensions.Options; +using Mysqlx.Crud; +using System.Data; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class ChannelListDao : IChannelListDao + { + + private AppDataConnection _connection; + private readonly SettingConfig _setting; + private GlobalStateService _globalStateService; + private readonly PortUtil _portUtil; + + private readonly ILog logger = LogManager.GetLogger(typeof(ChannelListDao)); + + public ChannelListDao(AppDataConnection connection, IOptions setting, GlobalStateService globalStateService, PortUtil portUtil) + { + _globalStateService = globalStateService; + _connection = connection; + _setting = setting.Value; + _portUtil = portUtil; + } + + public async Task> GetAllChannelList(int DrawerType, string drugName, int? take, int? skip) + { + + var query = _connection.ChannelStock.AsQueryable(); + + if (DrawerType != 0) + { + query = query.Where(cl => cl.DrawerType == DrawerType); + } + + if (!String.IsNullOrEmpty(drugName)) + { + query = query.Where(cl => cl.Drug.DrugName.Equals(drugName)); + } + + //query = query.Where(cl => !String.IsNullOrEmpty(cl.DrugId)); + query = query.Where(cl => cl.MachineId == _setting.machineId); + + + int pagedData = await query.CountAsync(); + + List list = await query + .LoadWith(cl => cl.Drug) + .LoadWith(cl => cl.Drug.Manus) + .LoadWith(cl => cl.drugManuNo) + .OrderBy((cl) => cl.DrawerNo) + .ThenBy((cl) => cl.ColNo) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + + return new PageData() + { + + TotalDesserts = pagedData, + Desserts = list + }; + } + + public async Task> GetChannelStockByDrugId(string DrugId) + { + var query = _connection.ChannelStock.AsQueryable(); + + + return await query + .LoadWith(cs => cs.Drug) + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId == DrugId) + .Where(cs => cs.MachineId == _setting.machineId) + //.Where(cs => cs.Quantity > 0) + .OrderBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + public async Task> GetChannelStockByDrawerNo(int DrawerNo, int Quantity = 0) + { + var query = _connection.ChannelStock.AsQueryable() + .LoadWith(cs => cs.Drug) + .LoadWith(cs => cs.drugManuNo) + .LoadWith(cs => cs.Drug.Manus) + .Where(cs => cs.DrawerNo == DrawerNo) + .Where(cs => cs.DrugId != String.Empty ) + .Where(cs => cs.DrawerType == 1) + .Where(cs => cs.MachineId == _setting.machineId); + + if(Quantity > 0) + { + query = query.Where(cs => cs.Quantity > 0); + } + return await query + .OrderBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + public async Task> GetChannelListByDrawerNo(int DrawerNo) + { + var query = _connection.ChannelList.AsQueryable(); + + + return await query + .LoadWith(cl => cl.Drug) + .LoadWith(cl => cl.ChannelStocks.Where(cs => cs.Quantity > 0)) + .Where(cl => cl.DrawerNo == DrawerNo) + .Where(cl => cl.DrawerType == 1) + .Where(cl => cl.MachineId == _setting.machineId) + .OrderBy((cl) => cl.DrawerNo) + .ThenBy((cl) => cl.ColNo) + .ToListAsync(); + } + + public async Task> GetAllDrugChannelStock() + { + var query = _connection.ChannelStock.AsQueryable(); + + + return await query + .LoadWith(cs => cs.Drug) + .Where(cs => !String.IsNullOrEmpty(cs.DrugId)) + .Where(cs => cs.DrawerType == 1) + .Where(cs => cs.MachineId == _setting.machineId) + .OrderBy((cs) => cs.DrugId) + .ThenBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + public async Task> GetAllDrugChannelList() + { + var query = _connection.ChannelList.AsQueryable(); + + + return await query + .LoadWith(cl => cl.Drug) + .LoadWith(cl => cl.ChannelStocks) + .Where(cl => !String.IsNullOrEmpty(cl.DrugId)) + .Where(cl => cl.DrawerType == 1) + .Where(cl => cl.MachineId == _setting.machineId) + .OrderBy((cl) => cl.DrugId) + .ThenBy((cl) => cl.DrawerNo) + .ThenBy((cl) => cl.ColNo) + .ToListAsync(); + } + + public async Task DrawerOperationFinish(List Stocks, int type = 1) + { + try + { + _connection.BeginTransaction(); + + string InvoiceId = "DRAWER_" + CurrentTimeMillis(); + var flag = true; + for (var i = 0; i < Stocks.Count; i++) + { + var stock = Stocks[i]; + + //var ManuNo = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.ManuNo : stock.ManuNo; + //var EffDate = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.EffDate : stock.EffDate; + var ManuNo = stock.ManuNo; + var EffDate = stock.EffDate; + // 出入库记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = stock.DrawerNo, + ColNo = stock.ColNo, + DrugId = stock.DrugId, + ManuNo = ManuNo, + EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = type, + Quantity = type == 1? stock.AddQuantity : stock.TakeQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = InvoiceId + }); + // 更新库存 + var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id) + .Set(cs => cs.Quantity, type == 1 ? stock.Quantity + stock.AddQuantity : stock.Quantity - stock.TakeQuantity); + // 入库时如果库存为0则有可能会修改批次效期进行保存 + if(type == 1 && stock.Quantity == 0 && !stock.drugManuNo.ManuNo.Equals(stock.ManuNo)) + { + stockQ = stockQ.Set(cs => cs.ManuNo, stock.drugManuNo.ManuNo).Set(cs => cs.EffDate, stock.drugManuNo.EffDate.ToString()).Set(cs => cs.Dmnguid, stock.drugManuNo.Id); + } + int r = stockQ.Update(); + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId.Equals(stock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = stock.DrugId, + ManuNo = ManuNo, + EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = type, + OutQuantity = stock.TakeQuantity, + AddQuantity = stock.AddQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == stock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = InvoiceId + }); + if (mid > 0 && r > 0 && acid > 0) + { + + } else + { + flag = false; + break; + } + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } catch (Exception ex) + { + logger.Error($"抽屉{(type == 1 ? "加药" : "取药")}操作完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + + public long CurrentTimeMillis() + { + return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; + } + + public async Task UnBind(string id) + { + var r = await _connection.ChannelStock + .Where(cs => cs.Id == id) + .Set(cs => cs.DrugId, String.Empty) + .Set(cs => cs.Dmnguid, String.Empty) + .Set(cs => cs.EffDate, String.Empty) + .Set(cs => cs.ManuNo, String.Empty) + .UpdateAsync(); + return r > 0; + } + + public async Task Bind(ChannelStock Stock) + { + var q = _connection.ChannelStock + .Where(cs => cs.Id == Stock.Id) + .Set(cs => cs.Dmnguid, Stock.drugManuNo?.Id??String.Empty) + .Set(cs => cs.EffDate, Stock.drugManuNo?.EffDate.ToString() ?? String.Empty) + .Set(cs => cs.ManuNo, Stock.drugManuNo?.ManuNo ?? String.Empty); + + if (Stock.Drug != null && !Stock.Drug.DrugId.Equals(Stock.DrugId)) { + q = q.Set(cs => cs.DrugId, Stock.Drug?.DrugId); + } + + var r = await q.UpdateAsync(); + return r > 0; + } + public async Task> GetAllChannelListWithDrug(int DrawerType, string drugName, int? take, int? skip) + { + + var query = _connection.ChannelStock.AsQueryable(); + + if (DrawerType != 0) + { + query = query.Where(cl => cl.DrawerType == DrawerType); + } + + if (!String.IsNullOrEmpty(drugName)) + { + query = query.Where(cl => cl.Drug.DrugName.Equals(drugName)); + } + + //query = query.Where(cl => !String.IsNullOrEmpty(cl.DrugId)); + query = query.Where(cl => cl.MachineId == _setting.machineId); + + + int pagedData = await query.CountAsync(); + + List list = await query + .LoadWith(cl => cl.Drug) + .LoadWith(cl => cl.Drug.Manus) + .LoadWith(cl => cl.drugManuNo) + .OrderBy((cl) => cl.DrawerNo) + .ThenBy((cl) => cl.ColNo) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + var other= _connection.DrugInfo.AsQueryable(); + List drugInfos= await other + .LoadWith(di => di.Manus) + .OrderBy((di) => di.DrugId) + .ToListAsync(); + + return new PageMultiData() + { + + TotalDesserts = pagedData, + Desserts = list, + Other= drugInfos + }; + } + //抽屉加药、取药获取数据 + public async Task> GetChannelStockByDrawerNoWithDrawers(int DrawerNo, int Quantity = 0) + { + var query = _connection.ChannelStock.AsQueryable() + .LoadWith(cs => cs.Drug) + .LoadWith(cs => cs.drugManuNo) + .LoadWith(cs => cs.Drug.Manus) + .Where(cs => cs.DrawerNo == DrawerNo) + .Where(cs => cs.DrugId != String.Empty) + .Where(cs => cs.DrawerType == 1) + .Where(cs => cs.MachineId == _setting.machineId); + + if (Quantity > 0) + { + query = query.Where(cs => cs.Quantity > 0); + } + int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId).GroupBy(cs=>cs.DrawerNo).Select(cs=>cs.Key).ToArray(); + List channelStocks= await query + .OrderBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + return new ChannelStockWithDrawerCount() { DrawerArray = ints, ChannelStocks = channelStocks }; + } + //盘点 + public async Task DrawerCheckFinish(List Stocks) + { + try + { + _connection.BeginTransaction(); + + string InvoiceId = "DRAWER_" + CurrentTimeMillis(); + var flag = true; + for (var i = 0; i < Stocks.Count; i++) + { + var stock = Stocks[i]; + + //var ManuNo = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.ManuNo : stock.ManuNo; + //var EffDate = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.EffDate : stock.EffDate; + var ManuNo = stock.ManuNo; + var EffDate = stock.EffDate; + // 出入库记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = stock.DrawerNo, + ColNo = stock.ColNo, + DrugId = stock.DrugId, + ManuNo = ManuNo, + EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 4, + Quantity =stock.CheckQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = InvoiceId + }); + // 更新库存 + var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id) + .Set(cs => cs.Quantity, stock.CheckQuantity); + + int r = stockQ.Update(); + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId.Equals(stock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = stock.DrugId, + ManuNo = ManuNo, + EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 3, + OutQuantity = stock.TakeQuantity, + AddQuantity = stock.AddQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == stock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = InvoiceId + }); + if (mid > 0 && r > 0 && acid > 0) + { + //根据抽屉类型判断是否需要写标签 + if (stock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(stock.CheckQuantity, stock.DrawerNo, stock.ColNo); + } + } + else + { + flag = false; + break; + } + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } + catch (Exception ex) + { + logger.Error($"抽屉盘点操作完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/DrugInfoDao.cs b/MasaBlazorApp3/DataAccess/Impl/DrugInfoDao.cs new file mode 100644 index 0000000..20bde97 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/DrugInfoDao.cs @@ -0,0 +1,132 @@ +using LinqToDB; +using log4net; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class DrugInfoDao : IDrugInfoDao + { + + private AppDataConnection _connection; + private readonly SettingConfig _setting; + private readonly ILog logger = LogManager.GetLogger(typeof(DrugInfoDao)); + + public DrugInfoDao(AppDataConnection connection, IOptions setting) + { + _connection = connection; + _setting = setting.Value; + } + public async Task> GetAllDrugAndStock() + { + var query = _connection.DrugInfo.AsQueryable(); + + + return await query + .LoadWith(di => di.Stocks.Where(cs => cs.Quantity > 0 && cs.MachineId == _setting.machineId)) + .InnerJoin( + _connection.ChannelStock.Where(cl => cl.MachineId == _setting.machineId && cl.DrawerType == 1).GroupBy(cl => cl.DrugId), + (di, cl) => di.DrugId == cl.Key, + (di, cl) => di + ) + //.Where(cs => cs.Quantity > 0) + .OrderBy((di) => di.DrugId) + .ToListAsync(); + } + + public async Task> GetAllDrug(string drugId, string drugName, int? take, int? skip) + { + var query = _connection.DrugInfo.AsQueryable(); + + if (!String.IsNullOrEmpty(drugId)) + { + query = query.Where(di => di.DrugId.Contains(drugId)); + } + if (!String.IsNullOrEmpty(drugName)) + { + query = query.Where(di => di.DrugName.Contains(drugName)); + } + + + + int pagedData = await query.CountAsync(); + query = query + .LoadWith(di => di.Manus) + .OrderBy((di) => di.DrugId) + .Skip((int)skip) + .Take((int)take); + + List list = await query + .ToListAsync(); + + return new PageData() + { + TotalDesserts = pagedData, + Desserts = list + }; + } + + public async Task> GetAllDrug() + { + var query = _connection.DrugInfo.AsQueryable(); + + return await query + .LoadWith(di => di.Manus) + .OrderBy((di) => di.DrugId) + .ToListAsync(); + } + + public async Task GetDrugManuNo(string drugId, string manuNo) + { + var query = _connection.DrugManuNo.AsQueryable(); + + return await query.Where(m => m.DrugId.Equals(drugId)) + .Where(m => m.ManuNo.Equals(manuNo)) + .FirstAsync(); + } + + public int AddDrugInfo(DrugInfo drugInfo) + { + return _connection.InsertWithInt32Identity(drugInfo); + } + + public async Task DeleteDrugInfo(string drugId) + { + try + { + logger.Error($"删除药品{drugId}"); + return _connection.DrugInfo.Where(di => di.DrugId == drugId).Delete() > 0; + } + catch (Exception ex) + { + logger.Error("删除药品失败,错误:" + ex.Message); + return false; + } + } + + public async Task UpdateDrugInfo(DrugInfo drugInfo) + { + try + { + var statement = _connection.DrugInfo + .Where(di => di.DrugId == drugInfo.DrugId) + .Set(di => di.DrugName, drugInfo.DrugName) + .Set(di => di.DrugSpec, drugInfo.DrugSpec) + .Set(di => di.Manufactory, drugInfo.Manufactory); + return statement.Update() > 0; + } + catch (Exception ex) + { + logger.Error($"修改药品{drugInfo.DrugId}失败,错误:" + ex.Message); + return false; + } + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs b/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs new file mode 100644 index 0000000..824f9d2 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs @@ -0,0 +1,44 @@ +using LinqToDB; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pages; +using MasaBlazorApp3.Pojo; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class DrugManuNoDao : IDrugManuNoDao + { + private readonly AppDataConnection _connection; + public DrugManuNoDao(AppDataConnection connection) + { + _connection = connection; + } + public int AddDrugManuNo(DrugManuNo drugManuNo) + { + if(drugManuNo!=null&& drugManuNo.EffDate!=null) + { + drugManuNo.EffDate= drugManuNo.EffDate.ToString().Length>10 ?new DateTime(drugManuNo.EffDate.Value.Year, drugManuNo.EffDate.Value.Month, drugManuNo.EffDate.Value.Day) : drugManuNo.EffDate; + } + return _connection.InsertWithInt32Identity(drugManuNo); + } + + public bool DeleteDrugManuNo(string id) + { + return _connection.DrugManuNo.Where(dm => dm.Id == id).Delete() > 0; + } + + public bool UpdateDrugManuNo(DrugManuNo drugManuNo) + { + var statement = _connection.DrugManuNo + .Where(dm => dm.Id == drugManuNo.Id) + .Set(dm => dm.ManuNo, drugManuNo.ManuNo) + .Set(dm => dm.EffDate, drugManuNo.EffDate); + return statement.Update() > 0; + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/InOutInvoiceDao.cs b/MasaBlazorApp3/DataAccess/Impl/InOutInvoiceDao.cs new file mode 100644 index 0000000..c72b3b0 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/InOutInvoiceDao.cs @@ -0,0 +1,510 @@ +using LinqToDB; +using log4net; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pages; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using MasaBlazorApp3.Pojo.Vo; +using MasaBlazorApp3.Port; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class InOutInvoiceDao : IInOutInvoiceDao + { + private AppDataConnection _connection; + private readonly SettingConfig _setting; + private readonly ILog logger = LogManager.GetLogger(typeof(InOutInvoiceDao)); + private GlobalStateService _globalStateService; + private readonly PortUtil _portUtil; + + public InOutInvoiceDao(AppDataConnection connection, IOptions setting, GlobalStateService globalStateService, PortUtil portUtil) + { + _connection = connection; + _setting = setting.Value; + _globalStateService = globalStateService; + _portUtil = portUtil; + } + public async Task> GetAllInvoiceByType(string invoiceNo, DateTime invoiceDate, int? take, int? skip, int type = 1) + { + var query2 = from cl in _connection.ChannelList.Where(c => c.MachineId == _setting.machineId) + group cl by cl.DrugId into temp + select new { temp.Key }; + var query3 = from ioi in _connection.InOutInvoice + from od in query2.InnerJoin(od => od.Key == ioi.DrugId) + group ioi by ioi.InvoiceNo into temp + select new InOutInvoice{ + InvoiceNo= temp.First().InvoiceNo, + InPharmacyId = temp.First().InPharmacyId, + OutPharmacyId = temp.First().OutPharmacyId, + InvoiceDate = temp.First().InvoiceDate, + CreateTime = temp.First().CreateTime, + Type = temp.First().Type, + CancelFlag = temp.First().CancelFlag, + Status = temp.First().Status, + }; + + + + //var query = _connection.FromSql($@" + // SELECT ioi.invoice_no,ioi.in_pharmacy_id, ioi.out_pharmacy_id, ioi.invoice_date, ioi.create_time, ioi.type, ioi.cancel_flag, ioi.status FROM in_out_invoice ioi + // INNER JOIN (SELECT drug_id FROM channel_list WHERE machine_id = ""{_setting.machineId}"" GROUP BY drug_id) c ON c.drug_id = ioi.drug_id + // GROUP BY ioi.invoice_no"); + + if (!String.IsNullOrEmpty(invoiceNo)) + { + //query = query.Where(ioi => ioi.InvoiceNo.Contains(invoiceNo)); + query3 = query3.Where(ioi => ioi.InvoiceNo.Contains(invoiceNo)); + } + if(invoiceDate != DateTime.MinValue) + { + //query = query.Where(ioi => ioi.CreateTime.Date.Equals(invoiceDate.Date)); + query3 = query3.Where(ioi => ioi.InvoiceNo.Contains(invoiceNo)); + } + + if(!String.IsNullOrEmpty(_setting.storage)) + { + if (type == 1) + { + //query = query.Where(ioi => ioi.OutPharmacyId.Equals(_setting.storage)); + query3 = query3.Where(ioi => ioi.OutPharmacyId.Equals(_setting.storage)); + } + // 调拨出库 + else if (type == 2) + { + //query = query.Where(ioi => ioi.InPharmacyId.Equals(_setting.storage)); + query3 = query3.Where(ioi => ioi.OutPharmacyId.Equals(_setting.storage)); + } + + } + // 调拨入库 + if (type == 1) + { + //query = query.Where(ioi => (ioi.Type == 0 && ioi.Status == 2) || (ioi.Type == 1 && ioi.Status == 0)); + query3 = query3.Where(ioi => (ioi.Type == 0 && ioi.Status == 2) || (ioi.Type == 1 && ioi.Status == 0)); + } + // 调拨出库 + else if (type == 2) + { + //query = query.Where(ioi => new int[] { 0, 2 }.Contains(ioi.Type) && ioi.Status == 0); + query3 = query3.Where(ioi => new int[] { 0, 2 }.Contains(ioi.Type) && ioi.Status == 0); + } + //query = query.Where(ioi => ioi.CancelFlag == 0); + //query = query.Select(ioi => new InOutInvoice() + //{ + // InPharmacyId = ioi.InPharmacyId, + // OutPharmacyId = ioi.OutPharmacyId, + // InvoiceDate = ioi.InvoiceDate, + // InvoiceNo = ioi.InvoiceNo, + // CreateTime = ioi.CreateTime, + // Type = ioi.Type, + // Status = ioi.Status, + // CancelFlag = ioi.CancelFlag, + //}); + + query3 = query3.Where(ioi => ioi.CancelFlag == 0); + List list = await query3 + .OrderByDescending(ioi => ioi.CreateTime) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + int pagedData = await query3.CountAsync(); + return new PageData() + { + + TotalDesserts = pagedData, + Desserts = list + }; + + } + public async Task GetDrugManuNo(string drugId, string manuNo) + { + var query = _connection.DrugManuNo.AsQueryable(); + + return await query.Where(m => m.DrugId.Equals(drugId)) + .Where(m => m.ManuNo.Equals(manuNo)) + .FirstAsync(); + } + + public async Task> GetChannelStockByDrugId(string DrugId, string manuNo, int quantity = 0) + { + var query = _connection.ChannelStock.AsQueryable(); + + + query = query.Where(cs => cs.MachineId.Equals(_setting.machineId)).Where(cs => cs.DrawerType == 1).Where(cs => cs.DrugId.Equals(DrugId)); + + + if (quantity > 0) + { + query = query.Where(cs => cs.Quantity > 0); + if (!String.IsNullOrEmpty(manuNo)) + { + query = query.Where(cs => cs.ManuNo.Equals(manuNo)); + } + } else + { + if (!String.IsNullOrEmpty(manuNo)) + { + query = query.Where(cs => cs.ManuNo.Equals(manuNo) || String.IsNullOrEmpty(cs.ManuNo) || cs.Quantity == 0); + } + } + + return await query.OrderBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + public async Task> getInvoiceByInvoiceNo(string invoiceNo) + { + var query = _connection.InOutInvoice.AsQueryable(); + + query = query.InnerJoin( + _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.machineId)).GroupBy(cs => cs.DrugId).Select(cs => cs.Key), + (ioi, key) => key == ioi.DrugId, + (ioi, key) => ioi) + .Where(ioi => ioi.InvoiceNo.Equals(invoiceNo)) + .OrderBy(ioi => ioi.DrugId); + return await query.ToListAsync(); + } + + public async Task getDrugInfoById(string DrugId) + { + return await _connection.DrugInfo.Where(di => di.DrugId == DrugId).FirstOrDefaultAsync(); + } + + + public async Task> getTakeInfoByInvoiceNo(string invoiceNo) + { + List tempData = new(); + var flag = true; + List details = await this.getInvoiceByInvoiceNo(invoiceNo); + for (var i = 0; i < details.Count; i++) + { + //List> tempData = new(); + InOutInvoice detail = details[i]; + + DrugInfo Drug = await this.getDrugInfoById(detail.DrugId); + // 当前detail取药数量 + var Quantity = detail.quantity; + List stockList = await this.GetChannelStockByDrugId(detail.DrugId, detail.DrugManuNo, Quantity); + + // 当前药品的库存总量 + var total = stockList.Sum(cs => cs.Quantity); + + if (flag) + { + // 盘点库存是否足够 + if (total >= Quantity) + { + + for (var j = 0; Quantity > 0; j++) + { + ChannelStock stock = stockList[j]; + if (Quantity > stock.Quantity) + { + // 取药数量大于库存 + stock.TakeQuantity = stock.Quantity; + Quantity -= stock.Quantity; + } + else + { + //取药数量小于库存 + stock.TakeQuantity = Quantity; + Quantity = 0; + } + } + } + else + { + // 库存不足 + flag = false; + } + } + tempData.Add(new InvoiceVo() + { + Drug = Drug, + Invoice = detail, + StockQuantity = total, + Quantity = detail.quantity, + ChannelStocks = stockList, + }); + } + return tempData; + } + + public async Task> getAddInfoByInvoiceNo(string invoiceNo) + { + List tempData = new(); + List details = await this.getInvoiceByInvoiceNo(invoiceNo); + for (var i = 0; i < details.Count; i++) + { + //List> tempData = new(); + InOutInvoice detail = details[i]; + List stockList = await this.GetChannelStockByDrugId(detail.DrugId, detail.DrugManuNo); + + DrugInfo Drug = await this.getDrugInfoById(detail.DrugId); + + // 当前药品的库存总量 + var total = stockList.Aggregate(0, (current, next) => current + next.Quantity); + // 当前detail加药数量 + var Quantity = detail.quantity; + + stockList.First().AddQuantity = Quantity; + + tempData.Add(new InvoiceVo() + { + Drug = Drug, + Invoice = detail, + StockQuantity = total, + Quantity = Quantity, + ChannelStocks = stockList, + }); + + } + return tempData; + } + + public async Task InvoiceOutFinish(List datas) + { + try + { + _connection.BeginTransaction(); + var flag = true; + // 更新处方状态 + int r1 = _connection.InOutInvoice.Where(oi => oi.InvoiceNo == datas.First().Invoice.InvoiceNo) + .Set(oi => oi.Status, 2) + .Update(); + if (!(r1 > 0)) + { + flag = false; + logger.Error("调拨取药完成更新状态失败"); + _connection.RollbackTransaction(); + return flag; + } + for (var i = 0; i < datas.Count; i++) + { + var invoiceVo = datas[i]; + + List stocks = invoiceVo.ChannelStocks.Where(cs => cs.TakeQuantity > 0).ToList(); + + for (var j = 0; j < stocks.Count; j++) + { + var ChannelStock = stocks[j]; + // 出库记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = ChannelStock.DrawerNo, + ColNo = ChannelStock.ColNo, + DrugId = ChannelStock.DrugId, + ManuNo = ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(ChannelStock.EffDate) ? DateTime.ParseExact(ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + Quantity = ChannelStock.TakeQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = invoiceVo.Invoice.InvoiceNo, + }); + // 更新库存 + int r = _connection.ChannelStock.Where(cs => cs.Id == ChannelStock.Id) + .Set(cs => cs.Quantity, ChannelStock.Quantity - ChannelStock.TakeQuantity) + .Update(); + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId.Equals(ChannelStock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = ChannelStock.DrugId, + ManuNo = ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(ChannelStock.EffDate) ? DateTime.ParseExact(ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + OutQuantity = ChannelStock.TakeQuantity, + AddQuantity = 0, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == ChannelStock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = invoiceVo.Invoice.InvoiceNo + }); + if (mid > 0 && r > 0 && acid > 0) + { + //根据抽屉类型判断是否需要写标签 + if (ChannelStock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(ChannelStock.Quantity- ChannelStock.TakeQuantity, ChannelStock.DrawerNo, ChannelStock.ColNo); + } + } + else + { + flag = false; + break; + } + } + + if (!flag) + { + break; + } + + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } + catch (Exception ex) + { + logger.Error("调拨取药完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + + public async Task InvoiceAddFinish(List datas) + { + + try + { + _connection.BeginTransaction(); + var flag = true; + // 更新调拨单状态 + int r1 = _connection.InOutInvoice.Where(oi => oi.InvoiceNo == datas.First().Invoice.InvoiceNo) + .Set(oi => oi.Status, 4) + .Update(); + if (!(r1 > 0)) + { + flag = false; + logger.Error("调拨加药完成更新状态失败"); + _connection.RollbackTransaction(); + return flag; + } + for (var i = 0; i < datas.Count; i++) + { + var invoiceVo = datas[i]; + + List stocks = invoiceVo.ChannelStocks.Where(cs => cs.AddQuantity > 0).ToList(); + + for (var j = 0; j < stocks.Count; j++) + { + var ChannelStock = stocks[j]; + + // 更新库存 + var q = _connection.ChannelStock.Where(cs => cs.Id == ChannelStock.Id) + .Set(cs => cs.Quantity, ChannelStock.Quantity + ChannelStock.AddQuantity); + if (String.IsNullOrEmpty(ChannelStock.ManuNo) || (ChannelStock.Quantity == 0 && !ChannelStock.ManuNo.Equals(invoiceVo.Invoice.DrugManuNo))) + { + DrugManuNo drugManuNo = await GetDrugManuNo(ChannelStock.DrugId, invoiceVo.Invoice.DrugManuNo); + + ChannelStock.Dmnguid = drugManuNo.Id; + ChannelStock.ManuNo = drugManuNo.ManuNo; + ChannelStock.EffDate = drugManuNo.EffDate.ToString(); + + q = q.Set(cs => cs.Dmnguid, drugManuNo.Id) + .Set(cs => cs.ManuNo, drugManuNo.ManuNo) + .Set(cs => cs.EffDate, drugManuNo.EffDate.ToString()); + } + int r = q.Update(); + // 入库记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = ChannelStock.DrawerNo, + ColNo = ChannelStock.ColNo, + DrugId = ChannelStock.DrugId, + ManuNo = ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(ChannelStock.EffDate) ? DateTime.ParseExact(ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 1, + Quantity = ChannelStock.AddQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = invoiceVo.Invoice.InvoiceNo, + }); + + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .Where(cs => cs.MachineId.Equals(_setting.machineId)) + .Where(cs => cs.DrawerType == 1) + .Where(cs => cs.DrugId.Equals(ChannelStock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = ChannelStock.DrugId, + ManuNo = ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(ChannelStock.EffDate) ? DateTime.ParseExact(ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 1, + OutQuantity = 0, + AddQuantity = ChannelStock.AddQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == ChannelStock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = invoiceVo.Invoice.InvoiceNo + }); + if (mid > 0 && r > 0 && acid > 0) + { + //根据抽屉类型判断是否需要写标签 + if (ChannelStock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(ChannelStock.Quantity - ChannelStock.TakeQuantity, ChannelStock.DrawerNo, ChannelStock.ColNo); + } + } + else + { + flag = false; + break; + } + } + if(!flag) + { + break; + } + + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } + catch (Exception ex) + { + logger.Error("调拨加药完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/MachineRecordDao.cs b/MasaBlazorApp3/DataAccess/Impl/MachineRecordDao.cs new file mode 100644 index 0000000..cc63a53 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/MachineRecordDao.cs @@ -0,0 +1,406 @@ +using LinqToDB; +using log4net; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pages; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using MasaBlazorApp3.Pojo.Vo; +using MasaBlazorApp3.Port; +using Microsoft.Extensions.Options; +using Mysqlx.Crud; +using static LinqToDB.Common.Configuration; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class MachineRecordDao : IMachineRecordDao + { + + private readonly AppDataConnection _connection; + private readonly SettingConfig _setting; + private readonly ILog logger = LogManager.GetLogger(typeof(MachineRecordDao)); + private readonly PortUtil _portUtil; + + //public UserDao(MyContext context) + //{ + // Context = context; + //} + public MachineRecordDao(AppDataConnection connection, IOptions setting, PortUtil portUtil) + { + _connection = connection; + _setting = setting.Value; + _portUtil = portUtil; + } + + public async Task> GetChannelStockByDrugId(string DrugId, String ManuNo) + { + var query = _connection.ChannelStock.AsQueryable(); + + + query = query.Where(cs => cs.MachineId.Equals(_setting.machineId)).Where(cs => cs.DrawerType == 1) + .Where(cs => cs.Quantity > 0) + .Where(cs => cs.DrugId.Equals(DrugId)) + .Where(cs => cs.ManuNo.Equals(ManuNo)); + + + return await query.OrderBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + //还药时有库位即可,不需要库存大于0的条件 + public async Task> GetChannelStockByDrugIdForReturn(string DrugId, String ManuNo) + { + var query = _connection.ChannelStock.AsQueryable(); + + + query = query.Where(cs => cs.MachineId.Equals(_setting.machineId)).Where(cs => cs.DrawerType == 1) + //.Where(cs => cs.Quantity > 0) + .Where(cs => cs.DrugId.Equals(DrugId)) + .Where(cs => cs.ManuNo.Equals(ManuNo)); + + + return await query.OrderBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + public async Task> GetCanReturnRecords(DateTime start, DateTime end, int operatorId, string drugId, int? take, int? skip) + { + var query = _connection.MachineRecord.AsQueryable().Where(it => it.MachineId.Equals(_setting.machineId)); + if (start != null && start != DateTime.MinValue) + { + query = query.Where(mr => mr.OperationTime > start); + } + if (end != null && end != DateTime.MinValue) + { + query = query.Where(mr => mr.OperationTime < end); + } + if (operatorId != 0) + { + query = query.Where(mr => mr.Operator == operatorId); + } + query = query.Where(mr => mr.Type == 2); + query = query.Where(mr => mr.Status < 2); + if (!String.IsNullOrEmpty(drugId)) + { + query = query.Where(mr => mr.DrugId == drugId); + } + int pagedData = await query.CountAsync(); + List MachineRecords = await query.LoadWith(mr => mr.Drug) + .LoadWith(mr => mr.OperatorUser) + .OrderByDescending(mr => mr.OperationTime) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + return new PageData() { Desserts = MachineRecords, TotalDesserts = pagedData }; + } + + public async Task> GetMachineRecordAsync(DateTime start, DateTime end, int operatorId, string drugId, int type, int? take, int? skip) + { + var query = _connection.MachineRecord.AsQueryable().Where(it => it.MachineId.Equals(_setting.machineId)); + if (start != null && start != DateTime.MinValue) + { + query = query.Where(mr => mr.OperationTime > start); + } + if (end != null && end != DateTime.MinValue) + { + query = query.Where(mr => mr.OperationTime < end); + } + if (operatorId != 0) + { + query = query.Where(mr => mr.Operator == operatorId); + } + if (type != 0) + { + query = query.Where(mr => mr.Type == type); + } + if (!String.IsNullOrEmpty(drugId)) + { + query = query.Where(mr => mr.DrugId == drugId); + } + int pagedData = await query.CountAsync(); + List MachineRecords = await query.LoadWith(mr => mr.Drug) + .LoadWith(mr => mr.OperatorUser) + .OrderByDescending(mr => mr.OperationTime) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + return new PageData() { Desserts = MachineRecords, TotalDesserts = pagedData }; + + } + + + public int InsertMachineRecord(MachineRecord record) + { + record.MachineId = _setting.machineId; + return _connection.InsertWithInt32Identity(record); + } + public async Task>>> getReturnDrugInfoByRecords(List records) + { + List>> list = new(); + + for (int i = 0; i < records.Count; i++) + { + var record = records[i]; + //var index = list.FindIndex(it => it.Drug.DrugId == record.DrugId && it.data.Count > 0 && it.data.First().ManuNo == record.ManuNo); + var index = list.FindIndex(it => it.Drug.DrugId == record.DrugId && it.data.First().ManuNo == record.ManuNo); + if (index > -1) + { + list[index].Quantity += record.CurrentReturnQuantity; + list[index].data.Add(record); + if (list[index].ChannelStocks.Count > 0) + { + list[index].ChannelStocks.First().ReturnQuantity += record.CurrentReturnQuantity; + } + } + else + { + //List stockList = await this.GetChannelStockByDrugId(record.DrugId, record.ManuNo); + List stockList = await this.GetChannelStockByDrugIdForReturn(record.DrugId, record.ManuNo); + // 当前药品的库存总量 + var total = stockList.Sum(current => current.Quantity); + if (stockList.Count > 0) + { + stockList.First().ReturnQuantity = record.CurrentReturnQuantity; + } + list.Add(new OperationVo>() + { + Drug = record.Drug, + ChannelStocks = stockList, + data = new List { record }, + Quantity = record.CurrentReturnQuantity, + StockQuantity = total, + }); + } + + + } + return list; + } + + public async Task ReturnDrugFinish(List>> datas) + { + //throw new NotImplementedException(); + //还药完成 + try + { + _connection.BeginTransaction(); + if (datas.Count > 0) + { + datas = datas.Select(it => + { + it.ChannelStocks = it.ChannelStocks.Where(cs => cs.ReturnQuantity > 0).ToList(); + return it; + }).ToList(); + if (datas.Count > 0) + { + foreach (var data in datas) + { + int sumQuantity = data.data.Sum(mr => mr.CurrentReturnQuantity); + //更新 库存 + foreach (ChannelStock record in data.ChannelStocks) + { + record.Quantity = record.Quantity + record.ReturnQuantity; + record.Id = record.Id; + _connection.Update(record); + + // 保存数据 还药记录 + int acid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = record.MachineId, + DrawerNo = record.DrawerNo, + ColNo = record.ColNo, + DrugId = record.DrugId, + ManuNo = record.ManuNo, + EffDate = !String.IsNullOrEmpty(record.EffDate) ? DateTime.ParseExact(record.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + Operator = data.data.First().Operator, + OperationTime = DateTime.Now, + Quantity = record.ReturnQuantity, + Type = 31, + InvoiceId = data.data.First().InvoiceId, + GetId = data.data.First().GetId + }); + //称重计数或称重+智能显示+管控药盒 类型需要 发26指令 + if (record.BoardType == 5 || record.BoardType == 6) + { + //计数数量设置,发送称重26指令 + _portUtil.SetNumCount(record.DrawerNo, record.ColNo, record.ReturnQuantity); + Thread.Sleep(80); + } + + } + // 更新 取药记录 设置还药数量、状态 + foreach (MachineRecord record in data.data) + { + record.ReturnQuantity1 = record.ReturnQuantity1 + record.CurrentReturnQuantity; + record.Id = record.Id; + record.Status = (record.Quantity - (record.ReturnQuantity1 + record.ReturnQuantity2 + sumQuantity)) == 0 ? 2 : 1; + _connection.Update(record); + } + + } + _connection.CommitTransaction(); + } + } + else + { + _connection.RollbackTransaction(); + return false; + } + return true; + } + catch (Exception ex) + { + logger.Error("还药完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + + + #region 还空瓶 + public async Task> GetReturnEmpty() + { + List channelStocks = new(); + var query = _connection.ChannelStock.AsQueryable().Where(it => it.MachineId == _setting.machineId && it.DrawerType == 2); + channelStocks= await query.LoadWith(cs => cs.Drug).ToListAsync(); + + //获取可归还数量 + return channelStocks; + //if (start != null && start != DateTime.MinValue) + //{ + // query = query.Where(mr => mr.OperationTime > start); + //} + //if (end != null && end != DateTime.MinValue) + //{ + // query = query.Where(mr => mr.OperationTime < end); + //} + //if (operatorId != 0) + //{ + // query = query.Where(mr => mr.Operator == operatorId); + //} + //query = query.Where(mr => mr.Type == 2); + //query = query.Where(mr => mr.Status < 2); + //if (!String.IsNullOrEmpty(drugId)) + //{ + // query = query.Where(mr => mr.DrugId == drugId); + //} + //int pagedData = await query.CountAsync(); + //List MachineRecords = await query.LoadWith(mr => mr.Drug) + // .LoadWith(mr => mr.OperatorUser) + // .OrderByDescending(mr => mr.OperationTime) + // .Skip((int)skip) + // .Take((int)take) + // .ToListAsync(); + + //return new PageData() { Desserts = MachineRecords, TotalDesserts = pagedData }; + } + public async Task> getReturnEmptyInfoByRecords(ChannelStock records) + { + List machineRecords = new(); + int pagedData = 0; + if (records != null && !string.IsNullOrEmpty(records.DrugId)) + { + var query = _connection.MachineRecord.Where(it => it.DrugId == records.DrugId && it.MachineId == _setting.machineId && it.Type == 2 && it.Status != 2).AsQueryable(); + machineRecords = await query.LoadWith(cs => cs.OperatorUser).ToListAsync(); + + pagedData = await query.CountAsync(); + } + return new PageData() { Desserts = machineRecords, TotalDesserts = pagedData }; + + } + public async Task ReturnEmptyFinish(List datas, ChannelStock channelStock) + { + try + { + _connection.BeginTransaction(); + // 更新数据 库存信息 + channelStock.Quantity = channelStock.Quantity+ datas.Sum(it => it.CurrentReturnQuantity); + int iStock = _connection.Update(channelStock); + for (int i = 0; i < datas.Count; i++) + { + MachineRecord _MachineRecord = datas[i]; + _MachineRecord.ReturnQuantity2 = _MachineRecord.ReturnQuantity2+ _MachineRecord.CurrentReturnQuantity; + _MachineRecord.Status = _MachineRecord.ReturnQuantity2 + _MachineRecord.ReturnQuantity1 >= _MachineRecord.Quantity ? 2 : 1; + // 更新数据 取药记录 设置还药数量、状态 + _connection.Update(_MachineRecord); + // 保存数据 还药空瓶记录 + int iMachineRecord = _connection.InsertWithInt32Identity(new MachineRecord() { + MachineId= channelStock.MachineId, + DrawerNo = channelStock.DrawerNo, + ColNo = channelStock.ColNo, + DrugId = channelStock.DrugId, + ManuNo = channelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(channelStock.EffDate) ? DateTime.ParseExact(channelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + Operator = _MachineRecord.Operator, + OperationTime = DateTime.Now, + Quantity = _MachineRecord.CurrentReturnQuantity, + Type = 31, + InvoiceId = _MachineRecord.InvoiceId, + GetId = _MachineRecord.GetId + }); + + ////称重计数或称重+智能显示+管控药盒 类型需要 发26指令 + //if (channelStock.BoardType == 5 || channelStock.BoardType == 6) + //{ + // //计数数量设置,发送称重26指令 + // _portUtil.SetNumCount(channelStock.DrawerNo, channelStock.ColNo, channelStock.ReturnQuantity); + // Thread.Sleep(80); + //} + + + if (channelStock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(channelStock.Quantity + datas.Sum(it => it.CurrentReturnQuantity), channelStock.DrawerNo, channelStock.ColNo); + } + } + // 更新屏显库存 + if (channelStock.BoardType == 5 || channelStock.BoardType == 35) + { + _portUtil.WriteQuantity(channelStock.DrawerNo, channelStock.ColNo, channelStock.Quantity); + } + _connection.CommitTransaction(); + return true; + } + catch (Exception ex) + { + logger.Error("还空瓶完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + public async Task> GetReturnEmptyWithCanReturnQuantiy() + { + List channelStocks = new(); + var queryStock = _connection.ChannelStock.Where(cs => cs.DrawerType == 2 && cs.MachineId == _setting.machineId); + var queryMachineRecord = _connection.MachineRecord.Where(dm => dm.Type == 2 && dm.Status != 2); + var query = from cs in queryStock + join other in queryMachineRecord on cs.DrugId equals other.DrugId + where cs.MachineId==other.MachineId + group other by cs.DrugId into g + select new + { + ChannelStockId = g.Key, + SumValue = g.Sum(x => x.Quantity-x.ReturnQuantity1-x.ReturnQuantity2) + }; + + var results = await query.ToListAsync(); + channelStocks= await queryStock.LoadWith(cs => cs.Drug).ToListAsync(); + foreach (var itemStock in channelStocks) + { + foreach (var itemResult in results) + { + if(itemStock.DrugId==itemResult.ChannelStockId) + { + itemStock.CanReturnQuantity = itemResult.SumValue; + } + } + } + return channelStocks; + } + #endregion + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs b/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs new file mode 100644 index 0000000..1a97974 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs @@ -0,0 +1,544 @@ +using LinqToDB; +using LinqToDB.SqlQuery; +using log4net; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pages; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using MasaBlazorApp3.Pojo.Vo; +using MasaBlazorApp3.Port; +using Microsoft.Extensions.Options; +using Mysqlx.Crud; +using Radzen.Blazor.Rendering; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class OrderInfoDao : IOrderInfoDao + { + + private readonly SettingConfig _setting; + private AppDataConnection _connection; + private GlobalStateService _globalStateService; + private readonly ILog logger = LogManager.GetLogger(typeof(OrderInfoDao)); + private readonly PortUtil _portUtil; + + public OrderInfoDao(AppDataConnection connection, IOptions setting, GlobalStateService globalStateService,PortUtil portUtil) + { + _connection = connection; + _setting = setting.Value; + _globalStateService = globalStateService; + _portUtil = portUtil; + } + + public async Task> GetAllOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip) + { + //var query = _connection.OrderInfo.AsQueryable(); + + //query.InnerJoin((oi, od) => oi.OrderNo == od.OrderNo); + + var query2 = from od in _connection.OrderDetail + from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId) + group od by od.OrderNo into temp + select new { temp.Key }; + var query = from oi in _connection.OrderInfo + from od in query2.InnerJoin(od => od.Key == oi.OrderNo) + select oi; + + if (!String.IsNullOrEmpty(OrderrNo)) + { + query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); + } + if(OrderDate !=null && OrderDate!= DateTime.MinValue) + { + query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date)); + } + + query = query.Where(oi => oi.Status == 0); + query = query.Where(oi => oi.HisDispFlag == 0); + query = query.Where(oi => oi.CancelFlag == 0); + + + int pagedData = await query.CountAsync(); + + List list = await query + .OrderBy((oi) => oi.RecvDate) + .ThenBy((oi => oi.OrderNo)) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + + return new PageData() + { + TotalDesserts = pagedData, + Desserts = list + }; + } + + public async Task> getDetailByOrderNo(string OrderrNo) + { + var query2 = from cl in _connection.ChannelStock + where cl.MachineId == _setting.machineId + group cl by cl.DrugId into temp + select new { temp.Key }; + ; + + + var query = from od in _connection.OrderDetail.Where(od => od.OrderNo == OrderrNo) + from cl in query2.InnerJoin(c => c.Key == od.DrugId) + orderby od.DrugId + select od; + + query = query.LoadWith(od => od.Drug); + + return await query.ToListAsync(); + } + + public async Task> GetChannelStockByDrugId(string DrugId, String ManuNo, int quantity = 0) + { + var query = _connection.ChannelStock.AsQueryable(); + + + query = query.Where(cs => cs.MachineId.Equals(_setting.machineId)).Where(cs => cs.DrawerType == 1) + .Where(cs => cs.Quantity > 0) + .Where(cs => cs.DrugId.Equals(DrugId)); + + if (quantity > 0) + { + if (!String.IsNullOrEmpty(ManuNo)) + { + query = query.Where(cs => cs.ManuNo.Equals(ManuNo)); + } + } else + { + if (!String.IsNullOrEmpty(ManuNo)) + { + query = query.Where(cs => cs.ManuNo.Equals(ManuNo) || cs.Quantity == 0); + } + } + + + return await query.OrderBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + public async Task> getTakeInfoByOrderNo(string OrderrNo) + { + List tempData = new(); + List tempData2 = new(); + List details = await this.getDetailByOrderNo(OrderrNo); + var flag = true; + for (var i = 0; i < details.Count; i++) + { + //List> tempData = new(); + OrderDetail detail = details[i]; + // 当前detail取药数量 + var Quantity = detail.Quantity; + List stockList = await this.GetChannelStockByDrugId(detail.DrugId, detail.SetManuNo, Quantity); + + // 当前药品的库存总量 + var total = stockList.Sum(current => current.Quantity); + + tempData2.Add(new OrderTakeVo() + { + Drug = detail.Drug, + OrderDetail = detail, + StockQuantity = total, + Quantity = Quantity + }); + + if (flag) + { + // 盘点库存是否足够 + if (total > Quantity) + { + + for (var j = 0; Quantity > 0; j++) + { + ChannelStock stock = stockList[j]; + if (Quantity > stock.Quantity) + { + // 取药数量大于库存 + tempData.Add(new OrderTakeVo() + { + Drug = detail.Drug, + OrderDetail = detail, + ChannelStock = stock, + StockQuantity = total, + Quantity = stock.Quantity, + }); + Quantity -= stock.Quantity; + } + else + { + //取药数量小于库存 + tempData.Add(new OrderTakeVo() + { + Drug = detail.Drug, + OrderDetail = detail, + ChannelStock = stock, + StockQuantity = total, + Quantity = Quantity, + }); + Quantity = 0; + } + } + } + else + { + // 库存不足 + flag = false; + } + } + + } + if (flag) + { + return tempData; + } + else + { + return tempData2; + } + } + + public async Task OrderTakeFinish(List datas) + { + + try + { + _connection.BeginTransaction(); + var flag = true; + // 更新处方状态 + int r1 = _connection.OrderInfo.Where(oi => oi.OrderNo == datas.First().OrderDetail.OrderNo) + .Set(oi => oi.Status, 1) + .Update(); + if (!(r1 > 0)) + { + flag = false; + logger.Error("处方取药完成更新处方状态失败"); + _connection.RollbackTransaction(); + return flag; + } + for (var i = 0; i < datas.Count; i++) + { + var orderTakeVo = datas[i]; + // 出库记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = orderTakeVo.ChannelStock.DrawerNo, + ColNo = orderTakeVo.ChannelStock.ColNo, + DrugId = orderTakeVo.ChannelStock.DrugId, + ManuNo = orderTakeVo.ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(orderTakeVo.ChannelStock.EffDate) ? DateTime.ParseExact(orderTakeVo.ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + Quantity = orderTakeVo.GetQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = orderTakeVo.OrderDetail.Id.ToString(), + }); + // 更新库存 + int r = _connection.ChannelStock.Where(cs => cs.Id == orderTakeVo.ChannelStock.Id) + .Set(cs => cs.Quantity, orderTakeVo.ChannelStock.Quantity - orderTakeVo.GetQuantity) + .Update(); + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId.Equals(orderTakeVo.ChannelStock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = orderTakeVo.ChannelStock.DrugId, + ManuNo = orderTakeVo.ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(orderTakeVo.ChannelStock.EffDate) ? DateTime.ParseExact(orderTakeVo.ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + OutQuantity = orderTakeVo.GetQuantity, + AddQuantity = 0, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == orderTakeVo.ChannelStock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = orderTakeVo.OrderDetail.Id.ToString() + }); + if (mid > 0 && r > 0 && acid > 0) + { + if (orderTakeVo.ChannelStock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(orderTakeVo.ChannelStock.Quantity - orderTakeVo.GetQuantity, orderTakeVo.ChannelStock.DrawerNo, orderTakeVo.ChannelStock.ColNo); + } + + } + else + { + flag = false; + break; + } + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } + catch (Exception ex) + { + logger.Error("处方取药完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + + public async Task> GetAllCanReturnOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip) + { + var query2 = from od in _connection.OrderDetail + from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId) + group od by od.OrderNo into temp + select new { temp.Key }; + var query = from oi in _connection.OrderInfo + from od in query2.InnerJoin(od => od.Key == oi.OrderNo) + select oi; + + if (!String.IsNullOrEmpty(OrderrNo)) + { + query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); + } + if (OrderDate != null && OrderDate != DateTime.MinValue) + { + query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date)); + } + + query = query.Where(oi => oi.Status == 1); + query = query.Where(oi => oi.CancelFlag == 1); + + + int pagedData = await query.CountAsync(); + + List list = await query + .OrderBy((oi) => oi.RecvDate) + .ThenBy((oi => oi.OrderNo)) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + + return new PageData() + { + TotalDesserts = pagedData, + Desserts = list + }; + } + + public async Task> GetMachineRecordByOrderNo(string OrderrNo) + { + var query = _connection.MachineRecord.AsQueryable(); + query = query.InnerJoin( + _connection.OrderDetail.Where(od => od.OrderNo.Equals(OrderrNo)), + (mr, od) => mr.InvoiceId.Equals(od.Id), + (mr, od) => mr + ) + .Where(md => md.Type == 2) + .LoadWith(md => md.Drug) + ; + return await query.ToListAsync(); + } + + public async Task>> getReturnInfoByOrderNo(string OrderrNo) + { + List> tempData = new(); + List details = await this.GetMachineRecordByOrderNo(OrderrNo); + for (var i = 0; i < details.Count; i++) + { + //List> tempData = new(); + MachineRecord detail = details[i]; + List stockList = await this.GetChannelStockByDrugId(detail.DrugId, detail.ManuNo); + + + // 当前药品的库存总量 + var total = stockList.Sum(current => current.Quantity); + // 当前detail出库数量 + var Quantity = detail.Quantity; + + stockList.First().AddQuantity = Quantity; + + tempData.Add(new OperationVo() + { + Drug = detail.Drug, + data = detail, + StockQuantity = total, + Quantity = Quantity, + ChannelStocks = stockList, + }); + + } + return tempData; + } + + public async Task GetDrugManuNo(string drugId, string manuNo) + { + var query = _connection.DrugManuNo.AsQueryable(); + + return await query.Where(m => m.DrugId.Equals(drugId)) + .Where(m => m.ManuNo.Equals(manuNo)) + .FirstAsync(); + } + + public async Task OrderReturnFinish(List> datas, string OrderNo) + { + try + { + _connection.BeginTransaction(); + var flag = true; + // 更新处方状态 + int r1 = _connection.OrderInfo.Where(oi => oi.OrderNo == OrderNo) + .Set(oi => oi.Status, 0) + .Update(); + if (!(r1 > 0)) + { + flag = false; + logger.Error("处方取药完成更新处方状态失败"); + _connection.RollbackTransaction(); + return flag; + } + for (var i = 0; i < datas.Count; i++) + { + var operationVo = datas[i]; + + List stocks = operationVo.ChannelStocks.Where(cs => cs.ReturnQuantity > 0).ToList(); + + // 更新取出记录状态 + var r2 = _connection.MachineRecord.Where(cs => cs.Id == operationVo.data.Id) + .Set(cs => cs.Status, 2) + .Set(cs => cs.ReturnQuantity1, operationVo.data.Quantity).Update(); + + if(r2 > 0) + { + + } else + { + flag = false; + break; + } + + for (var j = 0; j < stocks.Count; j++) + { + var channelStock = stocks[j]; + + // 更新库存 + var q = _connection.ChannelStock.Where(cs => cs.Id == channelStock.Id) + .Set(cs => cs.Quantity, channelStock.Quantity + channelStock.ReturnQuantity); + if (String.IsNullOrEmpty(channelStock.ManuNo) || (channelStock.Quantity == 0 && !channelStock.ManuNo.Equals(operationVo.data.ManuNo))) + { + DrugManuNo drugManuNo = await GetDrugManuNo(channelStock.DrugId, operationVo.data.ManuNo); + + channelStock.Dmnguid = drugManuNo.Id; + channelStock.ManuNo = drugManuNo.ManuNo; + channelStock.EffDate = drugManuNo.EffDate.ToString(); + + q = q.Set(cs => cs.Dmnguid, drugManuNo.Id) + .Set(cs => cs.ManuNo, drugManuNo.ManuNo) + .Set(cs => cs.EffDate, drugManuNo.EffDate.ToString()); + } + int r = q.Update(); + // 退回记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = channelStock.DrawerNo, + ColNo = channelStock.ColNo, + DrugId = channelStock.DrugId, + ManuNo = channelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(channelStock.EffDate) ? DateTime.ParseExact(channelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 31, + Quantity = channelStock.ReturnQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = operationVo.data.InvoiceId.ToString(), + GetId = operationVo.data.Id + }); + + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId.Equals(channelStock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = channelStock.DrugId, + ManuNo = channelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(channelStock.EffDate) ? DateTime.ParseExact(channelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + OutQuantity = channelStock.ReturnQuantity, + AddQuantity = 0, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == channelStock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = operationVo.data.InvoiceId + }); + if (mid > 0 && r > 0 && acid > 0) + { + if(channelStock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(channelStock.Quantity - channelStock.ReturnQuantity, channelStock.DrawerNo, channelStock.ColNo); + } + } + else + { + flag = false; + break; + } + + } + + + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } + catch (Exception ex) + { + logger.Error("处方取药完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/RoleDao.cs b/MasaBlazorApp3/DataAccess/Impl/RoleDao.cs new file mode 100644 index 0000000..6355459 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/RoleDao.cs @@ -0,0 +1,75 @@ +using LinqToDB; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using Microsoft.Extensions.Options; +using System.Linq; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class RoleDao : IRoleDao + { + + private AppDataConnection _connection; + private readonly SettingConfig _setting; + + public RoleDao(AppDataConnection connection, IOptions setting) { _connection = connection; _setting = setting.Value; } + + public async Task GetRoleById(int id) + { + return await _connection.Role.AsQueryable().FirstAsync(x => x.Id == id); + } + + + public int InsertRole(Role role) + { + role.MachineId = _setting.machineId; + return _connection.InsertWithInt32Identity(role); + } + + public bool UpdateRole(Role role) + { + int r = _connection.Role + .Where(r => r.Id == role.Id) + .Set(r => r.RoleName, role.RoleName) + .Set(r => r.permissions, role.permissions) + .Update(); + return r > 0; + } + + public bool DeleteRole(int id) + { + return _connection.Role.Where(r => r.Id ==id).Delete() > 0; + } + + public async Task> GetRolesByName(string name, int? take, int? skip) + { + var query = _connection.Role.AsQueryable(); + + if (!String.IsNullOrEmpty(name)) + { + query = query.Where(r => r.RoleName.IndexOf(name) > -1); + } + query = query.Where(r => r.MachineId == _setting.machineId); + + List list = await query + .OrderBy(r => r.Id) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + int pagedData = await query.CountAsync(); + return new PageData() + { + + TotalDesserts = pagedData, + Desserts = list + }; + } + + public async Task> GetAllRoles() + { + return await _connection.Role.Where(r => r.MachineId == _setting.machineId).ToListAsync(); + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/SelfTakeDao.cs b/MasaBlazorApp3/DataAccess/Impl/SelfTakeDao.cs new file mode 100644 index 0000000..c2de68c --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/SelfTakeDao.cs @@ -0,0 +1,300 @@ +using LinqToDB; +using log4net; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pages; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using MasaBlazorApp3.Pojo.Vo; +using MasaBlazorApp3.Port; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Channels; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class SelfTakeDao : ISelfTakeDao + { + private AppDataConnection _connection; + private readonly SettingConfig _setting; + ILog logger = LogManager.GetLogger(typeof(SelfTake)); + private GlobalStateService _globalStateService; + private readonly PortUtil _portUtil; + + public SelfTakeDao(AppDataConnection connection, IOptions setting, GlobalStateService globalStateService, PortUtil portUtil) + { + _connection = connection; + _setting = setting.Value; + _globalStateService = globalStateService; + _portUtil = portUtil; + } + /// + /// 根据药品信息 获取药品库存信息 + /// + /// + /// + public async Task> GetChannelStocksByDrug(List drugInfos) + { + List channelStocks = new List(); + try + { + foreach (var drugInfo in drugInfos) + { + var query = _connection.ChannelStock.AsQueryable(); + ChannelStock channelStock = query.Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == 1 && cs.DrugId == drugInfo.DrugId).First(); + if (channelStock != null) + { + channelStocks.Add(channelStock); + } + else + { + logger.Info($"药品{drugInfo.DrugName}未绑定"); + channelStocks.Add(new ChannelStock() + { + DrugId = drugInfo.DrugId, + DrawerType = 1, + MachineId = _setting.machineId, + Quantity = 0 + }); + } + } + } + catch (Exception ex) + { + logger.Info($"SelfTakeDao异常{ex.Message}"); + } + return channelStocks; + } + /// + /// 根据药品明细获取数据 + /// + /// + /// + public async Task> getTakeInfoByOrderNo(List orderDetails) + { + + List tempData = new(); + List tempData2 = new(); + var flag = true; + for (var i = 0; i < orderDetails.Count; i++) + { + //List> tempData = new(); + OrderDetail detail = orderDetails[i]; + // 当前detail取药数量 + var Quantity = detail.Quantity; + List stockList = await this.GetChannelStockByDrugId(detail.Drug.DrugId, detail.SetManuNo, Quantity); + + // 当前药品的库存总量 + var total = stockList.Sum(current => current.Quantity); + + tempData2.Add(new OrderTakeVo() + { + Drug = detail.Drug, + OrderDetail = detail, + StockQuantity = total, + Quantity = Quantity + }); + + if (flag) + { + // 盘点库存是否足够 + if (total > Quantity) + { + + for (var j = 0; Quantity > 0; j++) + { + ChannelStock stock = stockList[j]; + if (Quantity > stock.Quantity) + { + // 取药数量大于库存 + tempData.Add(new OrderTakeVo() + { + Drug = detail.Drug, + OrderDetail = detail, + ChannelStock = stock, + StockQuantity = total, + Quantity = stock.Quantity, + }); + Quantity -= stock.Quantity; + } + else + { + //取药数量小于库存 + tempData.Add(new OrderTakeVo() + { + Drug = detail.Drug, + OrderDetail = detail, + ChannelStock = stock, + StockQuantity = total, + Quantity = Quantity, + }); + Quantity = 0; + } + } + } + else + { + // 库存不足 + flag = false; + } + } + + } + if (flag) + { + return tempData; + } + else + { + return tempData2; + } + } + + public async Task> GetChannelStockByDrugId(string DrugId, String ManuNo, int quantity = 0) + { + var query = _connection.ChannelStock.AsQueryable(); + + + query = query.Where(cs => cs.MachineId.Equals(_setting.machineId)).Where(cs => cs.DrawerType == 1) + .Where(cs => cs.Quantity > 0) + .Where(cs => cs.DrugId.Equals(DrugId)); + + if (quantity > 0) + { + if (!String.IsNullOrEmpty(ManuNo)) + { + query = query.Where(cs => cs.ManuNo.Equals(ManuNo)); + } + } + else + { + if (!String.IsNullOrEmpty(ManuNo)) + { + query = query.Where(cs => cs.ManuNo.Equals(ManuNo) || cs.Quantity == 0); + } + } + + + return await query.OrderBy((cs) => cs.EffDate) + .ThenBy((cs) => cs.DrawerNo) + .ThenBy((cs) => cs.ColNo) + .ToListAsync(); + } + + /// + /// 保存自选取药完成数据 + /// + /// + /// + public async Task OrderTakeFinish(List datas, OrderInfo order) + { + + try + { + _connection.BeginTransaction(); + var flag = true; + // 保存处方信息 + order.Status = 1; + order.PatientId = order.PatientId == null ? "0" : order.PatientId; + int r1 = _connection.InsertWithInt32Identity(order); + if (!(r1 > 0)) + { + flag = false; + logger.Error("处方取药完成更新处方状态失败"); + _connection.RollbackTransaction(); + return flag; + } + for (var i = 0; i < datas.Count; i++) + { + var orderTakeVo = datas[i]; + //保存处方明细 + orderTakeVo.OrderDetail.PatientId = orderTakeVo.OrderDetail.PatientId == null ? order.PatientId : orderTakeVo.OrderDetail.PatientId; + orderTakeVo.OrderDetail.ChargeDate = orderTakeVo.OrderDetail.ChargeDate == null ? order.ChargeDate : orderTakeVo.OrderDetail.ChargeDate; + orderTakeVo.OrderDetail.OrderNo = order.OrderNo; + orderTakeVo.OrderDetail.DrugId = orderTakeVo.Drug.DrugId; + orderTakeVo.OrderDetail.SetManuNo = orderTakeVo.ChannelStock.ManuNo; + orderTakeVo.OrderDetail.SetEffDate = orderTakeVo.ChannelStock.EffDate; + int od = _connection.InsertWithInt32Identity(orderTakeVo.OrderDetail); + // 出库记录 + int mid = _connection.InsertWithInt32Identity(new MachineRecord() + { + MachineId = _setting.machineId, + DrawerNo = orderTakeVo.ChannelStock.DrawerNo, + ColNo = orderTakeVo.ChannelStock.ColNo, + DrugId = orderTakeVo.ChannelStock.DrugId, + ManuNo = orderTakeVo.ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(orderTakeVo.ChannelStock.EffDate) ? DateTime.ParseExact(orderTakeVo.ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + Quantity = orderTakeVo.GetQuantity, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + InvoiceId = orderTakeVo.OrderDetail.Id.ToString(), + }); + // 更新库存 + int r = _connection.ChannelStock.Where(cs => cs.Id == orderTakeVo.ChannelStock.Id) + .Set(cs => cs.Quantity, orderTakeVo.ChannelStock.Quantity - orderTakeVo.GetQuantity) + .Update(); + // 获取更新完库存之后的药品库存 + List list = await _connection.ChannelStock.AsQueryable() + .InnerJoin( + _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), + (cs, cl) => cs.ListId == cl.Id, + (cs, cl) => cs + ) + .Where(cs => cs.DrugId.Equals(orderTakeVo.ChannelStock.DrugId)) + .ToListAsync(); + // 保存账册 + int acid = _connection.InsertWithInt32Identity(new AccountBook() + { + MachineId = _setting.machineId, + DrugId = orderTakeVo.ChannelStock.DrugId, + ManuNo = orderTakeVo.ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(orderTakeVo.ChannelStock.EffDate) ? DateTime.ParseExact(orderTakeVo.ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + OperationTime = DateTime.Now, + Type = 2, + OutQuantity = orderTakeVo.GetQuantity, + AddQuantity = 0, + Operator = _globalStateService.Operator.Id, + Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, + ManuStock = list.Where(it => it.ManuNo == orderTakeVo.ChannelStock.ManuNo).Sum(it => it.Quantity), + TotalStock = list.Sum(it => it.Quantity), + InvoiceId = orderTakeVo.OrderDetail.Id.ToString() + }); + if (mid > 0 && r > 0 && acid > 0) + { + //根据抽屉类型判断是否需要写标签 + if (orderTakeVo.ChannelStock.BoardType.ToString().Contains("5")) + { + await _portUtil.WriteQuantityMethod(orderTakeVo.ChannelStock.Quantity - orderTakeVo.GetQuantity, orderTakeVo.ChannelStock.DrawerNo, orderTakeVo.ChannelStock.ColNo); + } + } + else + { + flag = false; + break; + } + } + if (flag) + { + _connection.CommitTransaction(); + } + else + { + _connection.RollbackTransaction(); + } + return flag; + + } + catch (Exception ex) + { + logger.Error("自选取药完成保存数据库失败,错误:" + ex.Message); + _connection.RollbackTransaction(); + return false; + } + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/UserDao.cs b/MasaBlazorApp3/DataAccess/Impl/UserDao.cs new file mode 100644 index 0000000..7c662b2 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/UserDao.cs @@ -0,0 +1,111 @@ +using Google.Protobuf.WellKnownTypes; +using LinqToDB; +using MasaBlazorApp3.DataAccess.Dao; +using MasaBlazorApp3.Pojo; +using MasaBlazorApp3.Pojo.Config; +using MasaBlazorApp3.Util; +using Microsoft.Extensions.Options; +using System.Data; +using System.Xml.Linq; + +namespace MasaBlazorApp3.DataAccess.Impl +{ + public class UserDao : IUserDao + { + + //private MyContext Context; + + private readonly AppDataConnection _connection; + private readonly SettingConfig _setting; + + //public UserDao(MyContext context) + //{ + // Context = context; + //} + public UserDao(AppDataConnection connection, IOptions setting) + { + _connection = connection; + _setting = setting.Value; + } + + public async Task> GetAllByNickname(string nickname, int? take, int? skip) + { + var query = _connection.User.AsQueryable(); + + if (!String.IsNullOrEmpty(nickname)) + { + query = query.Where(r => r.NickName.IndexOf(nickname) > -1); + } + query = query.Where(u => u.MachineId == _setting.machineId); + + List list = await query + .LoadWith(u => u.role) + .OrderBy(u => u.Id) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + int pagedData = await query.CountAsync(); + return new PageData() + { + + TotalDesserts = pagedData, + Desserts = list + }; + } + + public User GetById(int id) + { + return _connection.User.LoadWith(u => u.role).FirstOrDefault(u => u.Id == id); + } + + public User GetByUsername(string username) + { + + return _connection.User.LoadWith(u => (u.role)).FirstOrDefault(u => u.Username == username&&u.MachineId== _setting.machineId); + } + + public int InsertUser(User user) + { + user.MachineId = _setting.machineId; + user.Password = MD5.GetMD5Hash("123456").ToLower(); + return _connection.InsertWithInt32Identity(user); + } + + public bool UpdateUser(User user) + { + var statement = _connection.User + .Where(u => u.Id == user.Id) + .Set(u => u.NickName, user.NickName) + .Set(u => u.Username, user.Username) + .Set(u => u.RoleId, user.RoleId); + //if(!String.IsNullOrEmpty(user.Password)) + //{ + // statement.Set(u => user.Password, MD5.GetMD5Hash(user.Password).ToLower()); + //} + return statement.Update() > 0; + } + + public bool DeleteeUser(int id) + { + return _connection.User.Where(u => u.Id == id).Delete() > 0; + } + //重置用户密码 + public bool ResetPassword(int id) + { + var statement= _connection.User.Where(u => u.Id == id).Set(u=>u.Password, MD5.GetMD5Hash("123456").ToLower()); + return statement.Update() > 0; + } + + public async Task UpdateSign(int id, string sign) + { + var statement = _connection.User + .Where(u => u.Id == id) + .Set(u => u.Sign, Convert.FromBase64String(sign)); + //if(!String.IsNullOrEmpty(user.Password)) + //{ + // statement.Set(u => user.Password, MD5.GetMD5Hash(user.Password).ToLower()); + //} + return (await statement.UpdateAsync()) > 0; + } + } +} diff --git a/MasaBlazorApp3/DataAccess/PageData.cs b/MasaBlazorApp3/DataAccess/PageData.cs new file mode 100644 index 0000000..1cab9b4 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/PageData.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess +{ + public class PageData + { + public int TotalDesserts { get; set; } + public List Desserts { get; set; } = new List(); + } +} diff --git a/MasaBlazorApp3/DataAccess/PageMultiData.cs b/MasaBlazorApp3/DataAccess/PageMultiData.cs new file mode 100644 index 0000000..da34870 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/PageMultiData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MasaBlazorApp3.DataAccess +{ + public class PageMultiData + { + public int TotalDesserts { get; set; } + public List Desserts { get; set; } = new List(); + public List Other { get; set; } = new List(); + } +} diff --git a/MasaBlazorApp3/Finger/FingerprintUtil.cs b/MasaBlazorApp3/Finger/FingerprintUtil.cs new file mode 100644 index 0000000..03615c2 --- /dev/null +++ b/MasaBlazorApp3/Finger/FingerprintUtil.cs @@ -0,0 +1,142 @@ +using log4net; +using MasaBlazorApp3.Pojo; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using zkemkeeper; +using Microsoft.Extensions.Options; +using MasaBlazorApp3.Pojo.Config; + +namespace MasaBlazorApp3.Finger +{ + public class FingerprintUtil + { + + private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil)); + private readonly FingerPojo _options; + + public CZKEMClass axCZKEM1 = new CZKEMClass(); + public bool bIsConnected = false; + + private int fingerPort = 4370; + private int machineNumber = 1; + private int machineType = 2; + + public FingerprintUtil(IOptions options) + { + _options = options.Value; + logger.Info($"进入构造器,开始连接指纹机"); + // ConnectionMain(); + } + + public async void ConnectionMain() + { + await Task.Run(() => + { + try + { + bIsConnected = axCZKEM1.Connect_Net(_options.ip, fingerPort); + logger.Info($"连接指纹机,IP:{_options.ip},端口:{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); + + } + } + } + catch + { + } + }); + + } + + //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) + { + + logger.Info($"触发用户验证通过事件,用户id:{sEnrollNumber}验证方式:{iVerifyMethod}"); + } + + //When you are enrolling your finger,this event will be triggered. + private void axCZKEM1_OnEnrollFinger(int iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength) + { + + axCZKEM1.StartIdentify(); + axCZKEM1.RefreshData(1); + + logger.Info($"触发用户登记指纹事件,用户id:{iEnrollNumber}指纹索引:{iFingerIndex}登记结果:{(iActionResult == 0)}"); + + } + + private void axCZKEM1_OnEnrollFingerEx(string iEnrollNumber, int iFingerIndex, int iActionResult, int iTemplateLength) + { + + axCZKEM1.StartIdentify(); + axCZKEM1.RefreshData(1); + logger.Info($"触发用户登记指纹事件1,用户id:{iEnrollNumber}指纹索引:{iFingerIndex}登记结果:{(iActionResult == 0)}"); + + } + + /** + * 删除用户 + */ + 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(User 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(); + // 删除源指纹 + bool res = axCZKEM1.SSR_DelUserTmp(machineNumber, Id.ToString(), FingerIndex); + // 添加新指纹 + result = axCZKEM1.StartEnrollEx(Id.ToString(), FingerIndex, 3); + return result; + } + } +} diff --git a/MasaBlazorApp3/GlobalStateService.cs b/MasaBlazorApp3/GlobalStateService.cs new file mode 100644 index 0000000..99684dd --- /dev/null +++ b/MasaBlazorApp3/GlobalStateService.cs @@ -0,0 +1,40 @@ +using System.ComponentModel; +using MasaBlazorApp3.Pojo; + +namespace MasaBlazorApp3 +{ + public class GlobalStateService : INotifyPropertyChanged + { + private User _operator; + private User _reviewer; + + public User Operator + { + get { return _operator; } + set + { + _operator = value; + //OnPropertyChanged(); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Operator")); + } + } + + public User Reviewer + { + get => _reviewer; + set + { + _reviewer = value; + //OnPropertyChanged(); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Reviewer")); + } + } + + public event PropertyChangedEventHandler? PropertyChanged; + + //protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + //{ + + //} + } +} diff --git a/MasaBlazorApp3/MasaBlazorApp3.csproj b/MasaBlazorApp3/MasaBlazorApp3.csproj new file mode 100644 index 0000000..0b4ec44 --- /dev/null +++ b/MasaBlazorApp3/MasaBlazorApp3.csproj @@ -0,0 +1,96 @@ + + + + WinExe + net7.0 + enable + enable + favicon.ico + + + + + tlbimp + 0 + 1 + fe9ded34-e159-408e-8490-b720a5e632c7 + 0 + false + False + + + tlbimp + 0 + 6 + 4018f953-1bfe-441e-8a04-dc8ba1ff060e + 0 + false + False + + + + + + + + + + + + + + + + + + + + + Always + + + + + + Always + + + + + + + + + + + + + + Always + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + diff --git a/MasaBlazorApp3/Pages/BiaoDing.razor b/MasaBlazorApp3/Pages/BiaoDing.razor new file mode 100644 index 0000000..632b535 --- /dev/null +++ b/MasaBlazorApp3/Pages/BiaoDing.razor @@ -0,0 +1,288 @@ +@page "/stock/biaoDing" +@using MasaBlazorApp3.Pojo.Config; +@using MasaBlazorApp3.Util; +@using Microsoft.AspNetCore.Components +@using Microsoft.Extensions.Options; +@using Newtonsoft.Json; +@using log4net; + + + + + @if (DrawerNos.Count() > 8) + { + + + @foreach (int i in DrawerNos) + { + + + } + + + } + else + { + + + @foreach (int i in DrawerNos) + { + + + } + + + } + + + + + + + + + + + + + @channel.Drug?.DrugName + @channel.Drug?.DrugSpec + + + + + @channel.drugManuNo?.ManuNo + @channel.drugManuNo?.EffDate + + + + @if (channel.Quantity == 0 && !String.IsNullOrEmpty(channel.DrugId)) + { + + + @((context as DrugManuNo)?.ManuNo) + @((context as DrugManuNo)?.EffDate) + + + + @((context as DrugManuNo)?.ManuNo) + @((context as DrugManuNo)?.EffDate) + + + + + } + else + { + + @channel.drugManuNo?.ManuNo + @channel.drugManuNo?.EffDate + } + + + + + + + + + + @if (cs.BoardType == 2) + { + @cs.AddQuantity + } + else + { + + + } + + + + + +@code { + @inject IChannelListDao channelListDao; + @inject NavigationManager na; + @inject PortUtil PortUtil; + @inject NotificationService _message + @inject IOptions setting; + int status = 0; + int drawerNo = 1; + RadzenDataGrid grid; + private List? channels; + bool isLoading; + int count; + int[] DrawerNos = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + int[] BeforeQuantity = new int[9]; + int[] AfterQuantity = new int[9]; + private readonly ILog logger = LogManager.GetLogger(typeof(DrawerAdd)); + + // 当前操作的库位号列表 + public List ColNos { get; set; } = new List(); + int currentCol = 0; + bool CompleteIsEnable = true; + bool CancleIsEnable = true; + + void SelectDrawer(int drawerNo) + { + this.drawerNo = drawerNo; + grid.Reload(); + } + + async Task LoadData(LoadDataArgs args) + { + isLoading = true; + + var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo); + DrawerNos = result.DrawerArray; + channels = result.ChannelStocks; + count = result.ChannelStocks.Count; + + + isLoading = false; + } + async Task OpenDrawer() + { + this.status = 1; + var promiseUtil = new PromiseUtil(); + await promiseUtil.taskAsyncLoop(500, null, async (data, next, stop) => + { + try + { + if (this.status == 0) + { + stop(); + } + // 开启抽屉 + else if (this.status == 1) + { + // if(库存》0) + // {} + + } + var b = await PortUtil.OpenDrawerStatus(this.drawerNo); + if (b) + { + PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,加药"); + this.status = 2; + PortUtil.Operate = true; + next(); + } + // else + // { + // _message.Notify( + // new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 } + // ); + // logger.Info($"抽屉打开失败"); + // RestData(); + // PortUtil.Operate = false; + // stop(); + // } + + else if (this.status == 2) + { + if (setting.Value.box != null && setting.Value.box.Contains(this.drawerNo)) + { + //药盒抽屉,开药盒 + for (int i = 0; i < ColNos.Count; i++) + { + await PortUtil.OpenBoxByColNo(ColNos[i]); + } + } + // 查询抽屉是否为关闭状态 + var b2 = await PortUtil.CheckDrawerStatus2(drawerNo); + // 关闭则改变状态并终止循环 + if (b2) + { + PortUtil.SpeakAsync($"加药完成,请,核对,或,录入,正确的,添加数量"); + // 判断是否为称重抽屉 + if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo)) + { + //关闭抽屉后获取称重稳定数量 + // await GetWeightQuantity(); + } + this.status = 3; + PortUtil.Operate = false; + stop(); + } + else + { + if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo)) + { + byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo); + AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); + logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】"); + + channels.ForEach(cl => + { + cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1]; + }); + } + // 判断是否为称重抽屉 + if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo)) + { + //开抽屉后查数 + for (int i = 0; i < 9; i++) + { + int afterQuantity = await PortUtil.CheckQuantityForSingle(i); + AfterQuantity[i] = afterQuantity; + logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}"); + } + channels.ForEach(cl => + { + cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1]; + }); + } + next(); // continue iteration + } + + } + } + catch (Exception e) + { + logger.Info($"抽屉加药发生错误,{e.Message}"); + _message.Notify( + new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 } + ); + if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo)) + { + PortUtil.AllLightOff(); + } + RestData(); + stop(); + } + }); + } + void RestData() + { + this.status = 0; + } + void OnCellClick(DataGridCellMouseEventArgs args) + { + if (args.Data.BoardType.ToString().Contains("3")) + { + //是药盒抽屉则点击行,打开对应行的药箱 + if (!ColNos.Contains(args.Data.ColNo)) + { + ColNos.Add(args.Data.ColNo); + } + } + else + { + grid.EditRow(args.Data); + } + } +} diff --git a/MasaBlazorApp3/Pages/ConfirmDialo.razor b/MasaBlazorApp3/Pages/ConfirmDialo.razor new file mode 100644 index 0000000..bfce5a1 --- /dev/null +++ b/MasaBlazorApp3/Pages/ConfirmDialo.razor @@ -0,0 +1,27 @@ + + + + 确认要@(confirmInfo) 吗? + + + + + + + + + +@code { + @inject Radzen.DialogService dialogService; + [Parameter] public string confirmInfo { get; set; } + protected override async Task OnInitializedAsync() + { + var info = confirmInfo; + base.OnInitializedAsync(); + } + async Task ConfirmOK() + { + // 关闭弹窗 + dialogService.Close(true); + } +} diff --git a/MasaBlazorApp3/Pages/DrawerAdd.razor b/MasaBlazorApp3/Pages/DrawerAdd.razor new file mode 100644 index 0000000..5d6fa59 --- /dev/null +++ b/MasaBlazorApp3/Pages/DrawerAdd.razor @@ -0,0 +1,446 @@ +@page "/add/drawer" +@using MasaBlazorApp3.Pojo.Config; +@using MasaBlazorApp3.Util; +@using Microsoft.Extensions.Options; +@using Newtonsoft.Json; +@using log4net; + + + + + @* *@ + + @foreach (int i in DrawerNos) + { +
Sorry, there's nothing at this address.