Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryMoveInStockService.cs

293 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.EventBus;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Attributes;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// 载具移入
/// </summary>
[OverideVisualDev(ModuleId)]
[ServiceModule(BizTypeId)]
public class WmsPDACarryMoveInStockService : BaseWareHouseService, IPdaStroage
{
private const string BizTypeId = "26121988909861";
private const string ModuleId = "26476127634469";
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 WmsPDACarryMoveInStockService(
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.CreateAsync = PDACarryMoveIn;
}
private async Task<dynamic> PDACarryMoveIn(VisualDevModelDataCrInput input)
{
#region old
//try
//{
// await _db.Ado.BeginTranAsync();
// //入库取终点 //出库起点
// var inStockStrategyInput = new InStockStrategyQuery { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 };
// var endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
// WmsPointH sPoint = null!;
// WmsPointH ePoint = null!;
// if (input.data.ContainsKey(nameof(WmsPointH.location_id)))
// {
// sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.data[nameof(WmsPointH.location_id)].ToString());
// }
// if (endLocations?.Count > 0)
// {
// var carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.data[nameof(WmsCarryD.carry_id)].ToString());
// var loc = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == endLocations[0].id);
// var isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc);
// if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500);
// ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
// }
// VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true);
// await _runService.Create(templateEntity, input);
// if (sPoint != null && ePoint != null)
// {
// var points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
// //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
// if (points?.Count > 0)
// {
// if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500);
// var preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
// {
// var sPoint = it.FirstOrDefault();
// var ePoint = it.LastOrDefault();
// WmsPretaskH preTask = new();
// preTask.org_id = _userManager.User.OrganizeId;
// preTask.startlocation_id = sPoint?.location_id!;
// preTask.startlocation_code = sPoint?.location_code!;
// preTask.endlocation_id = ePoint?.location_id!;
// preTask.endlocation_code = ePoint?.location_code!;
// preTask.start_floor = sPoint?.floor.ToString();
// preTask.end_floor = ePoint?.floor.ToString();
// preTask.startpoint_id = sPoint?.id!;
// preTask.startpoint_code = sPoint?.point_code!;
// preTask.endpoint_id = ePoint?.id!;
// preTask.endpoint_code = ePoint?.point_code!;
// preTask.bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult();
// preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID;
// preTask.biz_type = WmsWareHouseConst.BIZTYPE_CARRYMOVEINSTOCK_ID;
// preTask.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
// preTask.carry_id = input.data[nameof(preTask.carry_id)]?.ToString()!;
// preTask.carry_code = input.data[nameof(preTask.carry_code)]?.ToString()!;
// preTask.area_id = sPoint?.area_id!;
// preTask.area_code = it.Key;
// preTask.require_id = input.data["ReturnIdentity"].ToString();
// preTask.require_code = input.data[nameof(preTask.bill_code)]?.ToString()!;
// preTask.create_id = _userManager.UserId;
// preTask.create_time = DateTime.Now;
// return preTask;
// }).ToList();
// var isOk = await _wareHouseService.GenPreTask(preTasks, null!);
// if (isOk)
// {
// var preTaskUpInput = new GenPreTaskUpInput();
// preTaskUpInput.RquireId = input.data["ReturnIdentity"].ToString()!;
// preTaskUpInput.CarryId = input.data[nameof(WmsCarryD.carry_id)]?.ToString()!;
// preTaskUpInput.CarryStartLocationId = points.FirstOrDefault()!.location_id!;
// preTaskUpInput.CarryStartLocationCode = points.FirstOrDefault()!.location_code!;
// preTaskUpInput.LocationIds = points.Select(x => x.location_id).ToList()!;
// preTaskUpInput.PreTaskRecords = preTasks.Adapt<List<WmsHandleH>>();
// preTaskUpInput.PreTaskRecords.ForEach(x => x.id = SnowflakeIdHelper.NextId());
// //根据载具移入Id回更单据状态
// await _db.Updateable<WmsMoveInstock>().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
// await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
// it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode },
// it => new BasLocation { is_lock = 1 });
// }
// }
// }
// await _db.Ado.CommitTranAsync();
//}
//catch (Exception)
//{
// await _db.Ado.RollbackTranAsync();
// throw;
//}
//finally
//{
// await InvokeGenPretaskExcute();
//}
//return Task.FromResult(true);
#endregion
try
{
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
var inStockStrategyInput = new InStockStrategyQuery { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 };
var endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
WmsPointH sPoint = null!;
WmsPointH ePoint = null!;
if (input.data.ContainsKey(nameof(WmsPointH.location_id)))
{
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == input.data[nameof(WmsPointH.location_id)].ToString());
}
if (endLocations?.Count > 0)
{
var carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.data[nameof(WmsCarryD.carry_id)].ToString());
var loc = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == endLocations[0].id);
var isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc);
if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500);
ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
}
VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_CARRYMOVEINSTOCK_ID, true);
await _runService.Create(templateEntity, input);
if (sPoint != null && ePoint != null)
{
var points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
if (points?.Count > 0)
{
if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500);
var preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
{
var sPoint = it.FirstOrDefault();
var ePoint = it.LastOrDefault();
WmsPretaskH preTask = new();
preTask.org_id = _userManager.User.OrganizeId!;
preTask.startlocation_id = sPoint?.location_id!;
preTask.startlocation_code = sPoint?.location_code!;
preTask.endlocation_id = ePoint?.location_id!;
preTask.endlocation_code = ePoint?.location_code!;
preTask.start_floor = sPoint?.floor.ToString();
preTask.end_floor = ePoint?.floor.ToString();
preTask.startpoint_id = sPoint?.id!;
preTask.startpoint_code = sPoint?.point_code!;
preTask.endpoint_id = ePoint?.id!;
preTask.endpoint_code = ePoint?.point_code!;
preTask.bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult();
preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID;
preTask.biz_type = WmsWareHouseConst.BIZTYPE_CARRYMOVEINSTOCK_ID;
preTask.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
preTask.carry_id = input.data[nameof(preTask.carry_id)]?.ToString()!;
preTask.carry_code = input.data[nameof(preTask.carry_code)]?.ToString()!;
preTask.area_id = sPoint?.area_id!;
preTask.area_code = it.Key;
preTask.require_id = input.data["ReturnIdentity"].ToString();
preTask.require_code = input.data[nameof(preTask.bill_code)]?.ToString()!;
preTask.create_id = _userManager.UserId;
preTask.create_time = DateTime.Now;
return preTask;
}).ToList();
var isOk = await _wareHouseService.GenPreTask(preTasks, null!);
if (isOk)
{
var preTaskUpInput = new GenPreTaskUpInput();
preTaskUpInput.RquireId = input.data["ReturnIdentity"].ToString()!;
preTaskUpInput.CarryId = input.data[nameof(WmsCarryD.carry_id)]?.ToString()!;
preTaskUpInput.CarryStartLocationId = points.FirstOrDefault()!.location_id!;
preTaskUpInput.CarryStartLocationCode = points.FirstOrDefault()!.location_code!;
preTaskUpInput.LocationIds = points.Select(x => x.location_id).ToList()!;
WmsHandleH handleH = new();
handleH.org_id = _userManager.User.OrganizeId;
handleH.startlocation_id = input.data[nameof(WmsPointH.location_id)]?.ToString()!;
handleH.endlocation_id = endLocations![0].id;
handleH.bill_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!;
handleH.biz_type = input.data[nameof(WmsHandleH.biz_type)]?.ToString()!;
handleH.carry_id = input.data[nameof(WmsHandleH.carry_id)]?.ToString()!;
handleH.carry_code = input.data[nameof(WmsHandleH.carry_code)]?.ToString()!;
handleH.require_id = input.data["ReturnIdentity"].ToString();
handleH.require_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!;
handleH.create_id = _userManager.UserId;
handleH.create_time = DateTime.Now;
preTaskUpInput.PreTaskRecord = handleH;
//根据载具移入Id回更单据状态
await _db.Updateable<WmsMoveInstock>().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode },
it => new BasLocation { is_lock = 1 });
}
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception)
{
await _db.Ado.RollbackTranAsync();
throw;
}
finally
{
//向队列写入消息
await InvokeGenPretaskExcute();
}
return Task.FromResult(true);
}
public override async Task ModifyAsync(WareHouseUpInput input)
{
if (input == null) throw new ArgumentNullException(nameof(input));
var isOk = await _db.Updateable<WmsMoveInstock>().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}
}
}