原材料转库、出库签收

This commit is contained in:
2024-05-21 15:00:13 +08:00
parent ccb52b157d
commit c40ce51e77
13 changed files with 528 additions and 53 deletions

View File

@@ -227,6 +227,18 @@ namespace Tnb.WarehouseMgr
, WmsWareHouseConst.FinishproductOutstockStation3 };
}
/// <summary>
/// 是否为三工位库位
/// </summary>
/// <param name="location_id"></param>
/// <returns></returns>
public string[] GetFloor1SGWOutstockLocation()
{
return new string[3] { WmsWareHouseConst.Floor1SGWOutstockStation1 , WmsWareHouseConst.Floor1SGWOutstockStation2
, WmsWareHouseConst.Floor1SGWOutstockStation3 };
}
/// <summary>
/// 出库策略-销售出库下发
/// </summary>
@@ -1633,8 +1645,8 @@ namespace Tnb.WarehouseMgr
//更新电梯任务数量
_ = await _db.Updateable<WmsElevatorH>().SetColumns(it => new WmsElevatorH { task_nums = it.task_nums - 1}).Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ExecuteCommandAsync();
// 更新中储仓任务数量
_ = await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { task_nums = it.task_nums - 1 }).Where(it => disTasks.Where(r => r.startlocation_code.Contains("SSX-111-011") || r.startlocation_code.Contains("SSX-111-012")).Select(x => x.startlocation_code).Contains(it.location_code)).ExecuteCommandAsync();
// 更新任务数量
_ = await _db.Updateable<BasLocation>().SetColumns(it => new BasLocation { task_nums = it.task_nums - 1 }).Where(it => disTasks.Select(x => x.endlocation_code).Contains(it.location_code)).ExecuteCommandAsync();
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位
@@ -1712,6 +1724,12 @@ namespace Tnb.WarehouseMgr
await _db.Updateable<WmsTransferInstockD>().SetColumns(r => r.qty == r.qty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync();
}
}
// 原材料转库单
else if (dt.biz_type == WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID)
{
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == dt.carry_id).FirstAsync();
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yzqty == r.yzqty + 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();
@@ -2312,7 +2330,7 @@ namespace Tnb.WarehouseMgr
bill_code = bill_code,
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
biz_type = WmsWareHouseConst.BIZTYPE_WMSEMPTYINSTOCK_ID,
task_type = "",
task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID,
carry_id = wmsCarryD.membercarry_id,
carry_code = wmsCarryD.membercarry_code,
area_id = sPoint?.area_id!,
@@ -2402,46 +2420,51 @@ namespace Tnb.WarehouseMgr
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
WmsPretaskH preTask = null;
string bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult();
string carry_id = "";
string carry_code = "";
WmsCarryH wmsCarryH = null;
if (!string.IsNullOrEmpty(input.carry_id) && !string.IsNullOrEmpty(input.carry_code))
{
carry_id = input.carry_id;
carry_code = input.carry_code;
}
// 如果指定了carry_id
else if (!string.IsNullOrEmpty(input.carry_id))
{
wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.id == input.carry_id).First();
}
// carry_code
else if (!string.IsNullOrEmpty(input.carry_code))
{
wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
}
// 如果carry_id和carry_code都没有指定随机取库位上载具记录的一条
else
{
wmsCarryH = _db.Queryable<BasLocation>().InnerJoin<WmsCarryH>((a, b) => a.id == b.location_id)
.Where((a, b) => a.id == sPoint.location_id).Select((a, b) => b).First();
}
if (wmsCarryH != null)
{
carry_id = wmsCarryH.id;
carry_code = wmsCarryH.carry_code;
}
if (string.IsNullOrEmpty(carry_id))
{
throw new AppFriendlyException("起点库位上没有载具", 500);
}
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
{
WmsPointH? sPoint = it.FirstOrDefault();
WmsPointH? ePoint = it.LastOrDefault();
string carry_id = "";
string carry_code = "";
WmsCarryH wmsCarryH = null;
if (!string.IsNullOrEmpty(input.carry_id) && !string.IsNullOrEmpty(input.carry_code))
{
carry_id = input.carry_id;
carry_code = input.carry_code;
}
// 如果指定了carry_id
else if (!string.IsNullOrEmpty(input.carry_id))
{
wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.id == input.carry_id).First();
}
// carry_code
else if (!string.IsNullOrEmpty(input.carry_code))
{
wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).First();
}
// 如果carry_id和carry_code都没有指定随机取库位上载具记录的一条
else
{
wmsCarryH = _db.Queryable<BasLocation>().InnerJoin<WmsCarryH>((a, b) => a.id == b.location_id)
.Where((a, b) => a.id == sPoint.location_id).Select((a, b) => b).First();
}
if (wmsCarryH != null)
{
carry_id = wmsCarryH.id;
carry_code = wmsCarryH.carry_code;
}
if (string.IsNullOrEmpty(carry_id))
{
throw new AppFriendlyException("起点库位上没有载具", 500);
}
preTask = new()
{
@@ -2464,7 +2487,7 @@ namespace Tnb.WarehouseMgr
carry_code = carry_code,
area_id = sPoint?.area_id!,
area_code = it.Key,
require_id = "",
require_id = input.require_id,
require_code = "",
create_id = _userManager.UserId,
create_time = DateTime.Now
@@ -2491,7 +2514,7 @@ namespace Tnb.WarehouseMgr
}
finally
{
await GenTaskExecute();
GenTaskExecute();
}
}

