销售出库与拣货接口以及部分问题修复

This commit is contained in:
2024-05-14 15:29:18 +08:00
parent 72ddc61591
commit eadaa50ef7
22 changed files with 1195 additions and 84 deletions

View File

@@ -1,5 +1,6 @@
using System.Diagnostics;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Security.Policy;
@@ -26,6 +27,7 @@ using NetTaste;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.OpenXmlFormats.Dml;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Crypto;
using SqlSugar;
using Tnb.BasicData.Entities;
@@ -57,6 +59,7 @@ namespace Tnb.WarehouseMgr
private readonly IUserManager _userManager;
private readonly ICacheManager _cacheManager;
private readonly IElevatorControlService _elevatorControlService;
private readonly IWmsCarryBindService _wmsCarryBindService;
private static readonly Dictionary<string, int> _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase);
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
private static Dictionary<string, object> locMap = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
@@ -67,7 +70,8 @@ namespace Tnb.WarehouseMgr
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService, RedisData redisData,
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService,
IWmsCarryBindService wmsCarryBindService
//IConfiguration configuration
) : base(repository.AsSugarClient())
{
@@ -78,6 +82,7 @@ namespace Tnb.WarehouseMgr
_cacheManager = cacheManager;
_elevatorControlService = elevatorControlService;
_redisData = redisData;
_wmsCarryBindService = wmsCarryBindService;
//_configuration = configuration;
}
@@ -205,11 +210,76 @@ namespace Tnb.WarehouseMgr
}
return items.Take(input.Size).ToList();
}
/// <summary>
/// 出库策略
/// 是否为一楼出库工位
/// </summary>
/// <param name="location_id"></param>
/// <returns></returns>
public string[] GetFloor1OutstockLocation()
{
return new string[3] { WmsWareHouseConst.FinishproductOutstockStation1 , WmsWareHouseConst.FinishproductOutstockStation2
, WmsWareHouseConst.FinishproductOutstockStation3 };
}
/// <summary>
/// 出库策略-销售出库下发
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>>> OutStockStrategy_saleRelease([FromQuery] OutStockStrategyQuery input)
{
Expressionable<WmsCarryH, WmsCarryCode, BasLocation> whereExprable = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
.And((a, b, c) => a.is_lock == 0 && c.is_lock == 0)
.And((a, b, c) => !string.IsNullOrEmpty(a.location_id))
.And((a, b, c) => c.is_type == ((int)EnumLocationType.).ToString())
.And((a, b, c) => a.out_status == "0")
.And((a, b, c) => c.wh_id == input.warehouse_id)
.AndIF(!string.IsNullOrEmpty(input.material_id), (a, b, c) => b.material_id == input.material_id)
.AndIF(!string.IsNullOrEmpty(input.code_batch), (a, b, c) => b.code_batch == input.code_batch)
.AndIF(!string.IsNullOrEmpty(input.material_specification), (a, b, c) => b.material_specification == input.material_specification)
.AndIF(!string.IsNullOrEmpty(input.container_no), (a, b, c) => b.container_no == input.container_no)
.AndIF(!string.IsNullOrEmpty(input.carrystd_id), (a, b, c) => a.carrystd_id == input.carrystd_id);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> carryStatusFilterExp = !input.material_id.IsNullOrWhiteSpace()
? (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString()
: (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString();
_ = whereExprable.And(carryStatusFilterExp);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> whereExpr = whereExprable.ToExpression();
SqlSugarClient cyDb = _db.CopyNew();
List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>> items = cyDb.Queryable<WmsCarryH>().LeftJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
.LeftJoin<BasLocation>((a, b, c) => a.location_id == c.id)
.Where(whereExpr)
//.OrderByIF((a,b,c)=>SqlFunc.IsNullOrEmpty())
.OrderBy("a.location_code,layers,loc_line,loc_column")
.Select((a, b, c) => new
{
WmsCarryH = a,
WmsCarryCode = b,
BasLocation = c,
codeqty = b.codeqty
}).ToList().Select(r =>
{
input.qty = input.qty - r.codeqty;
// 出库数量与托盘上的数量不一致需要进行分拣
if (input.qty < 0)
{
r.WmsCarryCode.codeqty = input.qty + r.codeqty;
return new Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>("分拣任务", r.WmsCarryH, r.WmsCarryCode, r.BasLocation);
}
else
{
// 正常预任务出库
return new Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>("预任务", r.WmsCarryH, r.WmsCarryCode, r.BasLocation);
}
}).ToList();
return items;
}
public async Task<List<WmsCarryH>> OutStockStrategy([FromQuery] OutStockStrategyQuery input)
{
Expressionable<WmsCarryH, WmsCarryCode, BasLocation> whereExprable = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
@@ -565,7 +635,7 @@ namespace Tnb.WarehouseMgr
["Value"] = value,
};
string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
// TODO 测试
// 测试
//JObject valueJson = new JObject();
//valueJson["Value"] = value;
@@ -1610,6 +1680,30 @@ namespace Tnb.WarehouseMgr
*/ //更新业务主表的单据状态
foreach (WmsDistaskH? dt in disTasks)
{
// 销售出库
if (dt.biz_type == WmsWareHouseConst.BIZTYPE_WMSSALERELEASE_ID)
{
// TODO 一楼工位放货完成后更新出库明细的实际出库数量
if (dt.start_floor == 1 && dt.end_floor == 1)
{
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == dt.carry_id).FirstAsync();
await _db.Updateable<WmsSaleD>().SetColumns(r => r.purchase_prqty == r.purchase_prqty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync();
CarryCodeUnbindInput carryCodeUnbindInput = new CarryCodeUnbindInput();
carryCodeUnbindInput.carry_id = dt.carry_id;
await _wmsCarryBindService.CarryCodeUnbind(carryCodeUnbindInput);
}
}
else if (dt.biz_type == WmsWareHouseConst.BIZTYPE_WMSTRANSFERINSTOCK_ID)
{
if (dt.start_floor == 3 && dt.end_floor == 3)
{
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == dt.carry_id).FirstAsync();
await _db.Updateable<WmsTransferInstockD>().SetColumns(r => r.qty == r.qty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync();
}
}
List<WmsDistaskCode> disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync();
WareHouseUpInput upInput = new() { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() };
@@ -1712,6 +1806,10 @@ namespace Tnb.WarehouseMgr
row = await _db.Updateable<WmsElevatorH>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => it.area_code == eleP.area_code).ExecuteCommandAsync();
}
// 累加终点库位任务数
row = await _db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1)
.Where(it => preTasks.Select(r => r.endlocation_id).Contains(it.id)).ExecuteCommandAsync();
return row > 0;
}
/// <summary>