using Autofac.Core;
|
using AutoMapper;
|
using Microsoft.AspNetCore.Mvc;
|
using SqlSugar;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.CodeConfigEnum;
|
using WIDESEA_Core.DB;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Seed;
|
using WIDESEA_IOutboundService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_OutboundService
|
{
|
public class OutboundOrderService : ServiceBase<Dt_OutboundOrder, IRepository<Dt_OutboundOrder>>, IOutboundOrderService
|
{
|
private readonly IMapper _mapper;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
public IRepository<Dt_OutboundOrder> Repository => BaseDal;
|
|
private readonly IRepository<Dt_OutboundOrderDetail> _outboundOrderDetailRepository;
|
|
public OutboundOrderService(IRepository<Dt_OutboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_outboundOrderDetailRepository = outboundOrderDetailRepository;
|
}
|
|
public WebResponseContent ReceiveOutboundOrder(Dt_OutboundOrder model, int operateType)
|
{
|
try
|
{
|
return operateType switch
|
{
|
1 => AddOutboundOrder(model),
|
2 => UpdateOutboundOrder(model),
|
3 => DeleteOutboundOrder(model),
|
|
_ => WebResponseContent.Instance.OK(),
|
};
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent AddOutboundOrder(Dt_OutboundOrder model)
|
{
|
try
|
{
|
|
if (BaseDal.QueryFirst(x => x.UpperOrderNo == model.UpperOrderNo) != null)
|
{
|
return WebResponseContent.Instance.Error($"出库单号重复");
|
}
|
|
model.OrderNo = CreateCodeByRule(nameof(RuleCodeEnum.OutboundOrderRule));
|
Db.InsertNav(model).Include(x => x.Details).ExecuteCommand();
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
public WebResponseContent UpdateOutboundOrder(Dt_OutboundOrder model)
|
{
|
try
|
{
|
|
var outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == model.UpperOrderNo).Includes(x => x.Details).First();
|
if (outboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到出库单信息");
|
}
|
if (outboundOrder.Details == null || outboundOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到出库单明细信息");
|
}
|
List<Dt_OutboundOrderDetail> inboundOrderDetails = new List<Dt_OutboundOrderDetail>();
|
List<Dt_OutboundOrderDetail> updateInboundOrderDetails = new List<Dt_OutboundOrderDetail>();
|
List<int> detailIds = new List<int>();
|
foreach (var item in model.Details)
|
{
|
|
var outboundOrderDetail = outboundOrder.Details.FirstOrDefault(x => x.lineNo == item.lineNo);
|
if (outboundOrderDetail == null)
|
{
|
outboundOrderDetail = new Dt_OutboundOrderDetail()
|
{
|
OrderId = outboundOrder.Id,
|
lineNo = item.lineNo,
|
MaterielCode = item.MaterielCode,
|
SupplyCode = item.SupplyCode,
|
BatchNo = item.BatchNo,
|
Unit = item.Unit,
|
WarehouseCode = item.WarehouseCode,
|
MoveQty=item.MoveQty,
|
OrderQuantity = item.OrderQuantity
|
};
|
inboundOrderDetails.Add(outboundOrderDetail);
|
}
|
else
|
{
|
outboundOrderDetail.lineNo = item.lineNo;
|
outboundOrderDetail.MaterielCode = item.MaterielCode;
|
outboundOrderDetail.SupplyCode = item.SupplyCode;
|
outboundOrderDetail.BatchNo = item.BatchNo;
|
outboundOrderDetail.Unit = item.Unit;
|
outboundOrderDetail.WarehouseCode = item.WarehouseCode;
|
outboundOrderDetail.MoveQty = item.MoveQty;
|
outboundOrderDetail.OrderQuantity = item.OrderQuantity;
|
|
updateInboundOrderDetails.Add(outboundOrderDetail);
|
detailIds.Add(outboundOrderDetail.Id);
|
}
|
}
|
|
|
outboundOrder.UpperOrderNo = model.UpperOrderNo;
|
outboundOrder.BusinessType = model.BusinessType;
|
outboundOrder.IsBatch = model.IsBatch;
|
outboundOrder.FactoryArea = model.FactoryArea;
|
|
var deletePurchaseOrderDetails = outboundOrder.Details.Where(x => !detailIds.Contains(x.Id)).ToList();
|
|
_unitOfWorkManage.BeginTran();
|
foreach (var item in deletePurchaseOrderDetails)
|
{
|
_outboundOrderDetailRepository.DeleteAndMoveIntoHty(item, OperateTypeEnum.自动删除);
|
}
|
|
_outboundOrderDetailRepository.UpdateData(updateInboundOrderDetails);
|
_outboundOrderDetailRepository.AddData(inboundOrderDetails);
|
|
BaseDal.UpdateData(outboundOrder);
|
_unitOfWorkManage.CommitTran();
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent DeleteOutboundOrder(Dt_OutboundOrder model)
|
{
|
try
|
{
|
var outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == model.UpperOrderNo).Includes(x => x.Details).First();
|
if (outboundOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到出库单信息");
|
}
|
if (outboundOrder.Details == null || outboundOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到出库单明细信息");
|
}
|
//Db.DeleteNav(inboundOrder).Include(x => x.Details).ExecuteCommand();
|
_unitOfWorkManage.BeginTran();
|
BaseDal.DeleteAndMoveIntoHty(outboundOrder, OperateTypeEnum.自动删除);
|
foreach (var item in outboundOrder.Details)
|
{
|
_outboundOrderDetailRepository.DeleteAndMoveIntoHty(item, OperateTypeEnum.自动删除);
|
}
|
_unitOfWorkManage.CommitTran();
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
/// <summary>
|
/// 根据ID获取出库单
|
/// </summary>
|
public async Task<WebResponseContent> GetById(int id)
|
{
|
var order = await Db.Queryable<Dt_OutboundOrder>().FirstAsync(o=>o.Id==id);
|
if (order == null)
|
{
|
return WebResponseContent.Instance.Error("未找到出库单信息");
|
}
|
return WebResponseContent.Instance.OK(null, order);
|
}
|
|
|
static object lock_code = new object();
|
public string CreateCodeByRule(string ruleCode)
|
{
|
lock (lock_code)
|
{
|
|
string code = string.Empty;
|
DateTime dateTime = DateTime.Now;
|
DateTime now = DateTime.Now;
|
try
|
{
|
if (string.IsNullOrEmpty(ruleCode))
|
throw new ArgumentNullException(nameof(ruleCode));
|
SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig
|
{
|
IsAutoCloseConnection = true,
|
DbType = DbType.SqlServer,
|
ConnectionString = DBContext.ConnectionString
|
});
|
Dt_CodeRuleConfig codeRuleConfig = sugarClient.Queryable<Dt_CodeRuleConfig>().Where(x => x.RuleCode == ruleCode).First();
|
if (codeRuleConfig == null)
|
throw new ArgumentNullException(nameof(codeRuleConfig));
|
if (codeRuleConfig.ModifyDate != null)
|
{
|
dateTime = Convert.ToDateTime(codeRuleConfig.ModifyDate);
|
}
|
else
|
{
|
dateTime = Convert.ToDateTime(codeRuleConfig.CreateDate);
|
}
|
|
if (now.Year == dateTime.Year && now.Month == dateTime.Month && now.Day == dateTime.Day)
|
{
|
now = dateTime;
|
codeRuleConfig.CurrentVal = Convert.ToInt32(codeRuleConfig.CurrentVal) + 1;
|
}
|
else
|
{
|
codeRuleConfig.CurrentVal = 1;
|
}
|
codeRuleConfig.ModifyDate = DateTime.Now;
|
code = codeRuleConfig.StartStr + codeRuleConfig.Format;
|
code = code.Replace($"[{CodeFormatTypeEnum.YYYY}]", now.Year.ToString().PadLeft(4, '0'));
|
code = code.Replace($"[{CodeFormatTypeEnum.MM}]", now.Month.ToString().PadLeft(2, '0'));
|
code = code.Replace($"[{CodeFormatTypeEnum.DD}]", now.Day.ToString().PadLeft(2, '0'));
|
code = code.Replace($"[{CodeFormatTypeEnum.ST}]", codeRuleConfig.StartStr?.ToString() ?? "");
|
code = code.Replace($"[{CodeFormatTypeEnum.NUM}]", codeRuleConfig.CurrentVal.ToString().PadLeft(codeRuleConfig.Length, '0'));
|
Dictionary<string, object> keyValuePairs = new Dictionary<string, object>() { { nameof(codeRuleConfig.CurrentVal), codeRuleConfig.CurrentVal }, { nameof(codeRuleConfig.Id), codeRuleConfig.Id }, { nameof(codeRuleConfig.ModifyDate), DateTime.Now } };
|
sugarClient.Updateable(keyValuePairs).AS(MainDb.CodeRuleConfig).WhereColumns(nameof(codeRuleConfig.Id)).ExecuteCommand();
|
sugarClient.Updateable(codeRuleConfig);
|
|
}
|
catch (Exception ex)
|
{
|
|
}
|
return code;
|
}
|
}
|
}
|
}
|