Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs
2023-11-07 18:01:59 +08:00

135 lines
6.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Contracts;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.FriendlyException;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Entity.Constraints;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 采购收货、销售发货,通用业务类
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class WmsPurchaseAndSaleCommonService<TEntity> : BaseWareHouseService where TEntity : BaseEntity<string>, IPurchaseAndSaleEntity, IPurchaseAndSaleQueryEntity
{
private readonly ISqlSugarClient _db;
private readonly IUserManager _userManager;
private readonly IWmsPDAScanInStockService _wmsPDAScanInStockService;
private readonly IWmsOutStockService _wmsOutStockService;
private static Dictionary<string, object> s_materialMap = new();
public WmsPurchaseAndSaleCommonService(ISqlSugarRepository<WmsPurchaseH> repo, IUserManager userManager, IWmsOutStockService? wmsOutStockService = null)
{
_db = repo.AsSugarClient();
_userManager = userManager;
_wmsOutStockService = wmsOutStockService!;
}
protected async Task<bool> PurchaseAndSaleUpdate(PurchaseAndReceiveUpInput input)
{
if (input == null) throw new ArgumentNullException("input");
if (input.details == null) throw new ArgumentNullException(nameof(input.details));
var dicMaterialPurchaseArriveQty = input.details.ToDictionary(x => x.material_id, x => x.purchase_arriveqty);
var materialIds = input.details.Select(x => x.material_id).ToList();
var purchaseDs = await _db.Queryable<TEntity>().Where(it => materialIds.Contains(it.material_id)).ToListAsync();
if (purchaseDs?.Count > 0)
{
var errMaterialTipList = new List<(string materialName, decimal purchaseArriveQty, decimal topPurchaseQty)>();
foreach (var pd in purchaseDs)
{
pd.purchase_prqty += dicMaterialPurchaseArriveQty.ContainsKey(pd.material_id) ? dicMaterialPurchaseArriveQty[pd.material_id] : 0;
var pdInput = input.details.Find(x => x.material_id == pd.material_id);
if (pdInput != null)
{
var topPurchaseQty = pd.purchase_qty - pd.purchase_prqty;
if (pdInput.purchase_arriveqty > topPurchaseQty)
{
if (s_materialMap.ContainsKey(pdInput.material_id) && s_materialMap[pdInput.material_id] != null)
{
errMaterialTipList.Add((s_materialMap[pdInput.material_id].ToString()!, pdInput.purchase_arriveqty, topPurchaseQty));
continue;
}
}
}
if (pd.purchase_prqty >= pd.purchase_qty)
{
pd.line_status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID;
}
else
{
pd.line_status = WmsWareHouseConst.BILLSTATUS_ON_ID;
}
}
if (errMaterialTipList.Count > 0)
{
var errMsgList = new List<string>();
if (typeof(TEntity) == typeof(WmsPurchaseD))
{
errMsgList = errMaterialTipList.Select(x => $"物料:{x.materialName},实际收货数:{x.purchaseArriveQty}已超出可收货数:{x.topPurchaseQty}").ToList();
}
else
{
errMsgList = errMaterialTipList.Select(x => $"物料:{x.materialName},实际发货数:{x.purchaseArriveQty}已超出可发货数:{x.topPurchaseQty}").ToList();
}
var errMsg = string.Join("\r\n", errMsgList);
throw new AppFriendlyException(errMsg, 500);
}
purchaseDs.ForEach(x =>
{
x.modify_id = _userManager.UserId;
x.modify_time = DateTime.Now;
});
await _db.Updateable(purchaseDs).ExecuteCommandAsync();
if (purchaseDs.All(x => x.line_status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID))
{
var purchase = await _db.Queryable<WmsPurchaseH>().FirstAsync(it => it.bill_code == input.bill_code);
if (purchase != null)
{
purchase.status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID;
purchase.modify_id = _userManager.UserId;
purchase.modify_time = DateTime.Now;
await _db.Updateable(purchase).UpdateColumns(it => it.status).ExecuteCommandAsync();
}
}
}
VisualDevModelDataCrInput visualDevModelDataInput = new();
visualDevModelDataInput.data = PocoToDictionary.ToDictionary(input) as Dictionary<string, object>;
if (_wmsOutStockService != null)
{
await _wmsOutStockService.OutStockApplyFor(visualDevModelDataInput);
}
return await Task.FromResult(true);
}
protected async Task<List<TEntity>> GetDetailsByPkId(string pkId)
{
if (s_materialMap.Count == 0)
{
s_materialMap = await _db.Queryable<BasMaterial>().ToDictionaryAsync(x => x.id, x => x.name);
}
var list = await _db.Queryable<TEntity>().Where(it => it.bill_id == pkId)
.Mapper(it => it.material_name = s_materialMap.ContainsKey(it.material_id) ? s_materialMap[it.material_id]?.ToString() ?? "" : "")
.ToListAsync();
return list;
}
}
}