修改更新

This commit is contained in:
马巧 2025-07-05 10:07:33 +08:00
parent ff96d4e676
commit 396fb8743f
27 changed files with 1579 additions and 785 deletions

View File

@ -8,13 +8,19 @@ 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

View File

@ -54,8 +54,9 @@ namespace MasaBlazorApp3.DataAccess.Dao
//手术室药箱入库
Task<PageData<ChannelList>> GetBoxWaitInfo(int? take, int? skip);
//手术室药箱入库获取待入库明细
Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl);
Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl, int? take, int? skip);
// 手术室药箱待入库明细入库完成
Task<bool> BoxAddBoxFinish(ChannelList boxChannelList);
//手术室药箱获取药箱药品及库存信息
Task<PageData<PlanDetails>> GetBoxDrugInfo(int DrawerNo, int? take, int? skip);

View File

@ -51,6 +51,10 @@ namespace MasaBlazorApp3.DataAccess.Dao
/// <param name="details"></param>
/// <returns></returns>
Task<bool> UpdatePlanDetail(PlanDetails details);
//查询要删除的套餐下是否有绑定,且绑定有库存
Task<bool> CheckPlanBind(int planId);
//查询要删除的药品是否有绑定且库存大于0
Task<bool> CheckPlanDetailBind(PlanDetails planDetail);
/// <summary>
/// 删除套餐中的药品
/// </summary>

View File

@ -21,5 +21,9 @@ namespace MasaBlazorApp3.DataAccess.Dao
Task<bool> UpdateSign(int id, string sign);
bool UpdateUserPassword(User user);
//查询当前值班信息
HkcChangeShifts GetOnDuty();
//保存交接班信息
Task<bool> UpdateChangeShift(HkcChangeShifts changeShift, HkcChangeShifts changeShiftNew);
}
}

View File

@ -315,7 +315,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
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().Substring(0, 10) ?? 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))
@ -617,7 +617,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
.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);
var query = _connection.PlanDetails.AsQueryable().Where(p => p.PlanId == list.PlanInfo.Id&&p.UseState==1);
List<PlanDetails> planInfos = await query.ToListAsync();
if (planInfos != null && planInfos.Count > 0)
{
@ -631,6 +631,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
DrawerNo = list.DrawerNo,
DrugId = planInfos[i].DrugId.ToString(),
BaseQuantity = planInfos[i].BaseQuantity,
BoxState = 1
});
if (mid > 0)
{
@ -789,7 +790,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
if (flag)
{
// 盘点库存是否足够
if (total > Quantity)
if (total >= Quantity)
{
for (var j = 0; Quantity > 0; j++)
@ -960,7 +961,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
NeedQuantity = 0,
DrugId = boxTakeVo.ChannelStock.DrugId,
ManuNo = boxTakeVo.ChannelStock.ManuNo,
EffDate = boxTakeVo.ChannelStock.EffDate,
EffDate = EffDate,
BaseQuantity = boxTakeVo.BoxDetail.BaseQuantity,
BoardType = boxTakeVo.BoxDetail.BoardType,
BoxState = 2 //补药完成
@ -980,12 +981,12 @@ namespace MasaBlazorApp3.DataAccess.Impl
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = boxTakeVo.ChannelStock.Id.ToString(),
});
int totalQuantity = _connection.PlanDetails.Where(p => p.PlanId == Convert.ToInt32(boxChannelList.DrugId)&&p.DrugId== boxTakeVo.BoxDetail.DrugId).Sum(p => p.BaseQuantity);
int list = _connection.ChannelList.Where(cl => cl.Id == boxChannelList.Id)
.Set(cl => cl.TotalQuantity, totalQuantity)
.Update();
//int totalQuantity = _connection.PlanDetails.Where(p => p.PlanId == Convert.ToInt32(boxChannelList.DrugId)&&p.DrugId== boxTakeVo.BoxDetail.DrugId).Sum(p => p.BaseQuantity);
//int list = _connection.ChannelList.Where(cl => cl.Id == boxChannelList.Id)
// .Set(cl => cl.TotalQuantity, totalQuantity)
// .Update();
int delResutl = await _connection.ChannelStock.Where(cs => cs.Id == boxTakeVo.BoxDetail.Id).DeleteAsync();
if (mid > 0 && r > 0 && boxID > 0 && boxMId > 0 && list > 0)
if (mid > 0 && r > 0 && boxID > 0 && boxMId > 0)
{
if (boxTakeVo.ChannelStock.BoardType.ToString().Contains("5"))
{
@ -1080,7 +1081,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
}
}
//手术室药箱入库获取待入库明细
public async Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl)
public async Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl, int? take, int? skip)
{
try
{
@ -1093,8 +1094,10 @@ namespace MasaBlazorApp3.DataAccess.Impl
// 当前药品取药数量
var Quantity = boxCs.NeedQuantity;
List<ChannelStock> stockList = await _connection.ChannelStock
.Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == 1 && cs.DrugId == boxCs.DrugId && cs.Quantity > 0 && cs.ManuNo != null)
.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();
// 当前药品的库存总量
@ -1106,58 +1109,6 @@ namespace MasaBlazorApp3.DataAccess.Impl
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)
{
return tempData;
}
else
{
return tempData2;
}
return tempData;
@ -1168,6 +1119,98 @@ namespace MasaBlazorApp3.DataAccess.Impl
return null;
}
}
// 手术室药箱待入库明细入库完成
public async Task<bool> BoxAddBoxFinish(ChannelList boxChannelList)
{
try
{
_connection.BeginTransaction();
bool flag = true;
int totalQuantity =0;
for (var i = 0; i < boxChannelList.ChannelStocks.Count; i++)
{
var EffDate = boxChannelList.ChannelStocks[i].EffDate;
//效期转换出错
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].ManuNo,
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now,
Type = 1,
Quantity = boxChannelList.ChannelStocks[i].AddToQuantity,
Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = boxChannelList.ChannelStocks[i].Id.ToString(),
});
// 更新库存
boxChannelList.ChannelStocks[i].Quantity= boxChannelList.ChannelStocks[i].Quantity+ boxChannelList.ChannelStocks[i].AddToQuantity;
boxChannelList.ChannelStocks[i].AddToQuantity = 0;
boxChannelList.ChannelStocks[i].NeedQuantity = 0;
boxChannelList.ChannelStocks[i].BoxState=0;
boxChannelList.ChannelStocks[i].EffDate = EffDate;
int r = _connection.Update(boxChannelList.ChannelStocks[i]);
totalQuantity += _connection.PlanDetails.Where(p => p.PlanId == Convert.ToInt32(boxChannelList.DrugId) && p.DrugId == boxChannelList.ChannelStocks[i].DrugId).Sum(p => p.BaseQuantity);
if (!(mid > 0 && 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<PageData<PlanDetails>> GetBoxDrugInfo(int DrawerNo, int? take, int? skip)
@ -1176,7 +1219,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
.InnerJoin(
_connection.ChannelList.Where(cl => cl.MachineId == _setting.boxMachineId && cl.DrawerNo.Equals(DrawerNo)),
(pd, cl) => pd.PlanId.ToString() == cl.DrugId,
(pd, cl) => pd);
(pd, cl) => pd).Where(pd=>pd.UseState==1);
@ -1226,7 +1269,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
try
{
var query = _connection.ChannelStock.AsQueryable().Where(c => c.MachineId == _setting.boxMachineId && c.DrawerNo.Equals(drawerNo) && c.DrugId.Equals(cs.DrugId)&&c.ManuNo!=cs.ManuNo&&c.EffDate!=cs.EffDate);
var query = _connection.ChannelStock.AsQueryable().Where(c => c.MachineId == _setting.boxMachineId && c.DrawerNo.Equals(drawerNo) && c.DrugId.Equals(cs.DrugId) && c.ManuNo != cs.ManuNo && c.EffDate != cs.EffDate);
@ -1261,7 +1304,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
/// <returns></returns>
public async Task<int[]> GetDrawerNum(ChannelStock channelStock)
{
int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == channelStock.MachineId && cs.DrugId == channelStock.DrugId && cs.DrawerNo != channelStock.DrawerNo && !string.IsNullOrEmpty(cs.ManuNo)&&cs.ManuNo!=channelStock.ManuNo)
int[] ints = _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 => cs.DrawerNo).Select(cs => cs.Key).ToArray();
return ints;
}
@ -1321,9 +1364,9 @@ namespace MasaBlazorApp3.DataAccess.Impl
break;
}
}
//记录操作记录
int recordId = _connection.InsertWithInt32Identity(new MachineRecord()
int recordId = _connection.InsertWithInt32Identity(new MachineRecord()
{
MachineId = stock.MachineId,
DrawerNo = stock.DrawerNo,
@ -1337,7 +1380,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = stockList[i].Id.ToString(),
});
if(recordId <= 0)
if (recordId <= 0)
{
logger.Info($"药箱{stock.DrawerNo}交换药品新增操作记录失败,药箱号:{stockList[i].DrawerNo}药品ID{stockList[i].DrugId}");
flag = false;
@ -1359,7 +1402,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
if (r <= 0)
{
logger.Info($"更新药箱药品数量失败,药箱号:{stockList[i].DrawerNo}药品ID{stockList[i].DrugId}");
flag= false;
flag = false;
break;
}
}
@ -1381,7 +1424,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
if (mid <= 0)
{
logger.Info($"新增药箱药品记录失败,药箱号:{stockList[i].DrawerNo}药品ID{stockList[i].DrugId}");
flag= false;
flag = false;
break;
}
@ -1429,7 +1472,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
}
if (flag)
{
_connection.CommitTransaction();
}
else
@ -1447,7 +1490,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
}
}
//手术室药箱移出药品完成
public async Task<bool> BoxRemoveFinish(ChannelStock stock,int SelectedDrawerNo,int removeQuantity)
public async Task<bool> BoxRemoveFinish(ChannelStock stock, int SelectedDrawerNo, int removeQuantity)
{
try
{
@ -1472,14 +1515,14 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
//如果没有该批次的药品,先查询是否有未绑批次的,有则更新批次信息,无则新增一条记录
ChannelStock inDrugChannelStock = _connection.ChannelStock.AsQueryable()
.Where(cs => cs.MachineId == stock.MachineId && cs.DrawerNo == SelectedDrawerNo && cs.DrugId == stock.DrugId )
.Where(cs => cs.MachineId == stock.MachineId && cs.DrawerNo == SelectedDrawerNo && cs.DrugId == stock.DrugId)
.FirstOrDefault();
if (inDrugChannelStock != null)
{
int mid= _connection.ChannelStock.Where(cs => cs.Id == inDrugChannelStock.Id)
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)
.Set(cs => cs.ManuNo, stock.ManuNo)
.Set(cs => cs.EffDate, stock.EffDate)
.Update();
if (mid <= 0)
{
@ -1516,16 +1559,16 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Update();
if (updateQuantity2 <= 0)
{
logger.Info($"更新入库药箱药品减数量失败,药箱号:{stock.DrawerNo}药品ID{stock.DrugId}");
logger.Info($"更新入库药箱药品减数量失败,药箱号:{stock.DrawerNo}药品ID{stock.DrugId}");
flag = false;
}
else
{
int updateTotalQuantity = 0;
int updateMoveToTotalQuantity=0;
int updateMoveToTotalQuantity = 0;
//修改总库存数
ChannelList channelList = _connection.ChannelList.Where(cl => cl.MachineId == stock.MachineId && cl.DrawerNo == stock.DrawerNo && cl.DrugId == stock.DrugId).FirstOrDefault();
if(channelList!=null)
if (channelList != null)
{
updateTotalQuantity = _connection.ChannelList.Where(cl => cl.Id == channelList.Id)
.Set(cl => cl.TotalQuantity, channelList.TotalQuantity - removeQuantity)
@ -1539,7 +1582,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Set(cl => cl.TotalQuantity, channelList.TotalQuantity + removeQuantity)
.Update();
}
if(updateTotalQuantity>0&&updateMoveToTotalQuantity > 0)
if (updateTotalQuantity > 0 && updateMoveToTotalQuantity > 0)
{
flag = true;
}

View File

@ -590,10 +590,6 @@ namespace MasaBlazorApp3.DataAccess.Impl
/// <returns></returns>
public async Task<PageData<OrderInfo>> GetAllOrderInfoByBox(int box, string OrderrNo, DateTime OrderDate, int? take, int? skip)
{
//var query = _connection.OrderInfo.AsQueryable();
//query.InnerJoin<OrderDetail>((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
@ -601,7 +597,6 @@ namespace MasaBlazorApp3.DataAccess.Impl
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));
@ -619,8 +614,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
int pagedData = await query.CountAsync();
List<OrderInfo> list = await query
.LoadWith(oi => oi.Detail)
.LoadWith(oi => oi.Detail.Drug)
//.LoadWith(oi => oi.DetailList)
.OrderBy((oi) => oi.RecvDate)
.ThenBy((oi => oi.OrderNo))
.Skip((int)skip)
@ -630,13 +624,57 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
for (int i = 0; i < list.Count; i++)
{
//list[i].Detail = await _connection.OrderDetail.AsQueryable()
// .Where(od => od.OrderNo == list[i].OrderNo)
// .LoadWith(od => od.Drug)
// .ToListAsync();
for (int j = 0; j < list[i].DetailList.Count; j++)
{
list[i].DetailList[j].Drug = await _connection.DrugInfo.AsQueryable().Where(d => d.DrugId == list[i].DetailList[j].DrugId).FirstOrDefaultAsync();
}
}
}
//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);
////query = query.Where(oi => oi.DoctorCode == box);
//int pagedData = await query.CountAsync();
//List<OrderInfo> list = await query
// .LoadWith(oi => oi.Detail)
// .LoadWith(oi => oi.Detail.Drug)
// .OrderBy((oi) => oi.RecvDate)
// .ThenBy((oi => oi.OrderNo))
// .Skip((int)skip)
// .Take((int)take)
// .ToListAsync();
//if (list != null && list.Count > 0)
//{
// for (int i = 0; i < list.Count; i++)
// {
// //list[i].Detail = await _connection.OrderDetail.AsQueryable()
// // .Where(od => od.OrderNo == list[i].OrderNo)
// // .LoadWith(od => od.Drug)
// // .ToListAsync();
// }
//}
return new PageData<OrderInfo>()
{
TotalDesserts = pagedData,
@ -654,7 +692,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
return ints;
}
//核对处方
public async Task<bool> CheckOrderInfo(IList<OrderInfo> selectedOrderInfos,int DrawerNo)
public async Task<bool> CheckOrderInfo(IList<OrderInfo> selectedOrderInfos, int DrawerNo)
{
try
{
@ -670,9 +708,9 @@ namespace MasaBlazorApp3.DataAccess.Impl
OrderInfo oi = selectedOrderInfos[i];
//更新处方状态
if (oi.state == 1)
if (oi.Status == 1)
{
int iUpdate= _connection.OrderInfo.Where(o=>o.OrderNo==oi.OrderNo).Set(o=>o.state,2).Update();
int iUpdate = _connection.OrderInfo.Where(o => o.OrderNo == oi.OrderNo).Set(o => o.Status, 2).Update();
_connection.Insert(new OrderFinish()
{
OrderNo = oi.OrderNo,
@ -683,149 +721,162 @@ namespace MasaBlazorApp3.DataAccess.Impl
Operator = _globalStateService.Operator.NickName,
});
}
int drawerNo = DrawerNo + 1;
ChannelStock cs =_connection.ChannelStock.AsQueryable()
.Where(cs => cs.DrugId == oi.Detail.DrugId
&& cs.ManuNo == oi.Detail.SetManuNo
// && cs.EffDate == oi._OrderDetail.SetEffDate
&& cs.MachineId.Equals(_setting.boxMachineId)
&& cs.DrawerNo == drawerNo
&& cs.Quantity >= oi.Detail.Quantity).First();
if (cs == null)
int drawerNo = DrawerNo;
if (oi.DetailList != null && oi.DetailList.Count > 0)
{
logger.Info($"手麻单{oi.OrderNo}对药品批次{oi.Detail.DrugId}-{oi.Detail.SetManuNo}在{drawerNo}药箱无库存");
continue;
}
cs.Quantity = cs.Quantity - oi.Detail.Quantity;
//cs.NeedNum = cs.NeedNum > 0 ? cs.NeedNum + oi._OrderDetail.Quantity : oi._OrderDetail.Quantity;
logger.Info($"更新手术间{cs.DrawerNo}药品{cs.DrugId}批次{cs.ManuNo}库存为{cs.Quantity},需补药数量为{oi.Detail.Quantity}");
// 更新数据 库存信息
_connection.Update(cs);
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = _connection.ChannelStock.AsQueryable()
.Where(it => it.MachineId.Equals(cs.MachineId) || it.MachineId.Equals(_setting.machineId))
.Where(it => it.DrugId.Equals(cs.DrugId))
.Where(it => it.ManuNo.Equals(cs.ManuNo))
.Where(it => it.DrawerType == 1)
.ToList();
if (cs != null)
{
_connection.Insert(new MachineRecord()
for (int j = 0; j < oi.DetailList.Count; j++)
{
MachineId = _setting.machineId,
DrawerNo = cs.DrawerNo,
ColNo = cs.ColNo,
DrugId = cs.DrugId,
ManuNo = cs.ManuNo,
EffDate = !String.IsNullOrEmpty(cs.EffDate) ? DateTime.ParseExact(cs.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = _globalStateService.Operator?.Id,
Reviewer = _globalStateService.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = oi.Detail.Quantity,
Type = 2,
InvoiceId = oi.OrderNo
//, StockQuantity = nowChannels.Sum(it => it.Quantity)
});
//查询上一条账册中的空瓶数
AccountBookG2 accountBookEmpty =_connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 1 || ab.Type == 2)
.Where(ab => ab.DrugId == oi.Detail.DrugId)
.Where(ab => ab.ManuNo == cs.ManuNo).OrderByDescending(ab => ab.Id).First();
//保存账册
int iInsertResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.Detail.DrugId,
Type = 2,
Department = oi.DeptName,
OrderNo = oi.OrderNo,
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
OutQuantity = oi.Detail.Quantity,
UserId1 = _globalStateService.Operator?.Id,
UserId2 = _globalStateService.Reviewer?.Id,
MachineId = _setting.machineId,
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
CreateTime = DateTime.Now,
InvoiceNo = oi.OrderNo,
ManuStock = nowChannels.Sum(it => it.Quantity),
TotalStock = (accountBookEmpty != null ? (accountBookEmpty.TotalStock > 0 ? accountBookEmpty.TotalStock : 0) : 0) + oi.Detail.Quantity,
ShoushuJian = drawerNo.ToString()
});
//修改凌晨生成的日结存与总结存数据
AccountBookG2 accountBookG2Day = _connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 3)
.Where(ab => ab.DrugId == oi.Detail.DrugId)
.Where(ab => ab.ManuNo == cs.ManuNo)
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
if (accountBookG2Day != null)
{
accountBookG2Day.ManuStock = accountBookG2Day.ManuStock - oi.Detail.Quantity;
_connection.Update(accountBookG2Day);
}
else
{
//生成日结存时可能没有该库位的绑定信息,需要写入日结存
int iDayResult =_connection.Insert(new AccountBookG2()
ChannelStock cs = _connection.ChannelStock.AsQueryable()
.Where(cs => cs.DrugId == oi.DetailList[j].DrugId
&& cs.ManuNo == oi.DetailList[j].SetManuNo
// && cs.EffDate == oi._OrderDetail.SetEffDate
&& cs.MachineId.Equals(_setting.boxMachineId)
&& cs.DrawerNo == drawerNo
&& cs.Quantity >= oi.DetailList[j].Quantity).First();
if (cs == null)
{
DrugId = oi.Detail.DrugId,
Type = 3,
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
YQuantity = 0,
ManuStock = oi.Detail.Quantity,
TotalStock = oi.Detail.Quantity,
UserId1 = _globalStateService.Operator?.Id,
UserId2 = _globalStateService.Reviewer?.Id,
MachineId = _setting.machineId,
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
InvoiceNo = "日结存"
});
if (iDayResult <= 0)
{
logger.Info($"未写入日结存数据{oi.Detail.DrugId}-{cs.ManuNo}-{cs.EffDate}-{cs.Quantity}");
logger.Info($"手麻单{oi.OrderNo}对药品批次{oi.DetailList[j].DrugId}-{oi.DetailList[j].SetManuNo}在{drawerNo}药箱无库存");
continue;
}
}
//修改凌晨生成的日结存与总结存数据
AccountBookG2 accountBookG2Total = _connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 4)
.Where(ab => ab.DrugId == oi.Detail.DrugId)
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
if (accountBookG2Total != null)
{
accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - oi.Detail.Quantity;
_connection.Update(accountBookG2Total);
}
else
{
//生成总结存时可能没有该库位的绑定信息,需要写入总结存
int iTotalResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.Detail.DrugId,
Type = 4,
YQuantity = 0,
ManuStock = oi.Detail.Quantity,
TotalStock = oi.Detail.Quantity,
UserId1 = _globalStateService.Operator?.Id,
UserId2 = _globalStateService.Reviewer?.Id,
MachineId = _setting.machineId,
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
InvoiceNo = "总结存"
});
if (iTotalResult <= 0)
{
logger.Info($"未写入总结存数据{oi.Detail.DrugId}-{oi.Detail.Quantity}");
}
}
cs.Quantity = cs.Quantity - oi.DetailList[j].Quantity;
//cs.NeedNum = cs.NeedNum > 0 ? cs.NeedNum + oi._OrderDetail.Quantity : oi._OrderDetail.Quantity;
logger.Info($"更新手术间{cs.DrawerNo}药品{cs.DrugId}批次{cs.ManuNo}库存为{cs.Quantity},需补药数量为{oi.DetailList[j].Quantity}");
// 更新数据 库存信息
_connection.Update(cs);
//更新ChannelList对应的总库存
ChannelList channelList = _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId.Equals(cs.MachineId) && cl.Id.Equals(cs.ListId) && cl.DrawerNo.Equals(cs.DrawerNo)).FirstOrDefault();
channelList.TotalQuantity = channelList.TotalQuantity - oi.DetailList[j].Quantity;
_connection.Update(channelList);
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = _connection.ChannelStock.AsQueryable()
.Where(it => it.MachineId.Equals(cs.MachineId) || it.MachineId.Equals(_setting.machineId))
.Where(it => it.DrugId.Equals(cs.DrugId))
.Where(it => it.ManuNo.Equals(cs.ManuNo))
.Where(it => it.DrawerType == 1)
.ToList();
if (cs != null)
{
_connection.Insert(new MachineRecord()
{
MachineId = _setting.machineId,
DrawerNo = cs.DrawerNo,
ColNo = cs.ColNo,
DrugId = cs.DrugId,
ManuNo = cs.ManuNo,
EffDate = !String.IsNullOrEmpty(cs.EffDate) ? DateTime.ParseExact(cs.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = _globalStateService.Operator?.Id,
Reviewer = _globalStateService.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = oi.DetailList[j].Quantity,
Type = 2,
InvoiceId = oi.OrderNo
//, StockQuantity = nowChannels.Sum(it => it.Quantity)
});
//查询上一条账册中的空瓶数
AccountBookG2 accountBookEmpty = _connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 1 || ab.Type == 2)
.Where(ab => ab.DrugId == oi.DetailList[j].DrugId)
.Where(ab => ab.ManuNo == cs.ManuNo).OrderByDescending(ab => ab.Id).First();
//保存账册
int iInsertResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.DetailList[j].DrugId,
Type = 2,
Department = oi.DeptName,
OrderNo = oi.OrderNo,
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
OutQuantity = oi.DetailList[j].Quantity,
UserId1 = _globalStateService.Operator?.Id,
UserId2 = _globalStateService.Reviewer?.Id,
MachineId = _setting.machineId,
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
CreateTime = DateTime.Now,
InvoiceNo = oi.OrderNo,
ManuStock = nowChannels.Sum(it => it.Quantity),
TotalStock = (accountBookEmpty != null ? (accountBookEmpty.TotalStock > 0 ? accountBookEmpty.TotalStock : 0) : 0) + oi.DetailList[j].Quantity,
ShoushuJian = drawerNo.ToString()
});
//修改凌晨生成的日结存与总结存数据
AccountBookG2 accountBookG2Day = _connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 3)
.Where(ab => ab.DrugId == oi.DetailList[j].DrugId)
.Where(ab => ab.ManuNo == cs.ManuNo)
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
if (accountBookG2Day != null)
{
accountBookG2Day.ManuStock = accountBookG2Day.ManuStock - oi.DetailList[j].Quantity;
_connection.Update(accountBookG2Day);
}
else
{
//生成日结存时可能没有该库位的绑定信息,需要写入日结存
int iDayResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.DetailList[j].DrugId,
Type = 3,
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
YQuantity = 0,
ManuStock = oi.DetailList[j].Quantity,
TotalStock = oi.DetailList[j].Quantity,
UserId1 = _globalStateService.Operator?.Id,
UserId2 = _globalStateService.Reviewer?.Id,
MachineId = _setting.machineId,
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
InvoiceNo = "日结存"
});
if (iDayResult <= 0)
{
logger.Info($"未写入日结存数据{oi.DetailList[j].DrugId}-{cs.ManuNo}-{cs.EffDate}-{cs.Quantity}");
}
}
//修改凌晨生成的日结存与总结存数据
AccountBookG2 accountBookG2Total = _connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 4)
.Where(ab => ab.DrugId == oi.DetailList[j].DrugId)
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
if (accountBookG2Total != null)
{
accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - oi.DetailList[j].Quantity;
_connection.Update(accountBookG2Total);
}
else
{
//生成总结存时可能没有该库位的绑定信息,需要写入总结存
int iTotalResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.DetailList[j].DrugId,
Type = 4,
YQuantity = 0,
ManuStock = oi.DetailList[j].Quantity,
TotalStock = oi.DetailList[j].Quantity,
UserId1 = _globalStateService.Operator?.Id,
UserId2 = _globalStateService.Reviewer?.Id,
MachineId = _setting.machineId,
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
InvoiceNo = "总结存"
});
if (iTotalResult <= 0)
{
logger.Info($"未写入总结存数据{oi.DetailList[j].DrugId}-{oi.DetailList[j].Quantity}");
}
}
}
}
}
}
return true;
logger.Info($"管理员{_globalStateService.Operator.NickName}结束确认手麻单");

View File

@ -4,6 +4,7 @@ using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config;
using Microsoft.Extensions.Options;
using Org.BouncyCastle.Crypto;
using System;
using System.Collections.Generic;
using System.Data.Common;
@ -38,8 +39,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
var query = _connection.Plan.AsQueryable();
List<Plan> list = await query.Where(p=>p.UseState==1)
.LoadWith(p => p._PlanDetails.Where(pd=>pd.UseState==1))
List<Plan> list = await query.Where(p => p.UseState == 1)
.LoadWith(p => p._PlanDetails.Where(pd => pd.UseState == 1))
//.ThenLoad(p=>p._DrugInfo)
.OrderBy(r => r.Id)
.ToListAsync();
@ -78,7 +79,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
/// <returns></returns>
public async Task<Plan> GetPlanById(int Id)
{
var query = _connection.Plan.AsQueryable().Where(p => p.Id == Id&&p.UseState==1);
var query = _connection.Plan.AsQueryable().Where(p => p.Id == Id && p.UseState == 1);
List<Plan> list = await query
.LoadWith(p => p._PlanDetails)
//.ThenLoad(p=>p._DrugInfo)
@ -112,6 +113,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
plan.AddTime = DateTime.Now;
plan.OperatorUser = _globalStateService.Operator.Id;
plan.ReviewerUser = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id;
plan.UseState = 1;
return _connection.InsertWithInt32Identity(plan) > 0;
}
catch (Exception ex)
@ -143,6 +145,38 @@ namespace MasaBlazorApp3.DataAccess.Impl
return false;
}
}
//查询要删除的套餐下是否有绑定,且绑定有库存
public async Task<bool> CheckPlanBind(int planId)
{
try
{
//查询是否有绑定,没有绑定可以删除,有绑定则不允许删除
List<string> channelListsId =await _connection.ChannelList.AsQueryable().Where(cl => cl.DrugId == planId.ToString() && cl.MachineId == _setting.boxMachineId).Select(cl => cl.Id).ToListAsync();
if (channelListsId != null && channelListsId.Count > 0)
{
bool searchResult = _connection.ChannelStock.AsQueryable().Where(cs => channelListsId.Contains(cs.ListId)).Any(cs => cs.Quantity > 0);
if (searchResult)
{
return false;
}
else
{
return true;
}
}
else
{
return true;
}
}
catch (Exception ex)
{
logger.Error($"查询要删除的套餐下是否有绑定异常{ex.Message}");
return false;
}
}
/// <summary>
/// 删除套餐
/// </summary>
@ -154,27 +188,32 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
_connection.BeginTransaction();
bool flag = false;
//查询是否有绑定,没有绑定可以删除,有绑定则不允许删除
int hasCount = _connection.ChannelList.Where(cl => cl.DrugId == planId.ToString() && cl.MachineId == _setting.machineId).Count();
if (hasCount > 0)
logger.Error($"删除套餐{planId}");
//查询该套餐下是否有药品,如果有则一并删除
int iHasPd = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Count();
int pdResult = 1;
if (iHasPd > 0)
{
return flag;
pdResult =await _connection.PlanDetails.Where(pd => pd.PlanId == planId).Set(pd => pd.UseState, 0).UpdateAsync();
}
else
int pResult = await _connection.Plan.Where(p => p.Id == planId).Set(pd => pd.UseState, 0).UpdateAsync();
//如果套餐下有绑药且库存为0的也将绑定药品信息一并删除
List<string> listIds =await _connection.ChannelList.Where(cl => cl.DrugId == planId.ToString()).Select(cl => cl.Id).ToListAsync();
int iDelResult = 1;
int iDelChannelListResult = 1;
if (listIds != null && listIds.Count > 0)
{
logger.Error($"删除套餐{planId}");
//查询该套餐下是否有药品,如果有则一并删除
int iHasPd = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Count();
int pdResult = 1;
if (iHasPd > 0)
{
pdResult = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Set(pd => pd.UseState, 0).Update();
}
int pResult = _connection.Plan.Where(p => p.Id == planId).Set(pd => pd.UseState, 0).Update();
if (pdResult > 0 && pResult > 0)
{
flag = true;
}
//删除channelStock表中的绑定药品
iDelResult = _connection.ChannelStock.Where(cs => listIds.Contains(cs.ListId)).Delete();
_connection.ChannelList.Where(cl => listIds.Contains(cl.Id)).Set(cl=>cl.DrugId,"").Update();
}
if (pdResult > 0 && pResult > 0 && iDelResult > 0 && iDelChannelListResult > 0)
{
flag = true;
}
if (flag)
@ -207,7 +246,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
if (!string.IsNullOrEmpty(details.DrugId))
{
int id = _connection.InsertWithInt32Identity(details);
int id =await _connection.InsertWithInt32IdentityAsync(details);
details.Id = id;
return id > 0;
}
@ -235,7 +274,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Where(p => p.Id == details.Id)
.Set(p => p.DrugId, details._DrugInfo.DrugId)
.Set(p => p.BaseQuantity, details.BaseQuantity);
return iResult.Update() > 0;
return await iResult.UpdateAsync() > 0;
}
catch (Exception ex)
{
@ -244,6 +283,26 @@ namespace MasaBlazorApp3.DataAccess.Impl
}
}
//查询要删除的药品是否有绑定且库存大于0
public async Task<bool> CheckPlanDetailBind(PlanDetails planDetail)
{
try
{
bool bFlag = true;
List<string> idList =await _connection.ChannelList.AsQueryable().Where(cl => cl.DrugId == planDetail.PlanId.ToString()).Select(cl => cl.Id).ToListAsync();
if (idList != null && idList.Count > 0)
{
bFlag = !(_connection.ChannelStock.AsQueryable().Where(cs => idList.Contains(cs.ListId) && cs.DrugId == planDetail.DrugId).Any(cs => cs.Quantity > 0));
}
return bFlag;
}
catch (Exception ex)
{
logger.Error($"查询要删除的药品是否有绑定异常{ex.Message}");
return true;
}
}
/// <summary>
/// 删除套餐中的药品
/// </summary>
@ -253,9 +312,33 @@ namespace MasaBlazorApp3.DataAccess.Impl
{
try
{
_connection.BeginTransaction();
logger.Error($"删除套餐中的药品{detail._DrugInfo.DrugName}");
return _connection.PlanDetails.Where(p => p.Id == detail.Id).Set(p=>p.UseState,0).Update() > 0;
int iDelResult = 1;
//删除该套餐下该药品对应绑定的库位
List<string> idList = await _connection.ChannelList.AsQueryable().Where(cl => cl.DrugId == detail.PlanId.ToString()).Select(cl => cl.Id).ToListAsync();
if (idList != null && idList.Count > 0)
{
iDelResult= await _connection.ChannelStock.AsQueryable().Where(cs => idList.Contains(cs.ListId) && cs.DrugId == detail.DrugId).DeleteAsync();
}
if (iDelResult > 0)
{
bool bUpdateResult= _connection.PlanDetails.Where(p => p.Id == detail.Id).Set(p => p.UseState, 0).Update() > 0;
if(bUpdateResult)
{
_connection.CommitTransaction();
return true;
}
else
{
_connection.RollbackTransaction();
return false;
}
}
else
{
return false;
}
}
catch (Exception ex)
{
@ -269,7 +352,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
if (details._DrugInfo.DrugId != null)
{
//查询该药品是否已在套餐中存在,存在则不再添加
PlanDetails pdDrug = _connection.PlanDetails.Where(p => p.PlanId == details.PlanId && p.DrugId == details._DrugInfo.DrugId&&p.UseState==1).FirstOrDefault();
PlanDetails pdDrug = _connection.PlanDetails.Where(p => p.PlanId == details.PlanId && p.DrugId == details._DrugInfo.DrugId && p.UseState == 1).FirstOrDefault();
if (details.Id > 0)
{

View File

@ -1,5 +1,6 @@
using Google.Protobuf.WellKnownTypes;
using LinqToDB;
using log4net;
using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config;
@ -17,6 +18,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
private readonly AppDataConnection _connection;
private readonly SettingConfig _setting;
private readonly ILog logger = LogManager.GetLogger(typeof(OrderInfoDao));
//public UserDao(MyContext context)
//{
@ -61,7 +63,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
public User GetByUsername(string username)
{
return _connection.User.LoadWith(u => (u.role)).FirstOrDefault(u => u.Username == username&&u.MachineId== _setting.machineId);
return _connection.User.LoadWith(u => (u.role)).FirstOrDefault(u => u.Username == username && u.MachineId == _setting.machineId);
}
public int InsertUser(User user)
@ -92,7 +94,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
//重置用户密码
public bool ResetPassword(int id)
{
var statement= _connection.User.Where(u => u.Id == id).Set(u=>u.Password, MD5.GetMD5Hash("123456").ToLower());
var statement = _connection.User.Where(u => u.Id == id).Set(u => u.Password, MD5.GetMD5Hash("123456").ToLower());
return statement.Update() > 0;
}
@ -115,5 +117,50 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Set(u => u.Password, MD5.GetMD5Hash(user.Password).ToLower());
return statement.Update() > 0;
}
//查询当前值班信息
public HkcChangeShifts GetOnDuty()
{
try
{
return _connection.HkcChangeShifts.Where(cs => cs.MachineId == _setting.machineId && cs.State == "0").FirstOrDefault();
}
catch (Exception ex)
{
logger.Info($"查询当前值班信息异常{ex.Message}");
return null;
}
}
//保存交接班信息
public async Task<bool> UpdateChangeShift(HkcChangeShifts changeShift, HkcChangeShifts changeShiftNew)
{
try
{
_connection.BeginTransaction();
var insertResult = _connection.InsertWithInt32Identity(changeShiftNew);
int updateResult = _connection.HkcChangeShifts
.Where(cs => cs.Id == changeShift.Id)
.Set(cs => cs.State, "1")
.Set(cs => cs.ToDate, DateTime.Now)
.Set(cs=>cs.ToOperator,changeShift.ToOperator).Update();
if (insertResult <= 0 || updateResult <= 0)
{
_connection.RollbackTransaction();
return false;
}
else
{
_connection.CommitTransaction();
return true;
}
}
catch (Exception ex)
{
logger.Error($"更新交接班信息异常: {ex.Message}");
return false;
}
}
}
}

View File

@ -6,6 +6,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<ApplicationIcon>favicon.ico</ApplicationIcon>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>

View File

@ -124,7 +124,7 @@
async void OnRowSelect(ChannelList cl)
{
var b = await dialogService.OpenAsync<BoxAddBoxDetailDialog>(
$"{cl.DrawerNo}号药箱药",
$"{cl.DrawerNo}号药箱药品入库",
new Dictionary<string, object>() { { "boxChannelList", cl } },
new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false }
);

View File

@ -8,51 +8,20 @@
<RadzenStack Gap="1rem" Orientation="Orientation.Vertical" Style="height: 100%;">
<RadzenStack>
@if (CanTakeDrug)
{
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
<RadzenDataGrid Data="@boxChannelList.ChannelStocks" AllowAlternatingRows="true"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Property="ChannelStock" Title="库位">
<Template>
@context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="ChannelStock.ManuNo" Title="批次" />
<RadzenDataGridColumn Property="ChannelStock.EffDate" Title="效期" />
<RadzenDataGridColumn Property="Quantity" Title="数量" />
<RadzenDataGridColumn Property="ChannelStocks.Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="ChannelStocks.Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="AddToQuantity" Title="入药箱数量" />
<RadzenDataGridColumn Property="Quantity" Title="库存" />
</Columns>
</RadzenDataGrid>
}
else
{
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
<Columns>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="Quantity" Title="取药数量" />
<RadzenDataGridColumn Property="StockQuantity" Title="库存" />
</Columns>
</RadzenDataGrid>
}
</RadzenStack>
</RadzenStack>
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
@if (status < 2)
{
<RadzenButton Click="@OpenDrawer" Disabled="!CanTakeDrug" IsBusy="status > 0" BusyText="取药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Text="取药" Style="width: 120px" />
}
@if (status == 2)
{
<RadzenButton Click="@TakeFinish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="完成" Style="width: 120px" />
}
@if (status <= 2)
{
<RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
}
<RadzenButton Click="@Finish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="保存" Style="width: 120px" />
<RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
</RadzenStack>
</RadzenStack>
@ -64,10 +33,10 @@
@inject PortUtil PortUtil;
private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
int status;
// int status;
bool isLoading;
int count;
[Parameter] public ChannelList boxChannelList { get; set; }
private bool CanTakeDrug = true;
public List<BoxTakeVo> data { get; set; }
//称重取药数量
@ -78,225 +47,212 @@
protected override async Task OnInitializedAsync()
{
data = await channelListDao.getTakeInfoByBox(boxChannelList);
// 如果有【stockQuantity】字段说明有药品库存不足
if (data.Any(it => it.ChannelStock == null))
{
CanTakeDrug = false;
}
base.OnInitializedAsync();
}
async Task OpenDrawer()
async Task LoadData(LoadDataArgs args)
{
this.status = 1;
// 解析需要打开的抽屉列表
List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
isLoading = true;
// 根据抽屉类型来决定打开前是否需要查询数量
var promiseUtil = new PromiseUtil<int>();
await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
{
var orderTakeVo = drawerNos[options._data];
var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
try
{
if (this.status == 0)
{
stop();
}
// 开启抽屉
else if (this.status == 1)
{
if (orderTakeVo.Status == 0)
{
// 判断是否为单支抽屉
if (setting.Value.single.Contains(drawerNo))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray());
}
for (int i = 0; i < data.Count; i++)
{
if (!DrawerNoColNoList.Contains(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo))
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
logger.Info($"称重抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
await Task.Delay(200);
}
//是药盒抽屉开药盒
if (data[i].ChannelStock.BoardType.ToString().Contains("3"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
await Task.Delay(200);
}
DrawerNoColNoList.Add(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo);
}
}
var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b)
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,取药");
orderTakeVo.Status = 1;
next();
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
);
logger.Info($"抽屉打开失败");
PortUtil.AllLightOff();
RestData();
stop();
}
}
// 检测状态
else if (orderTakeVo.Status == 1)
{
// 查询抽屉是否为关闭状态
var b = await PortUtil.CheckDrawerStatus2(drawerNo);
// 关闭则改变状态并终止循环
if (b)
{
data.ForEach(cl =>
{
if (cl.ChannelStock.DrawerNo == drawerNo)
{
cl.GetQuantity = cl.Quantity;
}
});
orderTakeVo.Status = 2;
PortUtil.AllLightOff();
if (options._data == drawerNos.Count - 1)
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
this.status = 2;
string alertMessage = string.Empty;
//检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
for (int i = 0; i < data.Count; i++)
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;// drawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
{
//称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
}
await Task.Delay(200);
}
if (data[i].ChannelStock.BoardType.ToString().Contains("2"))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = orderTakeVo.BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
{
alertMessage += $"{data[i].Drug.DrugName}应取数量【{orderTakeVo.Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
}
}
}
if (!string.IsNullOrEmpty(alertMessage))
{
//弹出确认对话框
alertMessage += "应取数与实际取出数不一致确认要保存吗?";
//弹出确认提示框
var confirm = await dialogService.OpenAsync<ConfirmDialog>(
$"保存确认",
new Dictionary<string, object>() { { "confirmInfo", alertMessage } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
logger.Info(alertMessage);
if (!confirm)
{
RestData();
logger.Info("取消保存");
// 关闭弹窗
dialogService.Close(false);
}
}
stop();
}
else
{
options._data += 1;
next();
}
}
else
{
next(); // continue iteration
}
}
}
}
catch (Exception e)
{
RestData();
logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
);
if (setting.Value.single.Contains(drawerNo))
{
PortUtil.AllLightOff();
}
stop();
}
});
data = await channelListDao.getBoxWaitByBox(boxChannelList, args.Top, args.Skip);
// Update the Data property
isLoading = false;
}
// async Task OpenDrawer()
// {
// this.status = 1;
// // 解析需要打开的抽屉列表
// List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
// // 根据抽屉类型来决定打开前是否需要查询数量
// var promiseUtil = new PromiseUtil<int>();
// await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
// {
// var orderTakeVo = drawerNos[options._data];
// var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
// try
// {
// if (this.status == 0)
// {
// stop();
// }
// // 开启抽屉
// else if (this.status == 1)
// {
// if (orderTakeVo.Status == 0)
// {
// // 判断是否为单支抽屉
// if (setting.Value.single.Contains(drawerNo))
// {
// byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
// orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
// logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
// await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray());
// }
// for (int i = 0; i < data.Count; i++)
// {
// if (!DrawerNoColNoList.Contains(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo))
// {
// if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
// {
// PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
// PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
// data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
// logger.Info($"称重抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
// await Task.Delay(200);
// }
// //是药盒抽屉开药盒
// if (data[i].ChannelStock.BoardType.ToString().Contains("3"))
// {
// PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
// await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
// await Task.Delay(200);
// }
// DrawerNoColNoList.Add(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo);
// }
// }
// var b = await PortUtil.OpenDrawerStatus(drawerNo);
// if (b)
// {
// PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
// PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,取药");
// orderTakeVo.Status = 1;
// next();
// }
// else
// {
// _message.Notify(
// new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
// );
// logger.Info($"抽屉打开失败");
// PortUtil.AllLightOff();
// RestData();
// stop();
// }
// }
// // 检测状态
// else if (orderTakeVo.Status == 1)
// {
// // 查询抽屉是否为关闭状态
// var b = await PortUtil.CheckDrawerStatus2(drawerNo);
// // 关闭则改变状态并终止循环
// if (b)
// {
// data.ForEach(cl =>
// {
// if (cl.ChannelStock.DrawerNo == drawerNo)
// {
// cl.GetQuantity = cl.Quantity;
// }
// });
// orderTakeVo.Status = 2;
// PortUtil.AllLightOff();
// if (options._data == drawerNos.Count - 1)
// {
// PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
// PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
// PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
// this.status = 2;
// string alertMessage = string.Empty;
// //检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
// for (int i = 0; i < data.Count; i++)
// {
// if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
// {
// PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;// drawerNo;
// PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
// orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
// logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
// WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
// if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
// {
// //称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
// alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
// }
// await Task.Delay(200);
// }
// if (data[i].ChannelStock.BoardType.ToString().Contains("2"))
// {
// byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
// orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
// logger.Info($"单支抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
// WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = orderTakeVo.BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
// if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
// {
// alertMessage += $"{data[i].Drug.DrugName}应取数量【{orderTakeVo.Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
// }
// }
// }
// if (!string.IsNullOrEmpty(alertMessage))
// {
// //弹出确认对话框
// alertMessage += "应取数与实际取出数不一致确认要保存吗?";
// //弹出确认提示框
// var confirm = await dialogService.OpenAsync<ConfirmDialog>(
// $"保存确认",
// new Dictionary<string, object>() { { "confirmInfo", alertMessage } },
// new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
// logger.Info(alertMessage);
// if (!confirm)
// {
// RestData();
// logger.Info("取消保存");
// // 关闭弹窗
// dialogService.Close(false);
// }
// }
// stop();
// }
// else
// {
// options._data += 1;
// next();
// }
// }
// else
// {
// next(); // continue iteration
// }
// }
// }
// }
// catch (Exception e)
// {
// RestData();
// logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
// _message.Notify(
// new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
// );
// if (setting.Value.single.Contains(drawerNo))
// {
// PortUtil.AllLightOff();
// }
// stop();
// }
// });
// }
void RestData()
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
this.status = 0;
data.ForEach(it =>
{
it.Status = 0;
it.BeforeQuantity = new int[9];
it.AfterQuantity = new int[9];
});
this.WeightFinnalQuantity = new int[9];
DrawerNoColNoList.Clear();
}
void Cancel()
{
RestData();
// 关闭弹窗
dialogService.Close(false);
}
async Task TakeFinish()
async Task Finish()
{
// 保存账册、操作记录
var b = await channelListDao.BoxTakeFinish(data, boxChannelList);
var b = await channelListDao.BoxAddBoxFinish(boxChannelList);
if (!b)
{
_message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 });
@ -310,8 +266,6 @@
dialogService.Close(true);
}
//重置状态
this.RestData();
}

