using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_IWMsInfoServices; using WIDESEA_Model.Models; namespace WIDESEA_WMsInfoServices { public class Inventory_BatchServices : ServiceBase>, IInventory_BatchServices { private IMessageInfoService _messageInfoService; private IMaterielInfoService _materielInfoService; private IInventoryInfoService _inventoryInfoService; private ISupplyTaskService _supplyTaskService; public Inventory_BatchServices(IRepository BaseDal, IMessageInfoService messageInfoService, IMaterielInfoService materielInfoService, IInventoryInfoService inventoryInfoService, ISupplyTaskService supplyTaskService) : base(BaseDal) { _messageInfoService = messageInfoService; _materielInfoService = materielInfoService; _inventoryInfoService = inventoryInfoService; _supplyTaskService = supplyTaskService; } public IRepository Repository => BaseDal; public override WebResponseContent UpdateData(SaveModel saveModel) { try { string WareCode = WarehouseEnum.大件库.ObjToInt().ToString("000"); var qty = saveModel.MainData["stockQuantity"].ObjToInt(); var id = saveModel.MainData["id"].ObjToInt(); var materielCode = saveModel.MainData["materielCode"].ToString(); var batchNo = saveModel.MainData["batchNo"].ToString(); //var Inventory_Batch = BaseDal.QueryFirst(x => x.Id == id); //if (qty > Inventory_Batch.AvailableQuantity) throw new Exception("调拨数量不可大于可用数量"); var materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == materielCode); if (materielInfo == null) return WebResponseContent.Instance.Error($"请维护药品编号【{materielCode}】的信息"); if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType)) return WebResponseContent.Instance.Error($"请设置药品编号【{materielCode}】的属性分类"); if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart) return WebResponseContent.Instance.Error($"药品编号【{materielCode}】的属性分类为大件,不可调拨"); List dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == materielInfo.MaterielCode && x.BatchNo == batchNo && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.AvailableQuantity > 0 && x.WarehouseCode == WareCode).OrderBy(x => x.InDate).ToList(); if (dt_InventoryInfos.Count < 1) return WebResponseContent.Instance.Error($"物料编号【{materielInfo.MaterielCode}】大件库无库存!请及时补充库存!"); var StockQty = dt_InventoryInfos.Sum(x => x.AvailableQuantity); if (StockQty < qty) return WebResponseContent.Instance.Error($"调拨数量不可大于大件库可用数量,大件库可用数量为【{StockQty}】"); var zx = qty / materielInfo.BoxQty; var ys = qty % materielInfo.BoxQty; if (ys > 0) zx++; decimal Qty = 0; List supplyTasks = new List(); Dt_DeliveryOrder deliveryOrder = new Dt_DeliveryOrder() { Out_no = DateTime.Now.ToString("yyMMddHHmmss"), Warehouse_no = WareCode, Out_type = OutOrderTypeEnum.Allocate.ObjToInt().ToString(), OutStatus = "新建", Details = new List() }; foreach (var item in dt_InventoryInfos) { decimal taskQty = 0; if (zx < 1) break; while (item.AvailableQuantity > 0 && zx > 0) { zx--; Qty += materielInfo.BoxQty; taskQty += materielInfo.BoxQty; materielInfo.Business_qty += materielInfo.BoxQty; item.OutboundQuantity += materielInfo.BoxQty; item.AvailableQuantity -= materielInfo.BoxQty; } #region 添加调拨出库任务 Dt_SupplyTask supplyTask = new Dt_SupplyTask() { WarehouseCode = item.WarehouseCode, BatchNo = item.BatchNo, MaterielName = item.MaterielName, MaterielCode = item.MaterielCode, MaterielSpec = item.MaterielSpec, TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(), TaskType = TaskTypeEnum.AllocatOut.ObjToInt(), CreateDate = DateTime.Now, Creater = App.User.UserName ?? "System", LocationCode = item.LocationCode, OrderNo = deliveryOrder.Out_no, StockQuantity = taskQty, SupplyQuantity = 0, Remark = "调拨出库" }; supplyTasks.Add(supplyTask); #endregion } Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail() { Batch_num = batchNo, Order_Outqty = 0, Order_qty = Qty, CreateDate = DateTime.Now, Creater = App.User.UserName ?? "System", Goods_no = materielCode, OotDetailStatus = "新建", Status = 2, Reservoirarea = WareCode }; deliveryOrder.Details.Add(deliveryOrderDetail); #region 添加调拨入库单 Dt_CabinOrder cabinOrder = new Dt_CabinOrder() { Order_no = deliveryOrder.Out_no, Order_type = InOrderTypeEnum.Allocat.ObjToInt().ToString(), Warehouse_no = "001", OdrderStatus = "新建", Details = new List() }; foreach (var item in deliveryOrder.Details) { Dt_CabinOrderDetail orderDetail = new Dt_CabinOrderDetail() { Reservoirarea = cabinOrder.Warehouse_no, Goods_no = item.Goods_no, Order_qty = item.Order_qty, Batch_num = item.Batch_num, OrderDetailStatus = "新建", Status = 0 }; cabinOrder.Details.Add(orderDetail); } #endregion Db.Ado.BeginTran(); _materielInfoService.UpdateData(materielInfo); _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos); _supplyTaskService.AddData(supplyTasks); if (deliveryOrder.Details.Count > 1) Db.InsertNav(deliveryOrder).Include(x => x.Details).ExecuteCommand(); if (cabinOrder.Details.Count > 1) Db.InsertNav(cabinOrder).Include(x => x.Details).ExecuteCommand(); Db.Ado.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Db.Ado.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent GetExpiredAndlow() { WebResponseContent content = new WebResponseContent(); try { DateTime dateTime = DateTime.Now.AddDays(30).Date; List inventory_Batches = BaseDal.QueryData(x => x.ValidityPeriod < dateTime); foreach (var item in inventory_Batches) { var day = (item.ValidityPeriod - DateTime.Now).Days; string d = $"还有{day}天过期"; if (day < 0) d = $"已过期{Math.Abs(day)}天"; _messageInfoService.AddMessageInfo(MessageGroupByEnum.InventoryExceedAlarm, "物料名称:" + item.MaterielName, $"物料编号【{item.MaterielCode}】物料批次【{item.BatchNo}】{d}", messageRemark: $"物料编号【{item.MaterielCode}】物料批次【{item.BatchNo}】"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } } }