diff --git a/MasaBlazorApp3.sln b/MasaBlazorApp3.sln
new file mode 100644
index 0000000..3049405
--- /dev/null
+++ b/MasaBlazorApp3.sln
@@ -0,0 +1,31 @@
+
+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
+ Debug|x64 = Debug|x64
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ 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}.Debug|x64.ActiveCfg = Debug|x64
+ {B589889C-FAEB-4394-A21D-DDCADF39382D}.Debug|x64.Build.0 = Debug|x64
+ {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
+ {B589889C-FAEB-4394-A21D-DDCADF39382D}.Release|x64.ActiveCfg = Release|x64
+ {B589889C-FAEB-4394-A21D-DDCADF39382D}.Release|x64.Build.0 = Release|x64
+ 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..f132fb4
--- /dev/null
+++ b/MasaBlazorApp3/App.razor
@@ -0,0 +1,15 @@
+@namespace MasaBlazorApp3
+
+
+
+
+
+
+
+
+ 抱歉,找不到此页面。
+
+
+
+
+
diff --git a/MasaBlazorApp3/DataAccess/AppDataConnection.cs b/MasaBlazorApp3/DataAccess/AppDataConnection.cs
new file mode 100644
index 0000000..1b4da17
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/AppDataConnection.cs
@@ -0,0 +1,41 @@
+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();
+ public ITable SettingManu => this.GetTable();
+ public ITable Plan => this.GetTable();
+ public ITable PlanDetails => this.GetTable();
+ public ITable AccountBookG2 => this.GetTable();
+ public ITable HkcChangeShifts => this.GetTable();
+ public ITable HkcChangeShiftsDetail => this.GetTable();
+
+
+
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/ChannelStockWidthDrawerInfo.cs b/MasaBlazorApp3/DataAccess/ChannelStockWidthDrawerInfo.cs
new file mode 100644
index 0000000..916e3e2
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/ChannelStockWidthDrawerInfo.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MasaBlazorApp3.DataAccess
+{
+ public class ChannelStockWidthDrawerInfo
+ {
+ //抽屉信息(抽屉号,抽屉类型)
+ public List> DrawerInfo { get; set; }
+
+ public List ChannelStocks { get; set; } = new List();
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs b/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs
new file mode 100644
index 0000000..4c7e67f
--- /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/CheckInfo.cs b/MasaBlazorApp3/DataAccess/CheckInfo.cs
new file mode 100644
index 0000000..5c788b3
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/CheckInfo.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 CheckInfo
+ {
+ public string StrInfo { get; set; }
+ public List TEntity { get; set; } = new List();
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs b/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs
new file mode 100644
index 0000000..6caa546
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs
@@ -0,0 +1,104 @@
+using System;
+using MasaBlazorApp3.Pojo;
+using MasaBlazorApp3.Pojo.Vo;
+
+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,BoxModel boxNum,List channelLists);
+
+ 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);
+ //抽屉获取库存数据--药品绑定
+ Task> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0);
+ //手术室药盒获取绑定数据
+ Task> GetAllChannelListWithPlan(int? take, int? skip);
+ ///
+ /// 手术室药盒绑定套餐
+ ///
+ ///
+ Task BindBox(ChannelList list, Plan plan);
+ ///
+ /// 手术室药盒绑定套餐
+ ///
+ ///
+ Task BindBox(ChannelList channelList);
+ ///
+ /// 手术室药盒解绑套餐
+ ///
+ ///
+ ///
+ Task UnBindBox(ChannelList list);
+ //获取手术室药盒中所有要补药的数据
+ Task> GetAllBoxAddDrug(int? take, int? skip);
+ //手术室药盒补药获取毒麻柜中的药品信息
+ Task> getTakeInfoByBox(ChannelList cl);
+ //手术室药盒补药完成
+ Task BoxTakeFinish(List datas, ChannelList boxChannelList);
+ //手术室药盒入库
+ Task> GetBoxWaitInfo(int? take, int? skip);
+ // 药盒入库弹窗页面获取要入库的药品明细信息
+ Task> GetBoxAddToBox(ChannelList cl);
+ //手术室药盒入库获取待入库明细
+ Task> getBoxWaitByBox(ChannelList cl, int? take, int? skip);
+ // 手术室药盒待入库明细入库完成
+ Task BoxAddBoxFinish(ChannelList boxChannelList);
+
+ //手术室药盒获取药盒药品及库存信息
+ Task> GetBoxDrugInfo(string DrawerNo, int? take, int? skip);
+ //药盒移库时获取选中药盒号的药品信息
+ Task> GetChannelStockByDrug(ChannelStock cs, string drawerNo,int? take, int? skip);
+
+ ///
+ /// 药盒交换药品获取所有除本药盒外的所有药盒号
+ ///
+ ///
+ ///
+ Task GetDrawerNum(ChannelStock channelStock);
+
+ ///
+ /// 药盒移除药品,获取所有除本药盒外的所有包含该药品的药盒号
+ ///
+ ///
+ ///
+ Task GetDrawerNumForRemove(ChannelStock channelStock);
+
+ //手术室药盒交换药品完成
+ Task BoxReplaceFinish(ChannelStock stock, List Stocks);
+ //手术室药盒移出药品完成
+ Task BoxRemoveFinish(ChannelStock stock, string SelectedDrawerNo, int removeQuantity);
+
+ Task> GetAllBox();
+ //根据药盒查询药品信息
+ Task> GetChannelStockByBox(int BoxNum);
+ //根据套餐下无库存的药箱
+ Task> GetChannelStockByPlan(string plan);
+ //手术室药盒获取绑定数据
+ Task> GetAllChannelList();
+ //抽屉取药向药盒加药校验药盒中是否存在该药
+ Task> CheckBoxDrugInfo(BoxModel BoxNum,List channelStockList);
+ //药箱中的药移入到抽屉
+ Task RemoveDrugToDrawerFinish(string SelectedDrawerNo, ChannelStock channelStock, int quantity);
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs b/MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs
new file mode 100644
index 0000000..abd2f98
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IDrugInfoDao.cs
@@ -0,0 +1,36 @@
+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> GetAllDrugAndStockByBox(BoxModel boxModel);
+
+
+ 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/IHkcChangeShiftsDao.cs b/MasaBlazorApp3/DataAccess/Dao/IHkcChangeShiftsDao.cs
new file mode 100644
index 0000000..d82de55
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IHkcChangeShiftsDao.cs
@@ -0,0 +1,16 @@
+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 IHkcChangeShiftsDao
+ {
+ //查询交接班记录
+ public Task> GetChangeShiftRecordAsync(DateTime start, DateTime end, int? take, int? skip);
+
+ }
+}
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..7179393
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs
@@ -0,0 +1,53 @@
+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> GetAllOrderInfoForImport(string name, string OrderrNo, DateTime OrderDate, BoxModel boxModel, 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);
+ //获取药盒中的用药信息
+ public Task> GetAllOrderInfoByBox(int box,string OrderrNo, DateTime OrderDate, int? take, int? skip);
+ //获取待处理处方中的麻醉师
+ public Task> GetAllOrderInfo(string Name, string BoxNum, string PatientName,string OrderrNo, DateTime? OrderDate, int? take, int? skip);
+
+ public Task> GetAllOrderInfoDrugByBox(BoxModel boxNum, string roomName, DateTime? OrderDate);
+ //获取麻醉师信息
+ public Task> GetAnaesthetistName();
+ //获取麻醉师单对应的手术间号
+ public Task> GetOperationNum(int boxColor);
+ //获取麻醉师单对应的手术间号(查询全部手术间已绑套餐的手术间)
+ public Task> GetAllBindOperationNum();
+ //获取所有药盒号
+ public Task> GetDrawerNum(string machineId);
+ /// 获取指定药盒号
+ public Task> GetDrawerNumByOperationNum(string machineId, List operationNum);
+ //核对处方
+ public Task CheckOrderInfo(IList selectedOrderInfos, BoxModel boxModel);
+ //查询药品对应的库位 drawerType=1药品库位,其他则是回收库位
+ public Task> GetStockByDRrug(string drugId, string manuNo, int drawerType);
+ //核对处方通过库位下的药品
+ public Task CheckOrderInfoByChannelStock(IList csList, BoxModel boxModel);
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs b/MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs
new file mode 100644
index 0000000..a56866f
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs
@@ -0,0 +1,71 @@
+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 IPlanDao
+ {
+
+ ///
+ /// 获取所有套餐数据
+ ///
+ ///
+ Task> GetAllPlanInfo();
+ ///
+ /// 根据套餐ID获取套餐数据
+ ///
+ ///
+ ///
+ Task GetPlanById(int Id);
+ ///
+ /// 新增套餐
+ ///
+ ///
+ ///
+ Task InsertPlanInfo(Plan plan);
+ ///
+ /// 更新套餐
+ ///
+ ///
+ ///
+ Task UpdatePlanInfo(Plan plan);
+ ///
+ /// 删除套餐
+ ///
+ ///
+ ///
+ Task DeletePlanInfo(int planID);
+ ///
+ /// 向套餐添加药品
+ ///
+ ///
+ ///
+ Task AddPlanDetail(PlanDetails details);
+ ///
+ /// 修改套餐中的药品
+ ///
+ ///
+ ///
+ Task UpdatePlanDetail(PlanDetails details);
+ //查询要删除的套餐下是否有绑定,且绑定有库存
+ Task CheckPlanBind(int planId);
+ //查询要删除的药品是否有绑定且库存大于0
+ Task CheckPlanDetailBind(PlanDetails planDetail);
+ ///
+ /// 删除套餐中的药品
+ ///
+ ///
+ ///
+ Task DeletePlanDetail(PlanDetails planID);
+ ///
+ /// 根据套餐明细获取套餐
+ ///
+ ///
+ ///
+ bool CheckDrugById(PlanDetails details);
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/Dao/IReportDataDao.cs.cs b/MasaBlazorApp3/DataAccess/Dao/IReportDataDao.cs.cs
new file mode 100644
index 0000000..7bf9a04
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IReportDataDao.cs.cs
@@ -0,0 +1,23 @@
+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 IReportDataDao
+ {
+ //获取库存导出数据
+ Task> GetStockExportData(string drugName);
+ //专用账册导出数据
+ Task> GetAccountExportData(DateTime? startDate, DateTime? endDate, string drugName);
+ //手术室患者麻醉药品使用登记本主表数据
+ Task> GetOrderInfoParentData(DateTime? startDate);
+ //手术室患者麻醉药品使用登记本
+ Task> GetOrderInfoData(DateTime? startDate);
+ //请领登记表导出
+ Task> GetApplyInfoDate(DateTime searchDate);
+ }
+}
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/ISettingManuDao.cs b/MasaBlazorApp3/DataAccess/Dao/ISettingManuDao.cs
new file mode 100644
index 0000000..36545dc
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/ISettingManuDao.cs
@@ -0,0 +1,14 @@
+using MasaBlazorApp3.Pojo;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MasaBlazorApp3.DataAccess.Dao
+{
+ interface ISettingManuDao
+ {
+ public Task> GetMenuItemsAsync();
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/Dao/IUserDao.cs b/MasaBlazorApp3/DataAccess/Dao/IUserDao.cs
new file mode 100644
index 0000000..8b12b3c
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Dao/IUserDao.cs
@@ -0,0 +1,29 @@
+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);
+
+ bool UpdateUserPassword(User user);
+ //查询当前值班信息
+ HkcChangeShifts GetOnDuty();
+ //保存交接班信息
+ Task UpdateChangeShift(HkcChangeShifts changeShift, HkcChangeShifts changeShiftNew);
+ }
+}
diff --git a/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs b/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs
new file mode 100644
index 0000000..828ac64
--- /dev/null
+++ b/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs
@@ -0,0 +1,2386 @@
+
+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 System.Collections.Generic;
+using System.Data;
+using System.Linq;
+
+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));
+ private readonly IServiceProvider _serviceProvider;
+ 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, BoxModel boxModel, List channelLists)
+ {
+ 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;
+ if (!DateTime.TryParse(stock.EffDate, out DateTime dEffDate))
+ {
+ //效期转换出错
+ if (stock.ManuNo != null)
+ {
+ string[] idate = stock.EffDate.Split('/');
+ foreach (string iS in idate)
+ {
+ if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim()))
+ {
+ switch (iS.Replace(" ", "").Trim().Length)
+ {
+ case 4:
+ EffDate = iS.Replace(" ", "").Trim();
+ break;
+ case 2:
+ EffDate += "-" + iS.Replace(" ", "").Trim();
+ break;
+ case 1:
+ EffDate += "-0" + iS.Replace(" ", "").Trim();
+ break;
+ }
+ }
+ }
+
+
+ }
+ }
+ else
+ {
+ EffDate = dEffDate.ToString("yyyy-MM-dd");
+ }
+
+ // 出入库记录
+ 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,
+ Status = type == 1 ? 0 : (boxModel != null) ? 0 : 2,
+ BoxDrawer = boxModel == null ? 0 : boxModel.BoxName,
+ BoxColNo = boxModel == null ? 0 : boxModel.BoxNo
+ });
+ // 更新库存
+ 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("yyyy-MM-dd")).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)
+ {
+
+ if (boxModel != null)
+ {
+ //抽屉给药盒补药
+ var BoxChannelStock = Stocks.GroupBy(cs => new { cs.DrugId, cs.ManuNo, cs.EffDate }).Select(cs => new
+ {
+ cs.Key.DrugId,
+ cs.Key.ManuNo,
+ cs.Key.EffDate,
+ total = cs.Sum(it => it.TakeQuantity)
+ }).ToList();
+ foreach (var item in BoxChannelStock)
+ {
+ //查询本次加药的药盒里是否有该药品批次库存,有则累计加数量,无则insert记录
+ ChannelStock cs = _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == boxModel.BoxName && cs.ColNo == boxModel.BoxNo && cs.DrugId == item.DrugId && cs.ManuNo == item.ManuNo).FirstOrDefault();
+ if (cs != null)
+ {
+ //存在批次库存,更改数量
+ cs.Quantity += item.total;
+ int iUpdate = await _connection.UpdateAsync(cs);
+ }
+ else
+ {
+ //不存在批次库存,插入一条批次数据
+ // 保存账册
+ //查询新加的药是否是已绑定的套餐,是则将基数写入,不是则基数记为零
+ int baseQuantity = 0;
+ string listId = string.Empty;
+ ChannelStock csBase = _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == boxModel.BoxName && cs.ColNo == boxModel.BoxNo && cs.DrugId == item.DrugId).FirstOrDefault();
+ if (csBase != null)
+ {
+ baseQuantity = csBase.CheckQuantity;
+ listId = csBase.ListId;
+ }
+ int acid = _connection.InsertWithInt32Identity(new ChannelStock()
+ {
+ Id = "DM5_" + Guid.NewGuid().ToString(),
+ ListId = listId,
+ MachineId = _setting.boxMachineId,
+ DrugId = item.DrugId,
+ ManuNo = item.ManuNo,
+ EffDate = item.EffDate,
+ DrawerNo = boxModel.BoxName,
+ ColNo = boxModel.BoxNo,
+ Quantity = item.total,
+ BaseQuantity = baseQuantity
+ });
+ }
+ //将库存数加入channel_list表
+ ChannelList clList = _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.boxMachineId) && cl.DrawerNo == boxModel.BoxName && cl.ColNo == boxModel.BoxNo).FirstOrDefault();
+ if (clList != null)
+ {
+ clList.TotalQuantity += item.total;
+ int iUpdate = await _connection.UpdateAsync(clList);
+ if (iUpdate <= 0)
+ {
+ logger.Info($"抽屉加药记录药盒{boxModel.BoxName}-{boxModel.BoxNo}总库存失败,加药数量{item.total}");
+ }
+ }
+ //药盒中是否有未绑套餐且库存为0的数据,有则删除
+ _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && (string.IsNullOrEmpty(cs.ListId)) && cs.DrawerNo == boxModel.BoxName && cs.ColNo == boxModel.BoxNo && cs.Quantity <= 0).Delete();
+ //删除药盒中已绑套餐中同一药品多批次且库存为0的第一条数据
+ List delChannelStock = await _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == boxModel.BoxName && cs.ColNo == boxModel.BoxNo && cs.DrugId == item.DrugId).ToListAsync();
+ if (delChannelStock != null && delChannelStock.Count > 1)
+ {
+ //删除绑定套餐中库存为0的药的批次数据,只保留一条数据
+ //for (int i = 1; i < delChannelStock.Count; i++)
+ //{
+ // _connection.Delete(delChannelStock[i]);
+ //}
+ //删除绑定套餐中库存为0的药的批次数据,只保留一条数据
+ List del = delChannelStock.Where(c => c.Quantity <= 0).ToList();
+ if (del != null && del.Count > 0)
+ {
+ if (delChannelStock.Count == del.Count)
+ {
+ for (int j = 1; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ else
+ {
+ for (int j = 0; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ }
+ }
+ }
+ }
+ _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.Value.ToString("yyyy-MM-dd") ?? 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 = "CHECK_" + 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;
+ if (!DateTime.TryParse(stock.EffDate, out DateTime dEffDate))
+ {
+ //效期转换出错
+ if (stock.ManuNo != null)
+ {
+ string[] idate = stock.EffDate.Split('/');
+ foreach (string iS in idate)
+ {
+ if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim()))
+ {
+ switch (iS.Replace(" ", "").Trim().Length)
+ {
+ case 4:
+ EffDate = iS.Replace(" ", "").Trim();
+ break;
+ case 2:
+ EffDate += "-" + iS.Replace(" ", "").Trim();
+ break;
+ case 1:
+ EffDate += "-0" + iS.Replace(" ", "").Trim();
+ break;
+ }
+ }
+ }
+
+
+ }
+ }
+ else
+ {
+ EffDate = dEffDate.ToString("yyyy-MM-dd");
+ }
+ // 出入库记录
+ 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)
+ .Set(cs => cs.ManuNo, ManuNo)
+ .Set(cs => cs.EffDate, EffDate)
+ .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 = 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;
+ }
+ }
+
+ //抽屉获取库存数据--药品绑定
+ public async Task> GetChannelStockByBiaoDing(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.DrawerType == 1)
+ .Where(cs => cs.MachineId == _setting.machineId);
+
+ if (DrawerNo > 0)
+ {
+ query = query.Where(cs => cs.DrawerNo == DrawerNo);
+ }
+ 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> GetAllChannelListWithPlan(int? take, int? skip)
+ {
+
+ var query = _connection.ChannelList.AsQueryable()
+ .Where(cl => cl.MachineId == _setting.boxMachineId);
+ //.LoadWith(cl=>cl.PlanInfo);
+
+
+ int pagedData = await query.CountAsync();
+
+ List list = await query
+ .OrderBy((cl) => cl.DrawerNo)
+ .Skip((int)skip)
+ .Take((int)take)
+ .ToListAsync();
+ if (list != null && list.Count > 0)
+ {
+ for (int i = 0; i < list.Count; i++)
+ {
+ if (!string.IsNullOrEmpty(list[i].DrugId))
+ {
+ list[i].PlanInfo = _connection.Plan.AsQueryable().Where(p => p.Id == Convert.ToInt32(list[i].DrugId)).FirstOrDefault();
+ }
+ list[i].BoxDisabled = list[i].TotalQuantity > 0 ? true : false;
+ }
+ }
+
+ var other = _connection.Plan.AsQueryable().Where(p => p.UseState == 1 && p._PlanDetails.Count > 0);
+ List planInfos = await other
+ .LoadWith(p => p._PlanDetails.Where(pd => pd.UseState == 1))
+ .OrderBy((p) => p.Id)
+ .ToListAsync();
+ if (planInfos != null && planInfos.Count > 0)
+ {
+ for (int i = 0; i < planInfos.Count(); i++)
+ {
+ for (int j = 0; j < planInfos[i]._PlanDetails.Count(); j++)
+ {
+ planInfos[i]._PlanDetails[j]._DrugInfo =
+ _connection.DrugInfo.AsQueryable().Where(di => di.DrugId == planInfos[i]._PlanDetails[j].DrugId).First();
+
+ }
+ }
+ }
+
+ return new PageMultiData()
+ {
+
+ TotalDesserts = pagedData,
+ Desserts = list,
+ Other = planInfos
+ };
+ }
+ ///
+ /// 手术室药盒绑定套餐
+ ///
+ ///
+ public async Task BindBox(ChannelList list, Plan plan)
+ {
+ try
+ {
+ _connection.BeginTransaction();
+ bool bFlag = true;
+
+ var q = _connection.ChannelList
+ .Where(cs => cs.Id == list.Id).Set(cs => cs.DrugId, plan.Id.ToString());
+ //将套餐中的药品信息写入channelStock
+ //查询套餐中药品信息
+ var query = _connection.PlanDetails.AsQueryable().Where(p => p.PlanId == plan.Id && p.UseState == 1);
+ List planInfos = await query.ToListAsync();
+ if (planInfos != null && planInfos.Count > 0)
+ {
+ for (int i = 0; i < planInfos.Count; i++)
+ {
+ int mid = await _connection.InsertAsync(new ChannelStock()
+ {
+ Id = Guid.NewGuid().ToString(),
+ ListId = list.Id,
+ MachineId = list.MachineId,
+ DrawerNo = list.DrawerNo,
+ ColNo = list.ColNo,
+ DrugId = planInfos[i].DrugId.ToString(),
+ BaseQuantity = planInfos[i].BaseQuantity,
+ //BoxState = 1
+ });
+ if (mid > 0)
+ {
+ bFlag = true;
+ }
+ else
+ {
+ bFlag = false;
+ break;
+ }
+ }
+ }
+ var r = await q.UpdateAsync();
+ if (bFlag && r > 0)
+ {
+ //保存操作记录
+ int mid = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = _setting.machineId,
+ DrawerNo = list.DrawerNo,
+ ColNo = list.ColNo,
+ DrugId = list.DrugId,
+ OperationTime = DateTime.Now,
+ Type = 55,
+ Quantity = list.TotalQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = $"药盒{list.DrawerNo}绑定套餐{list.DrugId}",
+ //GetId = operationVo.data.Id
+ });
+ _connection.CommitTransaction();
+ return true;
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ _connection.RollbackTransaction();
+ logger.Info($"绑定套餐异常{ex.Message}");
+ return false;
+ }
+ }
+ ///
+ /// 手术室药盒绑定套餐
+ ///
+ ///
+ public async Task BindBox(ChannelList list)
+ {
+ try
+ {
+ _connection.BeginTransaction();
+ bool bFlag = true;
+
+ var q = _connection.ChannelList
+ .Where(cs => cs.Id == list.Id).Set(cs => cs.DrugId, list.PlanInfo.Id.ToString());
+ //将套餐中的药品信息写入channelStock
+ //查询套餐中药品信息
+ var query = _connection.PlanDetails.AsQueryable().Where(p => p.PlanId == list.PlanInfo.Id && p.UseState == 1);
+ List planInfos = await query.ToListAsync();
+ if (planInfos != null && planInfos.Count > 0)
+ {
+ for (int i = 0; i < planInfos.Count; i++)
+ {
+ int mid = await _connection.InsertAsync(new ChannelStock()
+ {
+ Id = Guid.NewGuid().ToString(),
+ ListId = list.Id,
+ MachineId = list.MachineId,
+ DrawerNo = list.DrawerNo,
+ ColNo = list.ColNo,
+ DrugId = planInfos[i].DrugId.ToString(),
+ BaseQuantity = planInfos[i].BaseQuantity,
+ //BoxState = 1
+ });
+ if (mid > 0)
+ {
+ bFlag = true;
+ }
+ else
+ {
+ bFlag = false;
+ break;
+ }
+ }
+ }
+ var r = await q.UpdateAsync();
+ if (bFlag && r > 0)
+ {
+ //保存操作记录
+ int mid = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = _setting.machineId,
+ DrawerNo = list.DrawerNo,
+ ColNo = list.ColNo,
+ DrugId = list.DrugId,
+ OperationTime = DateTime.Now,
+ Type = 55,
+ Quantity = list.TotalQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = $"药盒{list.DrawerNo}绑定套餐{list.DrugId}",
+ //GetId = operationVo.data.Id
+ });
+ _connection.CommitTransaction();
+ return true;
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ _connection.RollbackTransaction();
+ logger.Info($"绑定套餐异常{ex.Message}");
+ return false;
+ }
+ }
+ ///
+ /// 手术室药盒解绑套餐
+ ///
+ ///
+ ///
+ public async Task UnBindBox(ChannelList list)
+ {
+ try
+ {
+ _connection.BeginTransaction();
+
+ var r = await _connection.ChannelList
+ .Where(cs => cs.Id == list.Id)
+ .Set(cs => cs.DrugId, String.Empty)
+ .UpdateAsync();
+ int iCount = await _connection.ChannelStock.Where(cs => cs.ListId == list.Id).CountAsync();
+ int cs = 0;
+ if (iCount > 0)
+ {
+ cs = await _connection.ChannelStock.Where(cs => cs.ListId == list.Id).DeleteAsync();
+ }
+ if (r > 0 && (iCount > 0 && cs > 0 || iCount <= 0))
+ {
+ //保存操作记录
+ int mid = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = _setting.machineId,
+ DrawerNo = list.DrawerNo,
+ ColNo = list.ColNo,
+ DrugId = list.DrugId,
+ OperationTime = DateTime.Now,
+ Type = 56,
+ Quantity = list.TotalQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = $"药盒{list.DrawerNo}解绑套餐{list.DrugId}",
+ //GetId = operationVo.data.Id
+ });
+ _connection.CommitTransaction();
+ return true;
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ return false;
+ }
+ }
+ catch (Exception ex)
+ {
+ _connection.RollbackTransaction();
+ logger.Info($"手术室药盒解绑异常:{ex.Message}");
+ return false;
+ }
+ }
+ //获取手术室药盒中所有要补药的数据
+ public async Task> GetAllBoxAddDrug(int? take, int? skip)
+ {
+ try
+ {
+ List channelLists = new List();
+ var query = _connection.ChannelStock//.AsQueryable()
+ .Where(cs => cs.MachineId == _setting.boxMachineId)
+ .GroupBy(cs => new { cs.DrawerNo, cs.ColNo, cs.DrugId })
+ .Select(g => new
+ {
+ DrawerNo = g.Key.DrawerNo,
+ DrugId = g.Key.DrugId,
+ ColNo = g.Key.ColNo,
+ sumQuantity = g.Sum(cs => cs.Quantity),
+ baseQuantity = g.Max(cs => cs.BaseQuantity),
+ sumAdd = g.Sum(cs => cs.AddToQuantity)
+ }).Where(x => x.baseQuantity > x.sumQuantity + x.sumAdd)
+ .ToList();
+
+ var queryChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId == _setting.boxMachineId)
+ .LoadWith(cs => cs.Drug).ToList();
+
+
+ var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
+ for (int i = 0; i < queryList.Count; i++)
+ {
+ foreach (var item in query)
+ {
+ if (queryList[i].DrawerNo == item.DrawerNo && queryList[i].ColNo == item.ColNo)
+ {
+ ChannelStock stock = queryChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.ColNo == item.ColNo && cs.DrugId == item.DrugId && cs.BaseQuantity > item.sumQuantity).FirstOrDefault();
+ if (stock != null)
+ {
+ stock.NeedQuantity = stock.BaseQuantity - item.sumQuantity;
+ queryList[i].ChannelStocks.Add(stock);
+ }
+ }
+ }
+ if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
+ {
+ channelLists.Add(queryList[i]);
+ }
+ }
+
+ //if (query != null && query.Count > 0)
+ //{
+ // var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
+ // for (int i = 0; i < queryList.Count; i++)
+ // {
+ // foreach (var item in query)
+ // {
+ // if (queryList[i].DrawerNo == item.DrawerNo)
+
+ // {
+ // ChannelStock? stock = _connection.ChannelStock.AsQueryable()
+ // .Where(cs => cs.MachineId == _setting.boxMachineId && cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId).LoadWith(cs => cs.Drug).FirstOrDefault();
+ // stock.NeedQuantity = item.baseQuantity - item.sumQuantity;
+ // queryList[i].ChannelStocks.Add(stock);
+ // }
+ // }
+ // if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
+ // {
+ // channelLists.Add(queryList[i]);
+ // }
+ // }
+ //}
+
+
+ int pagedData = channelLists.Count;
+
+
+
+
+ return new PageData()
+ {
+
+ TotalDesserts = pagedData,
+ Desserts = channelLists
+ };
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"获取药盒中补药数据失败{ex.Message}");
+ return null;
+ }
+ }
+
+ //手术室药盒补药获取毒麻柜中的药品信息
+ public async Task> getTakeInfoByBox(ChannelList cl)
+ {
+ try
+ {
+ List tempData = new();
+ List tempData2 = new();
+ var flag = true;
+ for (int i = 0; i < cl.ChannelStocks.Count; i++)
+ {
+ ChannelStock boxCs = cl.ChannelStocks[i];
+ // 当前药品取药数量
+ var Quantity = boxCs.NeedQuantity;
+ List stockList = await _connection.ChannelStock
+ .Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == 1 && cs.DrugId == boxCs.DrugId && cs.Quantity > 0 && cs.ManuNo != null)
+ .AsQueryable()
+ .OrderBy(cs => new { cs.EffDate, cs.Quantity }).ToListAsync();
+
+ // 当前药品的库存总量
+ var total = stockList.Sum(current => current.Quantity);
+
+ tempData2.Add(new BoxTakeVo()
+ {
+ Drug = boxCs.Drug,
+ 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 BoxTakeVo()
+ {
+ Drug = boxCs.Drug,
+ BoxDetail = boxCs,
+ ChannelStock = stock,
+ StockQuantity = total,
+ Quantity = stock.Quantity,
+ });
+ Quantity -= stock.Quantity;
+ }
+ else
+ {
+ //取药数量小于库存
+ tempData.Add(new BoxTakeVo()
+ {
+ Drug = boxCs.Drug,
+ BoxDetail = boxCs,
+ ChannelStock = stock,
+ StockQuantity = total,
+ Quantity = Quantity,
+ });
+ Quantity = 0;
+ }
+ }
+ }
+ else
+ {
+ // 库存不足
+ flag = false;
+ }
+ }
+ }
+ if (flag)
+ {
+ tempData.Sort((s1, s3) =>
+ {
+ int i = s1.ChannelStock.DrawerNo.CompareTo(s3.ChannelStock.DrawerNo);
+ if (i == 0)
+ {
+ return s1.ChannelStock.ColNo.CompareTo(s3.ChannelStock.ColNo);
+ }
+ return i;
+ });
+ return tempData;
+ }
+ else
+ {
+ return tempData2;
+ }
+
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"获取数据异常{ex.Message}");
+ return null;
+ }
+ }
+ //手术室药盒补药完成
+ public async Task BoxTakeFinish(List datas, ChannelList boxChannelList)
+ {
+
+ try
+ {
+ _connection.BeginTransaction();
+ var flag = true;
+ for (var i = 0; i < datas.Count; i++)
+ {
+ var boxTakeVo = datas[i];
+ var EffDate = boxTakeVo.ChannelStock.EffDate;
+ if (!DateTime.TryParse(boxTakeVo.ChannelStock.EffDate, out DateTime dEffDate))
+ {
+ //效期转换出错
+ if (boxTakeVo.ChannelStock.EffDate != null)
+ {
+ string[] idate = boxTakeVo.ChannelStock.EffDate.Split('/');
+ foreach (string iS in idate)
+ {
+ if (!string.IsNullOrEmpty(iS.Trim()))
+ {
+ switch (iS.Trim().Length)
+ {
+ case 4:
+ EffDate = iS.Trim();
+ break;
+ case 2:
+ EffDate += "-" + iS.Trim();
+ break;
+ case 1:
+ EffDate += "-0" + iS.Trim();
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ EffDate = dEffDate.ToString("yyyy-MM-dd");
+ }
+ // 出库记录
+ int mid = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = _setting.machineId,
+ DrawerNo = boxTakeVo.ChannelStock.DrawerNo,
+ ColNo = boxTakeVo.ChannelStock.ColNo,
+ DrugId = boxTakeVo.ChannelStock.DrugId,
+ ManuNo = boxTakeVo.ChannelStock.ManuNo,
+ EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
+ OperationTime = DateTime.Now,
+ Type = 2,
+ Status = 2,//给交接柜补药不需要还药或还空瓶
+ Quantity = boxTakeVo.GetQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = boxTakeVo.BoxDetail.Id.ToString(),
+ });
+ // 更新库存
+ int r = _connection.ChannelStock.Where(cs => cs.Id == boxTakeVo.ChannelStock.Id)
+ .Set(cs => cs.Quantity, boxTakeVo.ChannelStock.Quantity - boxTakeVo.GetQuantity)
+ .Update();
+ #region 保存账册,给药盒补药不记录出库账册
+ // 获取更新完库存之后的药品库存
+ //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(boxTakeVo.ChannelStock.DrugId))
+ // .ToListAsync();
+ // 保存账册,给药盒补药不记录出库账册
+ //int acid = _connection.InsertWithInt32Identity(new AccountBook()
+ //{
+ // MachineId = _setting.machineId,
+ // DrugId = boxTakeVo.ChannelStock.DrugId,
+ // ManuNo = boxTakeVo.ChannelStock.ManuNo,
+ // EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
+ // OperationTime = DateTime.Now,
+ // Type = 2,
+ // OutQuantity = boxTakeVo.GetQuantity,
+ // AddQuantity = 0,
+ // Operator = _globalStateService.Operator.Id,
+ // Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ // ManuStock = list.Where(it => it.ManuNo == boxTakeVo.ChannelStock.ManuNo).Sum(it => it.Quantity),
+ // TotalStock = list.Sum(it => it.Quantity),
+ // //InvoiceId = orderTakeVo.OrderDetail.Id.ToString()
+ //});
+ #endregion
+ //查询药盒中是否有该批次药品,有则把对应数量累加,无则insert
+ ChannelStock? BoxChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == boxTakeVo.BoxDetail.DrawerNo && cs.ColNo == boxTakeVo.BoxDetail.ColNo && cs.DrugId == boxTakeVo.ChannelStock.DrugId && cs.ManuNo == boxTakeVo.ChannelStock.ManuNo && cs.EffDate == EffDate).FirstOrDefault();
+ int boxID = 0;
+ if (BoxChannelStock != null)
+ {
+ //BoxChannelStock.AddToQuantity += boxTakeVo.GetQuantity;
+ //BoxChannelStock.BoxState = 2;
+ //改为直接加到药盒库存中
+ BoxChannelStock.Quantity += boxTakeVo.GetQuantity;
+ boxID = await _connection.UpdateAsync(BoxChannelStock);
+ }
+ else
+ {
+ //更新药盒中的药品数量
+ boxID = _connection.Insert(new ChannelStock()
+ {
+ Id = Guid.NewGuid().ToString(),
+ ListId = boxTakeVo.BoxDetail.ListId,
+ MachineId = _setting.boxMachineId,
+ DrawerNo = boxTakeVo.BoxDetail.DrawerNo,
+ ColNo = boxTakeVo.BoxDetail.ColNo,
+ //AddToQuantity = boxTakeVo.Quantity,//boxTakeVo.GetQuantity,
+ //NeedQuantity = 0,
+ Quantity = boxTakeVo.GetQuantity,
+ DrugId = boxTakeVo.ChannelStock.DrugId,
+ ManuNo = boxTakeVo.ChannelStock.ManuNo,
+ EffDate = EffDate,
+ BaseQuantity = boxTakeVo.BoxDetail.BaseQuantity,
+ BoardType = boxTakeVo.BoxDetail.BoardType,
+ //BoxState = 2, //补药完成
+ FillTime = DateTime.Now
+ });
+ }
+ // 手术室药盒入库记录
+ int boxMId = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = _setting.machineId,
+ DrawerNo = boxTakeVo.BoxDetail.DrawerNo,
+ ColNo = boxTakeVo.BoxDetail.ColNo,
+ DrugId = boxTakeVo.ChannelStock.DrugId,
+ ManuNo = boxTakeVo.ChannelStock.ManuNo,
+ EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
+ OperationTime = DateTime.Now,
+ Type = 1,
+ Quantity = boxTakeVo.GetQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = boxTakeVo.ChannelStock.Id.ToString(),
+ });
+ int delResutl = await _connection.ChannelStock.Where(cs => cs.MachineId == boxTakeVo.BoxDetail.MachineId && cs.DrugId == boxTakeVo.BoxDetail.DrugId && cs.DrawerNo == boxTakeVo.BoxDetail.DrawerNo && cs.ColNo == boxTakeVo.BoxDetail.ColNo && cs.ManuNo == null).DeleteAsync();
+ if (mid > 0 && r > 0 && boxID > 0 && boxMId > 0)
+ {
+ if (boxTakeVo.ChannelStock.BoardType.ToString().Contains("5"))
+ {
+ await _portUtil.WriteQuantityMethod(boxTakeVo.ChannelStock.Quantity - boxTakeVo.GetQuantity, boxTakeVo.ChannelStock.DrawerNo, boxTakeVo.ChannelStock.ColNo);
+ }
+
+ }
+ else
+ {
+ flag = false;
+ break;
+ }
+ }
+ if (flag)
+ {
+ int totalQuantity = boxChannelList.TotalQuantity + datas.Sum(it => it.GetQuantity);
+ int list = _connection.ChannelList.Where(cl => cl.Id == boxChannelList.Id)
+ .Set(cl => cl.TotalQuantity, totalQuantity)
+ .Update();
+ _connection.CommitTransaction();
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ }
+ return flag;
+
+ }
+ catch (Exception ex)
+ {
+ logger.Error("处方取药完成保存数据库失败,错误:" + ex.Message);
+ _connection.RollbackTransaction();
+ return false;
+ }
+ }
+
+
+ //手术室药盒入库
+ public async Task> GetBoxWaitInfo(int? take, int? skip)
+ {
+ try
+ {
+ List channelLists = new List();
+ var query = _connection.ChannelStock//.AsQueryable()
+ .Where(cs => cs.MachineId == _setting.boxMachineId)
+ .GroupBy(cs => new { cs.DrawerNo, cs.DrugId })
+ .Select(g => new
+ {
+ DrawerNo = g.Key.DrawerNo,
+ DrugId = g.Key.DrugId,
+ sumQuantity = g.Sum(cs => cs.Quantity),
+ baseQuantity = g.Max(cs => cs.BaseQuantity),
+ AddToQuantity = g.Sum(cs => cs.AddToQuantity)
+ }).Where(x => x.baseQuantity > x.sumQuantity)
+ .ToList();
+
+ var queryChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId == _setting.boxMachineId && cs.BoxState == 2)
+ .LoadWith(cs => cs.Drug).ToList();
+
+
+ var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
+ for (int i = 0; i < queryList.Count; i++)
+ {
+ foreach (var item in query)
+ {
+ if (queryList[i].DrawerNo == item.DrawerNo)
+ {
+ ChannelStock? stock = queryChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId && cs.BaseQuantity > item.sumQuantity).FirstOrDefault();
+ if (stock != null)
+ {
+ stock.NeedQuantity = stock.BaseQuantity - item.sumQuantity;
+ stock.AddToQuantity = item.AddToQuantity;
+ queryList[i].ChannelStocks.Add(stock);
+ }
+ }
+ }
+ if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
+ {
+ channelLists.Add(queryList[i]);
+ }
+ }
+ int pagedData = channelLists.Count;
+
+
+
+
+ return new PageData()
+ {
+
+ TotalDesserts = pagedData,
+ Desserts = channelLists
+ };
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"获取药盒中补药数据失败{ex.Message}");
+ return null;
+ }
+ }
+ // 药盒入库弹窗页面获取要入库的药品明细信息
+ public async Task> GetBoxAddToBox(ChannelList cl)
+ {
+ if (cl != null)
+ {
+ List manuNosList = new List();
+ foreach (var item in cl.ChannelStocks)
+ {
+ List manuList = new List();
+ List csList = _connection.ChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId && cs.BoxState == 2).ToList();
+ for (int i = 0; i < csList.Count; i++)
+ {
+ var existingItem = manuList.FirstOrDefault(item => item.DrugId == csList[i].DrugId && item.ManuNo == csList[i].ManuNo && item.EffDate.ToString() == csList[i].EffDate);
+ if (existingItem != null)
+ {
+ existingItem.Quantity += csList[i].AddToQuantity;
+ }
+ else
+ {
+ DrugManuNo manu = new DrugManuNo();
+ manu.DrugId = csList[i].DrugId;
+ manu.ManuNo = csList[i].ManuNo;
+ manu.EffDate = Convert.ToDateTime(csList[i].EffDate);
+ manu.Quantity = csList[i].AddToQuantity;
+ manuList.Add(manu);
+ }
+ }
+ item.drugManuNoList = manuList;
+ }
+ }
+ return cl.ChannelStocks;
+ }
+ //手术室药盒入库获取待入库明细
+ public async Task> getBoxWaitByBox(ChannelList cl, int? take, int? skip)
+ {
+ try
+ {
+ List tempData = new();
+ List tempData2 = new();
+ var flag = true;
+ for (int i = 0; i < cl.ChannelStocks.Count; i++)
+ {
+ ChannelStock boxCs = cl.ChannelStocks[i];
+ // 当前药品取药数量
+ var Quantity = boxCs.NeedQuantity;
+ List stockList = await _connection.ChannelStock
+ .Where(cs => cs.MachineId == _setting.boxMachineId && cs.DrugId == boxCs.DrugId && cs.Quantity > 0 && cs.ManuNo != null)
+ .AsQueryable()
+ .Skip((int)skip)
+ .Take((int)take)
+ .OrderBy(cs => cs.EffDate).ToListAsync();
+
+ // 当前药品的库存总量
+ var total = stockList.Sum(current => current.Quantity);
+
+ tempData2.Add(new BoxTakeVo()
+ {
+ Drug = boxCs.Drug,
+ StockQuantity = total,
+ Quantity = Quantity
+ });
+ }
+ return tempData;
+
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"获取数据异常{ex.Message}");
+ return null;
+ }
+ }
+ // 手术室药盒待入库明细入库完成
+ public async Task BoxAddBoxFinish(ChannelList boxChannelList)
+ {
+ try
+ {
+ _connection.BeginTransaction();
+ bool flag = true;
+ int totalQuantity = 0;
+ for (var i = 0; i < boxChannelList.ChannelStocks.Count; i++)
+ {
+ for (int j = 0; j < boxChannelList.ChannelStocks[i].drugManuNoList.Count; j++)
+ {
+ var EffDate = boxChannelList.ChannelStocks[i].drugManuNoList[j].EffDate?.ToString("yyyy-MM-dd");
+ //效期转换出错
+ //if (boxChannelList.ChannelStocks[i].EffDate != null)
+ //{
+ // string[] idate = boxChannelList.ChannelStocks[i].EffDate.Split('/');
+ // foreach (string iS in idate)
+ // {
+ // if (!string.IsNullOrEmpty(iS.Trim()))
+ // {
+ // switch (iS.Trim().Length)
+ // {
+ // case 4:
+ // EffDate = iS.Trim();
+ // break;
+ // case 2:
+ // EffDate += "-" + iS.Trim();
+ // break;
+ // case 1:
+ // EffDate += "-0" + iS.Trim();
+ // break;
+ // }
+ // }
+ // }
+ //}
+ // 手术室药盒入库记录
+ int mid = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = _setting.boxMachineId,
+ DrawerNo = boxChannelList.ChannelStocks[i].DrawerNo,
+ DrugId = boxChannelList.ChannelStocks[i].DrugId,
+ ManuNo = boxChannelList.ChannelStocks[i].drugManuNoList[j].ManuNo,
+ EffDate = boxChannelList.ChannelStocks[i].drugManuNoList[j].EffDate,//!String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
+ OperationTime = DateTime.Now,
+ Type = 1,
+ Quantity = boxChannelList.ChannelStocks[i].drugManuNoList[j].Quantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = boxChannelList.ChannelStocks[i].Id.ToString(),
+ });
+ // 更新库存
+ ChannelStock? updateChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.DrawerNo == boxChannelList.ChannelStocks[i].DrawerNo && cs.DrugId == boxChannelList.ChannelStocks[i].drugManuNoList[j].DrugId && cs.ManuNo == boxChannelList.ChannelStocks[i].drugManuNoList[j].ManuNo && cs.EffDate == EffDate)
+ .FirstOrDefault();
+ int r = 0;
+ if (updateChannelStock != null)
+ {
+ updateChannelStock.Quantity = updateChannelStock.Quantity + boxChannelList.ChannelStocks[i].drugManuNoList[j].Quantity;
+ updateChannelStock.AddToQuantity = 0;
+ updateChannelStock.NeedQuantity = 0;
+ updateChannelStock.BoxState = 0;
+ //updateChannelStock.EffDate = EffDate?.ToString("yyyy-MM-dd");
+ //updateChannelStock.ManuNo = boxChannelList.ChannelStocks[i].drugManuNoList[j].ManuNo;
+ r = _connection.Update(updateChannelStock);
+
+ }
+
+ //totalQuantity += _connection.PlanDetails.Where(p => p.PlanId == Convert.ToInt32(boxChannelList.DrugId) && p.DrugId == boxChannelList.ChannelStocks[i].DrugId).Sum(p => p.BaseQuantity);
+ totalQuantity += boxChannelList.ChannelStocks[i].drugManuNoList[j].Quantity;
+
+ if (!(mid > 0 && (updateChannelStock == null || r > 0)))
+ {
+ flag = false;
+ break;
+ }
+
+ }
+ }
+ if (flag)
+ {
+ boxChannelList.TotalQuantity += totalQuantity;
+ int updateResult = _connection
+ .Update(boxChannelList);
+ if (updateResult > 0)
+ {
+ _connection.CommitTransaction();
+ }
+ else
+ {
+ flag = false;
+ _connection.RollbackTransaction();
+ }
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ }
+ return flag;
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"手术室药盒待入库明细入库完成操作异常:{ex.Message}");
+ return false;
+ }
+ }
+
+ //手术室药盒获取药盒药品及库存信息
+ public async Task> GetBoxDrugInfo(string strDrawerNoCol, int? take, int? skip)
+ {
+ if (!string.IsNullOrEmpty(strDrawerNoCol))
+ {
+ int drawerNo = 0;
+ int colNo = 0;
+ var spl = strDrawerNoCol.Split('-');
+ if (spl != null && spl.Count() > 0)
+ {
+ drawerNo = Convert.ToInt32(spl[0]);
+ colNo = Convert.ToInt32(spl[1]);
+ }
+
+ var query = _connection.PlanDetails.AsQueryable()
+ .InnerJoin(
+ _connection.ChannelList.Where(cl => cl.MachineId == _setting.boxMachineId && cl.DrawerNo.Equals(drawerNo) && cl.ColNo.Equals(colNo)),
+ (pd, cl) => pd.PlanId.ToString() == cl.DrugId,
+ (pd, cl) => pd).Where(pd => pd.UseState == 1);
+
+ //查询不在套餐中的药
+ List outOfPlanStock = await _connection.ChannelStock
+ .Where(cs => cs.MachineId == _setting.boxMachineId && cs.DrawerNo.Equals(drawerNo) && cs.ColNo.Equals(colNo) && string.IsNullOrEmpty(cs.ListId))
+ .LoadWith(cs => cs.Drug)
+ .LoadWith(cs => cs.Drug.Manus)
+ .ToListAsync();
+ List outOfPlanDetailList = new();
+ if (outOfPlanStock != null && outOfPlanStock.Count > 0)
+ {
+ for (int i = 0; i < outOfPlanStock.Count; i++)
+ {
+ outOfPlanDetailList.Add(new PlanDetails()
+ {
+ _DrugInfo = outOfPlanStock[i].Drug,
+ channelStocks = outOfPlanStock,
+ _ManuNo = null
+ });
+
+ }
+ }
+
+ int pagedData = await query.CountAsync();
+
+ List list = await query
+ .LoadWith(pd => pd._DrugInfo)
+ //.LoadWith(pd => cl._PlanDetails._DrugInfo)
+ .OrderBy((pd) => pd.DrugId)
+ //.ThenBy((cl) => cl.ColNo)
+ //.Skip((int)skip)
+ //.Take((int)take)
+ .ToListAsync();
+ if (list != null && list.Count > 0)
+ {
+ for (int i = 0; i < list.Count; i++)
+ {
+ list[i].channelStocks = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId == _setting.boxMachineId && cs.DrawerNo == drawerNo && cs.ColNo == colNo && cs.DrugId == list[i].DrugId)
+ .LoadWith(cs => cs.Drug)
+ .LoadWith(cs => cs.Drug.Manus)
+ .ToList();
+ }
+ }
+ if (outOfPlanDetailList != null && outOfPlanDetailList.Count > 0)
+ {
+ for (int i = 0; i < outOfPlanDetailList.Count; i++)
+ {
+ list.Add(outOfPlanDetailList[i]);
+ }
+ }
+
+ //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
+ };
+ }
+ else
+ {
+ return null;
+ }
+ }
+ //药盒移库时获取选中药盒号的药品信息
+ public async Task> GetChannelStockByDrug(ChannelStock cs, string strDrawerNoCol, int? take, int? skip)
+ {
+ try
+ {
+ int drawerNo = 0;
+ int colNo = 0;
+ var spl = strDrawerNoCol.Split('-');
+ if (spl != null && spl.Count() > 0)
+ {
+ drawerNo = Convert.ToInt32(spl[0]);
+ if (drawerNo > 30)
+ {
+ colNo = Convert.ToInt32(spl[1]);
+ }
+ else
+ {
+ colNo = Convert.ToInt32(spl[1] == "白" ? 1 : 2);
+ }
+ }
+ //else if (strDrawerNoCol.Length > 0)
+ //{
+ // switch (strDrawerNoCol)
+ // {
+ // case "胃镜药盒":
+ // drawerNo = 31;
+ // colNo = 1;
+ // break;
+ // case "导管药盒":
+ // drawerNo = 32;
+ // colNo = 1;
+ // break;
+ // case "生殖药盒":
+ // drawerNo = 33;
+ // colNo = 1;
+ // break;
+ // case "妇门药盒":
+ // drawerNo = 34;
+ // colNo = 1;
+ // break;
+ // case "急诊药盒":
+ // drawerNo = 99;
+ // colNo = 1;
+ // break;
+ // case "恢复室药盒":
+ // drawerNo = 111;
+ // colNo = 1;
+ // break;
+ // }
+ //}
+
+ var query = _connection.ChannelStock.AsQueryable().Where(c => c.MachineId == _setting.boxMachineId && c.DrawerNo.Equals(drawerNo) && c.ColNo.Equals(colNo) && c.DrugId.Equals(cs.DrugId) && c.ManuNo != cs.ManuNo);
+ int pagedData = await query.CountAsync();
+
+ List list = await query
+ .LoadWith(cs => cs.Drug)
+ .OrderBy((cs) => cs.DrugId)
+ .Skip((int)skip)
+ .Take((int)take)
+ .ToListAsync();
+
+ return new PageData()
+ {
+
+ TotalDesserts = pagedData,
+ Desserts = list
+ };
+
+
+
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"药盒移库时获取选中药盒号的药品信息异常:{ex.Message}");
+ return null;
+ }
+ }
+
+
+ ///
+ /// 药盒交换药品获取所有除本药盒外的所有药盒号
+ ///
+ ///
+ ///
+ public async Task GetDrawerNum(ChannelStock channelStock)
+ {
+ //string[] stringArray = _connection.ChannelStock.Where(cs => cs.MachineId == channelStock.MachineId && cs.DrugId == channelStock.DrugId && cs.DrawerNo != channelStock.DrawerNo && !string.IsNullOrEmpty(cs.ManuNo) && cs.ManuNo != channelStock.ManuNo)
+ // .GroupBy(cs => new { cs.DrawerNo, cs.ColNo }).Select(cs => cs.Key.DrawerNo == 99 ? "急诊药盒" : cs.Key.DrawerNo == 111 ? "恢复室药盒" : cs.Key.DrawerNo == 31 ? "胃镜药盒" : cs.Key.DrawerNo == 32 ? "导管药盒" : cs.Key.DrawerNo == 33 ? "生殖药盒" : cs.Key.DrawerNo == 34 ? "妇门药盒" : cs.Key.DrawerNo.ToString() + "-" + (cs.Key.ColNo == 1 ? "白" : "绿")).ToArray();
+ //return stringArray;
+ string[] stringArray = _connection.ChannelStock.Where(cs => cs.MachineId == channelStock.MachineId && cs.DrugId == channelStock.DrugId && !string.IsNullOrEmpty(cs.ManuNo) && cs.ManuNo != channelStock.ManuNo && (cs.DrawerNo == channelStock.DrawerNo && cs.ColNo != channelStock.ColNo || cs.DrawerNo != channelStock.DrawerNo))
+ .GroupBy(cs => new { cs.DrawerNo, cs.ColNo })
+ .Select(cs => cs.Key.DrawerNo == 99 ? "急诊药盒" : cs.Key.DrawerNo == 111 ? "恢复室药盒" : cs.Key.DrawerNo == 31 ? "胃镜药盒" : cs.Key.DrawerNo == 32 ? "导管药盒" : cs.Key.DrawerNo == 33 ? "生殖药盒" : cs.Key.DrawerNo == 34 ? "妇门药盒" : cs.Key.DrawerNo.ToString() + "-" + (cs.Key.ColNo == 1 ? "白" : "绿")).ToArray();
+ return stringArray;
+ }
+ ///
+ /// 药盒移除药品,获取所有除本药盒外的所有包含该药品的药盒号
+ ///
+ ///
+ ///
+ public async Task GetDrawerNumForRemove(ChannelStock channelStock)
+ {
+ string[] stringArray = _connection.ChannelStock.Where(cs => cs.MachineId == channelStock.MachineId && (cs.DrawerNo == channelStock.DrawerNo && cs.ColNo != channelStock.ColNo || cs.DrawerNo != channelStock.DrawerNo))
+ .GroupBy(cs => new { cs.DrawerNo, cs.ColNo })
+ .Select(cs => cs.Key.DrawerNo == 99 ? "急诊药盒" : cs.Key.DrawerNo == 111 ? "恢复室药盒" : cs.Key.DrawerNo == 31 ? "胃镜药盒" : cs.Key.DrawerNo == 32 ? "导管药盒" : cs.Key.DrawerNo == 33 ? "生殖药盒" : cs.Key.DrawerNo == 34 ? "妇门药盒" : cs.Key.DrawerNo.ToString() + "-" + (cs.Key.ColNo == 1 ? "白" : "绿")).ToArray();
+ string[] stringDrawer = _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId && cs.DrugId == channelStock.DrugId && cs.ManuNo == channelStock.ManuNo).Select(cs => cs.Location).ToArray();
+ string[] resultArr = stringArray.Concat(stringDrawer).ToArray();
+ return resultArr;
+ }
+ //手术室药盒交换药品完成
+ public async Task BoxReplaceFinish(ChannelStock stock, List stockList)
+ {
+ try
+ {
+ bool flag = true;
+ _connection.BeginTransaction();
+ for (int i = 0; i < stockList.Count; i++)
+ {
+ //查询出药的药盒是否有该批次的药品
+ ChannelStock replace1ChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == stock.DrawerNo && cs.ColNo == stock.ColNo && cs.DrugId == stockList[i].DrugId && cs.ManuNo == stockList[i].ManuNo)
+ .FirstOrDefault();
+ if (replace1ChannelStock != null)
+ {
+ //如果有该批次的药品,则更新数量
+ int r = _connection.ChannelStock.Where(cs => cs.Id == replace1ChannelStock.Id)
+ .Set(cs => cs.Quantity, replace1ChannelStock.Quantity + stockList[i].AddQuantity)
+ .Update();
+ if (r <= 0)
+ {
+ logger.Info($"更新药盒药品数量失败,药盒号:{stockList[i].Location},药品ID:{stockList[i].DrugId}");
+ }
+ }
+ else
+ {
+ //如果没有该批次的药品,则新增一条批次数据
+ int mid = _connection.Insert(new ChannelStock()
+ {
+ Id = Guid.NewGuid().ToString(),
+ ListId = stock.ListId,
+ MachineId = _setting.boxMachineId,
+ DrawerNo = stock.DrawerNo,
+ ColNo = stock.ColNo,
+ DrugId = stock.DrugId,
+ ManuNo = stockList[i].ManuNo,
+ EffDate = stockList[i].EffDate,
+ DrawerType = stock.DrawerType,
+ BoardType = stock.BoardType,
+ Quantity = stockList[i].AddToQuantity,
+ BaseQuantity = stock.BaseQuantity,
+ //BoxState = 1
+ });
+ if (mid <= 0)
+ {
+ logger.Info($"新增药盒药品记录失败,药盒号:{stockList[i].DrawerNo},药品ID:{stockList[i].DrugId}");
+ flag = false;
+ break;
+ }
+ }
+
+ //记录操作记录
+ int recordId = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = stock.MachineId,
+ DrawerNo = stock.DrawerNo,
+ ColNo = stock.ColNo,
+ DrugId = stock.DrugId,
+ ManuNo = stock.ManuNo,
+ EffDate = !String.IsNullOrEmpty(stock.EffDate) ? DateTime.ParseExact(stock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
+ OperationTime = DateTime.Now,
+ Type = 69, //交换
+ Quantity = stockList[i].AddQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ InvoiceId = $"{stock.Location}-{stock.Drug.DrugName}-{stock.ManuNo}与{stockList[i].Location}-{stockList[i].Drug.DrugName}-{stockList[i].ManuNo}交换,交换数量{stockList[i].AddQuantity}",
+ BoxDrawer = stockList[i].DrawerNo,
+ BoxColNo = stockList[i].ColNo
+ });
+ if (recordId <= 0)
+ {
+ logger.Info($"药盒{stock.DrawerNo}交换药品新增操作记录失败,药盒号:{stockList[i].DrawerNo},药品ID:{stockList[i].DrugId}");
+ flag = false;
+ break;
+ }
+
+
+
+ //更新入药的药盒中的药品数量
+ ChannelStock replace2ChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == stockList[i].DrawerNo && cs.ColNo == stockList[i].ColNo && cs.DrugId == stock.DrugId && cs.ManuNo == stock.ManuNo)
+ .FirstOrDefault();
+ if (replace2ChannelStock != null)
+ {
+ //如果有该批次的药品,则更新数量
+ int r = _connection.ChannelStock.Where(cs => cs.Id == replace2ChannelStock.Id)
+ .Set(cs => cs.Quantity, replace2ChannelStock.Quantity + stockList[i].AddQuantity)
+ .Update();
+ if (r <= 0)
+ {
+ logger.Info($"更新药盒药品数量失败,药盒号:{stockList[i].DrawerNo},药品ID:{stockList[i].DrugId}");
+ flag = false;
+ break;
+ }
+ }
+ else
+ {
+ //如果没有该批次的药品,则新增一条记录
+ int mid = _connection.Insert(new ChannelStock()
+ {
+ Id = Guid.NewGuid().ToString(),
+ ListId = stockList[i].ListId,
+ MachineId = _setting.boxMachineId,
+ DrawerNo = stockList[i].DrawerNo,
+ ColNo = stockList[i].ColNo,
+ DrugId = stock.DrugId,
+ ManuNo = stock.ManuNo,
+ EffDate = stock.EffDate,
+ Quantity = stockList[i].AddQuantity,
+ BaseQuantity = stockList[i].BaseQuantity,
+ //BoxState = 1
+ });
+ if (mid <= 0)
+ {
+ logger.Info($"新增药盒药品记录失败,药盒号:{stockList[i].DrawerNo},药品ID:{stockList[i].DrugId}");
+ flag = false;
+ break;
+ }
+
+ }
+
+ //出库药盒减数量
+ int updateQuantity = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
+ .Set(cs => cs.Quantity, stock.Quantity - stockList[i].AddQuantity)
+ .Update();
+ if (updateQuantity <= 0)
+ {
+ logger.Info($"更新出库药盒药品减数量失败,药盒号:{stock.DrawerNo},药品ID:{stock.DrugId}");
+ flag = false;
+ break;
+ }
+ //入库药盒减数量
+ int updateQuantity2 = _connection.ChannelStock.Where(cs => cs.Id == stockList[i].Id)
+ .Set(cs => cs.Quantity, stockList[i].Quantity - stockList[i].AddQuantity)
+ .Update();
+ if (updateQuantity2 <= 0)
+ {
+ logger.Info($"更新入库药盒药品减数量失败,药盒号:{stockList[i].DrawerNo},药品ID:{stockList[i].DrugId}"); flag = false;
+ break;
+ }
+
+ //删除批次库存为零的数据
+ //移出库位里是否有未绑套餐且库存为0的数据,有则删除
+ _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && (string.IsNullOrEmpty(cs.ListId)) && cs.DrawerNo == stock.DrawerNo && cs.ColNo == stock.ColNo && cs.Quantity <= 0).Delete();
+ _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && (string.IsNullOrEmpty(cs.ListId)) && cs.DrawerNo == stockList[i].DrawerNo && cs.ColNo == stockList[i].ColNo && cs.Quantity <= 0).Delete();
+ //删除绑定套餐中同一药品多批次且库存为0的第一条数据
+ List delChannelStock = await _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == stock.DrawerNo && cs.ColNo == stock.ColNo && cs.DrugId == stock.DrugId).ToListAsync();
+ if (delChannelStock != null && delChannelStock.Count > 1)
+ {
+ //删除绑定套餐中库存为0的药的批次数据,只保留一条数据
+ List del = delChannelStock.Where(c => c.Quantity <= 0).ToList();
+ if (del != null && del.Count > 0)
+ {
+ if (delChannelStock.Count == del.Count)
+ {
+ for (int j = 1; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ else
+ {
+ for (int j = 0; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ }
+ }
+ //删除绑定套餐中同一药品多批次且库存为0的第一条数据
+ List listChannelStock = await _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == stockList[i].DrawerNo && cs.ColNo == stockList[i].ColNo && cs.DrugId == stockList[i].DrugId).ToListAsync();
+ if (listChannelStock != null && listChannelStock.Count > 1)
+ {
+ //删除绑定套餐中库存为0的药的批次数据,只保留一条数据
+ List del = listChannelStock.Where(c => c.Quantity <= 0).ToList();
+ if (del != null && del.Count > 0)
+ {
+ if (listChannelStock.Count == del.Count)
+ {
+ for (int j = 1; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ else
+ {
+ for (int j = 0; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ }
+ }
+ }
+ if (flag)
+ {
+
+ _connection.CommitTransaction();
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ }
+ return flag;
+
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"手术室药盒交换药品完成异常:{ex.Message}");
+ _connection.RollbackTransaction();
+ return false;
+ }
+ }
+ //手术室药盒移出药品完成
+ public async Task BoxRemoveFinish(ChannelStock stock, string SelectedDrawerNo, int removeQuantity)
+ {
+ try
+ {
+ bool flag = true;
+ _connection.BeginTransaction();
+
+ int selectDrawerNo = 0;
+ int selectColNo = 0;
+ var selectSpl = SelectedDrawerNo.Split('-');
+ if (selectSpl != null && selectSpl.Count() > 0)
+ {
+ selectDrawerNo = Convert.ToInt32(selectSpl[0]);
+ selectColNo = Convert.ToInt32(selectSpl[1] == "白" ? 1 : 2);
+ if (selectDrawerNo > 30)
+ {
+ selectColNo = Convert.ToInt32(selectSpl[1]);
+ }
+ else
+ {
+ selectColNo = Convert.ToInt32(selectSpl[1] == "白" ? 1 : 2);
+ }
+ }
+ //else if (SelectedDrawerNo.Length > 0)
+ //{
+ // switch (SelectedDrawerNo)
+ // {
+ // case "胃镜药盒":
+ // selectDrawerNo = 31;
+ // selectColNo = 1;
+ // break;
+ // case "导管药盒":
+ // selectDrawerNo = 32;
+ // selectColNo = 1;
+ // break;
+ // case "生殖药盒":
+ // selectDrawerNo = 33;
+ // selectColNo = 1;
+ // break;
+ // case "妇门药盒":
+ // selectDrawerNo = 34;
+ // selectColNo = 1;
+ // break;
+ // case "急诊药盒":
+ // selectDrawerNo = 99;
+ // selectColNo = 1;
+ // break;
+ // case "恢复室药盒":
+ // selectDrawerNo = 111;
+ // selectColNo = 1;
+ // break;
+ // }
+ //}
+
+ //查询移入的药品是否有库存
+ ChannelStock inChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId == stock.MachineId && cs.DrawerNo == selectDrawerNo && cs.ColNo == selectColNo && cs.DrugId == stock.DrugId && cs.ManuNo == stock.ManuNo)
+ .FirstOrDefault();
+ if (inChannelStock != null)
+ {
+ //如果有该批次的药品,则更新数量
+ int r = _connection.ChannelStock.Where(cs => cs.Id == inChannelStock.Id)
+ .Set(cs => cs.Quantity, inChannelStock.Quantity + removeQuantity)
+ .Update();
+ if (r <= 0)
+ {
+ logger.Info($"手术室药盒移出药品更新数量失败,药盒号:{SelectedDrawerNo},药品ID:{stock.DrugId}");
+ }
+ }
+ else
+ {
+ //如果没有该批次的药品,先查询是否有未绑批次的,有则更新批次信息,无则新增一条记录
+ ChannelStock inDrugChannelStock = _connection.ChannelStock.AsQueryable()
+ .Where(cs => cs.MachineId == stock.MachineId && cs.DrawerNo == selectDrawerNo && cs.ColNo == selectColNo && cs.DrugId == stock.DrugId && cs.Quantity <= 0)
+ .FirstOrDefault();
+ if (inDrugChannelStock != null)
+ {
+ int mid = _connection.ChannelStock.Where(cs => cs.Id == inDrugChannelStock.Id)
+ .Set(cs => cs.Quantity, removeQuantity)
+ .Set(cs => cs.ManuNo, stock.ManuNo)
+ .Set(cs => cs.EffDate, stock.EffDate)
+ .Update();
+ if (mid <= 0)
+ {
+ logger.Info($"更新药盒药品批次记录失败,药盒号:{stock.DrawerNo},药品ID:{stock.DrugId}");
+ flag = false;
+ }
+ }
+ else
+ {
+ int mid = _connection.Insert(new ChannelStock()
+ {
+ Id = Guid.NewGuid().ToString(),
+ MachineId = stock.MachineId,
+ DrawerNo = selectDrawerNo,
+ ColNo = selectColNo,
+ DrugId = stock.DrugId,
+ ManuNo = stock.ManuNo,
+ EffDate = stock.EffDate,
+ Quantity = removeQuantity,
+ BaseQuantity = stock.BaseQuantity,
+ //BoxState = 1
+ });
+ if (mid <= 0)
+ {
+ logger.Info($"新增药盒药品记录失败,药盒号:{stock.DrawerNo},药品ID:{stock.DrugId}");
+ flag = false;
+ }
+ }
+ }
+ if (flag)
+ {
+ //减本库位库存数量
+ int updateQuantity2 = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
+ .Set(cs => cs.Quantity, stock.Quantity - removeQuantity)
+ .Update();
+ if (updateQuantity2 <= 0)
+ {
+ logger.Info($"更新入库药盒药品减数量失败,药盒号:{stock.DrawerNo},药品ID:{stock.DrugId}");
+ flag = false;
+ }
+ else
+ {
+ int updateTotalQuantity = 0;
+ int updateMoveToTotalQuantity = 0;
+ //修改总库存数
+ ChannelList channelList = _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.boxMachineId) && cl.DrawerNo == stock.DrawerNo && cl.ColNo == stock.ColNo).FirstOrDefault();
+ if (channelList != null)
+ {
+ updateTotalQuantity = _connection.ChannelList.Where(cl => cl.Id == channelList.Id)
+ .Set(cl => cl.TotalQuantity, channelList.TotalQuantity - removeQuantity)
+ .Update();
+ }
+
+ //修改移入药盒的总库存数
+
+ ChannelList moveToChannelList = _connection.ChannelList.Where(cl => cl.MachineId == stock.MachineId && cl.DrawerNo == selectDrawerNo && cl.ColNo == selectColNo).FirstOrDefault();
+ if (moveToChannelList != null)
+ {
+ updateMoveToTotalQuantity = _connection.ChannelList.Where(cl => cl.Id == moveToChannelList.Id)
+ .Set(cl => cl.TotalQuantity, moveToChannelList.TotalQuantity + removeQuantity)
+ .Update();
+ }
+ if (updateTotalQuantity > 0 && updateMoveToTotalQuantity > 0)
+ {
+ flag = true;
+ }
+ else
+ {
+ flag = false;
+ }
+
+ }
+ if (flag)
+ {
+ //记录操作记录
+ int recordId = _connection.InsertWithInt32Identity(new MachineRecord()
+ {
+ MachineId = stock.MachineId,
+ DrawerNo = stock.DrawerNo,
+ ColNo = stock.ColNo,//移入的药盒号
+ DrugId = stock.DrugId,
+ ManuNo = stock.ManuNo,
+ EffDate = !String.IsNullOrEmpty(stock.EffDate) ? DateTime.ParseExact(stock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
+ OperationTime = DateTime.Now,
+ Type = 21, //移
+ Quantity = removeQuantity,
+ Operator = _globalStateService.Operator.Id,
+ Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
+ BoxDrawer = selectDrawerNo,
+ BoxColNo = selectColNo,
+ InvoiceId = stock.Id.ToString(),
+ });
+ if (recordId <= 0)
+ {
+ logger.Info($"药盒{stock.DrawerNo}交换药品新增操作记录失败,药盒号:{stock.DrawerNo},药品ID:{stock.DrugId}");
+ flag = false;
+ }
+ }
+ //移出库位里是否有未绑套餐且库存为0的数据,有则删除
+ _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && (string.IsNullOrEmpty(cs.ListId)) && cs.DrawerNo == selectDrawerNo && cs.ColNo == selectColNo && cs.Quantity <= 0).Delete();
+ _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && (string.IsNullOrEmpty(cs.ListId)) && cs.DrawerNo == stock.DrawerNo && cs.ColNo == stock.ColNo && cs.Quantity <= 0).Delete();
+ //删除绑定套餐中同一药品多批次且库存为0的第一条数据
+ List delChannelStock = await _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == stock.DrawerNo && cs.ColNo == stock.ColNo && cs.DrugId == stock.DrugId).ToListAsync();
+ if (delChannelStock != null && delChannelStock.Count > 1)
+ {
+ //删除绑定套餐中库存为0的药的批次数据,只保留一条数据
+ //for (int i = 1; i < delChannelStock.Count; i++)
+ //{
+ // _connection.Delete(delChannelStock[i]);
+ //}
+ //删除绑定套餐中库存为0的药的批次数据,只保留一条数据
+ List del = delChannelStock.Where(c => c.Quantity <= 0).ToList();
+ if (del != null && del.Count > 0)
+ {
+ if (delChannelStock.Count == del.Count)
+ {
+ for (int j = 1; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ else
+ {
+ for (int j = 0; j < del.Count; j++)
+ {
+ _connection.ChannelStock.Where(cs => cs.Id == del[j].Id).Delete();
+ }
+ }
+ }
+ }
+ }
+ if (flag)
+ {
+
+ _connection.CommitTransaction();
+ }
+ else
+ {
+ _connection.RollbackTransaction();
+ }
+ return flag;
+
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"手术室药盒移出药品异常{ex.Message}");
+ _connection.RollbackTransaction();
+ return false;
+ }
+ }
+
+
+ public async Task> GetAllBox()
+ {
+ var query = _connection.ChannelList.AsQueryable();
+
+
+ return await query
+ .Where(cl => cl.MachineId == _setting.boxMachineId)
+ .OrderBy((cl) => cl.DrawerNo)
+ .ThenBy((cl) => cl.DrawerNo)
+ .ThenBy((cl) => cl.ColNo)
+ .ToListAsync();
+ }
+ //根据药盒查询药品信息
+ public async Task> GetChannelStockByBox(int BoxNum)
+ {
+ var query = _connection.ChannelStock.AsQueryable()
+ .Where(cl => cl.MachineId == _setting.boxMachineId && cl.DrawerNo == BoxNum && cl.Quantity > 0);
+ return await query
+ //.Where(cl=>cl.Quantity<=0)
+ .OrderBy((cl) => cl.DrawerNo)
+ .ThenBy((cl) => cl.DrawerNo)
+ .ThenBy((cl) => cl.ColNo)
+ .ToListAsync();
+ }
+ //根据套餐下无库存的药箱
+ public async Task> GetChannelStockByPlan(string plan)
+ {
+ var query = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId && cl.DrugId == plan).Select(c => c.DrawerNo).ToListAsync();
+ if (query != null && query.Count > 0)
+ {
+ return await _connection.ChannelStock.Where(c => query.Contains(c.DrawerNo) && c.MachineId == _setting.boxMachineId && c.Quantity <= 0).ToListAsync();
+ }
+ return null;
+ }
+
+ //手术室药盒获取绑定数据
+ public async Task