using System.Linq.Expressions; using JNPF.Common.Extension; using JNPF.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Senparc.Weixin.MP.AdvancedAPIs.Semantic; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { public class WmsCarryQueryService : BaseWareHouseService, IWmsCarryQueryService { private readonly ISqlSugarClient _db; private static Dictionary s_materialMap = new(); public WmsCarryQueryService(ISqlSugarRepository repository) { _db = repository.AsSugarClient(); } /// /// 载具查询接口 /// /// /// [HttpPost] public async Task MESCarryQuery(MESCarryQueryInput input) { if (input.IsNull()) { throw new ArgumentNullException("input"); } List data = new(); try { List carrys = await _db.Queryable() .InnerJoin((a, b) => a.collocation_scheme_id == b.id) .Where((a, b) => a.carry_code.Contains(input.carry_code) || b.bill_name.Contains(input.collocation_scheme_name)) .ToListAsync(); data = carrys.Adapt>(); } catch (Exception) { await _db.Ado.RollbackTranAsync(); } return data; } /// /// 载具查询返回接口(这接口不对) /// /// /// [HttpPost] //[NonUnify] public async Task MESCarryQueryResult(MESCarryQueryResultInput input) { if (input.IsNull()) { throw new ArgumentNullException("input"); } if (s_materialMap.Count < 1) { s_materialMap = await _db.Queryable().ToDictionaryAsync(x => x.id, x => x.name); } CarryQueryOutput data = new(); WmsCarryH carry = await _db.Queryable().FirstAsync(a => a.carry_code == input.carry_code && a.status == 1); if (carry.IsNull()) { throw new AppFriendlyException($"编号{input.carry_code},对应载具不存在或被禁用", 500); } Dictionary mCarryIdDic = await _db.Queryable().Where(it => it.carry_id == carry.id).ToDictionaryAsync(x => x.membercarry_id, x => x.membercarry_code); Dictionary mCarryIdDic2 = await _db.Queryable().Where(it => it.carry_id == carry.id).ToDictionaryAsync(x => x.membercarry_code, x => x.membercarry_id); Expression> whereExp = carry.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID && mCarryIdDic.Keys?.Count > 0 ? a => mCarryIdDic.Keys.Contains(a.carry_id) : a => a.carry_id == carry.id; List carryCodes = await _db.Queryable().InnerJoin((a, b) => a.carry_id == b.id).LeftJoin((a, b, c) => a.carry_id == c.carry_id) .Where(whereExp) .Select((a, b, c) => new WmsCarryCode { check_conclusion = SqlFunc.IsNull(b.check_conclusion, 1), instock_time = b.create_time, }, true) .ToListAsync(); if (carry.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID && mCarryIdDic?.Count > 0) { if (carryCodes.Count < mCarryIdDic.Keys?.Count) { throw new AppFriendlyException("载具条码数据异常,有料箱为空", 500); } int i = 0; foreach ((string mCarryId, object v) in mCarryIdDic) { carryCodes[i].member_carrycode = v?.ToString() ?? string.Empty; var carryCode = carryCodes.Find(x => x.carry_id == mCarryId); if (carryCode != null) { carryCodes[i].material_name = s_materialMap.ContainsKey(carryCode.material_id) ? s_materialMap[carryCode.material_id]?.ToString() ?? "" : ""; } i++; } } data = carry.Adapt(); data.wmsCarryCodes = carryCodes.Adapt>(); foreach (CarryCodeQueryOutput carryCodeQueryOutput in data.wmsCarryCodes) { if (carryCodeQueryOutput.member_carrycode == null) { Logger.Information($"WmsCarryD数据:{JsonConvert.SerializeObject(mCarryIdDic)}||||||carryCodes数据:{JsonConvert.SerializeObject(carryCodes)}"); throw new AppFriendlyException("载具与条码数量可能不匹配", 500); } carryCodeQueryOutput.member_carryid = mCarryIdDic2.GetOrDefault(carryCodeQueryOutput.member_carrycode).ToString(); } return data; } } }