This commit is contained in:
FanLian
2023-07-27 14:30:36 +08:00
22 changed files with 729 additions and 126 deletions

View File

@@ -158,8 +158,6 @@ namespace Tnb.WarehouseMgr
var items = new List<BasLocation>();
try
{
//var stauts = (int)EnumCarryStatus.空闲;
items = await _db.Queryable<BasLocation>().Where(it => it.wh_id == input.warehouse_id && it.is_lock == 0 && it.is_type == "0" && it.is_use == ((int)EnumCarryStatus.).ToString()).OrderBy(it => new { it.layers, it.loc_line, it.loc_column }, OrderByType.Asc).ToListAsync();
}
@@ -185,47 +183,6 @@ namespace Tnb.WarehouseMgr
[HttpPost]
public async Task GenTaskExecute()
{
//任务链属性处理内部函数
async Task _taskChainAttrHandle(List<WmsDistaskH> items, List<WmsPretaskH> areaPreTasks, int moveNum)
{
var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE);
await Task.Run(() =>
{
if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1))
{
items.ForEach(x =>
{
x.is_chain = 0;
});
items[0].groups = groupCode;
items[0].bill_code = $"{groupCode}-1";
}
else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count)
{
items.ForEach(x => x.is_chain = 1);
var itemsCount = items.Count;
var mod = items.Count % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum;
var start = 0;
var end = Math.Min(itemsCount, moveNum);
var arrary = items.ToArray();
for (int i = 1; i <= mod; i++)
{
while (start < itemsCount)
{
var subArray = arrary[start..end];
for (int j = 0, arrLen = subArray.Length; j < arrLen; j++)
{
subArray[j].groups = groupCode;
subArray[j].bill_code = $"{groupCode}-{i}";
}
start = end;
end = Math.Min((end + moveNum), arrary.Length);
}
}
}
});
}
//获取所有未下发的预任务申请
var preTasks = await _db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
@@ -256,7 +213,44 @@ namespace Tnb.WarehouseMgr
if (moveNum >= 1)
{
var areaPreTasks = itGroup.ToList();
await _taskChainAttrHandle(items, areaPreTasks, moveNum);
var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE);
if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1))
{
items.ForEach(x =>
{
x.is_chain = 0;
});
items[0].groups = groupCode;
items[0].bill_code = $"{groupCode}-1";
}
else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count)
{
items.ForEach(x => x.is_chain = 1);
var itemsCount = items.Count;
var mod = items.Count % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum;
var start = 0;
var end = Math.Min(itemsCount, moveNum);
var arrary = items.ToArray();
var dic = new Dictionary<int, WmsDistaskH[]>();
for (int i = 1; i <= mod; i++)
{
while (start < itemsCount)
{
var subArray = arrary[start..end];
dic[i] = subArray;
start = end;
end = Math.Min((end + moveNum), arrary.Length);
}
}
foreach (var (i, v) in dic)
{
foreach (var it in v)
{
it.groups = groupCode;
it.bill_code = $"{groupCode}-{i}";
}
}
}
}
if (preTaskCodes?.Count > 0)
{
@@ -661,6 +655,7 @@ namespace Tnb.WarehouseMgr
List<WmsPointH> results = new() { startObj };
if (points?.Count > 0)
{
points.Where(it => result.Contains(it.id));
foreach (var i in result)
{
WmsPointH? point = points?.Find(x => x.id == i);

View File

@@ -128,7 +128,7 @@ namespace Tnb.WarehouseMgr
wmsCarryReplaceH.modify_id = null;
wmsCarryReplaceH.modify_time = null;
row = await _db.Insertable(wmsCarryReplaceH).ExecuteCommandAsync();
row = await UpdateNullCarry(oldCarry);
row = await await UpdateNullCarry(oldCarry);
isOk = (row > 0);
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}
@@ -156,9 +156,10 @@ namespace Tnb.WarehouseMgr
}
[NonAction]
public async Task<int> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>> updateTask = null, [CallerMemberName] string original = "")
public async Task<Task<int>> UpdateNullCarry(WmsCarryH carryObj, Func<WmsCarryH, Task<int>> updateTask = null, [CallerMemberName] string original = "")
{
var row = 1;
Task<int> resTask = Task.FromResult(row);
try
{
carryObj.status = 0;
@@ -173,16 +174,8 @@ namespace Tnb.WarehouseMgr
carryObj.collocation_scheme_code = null;
carryObj.source_id = null;
carryObj.source_code = null;
if (updateTask != null)
{
updateTask(carryObj);
}
else
{
row = await _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync();
}
//Task<int>.Run(() => _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync());
//删除对应明细表
resTask = updateTask?.Invoke(carryObj) ?? _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync();
//*****删除对应明细表
//删除载具明细
await _db.CopyNew().Deleteable<WmsCarryD>().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync();
//删除载具分拣物料明细
@@ -193,10 +186,11 @@ namespace Tnb.WarehouseMgr
catch (Exception ex)
{
row = 0;
resTask = Task.FromResult(row);
Log.Error("更新空载具出错", ex);
throw;
}
return row;
return resTask;
}

View File

@@ -0,0 +1,151 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Extension;
using JNPF.FriendlyException;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Mapster;
using OBS.Internal;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 盘点任务
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSCHECKTASK_ID)]
public class WmsCheckTaskService : BaseWareHouseService
{
private readonly ISqlSugarClient _db;
private readonly IWareHouseService _warehouseService;
private readonly IUserManager _userManager;
private readonly IVisualDevService _visualDevService;
private readonly IRunService _runService;
public WmsCheckTaskService(
ISqlSugarRepository<WmsCheckstockH> repository,
IWareHouseService wareHouseService,
IVisualDevService visualDevService,
IRunService runService,
IUserManager userManager)
{
_db = repository.AsSugarClient();
_warehouseService = wareHouseService;
_visualDevService = visualDevService;
_runService = runService;
_userManager = userManager;
OverideFuncs.CreateAsync = Create;
}
private async Task<dynamic> Create(VisualDevModelDataCrInput input)
{
if (input == null) throw new ArgumentNullException(nameof(input));
try
{
await _db.Ado.BeginTranAsync();
if (input.data?.Count > 0)
{
var checkType = input.data[nameof(WmsCheckstockH.checkstock_type)]?.ToString();
if (!checkType.IsNullOrEmpty())
{
var billStatus = new List<string>
{
WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID,
WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID,
};
var filter = Expressionable.Create<WmsDistaskH, BasLocation>()
.And((a, b) => b.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString())
.And((a, b) => b.is_type == ((int)EnumLocationType.).ToString())
.And((a, b) => !billStatus.Contains(a.status))
.ToExpression();
var queryTasks = new List<Task<List<WmsDistaskH>>>();
queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.startlocation_id == b.id, filter)));
queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.endlocation_id == b.id, filter)));
var disTasks = await Task.WhenAll(queryTasks);
if (disTasks?.Length > 0)
{
throw new AppFriendlyException("该仓库还有未完成的任务,不允许盘点!", 500);
}
VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCHECKTASK_ID, true);
await _runService.Create(templateEntity, input);
List<WmsCarryCode> carryCodes = new();
List<WmsCheckstockD> details = new();
switch (checkType.ToEnum<EnumCheckType>())
{
case EnumCheckType.:
carryCodes = await _db.Queryable<BasLocation>().InnerJoin<WmsCarryCode>((a, b) => a.id == b.location_id)
.Where(a => a.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && a.is_type == ((int)EnumLocationType.).ToString())
.Select<WmsCarryCode>()
.ToListAsync();
carryCodes ??= Enumerable.Empty<WmsCarryCode>().ToList();
var checkStockDs = carryCodes.Adapt<List<WmsCheckstockD>>();
var prQtyDic = checkStockDs.GroupBy(g => new { g.carry_id, g.material_id, g.code_batch }).ToDictionary(x => x.Key, x => x.Sum(d => d.codeqty));
foreach (var (k, v) in prQtyDic)
{
WmsCheckstockD? checkstockD = checkStockDs?.Find(x => string.Equals(k, $"{x.carry_id}{x.material_id}{x.code_batch}"));
if (checkstockD != null)
{
checkstockD.pr_qty = v;
details.Add(checkstockD);
}
}
details.ForEach(x =>
{
x.create_id = _userManager.UserId;
x.create_time = DateTime.Now;
});
await _db.Insertable(details).ExecuteCommandAsync();
break;
case EnumCheckType.:
break;
case EnumCheckType.:
break;
}
//生成预任务信息
if (details.Count > 0 && carryCodes.Count > 0)
{
var locTypes = new[] { ((int)EnumLocationType.).ToString(), ((int)EnumLocationType.).ToString() };
var endLocs = _db.Queryable<BasLocation>().Where(it=>it.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && locTypes.Contains(it.is_type)).ToListAsync();
var curDetails = details.DistinctBy(x => x.carry_id).ToList();
var curCarryCodes = carryCodes.FindAll(x => curDetails.Select(d => d.carry_id).Contains(x.carry_id));
if (curCarryCodes.Count > 0)
{
foreach (var item in curCarryCodes)
{
}
}
}
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception)
{
await _db.Ado.RollbackTranAsync();
throw;
}
return Task.FromResult(1);
}
private Task<List<WmsDistaskH>> FetchDisTasks(Expression<Func<WmsDistaskH, BasLocation, bool>> joinExp, Expression<Func<WmsDistaskH, BasLocation, bool>> whereExp)
{
return _db.Queryable<WmsDistaskH>().InnerJoin<BasLocation>(joinExp).Where(whereExp).Select<WmsDistaskH>().ToListAsync();
}
}
}

