using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.BaseServices; using WIDESEA_Core; using WIDESEA_IInboundRepository; using WIDESEA_IInboundService; using WIDESEA_Model.Models; using WIDESEA_DTO.ERP; using WIDESEA_Core.BaseRepository; using WIDESEA_IBasicRepository; using WIDESEA_IOutboundService; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.CommonEnum; using WIDESEA_Core.Helper; using Microsoft.AspNetCore.Mvc.RazorPages; using WIDESEA_External.ERPService; using WIDESEA_InboundRepository; using WIDESEA_IStockRepository; using WIDESEA_Common.StockEnum; using WIDESEA_Core.Enums; using WIDESEA_External.Model; using SqlSugar; namespace WIDESEA_InboundService { public class TakeStockOrderService : ServiceBase, ITakeStockOrderService { public ITakeStockOrderRepository Repository => BaseDal; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IBasicRepository _basicRepository; private readonly IInvokeERPService _invokeERPService; private readonly ITakeStockOrderDetailRepository _takeStockOrderDetailRepository; private readonly IStockInfoRepository _stockInfoRepository; private readonly IStockInfoDetailRepository _stockInfoDetailRepository; public TakeStockOrderService(ITakeStockOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository,IInvokeERPService invokeERPService,ITakeStockOrderDetailRepository takeStockOrderDetailRepository,IStockInfoRepository stockInfoRepository,IStockInfoDetailRepository stockInfoDetailRepository) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _basicRepository = basicRepository; _invokeERPService = invokeERPService; _takeStockOrderDetailRepository= takeStockOrderDetailRepository; _stockInfoRepository= stockInfoRepository; _stockInfoDetailRepository= stockInfoDetailRepository; } /// /// 新增 /// public override WebResponseContent AddData(SaveModel saveModel) { Dt_Warehouse? warehouse = null; if (saveModel.MainData.TryGetValue(nameof(Dt_TakeStockOrder.WarehouseId).FirstLetterToLower(), out object? warehouseId) && warehouseId != null && !string.IsNullOrEmpty(warehouseId.ToString())) { warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId.ObjToInt()); if (warehouse == null) return WebResponseContent.Instance.Error("未找到仓库信息"); } if (saveModel.DetailData.Count>0) { for (int i = 0; i < saveModel.DetailData.Count; i++) { if (saveModel.DetailData[i].TryGetValue(nameof(Dt_TakeStockOrderDetail.MaterielCode).FirstLetterToLower(), out object? materielCode) && materielCode != null && !string.IsNullOrEmpty(materielCode.ToString())) { Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode.ToString() && x.WarehouseId == warehouse.WarehouseId); if (materielInfo == null) return WebResponseContent.Instance.Error($"未找到本仓库物料{materielCode}信息"); saveModel.DetailData[i].Add(nameof(Dt_TakeStockOrderDetail.MaterielName).FirstLetterToLower(),materielInfo.MaterielName); saveModel.DetailData[i].Add(nameof(Dt_TakeStockOrderDetail.MaterielSpec).FirstLetterToLower(), materielInfo.MaterielSpec); saveModel.DetailData[i].Add(nameof(Dt_TakeStockOrderDetail.Unit).FirstLetterToLower(), materielInfo.MaterielUnit); } } } saveModel.MainData.Add(nameof(Dt_TakeStockOrder.TakeStockStatus).FirstLetterToLower(), TakeStockStatusEnum.未盘点.ObjToInt()); return base.AddData(saveModel); } /// /// 获取对应仓库盘点单 /// /// public WebResponseContent GetTakeStockOrders(SaveModel saveModel) { WebResponseContent content =new WebResponseContent(); try { int pageNo = saveModel.MainData["pageNo"].ObjToInt(); string? orderNo = saveModel.MainData["orderNo"].ToString(); int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); List takeStockOrders = new List(); if (string.IsNullOrEmpty(orderNo)) { takeStockOrders = Db.Queryable().Where(x => x.TakeStockStatus < TakeStockStatusEnum.盘点完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } else { takeStockOrders = Db.Queryable().Where(x => (x.OrderNo.Contains(orderNo) && x.TakeStockStatus < TakeStockStatusEnum.盘点完成.ObjToInt() && x.WarehouseId == warehouseId)).ToPageList(pageNo, 5); } content.OK(data: takeStockOrders); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 通过盘点单号+框号获取盘点信息详情 /// /// /// public WebResponseContent GetTakeDetailInfo(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { string? orderNo = saveModel.MainData["orderNo"].ToString(); string? takePalletCode = saveModel.MainData["takePalletCode"].ToString(); Dt_TakeStockOrderDetail takeStockOrderDetail=new Dt_TakeStockOrderDetail(); if (!string.IsNullOrEmpty(orderNo) && !string.IsNullOrEmpty(takePalletCode)) { //获取盘点明细 takeStockOrderDetail = BaseDal.Db.Queryable((master, detail) => master.Id == detail.TakeStockId) .Where((master, detail) => master.OrderNo == orderNo && detail.TakePalletCode== takePalletCode) .Select((master, detail) => detail).First(); if (takeStockOrderDetail==null) { return content.Error($"盘点单{orderNo}中未找到{takePalletCode}盘点明细"); } if (takeStockOrderDetail.TakeDetalStatus != TakeStockDetailStatusEnum.盘点出库完成.ObjToInt()) { return content.Error($"盘点单{orderNo}中未找到{takePalletCode}可盘状态"); } Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable().Where(x=>x.PalletCode== takePalletCode && x.StockStatus==StockStatusEmun.盘点出库完成.ObjToInt()).Includes(x=>x.Details).First(); if (stockInfo == null) { return content.Error($"未找到{takePalletCode}盘点库存状态"); } content.OK(data: takeStockOrderDetail); } else { return content.Error("请求信息为空"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 盘点操作 /// /// /// public WebResponseContent MatPicking(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { int id = saveModel.MainData["id"].ObjToInt(); decimal stockNum =saveModel.MainData["num"].ObjToDecimal(); if (stockNum<0) { return content.Error("盘亏不能为负"); } if (id>0) { //获取盘点详情 Dt_TakeStockOrderDetail takeStockOrderDetail = _takeStockOrderDetailRepository.QueryFirst(x=>x.Id== id); if (takeStockOrderDetail.TakeDetalStatus != TakeStockDetailStatusEnum.盘点出库完成.ObjToInt()) { return content.Error("非可盘点状态"); } Dt_TakeStockOrder takeStockOrder = BaseDal.Db.Queryable().Where(x => x.Id == takeStockOrderDetail.TakeStockId).Includes(x => x.Details).First(); if (takeStockOrder.TakeStockStatus != TakeStockStatusEnum.盘点中.ObjToInt()) { return content.Error("非可盘点状态"); } //获取库存 Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable().Where(x => x.PalletCode == takeStockOrderDetail.TakePalletCode && x.StockStatus == StockStatusEmun.盘点出库完成.ObjToInt()).Includes(x => x.Details).First(); List addStockDetails = new List(); List delStockDetails = new List(); List updateStockDetails = new List(); if (stockInfo == null || stockInfo.Details.Count<=0 || stockInfo.Details==null) { return content.Error("未找到库存"); } takeStockOrderDetail.Qty = (float)stockNum; takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.盘点完成.ObjToInt(); int stockCount=stockInfo.Details.Count; //判断是否盘赢还是盘亏 if (takeStockOrderDetail.SysQty< takeStockOrderDetail.Qty) //盘赢 { //float stockMaxQty = stockInfo.Details.Max(x => x.StockQuantity); //float stockMinQty = stockInfo.Details.Min(x => x.StockQuantity); Dt_StockInfoDetail? addstockInfoDetail = stockInfo.Details?.FirstOrDefault(); addstockInfoDetail.Id = 0; addstockInfoDetail.StockQuantity = (takeStockOrderDetail.Qty - takeStockOrderDetail.SysQty); addStockDetails.Add(addstockInfoDetail); } else if (takeStockOrderDetail.Qty==0) //盘亏 { delStockDetails.AddRange(stockInfo.Details); } else if(takeStockOrderDetail.SysQty > takeStockOrderDetail.Qty) //盘亏 { decimal totalQty = (takeStockOrderDetail.SysQty - takeStockOrderDetail.Qty).ObjToDecimal(); while (totalQty>0) { Dt_StockInfoDetail addstockInfoDetail=stockInfo.Details.OrderByDescending(x => x.Id).FirstOrDefault(); decimal stockQty = addstockInfoDetail.StockQuantity.ObjToDecimal(); if (stockQty < totalQty) { delStockDetails.Add(addstockInfoDetail); stockInfo.Details.Remove(addstockInfoDetail); totalQty -= stockQty; } else if (stockQty >= totalQty) { stockQty-=totalQty; if (stockQty==0) { delStockDetails.Add(addstockInfoDetail); stockInfo.Details.Remove(addstockInfoDetail); } else { addstockInfoDetail.StockQuantity = (float)stockQty; updateStockDetails.Add(addstockInfoDetail); stockInfo.Details.Remove(addstockInfoDetail); } totalQty = 0; } } } List takeStockOrderDetails=new List(); Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==takeStockOrder.WarehouseId); List overTakeStockOrderDetails = takeStockOrder.Details.Where(x => x.TakeDetalStatus == TakeStockDetailStatusEnum.盘点完成.ObjToInt()).ToList(); if ((overTakeStockOrderDetails.Count + 1) == takeStockOrder.Details.Count) { takeStockOrder.TakeStockStatus = TakeStockStatusEnum.盘点完成.ObjToInt(); takeStockOrderDetails.AddRange(overTakeStockOrderDetails); takeStockOrderDetails.Add(takeStockOrderDetail); } //数据操作 _unitOfWorkManage.BeginTran(); if (stockCount== delStockDetails.Count) { _stockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); } else { stockInfo.StockStatus = StockStatusEmun.盘点库存完成.ObjToInt(); _stockInfoRepository.UpdateData(stockInfo); if (stockInfo.Details!=null && stockInfo.Details.Count>0) { stockInfo.Details.ForEach(x => { x.Status = StockStatusEmun.盘点库存完成.ObjToInt(); }); } } if (delStockDetails.Count>0) { _stockInfoDetailRepository.DeleteAndMoveIntoHty(delStockDetails, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); } if (addStockDetails.Count>0) { addStockDetails.ForEach(x => { x.Status = StockStatusEmun.盘点库存完成.ObjToInt(); }); _stockInfoDetailRepository.AddData(addStockDetails); } if (updateStockDetails.Count>0) { updateStockDetails.ForEach(x => { x.Status = StockStatusEmun.盘点库存完成.ObjToInt(); }); _stockInfoDetailRepository.UpdateData(updateStockDetails); } _takeStockOrderDetailRepository.UpdateData(takeStockOrderDetail); BaseDal.UpdateData(takeStockOrder); //提交ERP逻辑 //if (takeStockOrder.TakeStockStatus== TakeStockStatusEnum.盘点完成.ObjToInt()) //{ // ERPTakeStockModel eRPTakeStock = new ERPTakeStockModel() // { // Way = 1, // UniqueTag = takeStockOrder.Id.ToString(), // Code = takeStockOrder.OrderNo, // FiscalPeriotime = takeStockOrder.CreateDate.ToString("yyyy-MM-dd"), // Name=takeStockOrder.OrderNo, // WarehouseCode= warehouse.WarehouseCode, // Createuser=takeStockOrder.Creater, // Createtime= takeStockOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), // Details=new List() // }; // foreach (var item in takeStockOrderDetails) // { // TakeDetailsItem takeDetailsItem = new TakeDetailsItem() // { // MaterialsCode=item.MaterielCode, // LocationCode=item.LocationCode, // Lotno=item.BatchNo, // Sysqty=item.SysQty.ObjToDecimal(), // Qty=item.Qty.ObjToDecimal() // }; // eRPTakeStock.Details.Add(takeDetailsItem); // } // string response = _invokeERPService.InvokeTakeStockApi(eRPTakeStock); // ErpRequestContent erpRequestContent = response.DeserializeObject(); // if (erpRequestContent.res != 1) // { // throw new Exception("同步ERP失败,错误信息:" + erpRequestContent.Data); // } //} _unitOfWorkManage.CommitTran(); content.OK("盘点成功"); } else { return content.Error("请求信息为空"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } public WebResponseContent DisEnableTakeOrder(int id) { WebResponseContent content = new WebResponseContent(); try { //获取盘点单 Dt_TakeStockOrder takeStockOrder = BaseDal.QueryFirst(x=>x.Id==id); if (takeStockOrder!=null) { takeStockOrder.TakeStockStatus = TakeStockStatusEnum.盘点关闭.ObjToInt(); BaseDal.UpdateData(takeStockOrder); content.OK("关闭盘点成功!"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } } }