diff --git a/BasicData/Tnb.BasicData.Entities/Consts/WebApiConst.cs b/BasicData/Tnb.BasicData.Entities/Consts/WebApiConst.cs index bc6ff7f8..c4488373 100644 --- a/BasicData/Tnb.BasicData.Entities/Consts/WebApiConst.cs +++ b/BasicData/Tnb.BasicData.Entities/Consts/WebApiConst.cs @@ -12,6 +12,9 @@ namespace Tnb.BasicData //生产出库接口 public const string MES_CREATE_OUTSTOCK = "/api/wms/wms-out-stock/mes-create-outstock"; + + //齐套出库接口 + public const string MES_KITTING_OUT_STK = "/api/wms/wmskitting-out/mes-kitting-out-stk"; #endregion diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdKittingOutD.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdKittingOutD.cs new file mode 100644 index 00000000..d0245679 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdKittingOutD.cs @@ -0,0 +1,57 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.ProductionMgr.Entities; + +/// +/// mes齐套出库子表 +/// +[SugarTable("prd_kitting_out_d")] +public partial class PrdKittingOutD : BaseEntity +{ + public PrdKittingOutD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 物料ID + /// + public string material_id { get; set; } = string.Empty; + + /// + /// 物料编号 + /// + public string? material_code { get; set; } + + /// + /// 单位ID + /// + public string? unit_id { get; set; } + + /// + /// 单位代码 + /// + public string? unit_code { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 数量(件数) + /// + public decimal pr_qty { get; set; } + + /// + /// 箱数 + /// + public int box { get; set; } + + /// + /// q齐套出库id + /// + public string kitting_out_id { get; set; } = string.Empty; + +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdKittingOutH.cs b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdKittingOutH.cs new file mode 100644 index 00000000..c5fd5cbc --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Entities/Entity/PrdKittingOutH.cs @@ -0,0 +1,97 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.ProductionMgr.Entities; + +/// +/// mes齐套出库主表 +/// +[SugarTable("prd_kitting_out_h")] +public partial class PrdKittingOutH : BaseEntity +{ + public PrdKittingOutH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 出库仓库ID + /// + public string warehouse_id { get; set; } = string.Empty; + + /// + /// 目标库位编号 + /// + public string location_code { get; set; } = string.Empty; + + /// + /// 产品ID + /// + public string material_id { get; set; } = string.Empty; + + /// + /// 产品编号 + /// + public string? material_code { get; set; } + + /// + /// 齐套搭配方案ID + /// + public string collocation_scheme_id { get; set; } = string.Empty; + + /// + /// 齐套搭配方案编号 + /// + public string? collocation_scheme_code { get; set; } + + /// + /// 顺序号 + /// + public string? seq { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 所属组织 + /// + public string? org_id { get; set; } + + /// + /// 流程任务Id + /// + public string? f_flowtaskid { get; set; } + + /// + /// 流程引擎Id + /// + public string? f_flowid { get; set; } + + /// + /// 单据号 + /// + public string code { get; set; } = string.Empty; + + /// + /// 所属工位 + /// + public string? workstation_id { get; set; } + + /// + /// 所属产线 + /// + public string? worklinei_d { get; set; } + + /// + /// 任务单 + /// + public string? mo_task_id { get; set; } + +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdKittingOutService.cs b/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdKittingOutService.cs new file mode 100644 index 00000000..b86a0354 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr.Interfaces/IPrdKittingOutService.cs @@ -0,0 +1,10 @@ +namespace Tnb.ProductionMgr.Interfaces +{ + /// + /// MES齐套出库接口 + /// + public interface IPrdKittingOutService + { + + } +} \ No newline at end of file diff --git a/ProductionMgr/Tnb.ProductionMgr/PrdKittingOutService.cs b/ProductionMgr/Tnb.ProductionMgr/PrdKittingOutService.cs new file mode 100644 index 00000000..598f9a33 --- /dev/null +++ b/ProductionMgr/Tnb.ProductionMgr/PrdKittingOutService.cs @@ -0,0 +1,108 @@ +using JNPF; +using JNPF.Common.Core.Manager; +using JNPF.Common.Dtos.VisualDev; +using JNPF.DependencyInjection; +using JNPF.DynamicApiController; +using JNPF.Extras.CollectiveOAuth.Models; +using JNPF.Extras.CollectiveOAuth.Utils; +using JNPF.FriendlyException; +using JNPF.Logging; +using JNPF.Systems.Interfaces.System; +using JNPF.VisualDev; +using JNPF.VisualDev.Entitys; +using JNPF.VisualDev.Interfaces; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using SqlSugar; +using Tnb.BasicData; +using Tnb.BasicData.Entities; +using Tnb.ProductionMgr.Entities; +using Tnb.ProductionMgr.Interfaces; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; + +namespace Tnb.ProductionMgr +{ + /// + /// 生产领料 + /// + [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 700)] + [Route("api/[area]/[controller]/[action]")] + [OverideVisualDev(ModuleId)] + public class PrdKittingOutService : IOverideVisualDevService, IPrdKittingOutService, IDynamicApiController, ITransient + { + private const string ModuleId = "27565198830357"; + private readonly ISqlSugarRepository _repository; + private readonly ISqlSugarClient _db; + private readonly IRunService _runService; + private readonly IVisualDevService _visualDevService; + private readonly IDictionaryDataService _dictionaryDataService; + private readonly IUserManager _userManager; + public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); + + public PrdKittingOutService(ISqlSugarRepository repository, IRunService runService, IUserManager userManager,IVisualDevService visualDevService, IDictionaryDataService dictionaryDataService) + { + _db = repository.AsSugarClient(); + _runService = runService; + _visualDevService = visualDevService; + _dictionaryDataService = dictionaryDataService; + _repository = repository; + _userManager = userManager; + OverideFuncs.CreateAsync = Create; + } + + private async Task Create(VisualDevModelDataCrInput visualDevModelDataCrInput) + { + try + { + var db = _repository.AsSugarClient(); + + List input = new List(); + visualDevModelDataCrInput.data["code"] = "111"; + input.Add(new MESKittingOutStkInput() + { + org_id = _userManager.GetUserInfo().Result.organizeId, + bill_date = DateTime.Now, + warehouse_id = visualDevModelDataCrInput.data.ContainsKey("warehouse_id") ? visualDevModelDataCrInput.data["warehouse_id"].ToString() : "", + location_code = visualDevModelDataCrInput.data.ContainsKey("location_code") ? visualDevModelDataCrInput.data["location_code"].ToString() : "", + material_id = visualDevModelDataCrInput.data.ContainsKey("material_id") ? visualDevModelDataCrInput.data["material_id"].ToString() : "", + material_code = visualDevModelDataCrInput.data.ContainsKey("material_code") ? visualDevModelDataCrInput.data["material_code"].ToString() : "", + collocation_scheme_id = visualDevModelDataCrInput.data.ContainsKey("collocation_scheme_id") ? visualDevModelDataCrInput.data["collocation_scheme_id"].ToString() : "", + collocation_scheme_code = visualDevModelDataCrInput.data.ContainsKey("collocation_scheme_code") ? visualDevModelDataCrInput.data["collocation_scheme_code"].ToString() : "", + source_id = visualDevModelDataCrInput.data.ContainsKey("code") ? visualDevModelDataCrInput.data["code"].ToString() : "", + // source_id = "123", + seq = visualDevModelDataCrInput.data.ContainsKey("seq") ? (int)visualDevModelDataCrInput.data["seq"] : 0, + create_id = _userManager.UserId, + wmsKittingoutDs = new List(), + }); + + input[0].wmsKittingoutDs = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(visualDevModelDataCrInput.data["tableField115"])); + string domain = (App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host; + Dictionary header = new Dictionary() + { + ["Authorization"] = App.HttpContext.Request.Headers["Authorization"] + }; + var sendResult = HttpUtils.RequestPost(domain + WebApiConst.MES_KITTING_OUT_STK,JsonConvert.SerializeObject(input),header); + Log.Information(sendResult); + + AuthResponse authResponse = JsonConvert.DeserializeObject(sendResult); + if (authResponse.code != 200) + { + throw Oops.Bah(authResponse.msg); + } + else + { + VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleId, true); + await _runService.Create(templateEntity, visualDevModelDataCrInput); + } + return await Task.FromResult(true); + } + catch (Exception e) + { + Console.WriteLine(e); + Log.Error(e.Message); + throw Oops.Bah(e.Message); + } + + } + } +} \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MESCollocationSchemeQueryInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MESCollocationSchemeQueryInput.cs index 9ad7c3c1..26ea874e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MESCollocationSchemeQueryInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MESCollocationSchemeQueryInput.cs @@ -3,10 +3,11 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using JNPF.Common.Filter; namespace Tnb.WarehouseMgr.Entities.Dto.Inputs { - public class MESCollocationSchemeQueryInput + public class MESCollocationSchemeQueryInput : PageInputBase { /// /// 齐套出库主表 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/CollocationSchemeOutput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/CollocationSchemeOutput.cs index 6986be71..64ee7215 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/CollocationSchemeOutput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Outputs/CollocationSchemeOutput.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; +using Org.BouncyCastle.Asn1.Mozilla; using SqlSugar; namespace Tnb.WarehouseMgr.Entities.Dto.Outputs @@ -64,7 +65,12 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Outputs /// /// 齐套明细输出 /// + [JsonIgnore] public List? CollocationSchemeDs { get; set; } + /// + /// 齐套明细Json + /// + public string CollocationSchemeDsJson { get; set; }=string.Empty; [JsonIgnore] public List? list { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCollocationSchemeSevice.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCollocationSchemeSevice.cs index 9e25e026..06731b64 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCollocationSchemeSevice.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCollocationSchemeSevice.cs @@ -17,6 +17,6 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// /// - Task MESCollocationSchemeQuery(MESCollocationSchemeQueryInput input); + Task MESCollocationSchemeQuery(MESCollocationSchemeQueryInput input); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index c2114d31..eabdffe4 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -25,6 +25,7 @@ using Mapster; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis; +using NPOI.HPSF; using NPOI.OpenXmlFormats.Wordprocessing; using Polly.Timeout; using Senparc.Weixin.Work.AdvancedAPIs.OaDataOpen; @@ -187,6 +188,7 @@ namespace Tnb.WarehouseMgr //任务链属性处理内部函数 async Task _taskChainAttrHandle(List items, List areaPreTasks, int moveNum) { + var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE); await Task.Run(() => { if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1)) @@ -194,19 +196,34 @@ namespace Tnb.WarehouseMgr items.ForEach(x => { x.is_chain = 0; - }); + items[^items.Count].groups = $"{groupCode}-1"; } else if ((moveNum > areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count) { items.ForEach(x => x.is_chain = 1); - //items[0].chain_type = "1"; - //for (int i = 0; i < items.Count; i++) - //{ - // if (i == 0 || i == items.Count - 1) continue; - // items[i].chain_type = "2"; - //} - //items[^1].chain_type = "3"; + var mod = items.Count % moveNum > 0 ? items.Count / moveNum + 1 : items.Count / moveNum; + int start = 0, end = moveNum; + var arrary = items.ToArray(); + var itemsCount = items.Count; + for (int i = 1; i <= mod; i++) + { + if (start >= itemsCount) break; + var subArray = arrary[start..end]; + for (int j = 0, arrLen = subArray.Length; j < arrLen; j++) + { + subArray[j].groups = $"{groupCode}-{i}"; + } + start = end; + if ((end + moveNum) >= arrary.Length) + { + end = arrary.Length; + } + else + { + end = end + moveNum; + } + } } }); @@ -234,12 +251,12 @@ namespace Tnb.WarehouseMgr { var moveNum = itGroup.First().move_num; var items = itGroup.Adapt>(); - items.ForEach(x => + for (int i = 0, cnt = items.Count; i < cnt; i++) { - x.id = SnowflakeIdHelper.NextId(); - x.status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID; - x.bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE).GetAwaiter().GetResult(); - }); + items[i].id = SnowflakeIdHelper.NextId(); + items[i].status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID; + items[i].bill_code = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE); + } if (moveNum == 1) { @@ -508,7 +525,7 @@ namespace Tnb.WarehouseMgr if (arr.Length > 1) { var subArr = arr[..^1]; - Array.ForEach(subArr, a => a.chain_type = "1"); + System.Array.ForEach(subArr, a => a.chain_type = "1"); } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs index 2e8b719b..ad7988b0 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs @@ -157,7 +157,7 @@ namespace Tnb.WarehouseMgr [NonAction] public async Task UpdateNullCarry(WmsCarryH carryObj) { - var row = -1; + var row = 1; try { carryObj.status = 0; @@ -172,7 +172,8 @@ namespace Tnb.WarehouseMgr carryObj.collocation_scheme_code = null; carryObj.source_id = null; carryObj.source_code = null; - row = await _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync(); + Task.Run(() => _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync()); + //row = await _db.CopyNew().Updateable(carryObj).ExecuteCommandAsync(); //删除对应明细表 //删除载具明细 await _db.CopyNew().Deleteable().Where(it => it.carry_id == carryObj.id).ExecuteCommandHasChangeAsync(); @@ -183,12 +184,14 @@ namespace Tnb.WarehouseMgr } catch (Exception ex) { - Log.Error("更新空载具出错",ex); + row = 0; + Log.Error("更新空载具出错", ex); throw; } return row; } + private async Task _updateSubCarry(ExChangeCarryInput input) where T : BaseEntity, IWmsCarryEntity, new() { var row = -1; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCollocationSchemeSevice.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCollocationSchemeSevice.cs index 1a15b5d0..4c367e00 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCollocationSchemeSevice.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCollocationSchemeSevice.cs @@ -7,6 +7,7 @@ using Aop.Api.Domain; using Aspose.Cells.Drawing; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Extension; +using JNPF.Common.Filter; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; @@ -15,6 +16,7 @@ using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; using Mapster; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using SqlSugar; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Dto.Inputs; @@ -89,25 +91,25 @@ namespace Tnb.WarehouseMgr /// [HttpPost] //[NonUnify] - public async Task MESCollocationSchemeQuery(MESCollocationSchemeQueryInput input) + public async Task MESCollocationSchemeQuery(MESCollocationSchemeQueryInput input) { if (input.IsNull()) throw new ArgumentNullException("input"); - var data = new List(); + SqlSugarPagedList pageData = new(); try { - data = await _db.Queryable() + pageData = await _db.Queryable() .Where(a => a.material_id == input.material_id) .Select(a => new CollocationSchemeOutput { list = SqlFunc.Subqueryable().Where(b => b.bill_id == a.id).ToList(), }, true) - .Mapper(it => it.CollocationSchemeDs = it.list?.Adapt>()) - .ToListAsync(); + .Mapper(it => it.CollocationSchemeDsJson = JsonConvert.SerializeObject(it.list)) + .ToPagedListAsync(input.currentPage, input.pageSize); } catch (Exception) { } - return data; + return pageData == null ? Enumerable.Empty() : PageResult.SqlSugarPageResult(pageData); } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs index 079c898c..671d6354 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs @@ -314,7 +314,6 @@ namespace Tnb.WarehouseMgr await _db.Updateable(curSortingDetails).ExecuteCommandAsync(); if (curSortingDetails.All(it => it.line_status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID)) { - await _db.Updateable().SetColumns(it => new WmsSetsortingH { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }).Where(it => it.id == input.requireId).ExecuteCommandAsync(); } var carry = await _db.Queryable().SingleAsync(it => it.id == carryId); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs index 7a649a6b..35b71c63 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; +using System.Transactions; using Aop.Api.Domain; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; @@ -304,7 +305,7 @@ namespace Tnb.WarehouseMgr carrys.Add(carry); if (carrys?.Count > 0) { - await _db.Ado.BeginTranAsync(); + await _db.Ado.BeginTranAsync(); var tasks = new List>(); foreach (var carryIt in carrys) { @@ -313,7 +314,9 @@ namespace Tnb.WarehouseMgr var all = await Task.WhenAll(tasks); await _db.Ado.CommitTranAsync(); if (all.All(x => x > 0)) + { isOk = all?.Length > 0; + } } } if (!isOk) throw Oops.Oh(ErrorCode.COM1001); @@ -338,11 +341,21 @@ namespace Tnb.WarehouseMgr if (input.IsNull()) throw new ArgumentNullException(nameof(input)); try { - var kittingOut = input[^1]; - var curCarry = await _db.Queryable().SingleAsync(it => it.id == kittingOut.carry_id); - var endLocation = await _db.Queryable().SingleAsync(it => it.id == kittingOut.location_id); - var isMatch = await IsCarryAndLocationMatchByCarryStd(curCarry, endLocation); - if (!isMatch) throw new AppFriendlyException("该载具无法放置到目标库位", 500); + //var kittingOut = input[^1]; + //if ((!kittingOut.carry_id.IsNullOrEmpty() || !kittingOut.carry_code.IsNullOrEmpty()) && !kittingOut.location_code.IsNullOrEmpty()) + //{ + // WmsCarryH? curCarry = null; + // if (!kittingOut.carry_id.IsNullOrEmpty()) + // curCarry = await _db.Queryable().SingleAsync(it => it.id == kittingOut.carry_id); + // else + // curCarry = await _db.Queryable().FirstAsync(it => it.carry_code == kittingOut.carry_code); + + // var endLocation = await _db.Queryable().SingleAsync(it => it.id == kittingOut.location_code); + // var isMatch = await IsCarryAndLocationMatchByCarryStd(curCarry, endLocation); + // if (!isMatch) throw new AppFriendlyException("该载具无法放置到目标库位", 500); + + //} + await _db.Ado.BeginTranAsync(); List kittingOutDs = new();