335 lines
16 KiB
C#
335 lines
16 KiB
C#
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 Newtonsoft.Json;
|
||
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, ISqlSugarClient dbConn = null)
|
||
{
|
||
Logger.LogInformation($"【PrdInstock】传入参数 {JsonConvert.SerializeObject(input)}");
|
||
var db = _db;
|
||
if (dbConn != null)
|
||
db = dbConn;
|
||
|
||
string type = "";
|
||
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;
|
||
type = input.type;
|
||
}
|
||
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();
|
||
|
||
type = prdInstockH.type;
|
||
}
|
||
|
||
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();
|
||
|
||
if (type == "25019163616533")
|
||
{
|
||
await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
|
||
}
|
||
else if (type == "25019172714005")
|
||
{
|
||
await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
|
||
}
|
||
else if (type == "25019191681045")
|
||
{
|
||
|
||
}
|
||
|
||
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;
|
||
|
||
|
||
if (type == "25019163616533")
|
||
{
|
||
Logger.LogInformation($"【PrdInstock】注塑车间生产提报");
|
||
// 注塑线边库到2,4输送线
|
||
// 根据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, db);
|
||
if (res1.code != HttpStatusCode.OK)
|
||
{
|
||
throw new Exception($"注塑车间生成到输送线的任务失败 {res1.msg}");
|
||
}
|
||
|
||
// 生成到中储仓任务
|
||
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.isChangeCarryLoc2StartLoc = false;
|
||
|
||
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
|
||
if (res2.code != HttpStatusCode.OK)
|
||
{
|
||
throw new Exception($"注塑车间生成到中储仓的任务失败 {res2.msg}");
|
||
}
|
||
}
|
||
else if (type == "25019172714005")
|
||
{
|
||
Logger.LogInformation($"【PrdInstock】挤出车间生产提报");
|
||
WmsCarryH wmsCarryH = await db.Queryable<WmsCarryH>().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync();
|
||
|
||
// 生成到中储仓任务
|
||
CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput();
|
||
commonCreatePretaskInput2.startlocation_id = startLocation.id;
|
||
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.isChangeCarryLoc2StartLoc = false;
|
||
|
||
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
|
||
if (res2.code != HttpStatusCode.OK)
|
||
{
|
||
throw new Exception($"挤出车间生成到中储仓的任务失败 {res2.msg}");
|
||
}
|
||
}
|
||
else if (type == "25019191681045")
|
||
{
|
||
Logger.LogInformation($"【PrdInstock】包装车间生产提报");
|
||
WmsCarryH wmsCarryH = await db.Queryable<WmsCarryH>().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync();
|
||
|
||
// 生成任务
|
||
CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput();
|
||
commonCreatePretaskInput2.startlocation_id = startLocation.id;
|
||
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;
|
||
|
||
Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db);
|
||
if (res2.code != HttpStatusCode.OK)
|
||
{
|
||
throw new Exception($"包装车间生成任务失败 {res2.msg}");
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
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
|
||
{
|
||
if (type == "25019163616533")
|
||
{
|
||
_s_taskExecuteSemaphore_F1ZCCInstock.Release();
|
||
}
|
||
else if (type == "25019172714005")
|
||
{
|
||
_s_taskExecuteSemaphore_F1ZCCInstock.Release();
|
||
}
|
||
else if (type == "25019191681045")
|
||
{
|
||
|
||
}
|
||
|
||
_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);
|
||
}
|
||
}
|
||
}
|
||
}
|