176 lines
7.3 KiB
C#
176 lines
7.3 KiB
C#
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;
|
|
|
|
foreach (dynamic row in mainTable)
|
|
{
|
|
row.create_time = row.create_time.Value.ToString("yyyy-MM-dd");
|
|
}
|
|
|
|
ISugarQueryable<WmsMaterialTransferD> wmsTransferInstockDs = _db.Queryable<WmsMaterialTransferD>()
|
|
.Where(r => mainTable.Select(r => r["id"].ToString()).ToList().Contains(r.bill_id));
|
|
|
|
foreach (JObject wmsTransferInstockH in mainTable)
|
|
{
|
|
wmsTransferInstockH["tablefield121"] = 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, "成功");
|
|
}
|
|
|
|
}
|
|
}
|