using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using JNPF.Common.Extension; using JNPF.Systems.Interfaces.System; using Microsoft.AspNetCore.Mvc; 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; using Tnb.WarehouseMgr.Entities.Enums; using Mapster; using JNPF.Common.Security; using System.Collections.Immutable; using JNPF.Common.Core.Manager; using Tnb.WarehouseMgr.Interfaces; //using JNPF.Extras.CollectiveOAuth.Utils; namespace Tnb.WarehouseMgr { public class PDATransferSignService : BaseWareHouseService { private readonly ISqlSugarClient _db; private readonly IDictionaryDataService _dictionaryDataService; private static Dictionary _dicBizType = new(); private readonly IUserManager _userManager; private readonly IWmsOutStockService _outstockService; public PDATransferSignService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService,IUserManager userManager,IWmsOutStockService outStockService) { _db = repository.AsSugarClient(); _dictionaryDataService = dictionaryDataService; _userManager = userManager; _outstockService = outStockService; } /// /// 转运签收 /// /// [HttpPost] public async Task SignForDelivery(SignForDeliveryInput input) { if (_dicBizType.Count < 1) { _dicBizType = await _dictionaryDataService.GetDictionaryByTypeId(WmsWareHouseConst.WMS_BIZTYPE_ID); } try { await _db.Ado.BeginTranAsync(); WmsCarryH? carry = null; WmsCarryH? newCarry = null; if (!input.carryId.IsNullOrWhiteSpace()) { carry = await _db.Queryable().SingleAsync(it => it.id == input.carryId); } else { carry = await _db.Queryable().SingleAsync(it => it.carry_code == input.carry_code); } if (!input.new_carry_code.IsNullOrWhiteSpace()) newCarry = await _db.Queryable().SingleAsync(it => it.carry_code == input.new_carry_code); if (carry != null && newCarry != null) { if (carry?.location_id?.IsNotEmptyOrNull() ?? false) { var loc = await _db.Queryable().SingleAsync(it => it.id == carry.location_id); loc.is_use = ((int)EnumCarryStatus.空闲).ToString(); await _db.Updateable(loc).UpdateColumns(it => it.is_use).ExecuteCommandAsync(); } WmsDistaskH? disTask = null; if (!input.disTaskId.IsNullOrEmpty()) { disTask = await _db.Queryable().SingleAsync(it => it.id == input.disTaskId); } else if (!input.carryId.IsNullOrEmpty()) { disTask = await _db.Queryable().FirstAsync(it => it.carry_id == input.carryId && it.is_sign == 0); } else if (!input.carry_code.IsNullOrEmpty()) { disTask = await _db.Queryable().FirstAsync(it => it.carry_code == input.carry_code && it.is_sign == 0); } if (disTask != null) { var nCCode = await _db.Queryable().Where(it => it.carry_id == newCarry.id).ToListAsync(); var dicMin = await _db.Queryable().Where(it => input.distaskCodes.Select(x => x.material_id).Contains(it.id)).ToDictionaryAsync(d => d.id, d => d.minpacking); WmsCarryCode cCode = new WmsCarryCode(); List iCodes = new List(); List uCodes = new List(); foreach (var dCode in input.distaskCodes) { decimal codeQty = 0; var sMCode = nCCode.Find(x => x.material_id == dCode.material_id && x.codeqty <= dicMin[dCode.material_id].ParseToDecimal()); cCode = dCode.Adapt(); cCode.carry_id = newCarry.id; cCode.code_batch = $"{DateTime.Today.Year}{DateTime.Today.Month}{DateTime.Today.Day}"; if (sMCode != null) { codeQty = sMCode.codeqty; cCode.codeqty += codeQty; cCode.id = sMCode.id; uCodes.Add(cCode); } else { cCode.id = SnowflakeIdHelper.NextId(); iCodes.Add(cCode); } } await _db.Insertable(iCodes).ExecuteCommandAsync(); await _db.Updateable(uCodes).ExecuteCommandAsync(); if (_dicBizType.ContainsKey(disTask.biz_type)) { WareHouseUpInput upInput = new() { loginType = "web", bizTypeId = disTask.biz_type, requireId = disTask!.require_id!, carryIds = new List { carry!.id }, distaskCodes = input.distaskCodes }; await DoUpdate(upInput); //回更业务 } disTask.is_sign = 1; await _db.Updateable(disTask).UpdateColumns(it => it.is_sign).ExecuteCommandAsync(); } } await _db.Ado.CommitTranAsync(); } catch (Exception) { await _db.Ado.RollbackTranAsync(); throw; } } /// /// 库存是否抵达最小库存 /// /// public async Task IsMinStorage() { try { List> mats = new List>(); var items = await _db.Queryable() .LeftJoin((a, b) => a.material_id == b.id) .LeftJoin((a, b, c) => b.material_id == c.id) .Where(a => a.warehouse_id == "2") .Select((a, b, c) => new { a.material_id, a.codeqty, b.min_stock, c.code, c.minpacking }) .ToListAsync(); var itGroups = items.GroupBy(it => it.material_id); foreach (var itGroup in itGroups) { Dictionary dic = new(); var minStock = itGroup.First().min_stock; if (itGroup.Select(x => x.codeqty).Sum() <= minStock) { foreach (var a in itGroup) { dic.Add(nameof(a.material_id), a.material_id); dic.Add(nameof(a.code), a.code); dic.Add(nameof(a.minpacking), a.minpacking ?? 0); } mats.Add(dic); } } var locs = await _db.Queryable().Where(it => it.is_type == ((int)EnumLocationType.存储库位).ToString() && it.wh_id == "2" && it.is_lock == 0 && it.is_use == ((int)EnumCarryStatus.空闲).ToString()).ToListAsync(); MESCreateOutstockInput input = new() { outstock = { org_id = _userManager.User.OrganizeId, bill_date = DateTime.Now, bill_type = "28135837838101",//单据类型:自动补货单 warehouse_id = "1", create_id= _userManager.UserId, } }; foreach (var mat in mats) { input.outstock.location_code = locs[mats.IndexOf(mat)].location_code; MESWmsOutstockDInput outstockD = new() { material_id = mat["material_id"].ToString()!, material_code = mat["code"].ToString()!, pr_qty = mat["minpacking"].ParseToDecimal(), }; input.outstockDs.Add(outstockD); await _outstockService.MESCreateOutstock(input); } } catch (Exception) { throw; } } } }