View File

@@ -268,7 +268,7 @@ namespace Tnb.WarehouseMgr
}
/// <summary>
/// 二楼机械手解绑定
///
/// </summary>
/// <param name="input"></param>
/// <returns></returns>

View File

@@ -0,0 +1,170 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using JNPF.Common.Filter;
using JNPF.EventBus;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys.Dto.VisualDevModelData;
using JNPF.VisualDev.Interfaces;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using SqlSugar;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Attributes;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Interfaces;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.VisualDev.Entitys;
using Microsoft.AspNetCore.Authorization;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Enums;
using JNPF.Common.Enums;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 原材料转库单
/// </summary>
[OverideVisualDev(ModuleConsts.MODULE_WMSMATERIALTRANSFER_ID)]
[ServiceModule(BizTypeId)]
public class WmsMaterialTransferService : BaseWareHouseService
{
private const string BizTypeId = "";
private readonly ISqlSugarClient _db;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWareHouseService _wareHouseService;
private readonly IBillRullService _billRullService;
private readonly IUserManager _userManager;
public WmsMaterialTransferService(
ISqlSugarRepository<WmsCarryH> repository,
IRunService runService,
IVisualDevService visualDevService,
IWareHouseService wareHouseService,
IUserManager userManager,
IBillRullService billRullService,
IEventPublisher eventPublisher)
{
_db = repository.AsSugarClient();
_runService = runService;
_visualDevService = visualDevService;
_wareHouseService = wareHouseService;
_userManager = userManager;
_billRullService = billRullService;
//OverideFuncs.GetListAsync = GetList;
}
[NonAction]
private async Task<dynamic> GetList(VisualDevModelListQueryInput input)
{
try
{
SqlSugarPagedList<WmsMaterialTransfer> result = await _db.Queryable<WmsMaterialTransfer>()
.ToPagedListAsync(input.currentPage, input.pageSize);
var _data = PageResult<WmsMaterialTransfer>.SqlSugarPageResult(result);
var json = JsonConvert.SerializeObject(_data);
var data = JsonConvert.DeserializeObject<dynamic>(json);
JArray mainTable = data.list;
ISugarQueryable<WmsMaterialTransferD> wmsTransferInstockDs = _db.Queryable<WmsMaterialTransferD>().Where(r => mainTable.Select(r => r["id"].ToString()).ToList().Contains(r.bill_id));
foreach (JObject wmsTransferInstockH in mainTable)
{
// todo 改tablefield105
wmsTransferInstockH["tablefield105"] = JArray.Parse(JsonConvert.SerializeObject(wmsTransferInstockDs.Where(r => r.bill_id == wmsTransferInstockH["id"].ToString()).ToList()));
}
return data;
}
catch (Exception ex)
{
return Task.FromResult(ex);
}
}
/// <summary>
/// 下发
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> Distribute(MaterialTransferDistributeInput input)
{
try
{
//if (input.qty <= 0)
//{
// throw new AppFriendlyException("数量必须大于0", 500);
//}
if (string.IsNullOrEmpty(input.source_id))
{
throw new AppFriendlyException("来源单据id不可为空", 500);
}
WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable<WmsMaterialTransferD>().FirstAsync(it => it.id == input.source_id);
await s_taskExecuteSemaphore.WaitAsync();
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, code_batch = wmsMaterialTransferD.code_batch, Size = 1 };
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(inStockStrategyInput);
if (items.Count == 0)
{
throw new AppFriendlyException($@"没有可以出库的载具", 500);
}
WmsCarryCode wmsCarryCode = await _db.Queryable<WmsCarryCode>().Where(r => r.carry_id == items[0].id).FirstAsync();
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.location_code == items[0].location_code).FirstAsync();
// 根据三工位任务数平均分配任务
BasLocation endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1SGWOutstockLocation().Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = startLocation.id;
commonCreatePretaskInput.endlocation_id = endLocation.id;
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
commonCreatePretaskInput.require_id = input.source_id;
Tnb.WarehouseMgr.Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code == HttpStatusCode.OK)
{
// 更新子表已下发数量
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yxfqty == r.yxfqty + wmsCarryCode.codeqty).Where(r => r.id == input.source_id).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
else
{
throw new AppFriendlyException($@"生成预任务失败", 500);
}
}
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
_ = s_taskExecuteSemaphore.Release();
await InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
}
}

