Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs
2024-06-04 15:48:13 +08:00

245 lines
11 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.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.FriendlyException;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Microsoft.Extensions.Logging;
using SqlSugar;
using Tnb.BasicData;
using Tnb.BasicData.Entities;
using Tnb.ProductionMgr.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Attributes;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Dto;
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
using Tnb.WarehouseMgr.Entities.Entity;
using Tnb.WarehouseMgr.Interfaces;
namespace Tnb.WarehouseMgr
{
[OverideVisualDev(ModuleConsts.MODULE_WMSPRDINSTOCK_ID)]
[ServiceModule(BizTypeId)]
public class WmsPrdInstockHService : BaseWareHouseService
{
private const string BizTypeId = "34467501190677";
private readonly ISqlSugarClient _db;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IWareHouseService _wareHouseService;
private readonly IBillRullService _billRullService;
public WmsPrdInstockHService(ISqlSugarRepository<WmsCarryH> repository, IRunService runService,
IVisualDevService visualDevService, IWareHouseService wareHouseService, IBillRullService billRullService)
{
_db = repository.AsSugarClient();
_runService = runService;
_visualDevService = visualDevService;
_wareHouseService = wareHouseService;
_billRullService = billRullService;
}
/// <summary>
/// 工单提报 第一次主表所有参数全传后续主表只需要传工单号prd_bill_code和更新后的合格数pqty、不合格数rqty
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<Entities.Dto.Outputs.Result> PrdInstock(WmsPrdInstockInput input)
{
try
{
await _db.Ado.BeginTranAsync();
WmsPrdInstockH prdInstockH = _db.Queryable<WmsPrdInstockH>().Where(r => r.prd_bill_code == input.prd_bill_code).First();
string prd_instock_code_id = "";
// 新建主表
if (prdInstockH == null)
{
string bill_code = await _billRullService.GetBillNumber(CodeTemplateConst.PRDOUTSTOCK_CODE);
WmsPrdInstockH wmsPrdInstockH = new ();
wmsPrdInstockH.create_id = "";
wmsPrdInstockH.create_time = DateTime.Now;
wmsPrdInstockH.prd_bill_code = input.prd_bill_code;
wmsPrdInstockH.bill_code = bill_code;
wmsPrdInstockH.material_id = input.material_id;
wmsPrdInstockH.material_code = input.material_code;
wmsPrdInstockH.material_name = input.material_name;
wmsPrdInstockH.material_spec = input.material_spec;
wmsPrdInstockH.planqty = input.planqty;
wmsPrdInstockH.pqty = input.pqty;
wmsPrdInstockH.rqty = input.rqty;
wmsPrdInstockH.type = input.type;
//wmsPrdInstockH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID;
await _db.Insertable(wmsPrdInstockH).ExecuteCommandAsync();
prd_instock_code_id = wmsPrdInstockH.id;
}
else
{
prd_instock_code_id = prdInstockH.id;
await _db.Updateable<WmsPrdInstockH>(r => new WmsPrdInstockH
{
pqty = input.pqty,
rqty = input.rqty
}).Where(r => r.id == prd_instock_code_id).ExecuteCommandAsync();
}
List<WmsPrdInstockD> WmsPrdInstockDs = new List<WmsPrdInstockD>();
foreach (WmsPrdInstockDInput prdInstockDInput in input.prdInstockDs)
{
WmsPrdInstockDs.Add(new WmsPrdInstockD()
{
task_bill_code = prdInstockDInput.task_bill_code,
warehouse_id = prdInstockDInput.warehouse_id,
startlocation_id = prdInstockDInput.startlocation_id,
carry_id = prdInstockDInput.carry_id,
create_id = input.create_id,
create_time = DateTime.Now,
prd_instock_id = prd_instock_code_id,
status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID
});
}
List<WmsPrdInstockCode> WmsPrdInstockCodes = new List<WmsPrdInstockCode>();
foreach (WmsPrdInstockCodeInput prdInstockCodeInput in input.prdInstockCodes)
{
WmsPrdInstockCodes.Add(new WmsPrdInstockCode()
{
planqty = prdInstockCodeInput.planqty,
pqty = prdInstockCodeInput.pqty,
code_batch = prdInstockCodeInput.code_batch,
code = prdInstockCodeInput.code,
unit_id = prdInstockCodeInput.unit_id,
carry_id = prdInstockCodeInput.carry_id,
prd_instock_id = prd_instock_code_id
});
}
await _db.Insertable(WmsPrdInstockDs).ExecuteCommandAsync();
await _db.Insertable(WmsPrdInstockCodes).ExecuteCommandAsync();
foreach (WmsPrdInstockD wmsPrdInstockD in WmsPrdInstockDs)
{
//入库取终点
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = wmsPrdInstockD.warehouse_id, Size = 1 };
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations?.Count == 0)
{
throw new AppFriendlyException("没有可用的中储仓库位", 500);
}
BasLocation endLocation = endLocations[0];
BasLocation startLocation = _db.Queryable<BasLocation>().Where(r => r.id == wmsPrdInstockD.startlocation_id).First();
if (startLocation == null)
{
throw new AppFriendlyException("系统中找不到起点ID的库位信息", 500);
}
BasLocation endlocation_ssx = null;
string startlocation_id_ssx = null;
// 注塑线边库到24输送线
if (startLocation.wh_id == "32604516180501")
{
// 根据ZSSSXCTU01 ZSSSXCTU02任务数平均分配任务
endlocation_ssx = await _db.Queryable<BasLocation>().Where(r => new string[2] { "32624148726549", "32624157608981" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
await _db.Updateable<BasLocation>().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync();
// ZSSSXCTU01 对应 SSX-011-002
if (endlocation_ssx.location_code == "ZSSSXCTU01")
{
startlocation_id_ssx = "32609073591317";
}
// ZSSSXCTU02 对应 SSX-011-004
else if (endlocation_ssx.location_code == "ZSSSXCTU02")
{
startlocation_id_ssx = "32609093546005";
}
}
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync();
// 生成到输送线任务
CommonCreatePretaskInput commonCreatePretaskInput1 = new CommonCreatePretaskInput();
commonCreatePretaskInput1.startlocation_id = startLocation.id;
commonCreatePretaskInput1.endlocation_id = endlocation_ssx.id;
commonCreatePretaskInput1.carry_id = wmsCarryH.id;
commonCreatePretaskInput1.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput1.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput1.biz_type = "";
commonCreatePretaskInput1.require_id = wmsPrdInstockD.id;
commonCreatePretaskInput1.isExcuteMission = false;
Entities.Dto.Outputs.Result res1 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput1);
// 生成到中储仓任务
CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput();
commonCreatePretaskInput2.startlocation_id = startlocation_id_ssx;
commonCreatePretaskInput2.endlocation_id = endLocation.id;
commonCreatePretaskInput2.carry_id = wmsCarryH.id;
commonCreatePretaskInput2.carry_code = wmsCarryH.carry_code;
commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID;
commonCreatePretaskInput2.require_id = wmsPrdInstockD.id;
commonCreatePretaskInput2.isExcuteMission = false;
commonCreatePretaskInput2.isChangeCarryLoc2StartLoc = false;
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2);
}
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
Logger.Error(ex.Message);
Logger.Error(ex.StackTrace);
await _db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
_wareHouseService.GenTaskExecute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
public override async Task ModifyAsync(WareHouseUpInput input)
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
bool isOk = true;
// 如果生产入库 输送线到仓库这条任务完成,反写单据数据
if (input.bizTypeId == WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID)
{
isOk = await _db.Updateable<WmsPrdInstockD>().SetColumns(it => new WmsPrdInstockD { status = WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID })
.Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
}
if (!isOk)
{
throw Oops.Oh(ErrorCode.COM1001);
}
}
}
}