View File

@ -1,114 +1,330 @@
@page "/setting/Change"
@page "/0"
@using MasaBlazorApp3.Pojo.Config;
@using MasaBlazorApp3.Pojo.Vo;
@using MasaBlazorApp3.Util;
@using Microsoft.Extensions.Options;
@using Newtonsoft.Json;
@using log4net;
<style>
.rz-dialog-content {
padding: 0 !important;
}
</style>
<div class="container-fluid">
<div class="row">
<div class="col-12 mb-4">
<RadzenRow Gap="0" Style="overflow: hidden;width:100%;height:100%">
<RadzenColumn Size="12" SizeMD="5">
<RadzenCard class="rz-shadow-0 rz-border-radius-0 rz-text-align-center rz-p-12 align-items-center justify-content-center" Style="height: 100%; background: var(--rz-primary-light) no-repeat 100% 70% fixed url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwNCIgaGVpZ2h0PSIxNDU4IiB2aWV3Qm94PSIwIDAgMTIwNCAxNDU4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBvcGFjaXR5PSIwLjUiIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2ZfNDkzXzEwMTM0KSI+CjxjaXJjbGUgY3g9IjcyMi4xMjgiIGN5PSI4MzkuMDIiIHI9IjQ4MS40MTkiIGZpbGw9InVybCgjcGFpbnQwX3JhZGlhbF80OTNfMTAxMzQpIi8+CjwvZz4KPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzQ5M18xMDEzNCkiPgo8Y2lyY2xlIGN4PSI0NzAuMzMzIiBjeT0iNTcwLjMzMyIgcj0iNDcwLjMzMyIgZmlsbD0idXJsKCNwYWludDFfcmFkaWFsXzQ5M18xMDEzNCkiLz4KPC9nPgo8ZyBvcGFjaXR5PSIwLjUiIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfNDkzXzEwMTM0KSI+CjxjaXJjbGUgY3g9IjY5MS41MTEiIGN5PSI1MjIuMjk3IiByPSIzMzEuNTAzIiBmaWxsPSJ1cmwoI3BhaW50Ml9yYWRpYWxfNDkzXzEwMTM0KSIvPgo8L2c+CjxnIG9wYWNpdHk9IjAuNSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjNfZl80OTNfMTAxMzQpIj4KPGNpcmNsZSBjeD0iNjA4LjI0NCIgY3k9IjEwNzkuOTciIHI9IjMzMS41MDMiIHRyYW5zZm9ybT0icm90YXRlKC04MS4yMjQ0IDYwOC4yNDQgMTA3OS45NykiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF80OTNfMTAxMzQpIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZl80OTNfMTAxMzQiIHg9IjE0MC43MDkiIHk9IjI1Ny42MDEiIHdpZHRoPSIxMTYyLjg0IiBoZWlnaHQ9IjExNjIuODQiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl80OTNfMTAxMzQiIHg9Ii0xMDAiIHk9IjAiIHdpZHRoPSIxMTQwLjY3IiBoZWlnaHQ9IjExNDAuNjciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjJfZl80OTNfMTAxMzQiIHg9IjI2MC4wMDgiIHk9IjkwLjc5MzkiIHdpZHRoPSI4NjMuMDA2IiBoZWlnaHQ9Ijg2My4wMDYiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjNfZl80OTNfMTAxMzQiIHg9IjE3Ni42OTQiIHk9IjY0OC40MjMiIHdpZHRoPSI4NjMuMSIgaGVpZ2h0PSI4NjMuMSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzQ5M18xMDEzNCIvPgo8L2ZpbHRlcj4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDBfcmFkaWFsXzQ5M18xMDEzNCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MjIuMTI4IDgzOS4wMikgcm90YXRlKDkwKSBzY2FsZSg0ODEuNDE5KSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRjFBNkMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkYxQTZDIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9yYWRpYWxHcmFkaWVudD4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDFfcmFkaWFsXzQ5M18xMDEzNCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0NzAuMzMzIDU3MC4zMzMpIHJvdGF0ZSg5MCkgc2NhbGUoNDcwLjMzMykiPgo8c3RvcCBzdG9wLWNvbG9yPSIjM0FBQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzNBOTVGRiIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQyX3JhZGlhbF80OTNfMTAxMzQiIGN4PSIwIiBjeT0iMCIgcj0iMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjkxLjUxMSA1MjIuMjk3KSByb3RhdGUoOTApIHNjYWxlKDMzMS41MDMpIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzQ4M0FGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM0ODNBRkYiIHN0b3Atb3BhY2l0eT0iMCIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50M19yYWRpYWxfNDkzXzEwMTM0IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwOC4yNDQgMTA3OS45Nykgcm90YXRlKDkwKSBzY2FsZSgzMzEuNTAzKSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkM4M0EiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZDODNBIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9yYWRpYWxHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K')">
@if (userI == 1)
{
<RadzenText TextStyle="TextStyle.H5" class="rz-color-white">
请交班操作人 @FromOperator?.NickName
<p>登录验证</p>
</RadzenText>
}
else if (userI == 2)
{
<RadzenText TextStyle="TextStyle.H5" class="rz-color-white">
请交班复核人 @FromRviewer?.NickName
<p>登录验证</p>
</RadzenText>
}
else
@if (userI == 3)
{
<RadzenText TextStyle="TextStyle.H5" class="rz-color-white">
请接班操作人 @ToOperator?.NickName
<p>登录验证</p>
</RadzenText>
}
else if (userI == 4)
{
<RadzenText TextStyle="TextStyle.H5" class="rz-color-white">
请接班复核人 @ToReviewer?.NickName
<p>登录验证</p>
</RadzenText>
}
</RadzenCard>
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="7">
<RadzenCard Class="rz-shadow-0 rz-border-radius-0 rz-p-12" Style="width:100%;height:100%">
<RadzenText TextStyle="TextStyle.H5" TagName="TagName.H2" class="rz-mb-6">
登录
</RadzenText>
<RadzenTemplateForm Data="@loginModel" Submit="@((Pojo.User args) => { Submit(args); })" Style="width:100%;height:100%">
<div class="rz-form-row">
<label class="rz-label" for="username">账号</label>
<div class="rz-form-input-wrapper">
<!--@onfocusin="@(() => Util.VirtualKeyboardHelper.ShowVirtualKeyboard())"-->
<RadzenTextBox id="username" Name="Username" @bind-Value="@loginModel.Username" Style="width:100%" />
<RadzenRequiredValidator Component="Username" Text="请填写用户名" />
</div>
</div>
<div class="rz-form-row">
<label class="rz-label" for="password">密码</label>
<div class="rz-form-input-wrapper">
<RadzenPassword id="password" Name="Password" @bind-Value="@loginModel.Password" Style="width:100%" />
<RadzenRequiredValidator Component="Password" Text="请填写密码" />
</div>
</div>
<div class="rz-form-row">
<label class="rz-label"></label>
<div class="rz-form-input-wrapper rz-login-buttons">
<RadzenButton Style="background:#255dd4;color:white;width:110px" ButtonType="ButtonType.Submit" Text="登录" />
<RadzenButton Style="border-color:#255dd4;width:110px" Variant="Variant.Outlined" Text="取消" Click="@Exit" />
<form onsubmit="@(() => grid.Reload())">
<RadzenFieldset Text="查询">
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="开始时间" Component="Start" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="start" Style="width: 100%;" Name="Start" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="结束时间" Component="End" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="end" Style="width: 100%;" Name="End" />
</RadzenColumn>
</RadzenRow>
</div>
</div>
</RadzenTemplateForm>
</RadzenCard>
</RadzenColumn>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12">
<RadzenButton Size="ButtonSize.Large" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" />
<RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
</RadzenColumn>
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
</form>
</div>
<div class="col-12 mb-4">
<RadzenDataGrid @ref="grid"
LoadData="@LoadData"
IsLoading="@isLoading"
Count="@count"
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Title="日期" Property="optDate">
<Template Context="mr">
@mr.optDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="交班人发药人" Property="FromOperator"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="交班人审核人" Property="FromRviewer"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班人发药人" Property="ToOperator"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班人审核人" Property="ToReviewer"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班日期" Property="ToDate">
<Template Context="mr">
@mr.ToDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="当班状态" Property="State">
</RadzenDataGridColumn>
<RadzenDataGridColumn title="库位" Property="Location"></RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
</div>
</div>
</RadzenRow>
@code {
@inject IHkcChangeShiftsDao hkcChangeShiftsDao;
@inject DialogService dialogService;
@inject Radzen.DialogService dialogService;
@inject NavigationManager navigate;
RadzenDataGrid<HkcChangeShifts> grid;
bool isLoading;
int count;
private IEnumerable<HkcChangeShifts>? _forecasts;
DateTime start;
DateTime end;
@inject FingerprintUtil FingerprintUtil;
@inject PortUtil PortUtil;
@inject NavigationManager na;
@inject NotificationService _message
@inject GlobalStateService globalStateService;
@inject IUserDao userDao;
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
[Parameter] public string type { get; set; }
protected override void OnParametersSet()
private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
private int loginMode = 1;
private bool opFirst = true;
[Parameter] public int userI { get; set; }
Pojo.User FromOperator = new Pojo.User();
Pojo.User FromRviewer = new Pojo.User();
Pojo.User ToOperator = new Pojo.User();
Pojo.User ToReviewer = new Pojo.User();
HkcChangeShifts hkcChange = new HkcChangeShifts();
bool isShow;
private Pojo.User loginModel = new();
protected override Task OnInitializedAsync()
{
if (grid != null)
FingerprintUtil.axCZKEM1.OnAttTransactionEx += axCZKEM1_OnAttTransactionEx;
loginMode = setting.Value.loginMode;
opFirst = setting.Value.opFirst;
//查询当前值班信息
hkcChange = userDao.GetOnDuty();
if (hkcChange != null && !string.IsNullOrEmpty(hkcChange.FromOperator))
{
reloadGrid();
FromOperator = userDao.GetByUsername(hkcChange.FromOperator);
}
if (hkcChange != null && string.IsNullOrEmpty(hkcChange.FromRviewer))
{
FromRviewer = userDao.GetByUsername(hkcChange.FromRviewer);
}
return base.OnInitializedAsync();
}
private async Task SetUser(Pojo.User user)
{
if (userI == 1)
{
if(FromOperator.Id != user.Id)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"值班操作人有误,请核查当前值班人", Duration = 3000 }
);
return;
}
//交班人操作人登录
if (FromRviewer != null)
{
userI = 2;
}
else
{
userI = 3;
}
}
else if (userI == 2)
{
if (FromOperator != null && FromOperator.Id == user.Id)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"验证重复,请使用其他账号", Duration = 3000 }
);
return;
}
else
{
if(FromRviewer.Id!=user.Id)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"值班审核人有误,请核查当前值班人", Duration = 3000 }
);
return;
}
FromRviewer = user;
userI = 3;
}
}
else if (userI == 3)
{
if (loginMode == 2)
{
if (FromOperator.Id == user.Id || (FromRviewer != null && FromRviewer.Id == user.Id))
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"验证重复,请使用其他账号", Duration = 3000 }
);
return;
}
userI = 4;
ToOperator = user;
}
else
{
if (FromOperator.Id == user.Id || (FromRviewer != null && FromRviewer.Id == user.Id))
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"验证重复,请使用其他账号", Duration = 3000 }
);
return;
}
else
{
ToOperator = user;
//保存交接班信息
HkcChangeShifts hkcChangeNew = new HkcChangeShifts
{
FromOperator = ToOperator.Username,
optDate = DateTime.Now,
ToDate = DateTime.Now,
State = "0", //状态为1表示交接班完成
MachineId = hkcChange.MachineId
};
hkcChange.ToOperator = ToOperator.Username;
bool bResult = await userDao.UpdateChangeShift(hkcChange, hkcChangeNew);
if (bResult)
{
FingerprintUtil.axCZKEM1.OnAttTransactionEx -= axCZKEM1_OnAttTransactionEx;
logger.Info($"交接班完成,交班人{FromOperator.NickName};{FromRviewer?.NickName},接班人{ToOperator?.NickName};{ToOperator?.NickName}");
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"交接班完成", Duration = 3000 }
);
dialogService.Close(true);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = "交接班保存数据失败", Duration = 3000 }
);
}
}
}
}
else if (userI == 4)
{
if (FromOperator.Id == user.Id || (FromRviewer != null && FromRviewer.Id == user.Id) || (ToOperator != null && ToOperator.Id == user.Id))
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"验证重复,请使用其他账号", Duration = 3000 }
);
return;
}
ToReviewer = user;
hkcChange.ToReviewer = ToReviewer?.Username;
//保存交接班信息
HkcChangeShifts hkcChangeNew = new HkcChangeShifts
{
FromOperator = ToOperator.Username,
FromRviewer = ToReviewer?.Username,
optDate = DateTime.Now,
State = "0", //状态为1表示交接班完成
MachineId = hkcChange.MachineId
};
bool bResult = await userDao.UpdateChangeShift(hkcChange, hkcChangeNew);
if (bResult)
{
FingerprintUtil.axCZKEM1.OnAttTransactionEx -= axCZKEM1_OnAttTransactionEx;
logger.Info($"交接班完成,交班人{FromOperator.NickName};{FromRviewer?.NickName},接班人{ToOperator?.NickName};{ToReviewer?.NickName}");
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"交接班完成", Duration = 3000 }
);
dialogService.Close(true);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = "交接班保存数据失败", Duration = 3000 }
);
}
}
}
async Task LoadData(LoadDataArgs args)
private void Submit(Pojo.User user)
{
isLoading = true;
Pojo.User u = userDao.GetByUsername(loginModel.Username);
if (u != null)
{
if (Util.MD5.GetMD5Hash(loginModel.Password).ToLower().Equals(u.Password))
{
SetUser(u);
loginModel.Username = "";
loginModel.Password = "";
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"密码错误", Duration = 4000 }
);
logger.Info($"用户【{u.NickName}】密码输入错误");
var result = await hkcChangeShiftsDao.GetChangeShiftRecordAsync(start, end,args.Top, args.Skip);
// Update the Data property
_forecasts = result.Desserts;
// Update the count
count = result.TotalDesserts;
}
isLoading = false;
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"无此用户", Duration = 4000 }
);
logger.Info($"没有用户:【{loginModel.Username}】");
}
}
async Task reloadGrid()
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)
{
start = DateTime.MinValue;
end = DateTime.MinValue;
await grid.Reload();
Pojo.User u = userDao.GetById(Convert.ToInt32(sEnrollNumber));
if (u != null)
{
SetUser(u);
InvokeAsync(StateHasChanged);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"系统中没有ID为【{sEnrollNumber}】的用户", Duration = 4000 }
);
logger.Info($"指纹机验证通过id为【{sEnrollNumber}】,但是华康数据库中无此用户");
}
}
}
private void Exit()
{
dialogService.Close(false);
}
}