View File

@@ -15,6 +15,7 @@ using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Entities.Enums;
using Tnb.WarehouseMgr.Interfaces;
@@ -33,13 +34,16 @@ namespace Tnb.WarehouseMgr
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
private readonly IWareHouseService _wareHouseService;
private readonly IWmsCarryBindService _wmsCarryBindService;
public WmsPDACarryBindService(
ISqlSugarRepository<WmsCarryH> repository,
IRunService runService,
IVisualDevService visualDevService,
IUserManager userManager,
IWareHouseService wareHouseService,
IBillRullService billRullService)
IBillRullService billRullService,
IWmsCarryBindService wmsCarryBindService)
{
_db = repository.AsSugarClient();
_runService = runService;
@@ -47,6 +51,7 @@ namespace Tnb.WarehouseMgr
_userManager = userManager;
_billRullService = billRullService;
_wareHouseService = wareHouseService;
_wmsCarryBindService = wmsCarryBindService;
OverideFuncs.CreateAsync = PDACarryBind;
}
@@ -365,10 +370,10 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException("起点id不可为空", 500);
}
if (!_wareHouseService.GetFloor1OutstockLocation().Contains(input.location_id))
{
throw new AppFriendlyException("非一楼出库库位不允许通过此功能解锁", 500);
}
//if (!_wareHouseService.GetFloor1OutstockLocation().Contains(input.location_id))
//{
// throw new AppFriendlyException("非一楼出库库位不允许通过此功能解锁", 500);
//}
await _db.Ado.BeginTranAsync();
try
@@ -384,6 +389,11 @@ namespace Tnb.WarehouseMgr
is_lock = 0
}).Where(r => r.location_id == input.location_id).ExecuteCommandAsync();
WmsCarryH wmsCarryH = _db.Queryable<WmsCarryH>().Where(r => r.location_id == input.location_id).First();
CarryCodeUnbindInput carryCodeUnbindInput = new CarryCodeUnbindInput();
carryCodeUnbindInput.carry_id = wmsCarryH.id;
await _wmsCarryBindService.CarryCodeUnbind(carryCodeUnbindInput);
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)