View File

@@ -169,7 +169,7 @@ namespace Tnb.WarehouseMgr
var isOk = await _db.Updateable<WmsOutbale>().SetColumns(it => new WmsOutbale { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
var carryId = input.carryIds[^input.carryIds.Count];
var carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == carryId);
var row = await _wmsCarryService.UpdateNullCarry(carry);
var row = await _wmsCarryService.UpdateNullCarry(carry).Unwrap();
isOk = row > 0;
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);

View File

@@ -622,7 +622,7 @@ namespace Tnb.WarehouseMgr
//如果没有完成,修改为工作中
await _db.Updateable<WmsOutstockH>().SetColumns(it => new WmsOutstockH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == input.requireId).ExecuteCommandAsync();
}
await _wareCarryService.UpdateNullCarry(carry);
await _wareCarryService.UpdateNullCarry(carry).Unwrap();
}
else if (outStatus == EnumOutStatus.)
{

View File

@@ -91,16 +91,17 @@ namespace Tnb.WarehouseMgr
feedBox.modify_id = _userManager.UserId;
feedBox.modify_time = DateTime.Now;
var row = await _db.Updateable(feedBox)
.UpdateColumns(it => new {
.UpdateColumns(it => new
{
it.material_id,
it.material_code,
it.qty,
it.batch,
it.modify_id,
it.modify_id,
it.modify_time
}).ExecuteCommandAsync();
//更新载具
row = await _carryService.UpdateNullCarry(carry);
row = await _carryService.UpdateNullCarry(carry).Unwrap();
isOk = (row > 0);
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}

View File

@@ -306,17 +306,17 @@ namespace Tnb.WarehouseMgr
if (carrys?.Count > 0)
{
await _db.Ado.BeginTranAsync();
var tasks = new List<Task<int>>();
var tasks = new List<Task<Task<int>>>();
foreach (var carryIt in carrys)
{
tasks.Add(_carryService.UpdateNullCarry(carryIt, carryIt => Task.Run(() => _db.CopyNew().Updateable(carryIt).ExecuteCommandAsync())));
}
var all = await Task.WhenAll(tasks);
await _db.Ado.CommitTranAsync();
var all = await Task.WhenAll(tasks.Select(t => t.Unwrap()));
if (all.All(x => x > 0))
{
isOk = all?.Length > 0;
}
await _db.Ado.CommitTranAsync();
}
}
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);