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 repository, IRunService runService, IVisualDevService visualDevService, IWareHouseService wareHouseService, IBillRullService billRullService) { _db = repository.AsSugarClient(); _runService = runService; _visualDevService = visualDevService; _wareHouseService = wareHouseService; _billRullService = billRullService; } /// /// 工单提报 第一次主表所有参数全传,后续主表只需要传工单号prd_bill_code和更新后的合格数pqty、不合格数rqty /// /// /// public async Task PrdInstock(WmsPrdInstockInput input, ISqlSugarClient dbConn = null) { Logger.LogInformation($"【PrdInstock】传入参数 {JsonConvert.SerializeObject(input)}"); var db = _db; if (dbConn != null) db = dbConn; try { await db.Ado.BeginTranAsync(); WmsPrdInstockH prdInstockH = db.Queryable().Where(r => r.prd_bill_code == input.prd_bill_code).First(); string prd_instock_code_id = ""; string type = ""; // 新建主表 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(r => new WmsPrdInstockH { pqty = input.pqty, rqty = input.rqty }).Where(r => r.id == prd_instock_code_id).ExecuteCommandAsync(); type = prdInstockH.type; } List WmsPrdInstockDs = new List(); 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 WmsPrdInstockCodes = new List(); 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 endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); if (endLocations?.Count == 0) { throw new AppFriendlyException("没有可用的中储仓库位", 500); } BasLocation endLocation = endLocations[0]; BasLocation startLocation = db.Queryable().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().Where(r => new string[2] { "32624148726549", "32624157608981" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); await db.Updateable().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().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().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().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}"); } } } 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().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); } } } }