206 lines
9.4 KiB
C#
206 lines
9.4 KiB
C#
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<string, object> _dicBizType = new();
|
|
private readonly IUserManager _userManager;
|
|
private readonly IWmsOutStockService _outstockService;
|
|
public PDATransferSignService(ISqlSugarRepository<WmsDistaskH> repository, IDictionaryDataService dictionaryDataService,IUserManager userManager,IWmsOutStockService outStockService)
|
|
{
|
|
_db = repository.AsSugarClient();
|
|
_dictionaryDataService = dictionaryDataService;
|
|
_userManager = userManager;
|
|
_outstockService = outStockService;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 转运签收
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[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<WmsCarryH>().SingleAsync(it => it.id == input.carryId);
|
|
}
|
|
else
|
|
{
|
|
carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.carry_code == input.carry_code);
|
|
}
|
|
if (!input.new_carry_code.IsNullOrWhiteSpace())
|
|
newCarry = await _db.Queryable<WmsCarryH>().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<BasLocation>().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<WmsDistaskH>().SingleAsync(it => it.id == input.disTaskId);
|
|
}
|
|
else if (!input.carryId.IsNullOrEmpty())
|
|
{
|
|
disTask = await _db.Queryable<WmsDistaskH>().FirstAsync(it => it.carry_id == input.carryId && it.is_sign == 0);
|
|
}
|
|
else if (!input.carry_code.IsNullOrEmpty())
|
|
{
|
|
disTask = await _db.Queryable<WmsDistaskH>().FirstAsync(it => it.carry_code == input.carry_code && it.is_sign == 0);
|
|
}
|
|
if (disTask != null)
|
|
{
|
|
var nCCode = await _db.Queryable<WmsCarryCode>().Where(it => it.carry_id == newCarry.id).ToListAsync();
|
|
var dicMin = await _db.Queryable<BasMaterial>().Where(it => input.distaskCodes.Select(x => x.material_id).Contains(it.id)).ToDictionaryAsync(d => d.id, d => d.minpacking);
|
|
WmsCarryCode cCode = new WmsCarryCode();
|
|
List<WmsCarryCode> iCodes = new List<WmsCarryCode>();
|
|
List<WmsCarryCode> uCodes = new List<WmsCarryCode>();
|
|
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<WmsCarryCode>();
|
|
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<string> { 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;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 库存是否抵达最小库存
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public async Task IsMinStorage()
|
|
{
|
|
try
|
|
{
|
|
List<Dictionary<string, object>> mats = new List<Dictionary<string, object>>();
|
|
var items = await _db.Queryable<WmsCarryCode>()
|
|
.LeftJoin<BasMaterialSendWarehouse>((a, b) => a.material_id == b.id)
|
|
.LeftJoin<BasMaterial>((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<string, object> 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<BasLocation>().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;
|
|
}
|
|
}
|
|
}
|
|
}
|