View File

@ -0,0 +1,123 @@
@page "/stock/Change"
<div class="container-fluid">
<div class="row">
<div class="col-12 mb-4">
<form onsubmit="@(() => grid.Reload())">
<RadzenFieldset Text="查询">
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="开始时间" Component="Start" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="start" Style="width: 100%;" Name="Start" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="结束时间" Component="End" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="end" Style="width: 100%;" Name="End" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12">
<RadzenButton Size="ButtonSize.Large" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" />
<RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
</RadzenColumn>
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
</form>
</div>
<div class="col-12 mb-4">
<RadzenDataGrid @ref="grid"
LoadData="@LoadData"
IsLoading="@isLoading"
Count="@count"
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Title="日期" Property="optDate">
<Template Context="mr">
@mr.optDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="交班发药人" Property="FromOperator"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="交班审核人" Property="FromRviewer"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班发药人" Property="ToOperator"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班审核人" Property="ToReviewer"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班日期" Property="ToDate">
<Template Context="mr">
@mr.ToDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="当班状态" Property="State">
<Template Context="state">
@if(state.State=="0")
{
<RadzenText>值班中</RadzenText>
}
else
{
<RadzenText>已交班</RadzenText>
}
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
</div>
</div>
@code {
@inject IHkcChangeShiftsDao hkcChangeShiftsDao;
@inject DialogService dialogService;
@inject NavigationManager navigate;
RadzenDataGrid<HkcChangeShifts> grid;
bool isLoading;
int count;
private IEnumerable<HkcChangeShifts>? _forecasts;
DateTime start;
DateTime end;
[Parameter] public string type { get; set; }
protected override void OnParametersSet()
{
if (grid != null)
{
reloadGrid();
}
}
async Task LoadData(LoadDataArgs args)
{
isLoading = true;
var result = await hkcChangeShiftsDao.GetChangeShiftRecordAsync(start, end,args.Top, args.Skip);
// Update the Data property
_forecasts = result.Desserts;
// Update the count
count = result.TotalDesserts;
isLoading = false;
}
async Task reloadGrid()
{
start = DateTime.MinValue;
end = DateTime.MinValue;
await grid.Reload();
}
}

