using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_BasicRepository; using WIDESEA_Common.OrderEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO; using WIDESEA_DTO.Basic; using WIDESEA_IBasicRepository; using WIDESEA_IInboundRepository; using WIDESEA_IInboundService; using WIDESEA_InboundRepository; using WIDESEA_Model.Models; namespace WIDESEA_InboundService { public class PurchaseOrderService : ServiceBase, IPurchaseOrderService { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IPurchaseOrderDetailRepository _purchaseOrderDetailRepository; private readonly IBasicRepository _basicRepository; private readonly ISupplierInfoRepository _supplierInfoRepository; private readonly IMaterielInfoRepository _materielInfoRepository; public PurchaseOrderService(IPurchaseOrderRepository BaseDal, IPurchaseOrderDetailRepository purchaseOrderDetailRepository, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository, ISupplierInfoRepository supplierInfoRepository, IMaterielInfoRepository materielInfoRepository) : base(BaseDal) { _purchaseOrderDetailRepository = purchaseOrderDetailRepository; _unitOfWorkManage = unitOfWorkManage; _basicRepository = basicRepository; _supplierInfoRepository = supplierInfoRepository; _materielInfoRepository = materielInfoRepository; } public WebResponseContent GetPurchaseOrderInfo(string purchaseOrderNo) { try { Dt_PurchaseOrder purchaseOrder = BaseDal.Db.Queryable().Where(x => x.PurchaseOrderNo == purchaseOrderNo).Includes(x => x.Details).First(); List MaterielCodes = purchaseOrder.Details.Where(x => x.PurchaseDetailStatus != PurchaseOrderDetailStatusEnum.Received.ObjToInt()).Select(x => x.MaterielCode).ToList(); return WebResponseContent.Instance.OK(data: MaterielCodes); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ReceivePurchaseOrder(PurchaseOrderModel model) { try { return model.Way switch { 1 => AddPurchaseOrder(model), 2 => UpdatePurchaseOrder(model), 3 => DeletePurchaseOrder(model), 4 => ClosePurchaseOrder(model), _ => WebResponseContent.Instance.OK(), }; } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent AddPurchaseOrder(PurchaseOrderModel model) { try { if (BaseDal.QueryFirst(x => x.PurchaseOrderNo == model.OrderNo) != null) { return WebResponseContent.Instance.Error($"采购单号重复"); } if (_supplierInfoRepository.QueryFirst(x => x.SupplierCode == model.SCode) == null) { return WebResponseContent.Instance.Error($"未找到供应商编码【{model.SCode}】的信息"); } List warehouses = _basicRepository.WarehouseRepository.QueryData(); List materielInfos = _materielInfoRepository.QueryData(); List purchaseOrderDetails = new List(); foreach (var item in model.MList) { Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseCode == item.WaId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到仓库信息"); } Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到物料编码【{item.MCode}】的信息"); } Dt_PurchaseOrderDetail purchaseOrderDetail = new Dt_PurchaseOrderDetail() { MaterielCode = item.MCode, PurchaseDetailQuantity = item.Qty, PurchaseDetailReceiveQty = 0, PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt(), Unit = item.Unit, WarehouseId = warehouse.WarehouseId, RowNo = item.RowId, }; purchaseOrderDetails.Add(purchaseOrderDetail); } Dt_PurchaseOrder purchaseOrder = new Dt_PurchaseOrder() { OrderQuantity = model.Amount, OrderDate = model.OrderDate, PurchaseOrderNo = model.OrderNo, PurchaseOrderStatus = PurchaseOrderStatusEnum.NotReceived.ObjToInt(), PurchaseOrderType = model.Type, SupplierCode = model.SCode, Details = purchaseOrderDetails }; Db.InsertNav(purchaseOrder).Include(x => x.Details).ExecuteCommand(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent UpdatePurchaseOrder(PurchaseOrderModel model) { try { Dt_PurchaseOrder purchaseOrder = Db.Queryable().First(x => x.PurchaseOrderNo == model.OrderNo); if (purchaseOrder == null) { return WebResponseContent.Instance.Error($"未找到采购单信息"); } if (purchaseOrder.Details == null || purchaseOrder.Details.Count == 0) { return WebResponseContent.Instance.Error($"未找到采购单明细信息"); } if (_supplierInfoRepository.QueryFirst(x => x.SupplierCode == model.SCode) == null) { return WebResponseContent.Instance.Error($"未找到供应商编码【{model.SCode}】的信息"); } List warehouses = _basicRepository.WarehouseRepository.QueryData(); List materielInfos = _materielInfoRepository.QueryData(); List purchaseOrderDetails = new List(); List updatePurchaseOrderDetails = new List(); List detailIds = new List(); foreach (var item in model.MList) { Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseCode == item.WaId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到仓库信息"); } Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到物料编码【{item.MCode}】的信息"); } Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrder.Details.FirstOrDefault(x => x.RowNo == item.RowId); if (purchaseOrderDetail == null) { purchaseOrderDetail = new Dt_PurchaseOrderDetail() { MaterielCode = item.MCode, PurchaseDetailQuantity = item.Qty, PurchaseDetailReceiveQty = 0, PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt(), Unit = item.Unit, WarehouseId = warehouse.WarehouseId, RowNo = item.RowId, }; purchaseOrderDetails.Add(purchaseOrderDetail); } else { purchaseOrderDetail.MaterielCode = item.MCode; purchaseOrderDetail.PurchaseDetailQuantity = item.Qty; purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt(); purchaseOrderDetail.Unit = item.Unit; purchaseOrderDetail.WarehouseId = warehouse.WarehouseId; purchaseOrderDetail.RowNo = item.RowId; updatePurchaseOrderDetails.Add(purchaseOrderDetail); detailIds.Add(purchaseOrderDetail.Id); } } purchaseOrder.OrderQuantity = model.Amount; purchaseOrder.OrderDate = model.OrderDate; purchaseOrder.PurchaseOrderNo = model.OrderNo; purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.NotReceived.ObjToInt(); purchaseOrder.PurchaseOrderType = model.Type; purchaseOrder.SupplierCode = model.SCode; List deletePurchaseOrderDetails = purchaseOrder.Details.Where(x => !detailIds.Contains(x.Id)).ToList(); _unitOfWorkManage.BeginTran(); foreach (var item in deletePurchaseOrderDetails) { _purchaseOrderDetailRepository.DeleteAndMoveIntoHty(item, OperateTypeEnum.人工删除); } _purchaseOrderDetailRepository.UpdateData(updatePurchaseOrderDetails); _purchaseOrderDetailRepository.AddData(purchaseOrderDetails); BaseDal.UpdateData(purchaseOrder); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent DeletePurchaseOrder(PurchaseOrderModel model) { try { Dt_PurchaseOrder purchaseOrder = Db.Queryable().First(x => x.PurchaseOrderNo == model.OrderNo); if (purchaseOrder == null) { return WebResponseContent.Instance.Error($"未找到采购单信息"); } if (purchaseOrder.Details == null || purchaseOrder.Details.Count == 0) { return WebResponseContent.Instance.Error($"未找到采购单明细信息"); } Db.DeleteNav(purchaseOrder).Include(x => x.Details).ExecuteCommand(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ClosePurchaseOrder(PurchaseOrderModel model) { try { Dt_PurchaseOrder purchaseOrder = Db.Queryable().First(x => x.PurchaseOrderNo == model.OrderNo); if (purchaseOrder == null) { return WebResponseContent.Instance.Error($"未找到采购单信息"); } if (purchaseOrder.Details == null || purchaseOrder.Details.Count == 0) { return WebResponseContent.Instance.Error($"未找到采购单明细信息"); } _unitOfWorkManage.BeginTran(); BaseDal.DeleteAndMoveIntoHty(purchaseOrder, OperateTypeEnum.关闭); foreach (var item in purchaseOrder.Details) { _purchaseOrderDetailRepository.DeleteAndMoveIntoHty(item, OperateTypeEnum.关闭); } _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } } }