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<Dt_PurchaseOrder, IPurchaseOrderRepository>, 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<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == purchaseOrderNo).Includes(x => x.Details).First();
|
List<string> 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<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData();
|
List<Dt_MaterielInfo> materielInfos = _materielInfoRepository.QueryData();
|
List<Dt_PurchaseOrderDetail> purchaseOrderDetails = new List<Dt_PurchaseOrderDetail>();
|
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,
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec,
|
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<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == model.OrderNo).Includes(x => x.Details).First();
|
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<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData();
|
List<Dt_MaterielInfo> materielInfos = _materielInfoRepository.QueryData();
|
List<Dt_PurchaseOrderDetail> purchaseOrderDetails = new List<Dt_PurchaseOrderDetail>();
|
List<Dt_PurchaseOrderDetail> updatePurchaseOrderDetails = new List<Dt_PurchaseOrderDetail>();
|
List<int> detailIds = new List<int>();
|
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<Dt_PurchaseOrderDetail> 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<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == model.OrderNo).Includes(x => x.Details).First();
|
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<Dt_PurchaseOrder>().Where(x=>x.PurchaseOrderNo== model.OrderNo).Includes(x=>x.Details).First();
|
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);
|
}
|
}
|
}
|
}
|