View File

@ -6,7 +6,7 @@
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
@foreach (int i in DrawerNos)
{
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo != i ? Variant.Outlined : Variant.Flat)" />
}
</div>
@ -44,28 +44,52 @@
</form>
<RadzenDataGrid @ref="grid" AllowRowSelectOnRowClick="@allowRowSelectOnRowClick" AllowFiltering="true" LoadData="@LoadData"
FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
Data="@orderInfos" ColumnWidth="200px" IsLoading="@isLoading" Count="@count" EmptyText="无数据"
SelectionMode="DataGridSelectionMode.Multiple" @bind-Value=@selectedOrderInfos
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
Data="@orderInfos" ColumnWidth="200px" IsLoading="@isLoading" Count="@count" EmptyText="无数据"
SelectionMode="DataGridSelectionMode.Multiple" @bind-Value=@selectedOrderInfos
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Sortable="false" Filterable="false" Width="4rem">
<HeaderTemplate>
<RadzenCheckBox TabIndex="-1" TriState="false" TValue="bool?" InputAttributes="@(new Dictionary<string,object>(){ { "aria-label", "Select all items" }})"
Value="@(selectedOrderInfos == null || selectedOrderInfos?.Any() != true ? false : !orderInfos.All(i => selectedOrderInfos.Contains(i)) ? null : orderInfos.Any(i => selectedOrderInfos.Contains(i)))"
<RadzenCheckBox TabIndex="-1" TriState="false" TValue="bool?" InputAttributes="@(new Dictionary<string, object>() { { "aria-label", "Select all items" } })"
Value="@(selectedOrderInfos == null || selectedOrderInfos?.Any() != true ? false : !orderInfos.All(i => selectedOrderInfos.Contains(i)) ? null : orderInfos.Any(i => selectedOrderInfos.Contains(i)))"
Change="@(args => selectedOrderInfos = args == true ? orderInfos.ToList() : null)" />
</HeaderTemplate>
<Template Context="data">
<RadzenCheckBox TabIndex="-1" TriState="false" Value="@(selectedOrderInfos != null && selectedOrderInfos.Contains(data))" InputAttributes="@(new Dictionary<string,object>(){ { "aria-label", "Select item" }})"
<RadzenCheckBox TabIndex="-1" TriState="false" Value="@(selectedOrderInfos != null && selectedOrderInfos.Contains(data))" InputAttributes="@(new Dictionary<string, object>() { { "aria-label", "Select item" } })"
TValue="bool" Change="@(args => { if (!allowRowSelectOnRowClick) { grid.SelectRow(data); } })" />
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="PatientName" Title="姓名" Sortable="false" Filterable="false" Width="4rem" />
<RadzenDataGridColumn Property="Sex" Title="性别" Sortable="false" Filterable="false" Width="2rem" />
<RadzenDataGridColumn Property="OrderNo" Title="单号" Sortable="false" Filterable="false" Width="8rem" />
<RadzenDataGridColumn Property="Detail.Drug.DrugName" Title="药品名称" FormatString="{0:d}" Sortable="false" Filterable="false" Width="8rem" />
<RadzenDataGridColumn Property="Detail.SetManuNo" Title="药品批次" Sortable="false" Filterable="false" Width="8rem" />
<RadzenDataGridColumn Property="Detail.Quantity" Title="数量" Sortable="false" Filterable="false" Width="2rem" />
<RadzenDataGridColumn Property="Detail.Drug.DrugName" Title="药品名称" FormatString="{0:d}" Sortable="false" Filterable="false" Width="8rem">
<Template Context="DetailList">
@for (int i = 0; i < DetailList.DetailList.Count; i++)
{
OrderDetail orderDetail = DetailList.DetailList[i];
<RadzenText TextStyle="TextStyle.Subtitle2" class="rz-mb-0">@orderDetail.Drug.DrugName</RadzenText>
}
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="Detail.SetManuNo" Title="药品批次" Sortable="false" Filterable="false" Width="8rem">
<Template Context="DetailList">
@for (int i = 0; i < DetailList.DetailList.Count; i++)
{
OrderDetail orderDetail = DetailList.DetailList[i];
<RadzenText TextStyle="TextStyle.Subtitle2" class="rz-mb-0">@orderDetail.SetManuNo</RadzenText>
}
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="Detail.Quantity" Title="数量" Sortable="false" Filterable="false" Width="2rem">
<Template Context="DetailList">
@for (int i = 0; i < DetailList.DetailList.Count; i++)
{
OrderDetail orderDetail = DetailList.DetailList[i];
<RadzenText TextStyle="TextStyle.Subtitle2" class="rz-mb-0">@orderDetail.Quantity</RadzenText>
}
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>

View File

@ -36,33 +36,57 @@
.rz-gauge .rz-tick-text {
fill: #ffffff !important;
}
<style >
.icon-preview div {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
width: 120px;
}
.icon-preview span {
color: white;
font-size: 0.75rem;
}
</style>
</style>
<RadzenStack Orientation="Orientation.Vertical" class="rz-background-color-primary-light" AlignItems="AlignItems.Center" Style="width:100vw;height:100vh" Gap="0">
<RadzenRow Style="width:100vw;height:25vh;" Gap="0" RowGap="0">
<RadzenColumn Size="4">
<RadzenColumn Size="2">
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenRow Style="height: 100%;width:100%" Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
<RadzenColumn Size="3">
<RadzenColumn Size="2">
@if (globalStateService.Operator != null)
{
//<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@globalStateService.Operator.NickName</RadzenText>
<RadzenText onclick="@(()=>{EditPassword(1);})" Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@globalStateService.Operator.NickName</RadzenText>
<RadzenText onclick="@(() => { EditPassword(1); })" Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@globalStateService.Operator.NickName</RadzenText>
}
@if (globalStateService.Reviewer != null)
{
//<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">复核人:@globalStateService.Reviewer.NickName</RadzenText>
<RadzenText onclick="@(()=>{EditPassword(2);})" Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">复核人:@globalStateService.Reviewer.NickName</RadzenText>
<RadzenText onclick="@(() => { EditPassword(2); })" Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">复核人:@globalStateService.Reviewer.NickName</RadzenText>
}
</RadzenColumn>
<RadzenColumn Size="3">
<RadzenColumn Size="3" Orientation="Orientation.Horizontal" Wrap="FlexWrap.Wrap" class="icon-preview rz-p-12">
<div>
<RadzenIcon Icon="compare_arrows" Style="font-size:3rem;cursor: pointer;" class="rz-ripple" IconColor="white" @onclick="@(() => { changeShifts(); })" />
<span>交接班</span>
</div>
</RadzenColumn>
<RadzenColumn Size="2">
<RadzenIcon Icon="exit_to_app" Style="font-size:3rem;cursor: pointer;" class="rz-ripple" IconColor="white" @onclick="@(() => { logout(); })" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="2">
</RadzenColumn>
</RadzenRow>
<RadzenStack class="rz-background-color-info-lighter" Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" AlignItems="AlignItems.Center" Style="width: 75vw;height: 57vh" Gap="20">
@ -80,17 +104,31 @@
}
}
</RadzenStack>
<RadzenStack class="home-menu rz-background-color-success-light rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(2))" Style="height: 50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">入库</RadzenText>
@if (globalStateService.Operator != null)
{
@if (!globalStateService.Operator.role.permissionIds.Any(id => id - 20 > 0 && id - 20 < 10))
<RadzenStack Orientation="Orientation.Horizontal" Style="height: 50%;width:100%">
<RadzenStack class="home-menu rz-background-color-success-light rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(2))" Style="height: 100%;width:50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">入库</RadzenText>
@if (globalStateService.Operator != null)
{
<div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
@if (!globalStateService.Operator.role.permissionIds.Any(id => id - 20 > 0 && id - 20 < 10))
{
<div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
}
}
}
</RadzenStack>
<RadzenStack class="home-menu rz-background-color-danger-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(6))" Style="height: 100%;width:50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">药箱管理</RadzenText>
@if (globalStateService.Operator != null)
{
@if (!globalStateService.Operator.role.permissionIds.Any(id => id - 60 > 0 && id - 60 < 10))
{
<div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
}
}
</RadzenStack>
</RadzenStack>
</RadzenStack>
<RadzenStack Style="height: 100%;width:59%" Gap="20">
@ -296,4 +334,15 @@
new DialogOptions() { Width = "55vw", Resizable = false, Draggable = false, ShowClose = false, ShowTitle = false });
}
//交接班
async void changeShifts()
{
//修改复核人
await dialogService.OpenAsync<ChangeShifts>(
"",
new Dictionary<string, object>() { { "userI", 1 } },
new DialogOptions() { Width = "55vw", Resizable = false, Draggable = false, ShowClose = false, ShowTitle = false });
}
}

View File

@ -3,6 +3,7 @@
@page "/return/record1/{type}"
@page "/return/record2/{type}"
@page "/stock/record/{type}"
@using MasaBlazorApp3.Report
<div class="container-fluid">
@ -35,6 +36,10 @@
<RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="ÖØÖÃ" ButtonStyle="ButtonStyle.Warning" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" Click="StockExport" />
<RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" Click="AccountBookExport" />
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
</form>
@ -111,7 +116,18 @@
await grid.Reload();
}
//库存导出
void StockExport()
{
}
//专用账册导出
void AccountBookExport()
{
// string drugId = drugName != null ? drugName.Split('/').Last().Trim():"";
// GridReportUtil gridReportUtil = new GridReportUtil();
GridReportUtil.PrintReport("stock_template.grf", null);
}

View File

@ -28,7 +28,7 @@
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single" RowUpdate="@((Plan di)=>{OnUpdatePlanRow(di);})" RowCreate="@((Plan di)=>{OnCreatePlanRow(di);})"
SelectionMode="DataGridSelectionMode.Single" RowUpdate="@((Plan di) => { OnUpdatePlanRow(di); })" RowCreate="@((Plan di) => { OnCreatePlanRow(di); })"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ColumnWidth="100px" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Frozen="true" Title="套餐名称" Property="Name">
@ -96,8 +96,8 @@
<RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" />
</Columns>
</RadzenDropDownDataGrid>
<RadzenCustomValidator Component="drugName" Validator="@(()=>(planDetails._DrugInfo.DrugId!=null))" Text="请选择药品" Popup=true />
<RadzenCustomValidator Component="drugName" Validator="@(()=>ValidatroDrug(planDetails))" Text="套餐中已包含该药品" Popup=true />
<RadzenCustomValidator Component="drugName" Validator="@(() => (planDetails._DrugInfo.DrugId != null))" Text="请选择药品" Popup=true />
<RadzenCustomValidator Component="drugName" Validator="@(() => ValidatroDrug(planDetails))" Text="套餐中已包含该药品" Popup=true />
</EditTemplate>
</RadzenDataGridColumn>
@ -136,6 +136,7 @@
@inject IPlanDao planDao;
@inject DialogService dialogService;
@inject NotificationService _message
@inject GlobalStateService globalStateService;
RadzenDataGrid<Plan> grid;
RadzenDataGrid<PlanDetails> PlanDetailsGrid;
@ -218,18 +219,35 @@
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if (b)
{
//查询要删除的套餐下是否有绑定,且绑定有库存
if (!(await planDao.CheckPlanBind(planInfo.Id)))
{
_message.Notify
(
new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = $"该套餐还有库存绑定且有库存,请先清库存",
Duration = 4000
}
);
return;
}
// 数据库删除
if (await planDao.DeletePlanInfo(planInfo.Id))
{
_message.Notify
(
new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = $"删除成功",
Duration = 4000
}
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = $"删除成功",
Duration = 4000
}
);
}
else
@ -237,12 +255,12 @@
_message.Notify
(
new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "删除失败",
Duration = 4000
}
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "删除失败",
Duration = 4000
}
);
}
}
@ -306,28 +324,41 @@
);
if (b)
{
SelectedPlan.FirstOrDefault()._PlanDetails.Remove(planDetail);
//查询要删除的药品是否有绑定且库存大于0
if (!(await planDao.CheckPlanDetailBind(planDetail)))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "该药品有绑定且库存不为0请先清库存",
Duration = 4000
});
return;
}
// 数据库删除
if (await planDao.DeletePlanDetail(planDetail))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "删除成功",
Duration = 4000
}
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "删除成功",
Duration = 4000
}
);
SelectedPlan.FirstOrDefault()._PlanDetails.Remove(planDetail);
}
else
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "删除失败",
Duration = 4000
}
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "删除失败",
Duration = 4000
}
);
}
await PlanDetailsGrid.Reload();
@ -348,23 +379,23 @@
if (await planDao.UpdatePlanDetail(planDetail))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "修改成功",
Duration = 4000
}
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "修改成功",
Duration = 4000
}
);
}
else
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "修改失败",
Duration = 4000
}
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "修改失败",
Duration = 4000
}
);
}
@ -377,15 +408,18 @@
{
planDetail.PlanId = SelectedPlan.FirstOrDefault().Id;
planDetail.DrugId = planDetail.DrugId == null ? planDetail._DrugInfo.DrugId : planDetail.DrugId;
planDetail.UseState = 1;
planDetail.OperatorUser = globalStateService.Operator?.Username;
planDetail.ReviewerUser = globalStateService.Reviewer?.Username;
if (await planDao.AddPlanDetail(planDetail))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "保存成功",
Duration = 4000
}
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "保存成功",
Duration = 4000
}
);
@ -393,12 +427,12 @@
else
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "保存失败",
Duration = 4000
}
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "保存失败",
Duration = 4000
}
);
}
}
@ -411,9 +445,9 @@
async Task InsertRow()
{
var detail = new Pojo.PlanDetails()
{
PlanId = SelectedPlan.FirstOrDefault().Id
};
{
PlanId = SelectedPlan.FirstOrDefault().Id
};
SelectedPlan.FirstOrDefault()._PlanDetails.Add(detail);
await PlanDetailsGrid.InsertRow(detail);

View File

@ -162,7 +162,11 @@
<RadzenDropDownDataGrid @bind-Value=@channel.drugManuNo Data=@channel.Drug?.Manus Disabled="@(channel.Drug == null)" TValue="DrugManuNo" Name="@("Drugmanu_" + channel.Id)" TextProperty="ManuNo">
<Columns>
<RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" Sortable="false" />
<RadzenDropDownDataGridColumn Property="EffDate" Title="效期" Sortable="false" />
<RadzenDropDownDataGridColumn Property="EffDate" Title="效期" Sortable="false">
<Template Context="data">
@data.EffDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDropDownDataGridColumn>
</Columns>
</RadzenDropDownDataGrid>
}

View File

@ -1,39 +1,105 @@
@page "/stock/list"
@using MasaBlazorApp3.Report
<style>
@@keyframes shake {
0% { opacity:1;color:red; }
25%{opacity:1;color:orange;}
50% { opacity:0;color:yellow;}
75%{opacity:1;color:crimson;}
100% { opacity:1;color:red; }
0% {
opacity: 1;
color: red;
}
25% {
opacity: 1;
color: orange;
}
50% {
opacity: 0;
color: yellow;
}
75% {
opacity: 1;
color: crimson;
}
100% {
opacity: 1;
color: red;
}
}
.rz-custom-header {
width: 100%;
width: 100%;
}
.shaky-text {
animation: shake 2s infinite ease-in-out;
/* 你可以根据需要调整动画的持续时间和迭代次数 */
transition:color 0.5s linear,opacity 0.5s linear;
animation: shake 2s infinite ease-in-out;
/* 你可以根据需要调整动画的持续时间和迭代次数 */
transition: color 0.5s linear,opacity 0.5s linear;
}
</style>
<div class="col-12 mb-4">
<div class="container-fluid">
<form onsubmit="@(() => grid.Reload())">
<RadzenFieldset Text="查询">
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="开始时间" Component="Start" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="start" Style="width: 100%;" Name="Start" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="结束时间" Component="End" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="end" Style="width: 100%;" Name="End" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="6">
<RadzenLabel Text="药品名称/拼音码/编码" Component="drug" />
</RadzenColumn>
<RadzenColumn Size="6">
<RadzenAutoComplete Name="drug" Multiline="true" @bind-Value=@drugName Data=@drugInfo TextProperty="@nameof(DrugInfo.DrugNameSpecManufactory)"
Style="width: 100%;" InputAttributes="@(new Dictionary<string, object>() { { "aria-label", "drugInfo" } })" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12">
@* <RadzenButton Size="ButtonSize.Large" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" /> *@
<RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
</RadzenColumn>
</RadzenRow>
<RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
<RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" Click="StockExport" />
<RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" Click="AccountBookExport" />
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
</form>
</div>
<div class="col-12 mb-4">
<RadzenDataGrid @ref="grid"
IsLoading="@isLoading"
RowRender="@RowRender"
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
ExpandMode="DataGridExpandMode.Multiple">
<HeaderTemplate>
IsLoading="@isLoading"
RowRender="@RowRender"
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
ExpandMode="DataGridExpandMode.Multiple">
@* <HeaderTemplate>
<RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
<RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" Click="StockExport" />
<RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" Click="AccountBookExport" />
</RadzenRow>
</HeaderTemplate>
</HeaderTemplate> *@
<Template Context="di">
<RadzenDataGrid Data="@di.Stocks" EmptyText="无数据">
<Columns>
@ -50,9 +116,11 @@
@{
DateTime dateTime;
bool success = DateTime.TryParse(s.EffDate, out dateTime);
if(success&&dateTime<=DateTime.Now.AddMonths(3))
if (success && dateTime <= DateTime.Now.AddMonths(3))
{
@s.EffDate<p class="shaky-text">近效期药品!</p>
@s.EffDate
<p class="shaky-text">近效期药品!</p>
}
else
{
@ -67,11 +135,13 @@
<Columns>
<RadzenDataGridColumn Frozen="true" Width="200px" Title="药品名称" Property="DrugName"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="规格" Property="DrugSpec"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="总库存" Property="StockQuantity">
<RadzenDataGridColumn Title="总库存" Property="StockQuantity">
<Template Context="s">
@if(s.StockQuantity<10)
@if (s.StockQuantity < 10)
{
@s.StockQuantity<p class="shaky-text">库存预警!</p>
@s.StockQuantity
<p class="shaky-text">库存预警!</p>
}
else
{
@ -94,7 +164,9 @@
DateTime start;
DateTime end;
string drugName;
IEnumerable<DrugInfo> drugInfo;
protected override async Task OnInitializedAsync()
{
@ -104,6 +176,9 @@
var result = await drugInfoDao.GetAllDrugAndStock();
// Update the Data property
_forecasts = result;
drugInfo = await drugInfoDao.GetAllDrug();
isLoading = false;
}
@ -123,17 +198,26 @@
}
async void StockExport()
//库存导出
void StockExport()
{
}
async void AccountBookExport()
//专用账册导出
void AccountBookExport()
{
// string drugId = drugName != null ? drugName.Split('/').Last().Trim():"";
// GridReportUtil gridReportUtil = new GridReportUtil();
GridReportUtil.PrintReport("stock_template.grf", null);
}
//重置
async Task reloadGrid()
{
start = DateTime.MinValue;
end = DateTime.MinValue;
drugName = string.Empty;
await grid.Reload();
}
}

View File

@ -29,7 +29,14 @@ namespace MasaBlazorApp3.Pojo
public string Manufactory { get; set; }
[Column("pack_unit")]
public string PackUnit { get; set;}
public string PackUnit { get; set; }
[Column("py_code")]
public string PyCode { get; set; }
[Column(IsColumn =false)]
public string DrugNameSpecManufactory
{
get => DrugName + " / " + DrugSpec+ " / " + Manufactory+" / " + PyCode+" / " + DrugId;
}
[Association(ThisKey = nameof(DrugId), OtherKey = nameof(ChannelStock.DrugId))]

View File

@ -13,20 +13,28 @@ namespace MasaBlazorApp3.Pojo
{
[Column("Id")]
public int Id { get; set; }
//操作时间
[Column("optDate")]
public DateTime optDate { get; set; }
//交班操作人
[Column("FromOperator")]
public string FromOperator { get; set; }
//交班审核人
[Column("FromRviewer")]
public string FromRviewer { get; set; }
//接班操作人
[Column("ToOperator")]
public string ToOperator { get; set; }
//接班审核人
[Column("ToReviewer")]
public string ToReviewer { get; set; }
//接班时间
[Column("ToDate")]
public DateTime ToDate { get; set; }
//当班状态0当前值班1已交班
[Column("State")]
public string State { get; set; }
//操作状态0新增1修改
[Column("optState")]
public string optState { get; set; }
[Column("machine_id")]

View File

@ -147,15 +147,15 @@ namespace MasaBlazorApp3.Pojo
///</summary>
[Column("win_no")]
public int WinNo { get; set; } = 0;
/// <summary>
///
/// 默认值: 0
///</summary>
[Column("state")]
public int state { get; set; } = 0;
///// <summary>
/////
///// 默认值: 0
/////</summary>
//[Column("state")]
//public int state { get; set; } = 0;
[Association(ThisKey = nameof(OrderNo), OtherKey = nameof(OrderDetail.OrderNo))]
public OrderDetail Detail { get; set; } = new();
public List<OrderDetail> DetailList { get; set; } = new();
/// <summary>
/// 是否选中

View File

@ -33,10 +33,10 @@ namespace MasaBlazorApp3.Pojo
public int UseState { get; set; }
//操作人
[Column("operatorUser")]
public int OperatorUser { get; set; }
public string OperatorUser { get; set; }
//审核人
[Column("reviewerUser")]
public int ReviewerUser { get; set; }
public string ReviewerUser { get; set; }
public List<ChannelStock> channelStocks { get; set; } = new List<ChannelStock>();
public DrugManuNo _ManuNo { get; set; }

View File

@ -177,6 +177,12 @@ namespace MasaBlazorApp3.Pojo
PremissionName = "药品标定",
PremissionPath = "/stock/biaoDing"
});
k.AddChild(new Premission()
{
Id = 47,
PremissionName = "交接班列表",
PremissionPath = "/stock/Change"
});
Premission x = new Premission
{
Id = 5,
@ -216,39 +222,85 @@ namespace MasaBlazorApp3.Pojo
PremissionPath = "/manage/setting/Fridge"
});
x.AddChild(new Premission()
//x.AddChild(new Premission()
//{
// Id = 54,
// PremissionName = "套餐管理",
// PremissionPath = "/Box/Plan"
//});
//x.AddChild(new Premission()
//{
// Id = 55,
// PremissionName = "绑定药箱",
// PremissionPath = "/Box/BoxBindings"
//});
//x.AddChild(new Premission()
//{
// Id = 56,
// PremissionName = "药箱核对",
// PremissionPath = "/Box/Check"
//});
//x.AddChild(new Premission()
//{
// Id = 57,
// PremissionName = "药箱加药",
// PremissionPath = "/Box/BoxAdd"
//});
//x.AddChild(new Premission()
//{
// Id = 58,
// PremissionName = "药箱入库",
// PremissionPath = "/Box/BoxAddBox"
//});
//x.AddChild(new Premission()
//{
// Id = 59,
// PremissionName = "药箱库存",
// PremissionPath = "/Box/BoxStock"
//});
Premission b = new Premission
{
Id = 54,
Id = 6,
PremissionName = "药箱管理",
PremissionPath = "Box"
};
b.AddChild(new Premission()
{
Id = 61,
PremissionName = "套餐管理",
PremissionPath = "/Box/Plan"
});
x.AddChild(new Premission()
b.AddChild(new Premission()
{
Id = 55,
Id = 62,
PremissionName = "绑定药箱",
PremissionPath = "/Box/BoxBindings"
});
x.AddChild(new Premission()
b.AddChild(new Premission()
{
Id = 56,
Id = 63,
PremissionName = "药箱核对",
//PremissionName = "盘点交接",
PremissionPath = "/Box/Check"
});
x.AddChild(new Premission()
b.AddChild(new Premission()
{
Id = 57,
Id = 66,
PremissionName = "药箱加药",
//PremissionPath = "/stock/checkRecord"
PremissionPath = "/Box/BoxAdd"
});
x.AddChild(new Premission()
b.AddChild(new Premission()
{
Id = 58,
Id = 65,
PremissionName = "药箱入库",
PremissionPath = "/Box/BoxAddBox"
});
x.AddChild(new Premission()
b.AddChild(new Premission()
{
Id = 59,
Id = 66,
PremissionName = "药箱库存",
PremissionPath = "/Box/BoxStock"
});
@ -256,6 +308,7 @@ namespace MasaBlazorApp3.Pojo
list.Add(j);
list.Add(h);
list.Add(k);
list.Add(b);
x.AddChild(set);
list.Add(x);

View File

@ -72,6 +72,10 @@ internal class Program
//药品批次
appBuilder.Services.AddScoped<IDrugManuNoDao, DrugManuNoDao>();
//交接班记录
appBuilder.Services.AddScoped<IHkcChangeShiftsDao, HkcChangeShiftsDao>();
//GlobalStateService.connStr = config.GetValue<String>("connectionStrings");
var app = appBuilder.Build();
app.MainWindow
.SetHeight(768)

View File

@ -31,8 +31,8 @@ namespace MasaBlazorApp3.Report
Report.PrintPreview(true);
}
}
}

View File

@ -1,5 +1,5 @@
{
"Version":"6.8.5.2",
"Version":"6.8.1.1",
"Font":{
"Name":"宋体",
"Size":105000,
@ -17,8 +17,6 @@
"CenterView":true,
"AppendBlankRow":true,
"Recordset":{
"ConnectionString":"MYSQL;\r\nDatabase=hkcdb;\r\nPassword=qq1223;\r\nPort=3307;\r\nServer=127.0.0.1;\r\nUser=root;",
"QuerySQL":"SELECT \r\n mr.`stock_quantity` AS `stockQuantity`,\r\n IF(mr.`type` IN (1, 31), mr.`quantity`, IF(mr.`type` = 4 AND mr.`quantity` > 0, mr.`quantity`, 0)) AS `inQuantity`,\r\n IF(mr.`type` = 2, mr.`quantity`, IF(mr.`type` = 4 AND mr.`quantity` < 0, (0 - mr.`quantity`), 0)) AS `outQuantity`,\r\n mr.`operation_time` AS `operationTime`,\r\n mr.`invoice_id` AS `invoiceId`,\r\n di.`drug_name` AS `drugName`,\r\n di.`drug_id` AS `drugId`,\r\n di.`drug_spec` AS `drugSpec`,\r\n di.`pack_unit` AS `packUnit`,\r\n di.`dosage` AS `dosage`,\r\n di.`manufactory` AS `manufactory`,\r\n mr.`manu_no` AS `manuNo`,\r\n mr.`eff_date` AS `effDate`,\r\n u1.`user_name` AS `operatorName`,\r\n u2.`user_name` AS `reviewerName`\r\nFROM\r\n dm_machine_record mr \r\n LEFT JOIN drug_info di ON mr.`drug_id` = di.`drug_id` \r\n LEFT JOIN user_list u1 ON mr.`operator` = u1.`id`\r\n LEFT JOIN user_list u2 ON mr.`reviewer` = u2.`id`\r\n ORDER BY mr.`drug_id`, mr.`operation_time`, mr.`id`",
"Field":[
{
"Name":"日期",
@ -34,11 +32,6 @@
"Name":"批号",
"DBFieldName":"manuNo"
},
{
"Name":"上次批次结存",
"Type":"Integer",
"DBFieldName":"beforeManuQuan"
},
{
"Name":"入库数量",
"Type":"Integer",
@ -49,11 +42,6 @@
"Type":"Integer",
"DBFieldName":"outQuantity"
},
{
"Name":"批号结存",
"Type":"Integer",
"DBFieldName":"manuQuantity"
},
{
"Name":"总结存",
"Type":"Integer",
@ -65,7 +53,7 @@
},
{
"Name":"复核人",
"DBFieldName":"reviewName"
"DBFieldName":"reviewerName"
},
{
"Name":"药品名称",
@ -94,15 +82,12 @@
"DBFieldName":"effDate"
},
{
"Name":"sign1",
"Type":"Binary"
"Name":"drugId",
"DBFieldName":"drug_Id"
},
{
"Name":"sign2",
"Type":"Binary"
},
{
"Name":"drugId"
"Name":"凭证号",
"DBFieldName":"invoiceId"
}
]
},
@ -112,7 +97,7 @@
"Width":1.77271
},
{
"Name":"操作类型",
"Name":"凭证号",
"Width":2.19604
},
{
@ -121,7 +106,7 @@
},
{
"Name":"有效期",
"Width":2.43417
"Width":2.40771
},
{
"Name":"入库数量",
@ -157,20 +142,14 @@
"ColumnContentCell":[
{
"Column":"日期",
"WordWrap":true,
"TextAlign":"MiddleCenter",
"ShrinkFontToFit":true,
"DataField":"日期"
},
{
"Column":"操作类型",
"FreeCell":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox10",
"Dock":"Fill",
"TextAlign":"MiddleCenter"
}
]
"Column":"凭证号",
"DataField":"凭证号"
},
{
"Column":"批号",
@ -228,11 +207,10 @@
"FreeCell":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox6",
"Type":"FieldBox",
"Name":"FieldBox14",
"Dock":"Fill",
"TextAlign":"MiddleCenter",
"Text":"药库"
"TextAlign":"MiddleCenter"
}
]
},
@ -241,11 +219,10 @@
"FreeCell":true,
"Control":[
{
"Type":"StaticBox",
"Name":"StaticBox7",
"Type":"FieldBox",
"Name":"FieldBox15",
"Dock":"Fill",
"TextAlign":"MiddleCenter",
"Text":"门诊药房"
"TextAlign":"MiddleCenter"
}
]
}
@ -269,7 +246,7 @@
},
{
"GroupTitle":false,
"Column":"操作类型",
"Column":"凭证号",
"Font":{
"Name":"宋体",
"Size":105000,
@ -394,6 +371,7 @@
"Name":"Group1",
"ByFields":"drugId",
"GroupHeader":{
"NewPage":"Before",
"PrintGridBorder":false,
"RepeatOnPage":true,
"Control":[