生产退料开发等
This commit is contained in:
381
WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs
Normal file
381
WarehouseMgr/Tnb.WarehouseMgr/WmsPrdReturnService.cs
Normal file
@@ -0,0 +1,381 @@
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Dtos.VisualDev;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Security;
|
||||
using JNPF.FriendlyException;
|
||||
using JNPF.VisualDev;
|
||||
using JNPF.VisualDev.Entitys;
|
||||
using JNPF.VisualDev.Interfaces;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using NPOI.POIFS.Storage;
|
||||
using SqlSugar;
|
||||
using Tnb.BasicData.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.Dto.Outputs;
|
||||
using Tnb.WarehouseMgr.Entities.Entity;
|
||||
using Tnb.WarehouseMgr.Entities.Enums;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
/// <summary>
|
||||
/// 载具解绑
|
||||
/// </summary>
|
||||
[OverideVisualDev(ModuleConsts.MODULE_WMSPRDRETURN_ID)]
|
||||
[ServiceModule(BizTypeId)]
|
||||
public class WmsPrdReturnService : BaseWareHouseService, IWmsPrdReturnService
|
||||
{
|
||||
private const string BizTypeId = WmsWareHouseConst.BIZTYPE_PRDRETURN_ID;
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IRunService _runService;
|
||||
private readonly IVisualDevService _visualDevService;
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
public WmsPrdReturnService(
|
||||
ISqlSugarRepository<WmsCarryH> repository,
|
||||
IRunService runService,
|
||||
IVisualDevService visualDevService,
|
||||
IWareHouseService wareHouseService,
|
||||
IUserManager userManager)
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_runService = runService;
|
||||
_visualDevService = visualDevService;
|
||||
_userManager = userManager;
|
||||
_wareHouseService = wareHouseService;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从产线呼叫装料架到暂存仓/缓存仓
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, NonUnify, AllowAnonymous]
|
||||
public async Task<Result> PrdReturn(PrdReturnInput input)
|
||||
{
|
||||
WmsPrdReturnH wmsPrdReturnH = await _db.Queryable<WmsPrdReturnH>().Where(r => r.id == input.source_id).FirstAsync();
|
||||
if (wmsPrdReturnH == null)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】不存在id为{input.source_id}的生产退料单!");
|
||||
throw new AppFriendlyException($"【PrdReturn】不存在id为{input.startlocation_id}的生产退料单!", 500);
|
||||
}
|
||||
if (wmsPrdReturnH.status == WmsWareHouseConst.BILLSTATUS_COMPLETE_ID)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已完成!");
|
||||
throw new AppFriendlyException($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已完成!", 500);
|
||||
}
|
||||
if (wmsPrdReturnH.status == WmsWareHouseConst.BILLSTATUS_CANCEL_ID)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已取消!");
|
||||
throw new AppFriendlyException($"【PrdReturn】生产退料单{wmsPrdReturnH.bill_code}状态为已取消!", 500);
|
||||
}
|
||||
|
||||
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.carry_code == input.carry_code).FirstAsync();
|
||||
|
||||
// 料架到暂存仓
|
||||
if (wmsCarryH.carrystd_id == "26037267399717")
|
||||
{
|
||||
return await Return_到暂存仓(input, wmsCarryH, wmsPrdReturnH);
|
||||
}
|
||||
// 载运小车和载运料架到缓存仓
|
||||
else if (wmsCarryH.carrystd_id == "26103233723941" || wmsCarryH.carrystd_id == "34995839046677")
|
||||
{
|
||||
return await Return_到缓存仓(input, wmsCarryH, wmsPrdReturnH);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError($"【PrdReturn】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!");
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"【PrdReturn】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async Task<Result> Return_到暂存仓(PrdReturnInput input, WmsCarryH wmsCarryH, WmsPrdReturnH wmsPrdReturnH)
|
||||
{
|
||||
try
|
||||
{
|
||||
BasLocation startlocation = _db.Queryable<BasLocation>().Where(r => r.id == input.startlocation_id).First();
|
||||
if (startlocation == null)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】不存在id为{input.startlocation_id}的库位!");
|
||||
throw new AppFriendlyException($"【PrdReturn】不存在id为{input.startlocation_id}的库位!", 500);
|
||||
}
|
||||
if (string.IsNullOrEmpty(input.carry_code))
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】料架不能为空!{input.carry_code}");
|
||||
throw new AppFriendlyException($"【PrdReturn】料架不能为空!{input.carry_code}!", 500);
|
||||
}
|
||||
|
||||
// 找到未占用且未锁定的库位
|
||||
ISugarQueryable<BasLocation> rackEndLocations =
|
||||
_db.Queryable<BasLocation>()
|
||||
.Where(r => r.wh_id == "33780009364245" && r.is_use == "0" && r.is_lock == 0 && r.is_type == "0").OrderBy(a => a.id).Take(1);
|
||||
|
||||
if (rackEndLocations.Count() == 0)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】没有可用的终点库位");
|
||||
throw new AppFriendlyException($"【PrdReturn】没有可用的终点库位!", 500);
|
||||
}
|
||||
|
||||
BasLocation endlocation = rackEndLocations.First();
|
||||
|
||||
var memberCarryCodes = _db.Queryable<WmsCarryD>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.membercarry_id == b.id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c) => b.id == c.carry_id)
|
||||
.Where((a, b, c) => a.carry_id == wmsCarryH.id).Select((a, b, c) => new
|
||||
{
|
||||
carry_code = b.carry_code,
|
||||
barcode = c.barcode,
|
||||
material_id = c.material_id,
|
||||
material_code = c.material_code,
|
||||
}).ToList();
|
||||
|
||||
List<string> matIds = memberCarryCodes.Select(r => r.material_id).Distinct().ToList();
|
||||
|
||||
// 匹配生产退料单明细的物料种类
|
||||
List<string> existsMatIds = _db.Queryable<WmsPrdReturnD>().Where(r => r.bill_id == input.source_id).Select(r => r.material_id).Distinct().ToList();
|
||||
List<string> notExistsMatIds = matIds.Where(r => !existsMatIds.Contains(r)).ToList();
|
||||
|
||||
if (notExistsMatIds.Count() > 0)
|
||||
{
|
||||
var existsMat = memberCarryCodes.Where(r => notExistsMatIds.Contains(r.material_id)).Select(r => new
|
||||
{
|
||||
carry_code = r.carry_code,
|
||||
barcode = r.barcode,
|
||||
});
|
||||
|
||||
string msg = "";
|
||||
foreach (var row in existsMat)
|
||||
{
|
||||
msg += $",料箱{row.carry_code} 条码{row.barcode}";
|
||||
}
|
||||
Logger.LogWarning($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查! {msg.Trim(',')}");
|
||||
throw new AppFriendlyException($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查!{msg.Trim(',')}", 500);
|
||||
}
|
||||
|
||||
WmsPretaskH wmsPretaskH = _db.Queryable<WmsPretaskH>().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First();
|
||||
if (wmsPretaskH != null)
|
||||
{
|
||||
Logger.LogWarning($"【CallRackToProductionLine】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!");
|
||||
throw new AppFriendlyException($"此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!", 500);
|
||||
}
|
||||
|
||||
await _db.Ado.BeginTranAsync();
|
||||
|
||||
Logger.LogWarning($"【PrdReturn】开始生成预任务");
|
||||
CommonCreatePretaskInput commonCreatePretaskInput = new();
|
||||
commonCreatePretaskInput.startlocation_id = startlocation.id;
|
||||
commonCreatePretaskInput.endlocation_id = endlocation.id;
|
||||
commonCreatePretaskInput.source_id = input.source_id;
|
||||
commonCreatePretaskInput.carry_id = wmsCarryH.id;
|
||||
commonCreatePretaskInput.carry_code = input.carry_code;
|
||||
commonCreatePretaskInput.task_type = "";
|
||||
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_PRDRETURN_ID;
|
||||
|
||||
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
|
||||
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
|
||||
{
|
||||
Logger.LogInformation($"【PrdReturn】生成预任务失败 载具 {input.carry_code}");
|
||||
throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500);
|
||||
}
|
||||
Logger.LogWarning($"【PrdReturn】生成预任务成功");
|
||||
await _db.Ado.CommitTranAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("【PrdReturn】" + ex.Message);
|
||||
Logger.LogError("【PrdReturn】" + ex.StackTrace);
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
|
||||
}
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
|
||||
async Task<Result> Return_到缓存仓(PrdReturnInput input, WmsCarryH wmsCarryH, WmsPrdReturnH wmsPrdReturnH)
|
||||
{
|
||||
try
|
||||
{
|
||||
BasLocation startlocation = _db.Queryable<BasLocation>().Where(r => r.id == input.startlocation_id).First();
|
||||
if (startlocation == null)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】不存在id为{input.startlocation_id}的库位!");
|
||||
throw new AppFriendlyException($"【PrdReturn】不存在id为{input.startlocation_id}的库位!", 500);
|
||||
}
|
||||
if (string.IsNullOrEmpty(input.carry_code))
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】料架不能为空!{input.carry_code}");
|
||||
throw new AppFriendlyException($"【PrdReturn】料架不能为空!{input.carry_code}!", 500);
|
||||
}
|
||||
|
||||
// 找到未占用且未锁定的库位
|
||||
ISugarQueryable<BasLocation> rackEndLocations =
|
||||
_db.Queryable<BasLocation>()
|
||||
.Where(r => r.wh_id == "26103348825381" && r.is_use == "0" && r.is_lock == 0 && r.is_type == "0").OrderBy(a => a.id).Take(1);
|
||||
|
||||
if (rackEndLocations.Count() == 0)
|
||||
{
|
||||
Logger.LogWarning($"【PrdReturn】没有可用的终点库位");
|
||||
throw new AppFriendlyException($"【PrdReturn】没有可用的终点库位!", 500);
|
||||
}
|
||||
|
||||
BasLocation endlocation = rackEndLocations.First();
|
||||
|
||||
var memberCarryCodes = _db.Queryable<WmsCarryH>()
|
||||
.InnerJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
|
||||
.Where((a, b) => a.id == wmsCarryH.id).Select((a, b) => new
|
||||
{
|
||||
carry_code = a.carry_code,
|
||||
barcode = b.barcode,
|
||||
material_id = b.material_id,
|
||||
material_code = b.material_code,
|
||||
}).ToList();
|
||||
|
||||
List<string> matIds = memberCarryCodes.Select(r => r.material_id).Distinct().ToList();
|
||||
|
||||
// 匹配生产退料单明细的物料种类
|
||||
List<string> existsMatIds = _db.Queryable<WmsPrdReturnD>().Where(r => r.bill_id == input.source_id).Select(r => r.material_id).Distinct().ToList();
|
||||
List<string> notExistsMatIds = matIds.Where(r => !existsMatIds.Contains(r)).ToList();
|
||||
|
||||
if (notExistsMatIds.Count() > 0)
|
||||
{
|
||||
var existsMat = memberCarryCodes.Where(r => notExistsMatIds.Contains(r.material_id)).Select(r => new
|
||||
{
|
||||
carry_code = r.carry_code,
|
||||
barcode = r.barcode,
|
||||
});
|
||||
|
||||
string msg = "";
|
||||
foreach (var row in existsMat)
|
||||
{
|
||||
msg += $",料箱{row.carry_code} 条码{row.barcode}";
|
||||
}
|
||||
Logger.LogWarning($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查! {msg.Trim(',')}");
|
||||
throw new AppFriendlyException($"【PrdReturn】存在装有与生产退料单明细不匹配物料的料箱,请检查!{msg.Trim(',')}", 500);
|
||||
}
|
||||
|
||||
WmsPretaskH wmsPretaskH = _db.Queryable<WmsPretaskH>().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).First();
|
||||
if (wmsPretaskH != null)
|
||||
{
|
||||
Logger.LogWarning($"【CallRackToProductionLine】此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!");
|
||||
throw new AppFriendlyException($"此料架{wmsCarryH.carry_code}存在未完成的预任务{wmsPretaskH.bill_code}!", 500);
|
||||
}
|
||||
|
||||
await _db.Ado.BeginTranAsync();
|
||||
|
||||
Logger.LogWarning($"【PrdReturn】开始生成预任务");
|
||||
CommonCreatePretaskInput commonCreatePretaskInput = new();
|
||||
commonCreatePretaskInput.startlocation_id = startlocation.id;
|
||||
commonCreatePretaskInput.endlocation_id = endlocation.id;
|
||||
commonCreatePretaskInput.source_id = input.source_id;
|
||||
commonCreatePretaskInput.carry_id = wmsCarryH.id;
|
||||
commonCreatePretaskInput.carry_code = input.carry_code;
|
||||
commonCreatePretaskInput.task_type = "";
|
||||
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_PRDRETURN_ID;
|
||||
|
||||
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
|
||||
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
|
||||
{
|
||||
Logger.LogInformation($"【PrdReturn】生成预任务失败 载具 {input.carry_code}");
|
||||
throw new AppFriendlyException($"生成预任务失败 载具 {input.carry_code}", 500);
|
||||
}
|
||||
Logger.LogWarning($"【PrdReturn】生成预任务成功");
|
||||
await _db.Ado.CommitTranAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("【PrdReturn】" + ex.Message);
|
||||
Logger.LogError("【PrdReturn】" + ex.StackTrace);
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
|
||||
}
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
|
||||
public override async Task ModifyAsync(WareHouseUpInput input)
|
||||
{
|
||||
if (input == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(input));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
WmsCarryH wmsCarryH = await _db.Queryable<WmsCarryH>().Where(r => r.id == input.carryIds[0]).FirstAsync();
|
||||
|
||||
List<WmsCarryCode> wmsCarryCodes = null;
|
||||
// 料架到暂存仓
|
||||
if (wmsCarryH.carrystd_id == "26037267399717")
|
||||
{
|
||||
wmsCarryCodes = _db.Queryable<WmsCarryD>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.membercarry_id == b.id)
|
||||
.InnerJoin<WmsCarryCode>((a, b, c) => b.id == c.carry_id)
|
||||
.Where((a, b, c) => a.carry_id == wmsCarryH.id).Select((a, b, c) => c).ToList();
|
||||
}
|
||||
// 载运小车和载运料架到缓存仓
|
||||
else if (wmsCarryH.carrystd_id == "26103233723941" || wmsCarryH.carrystd_id == "34995839046677")
|
||||
{
|
||||
|
||||
wmsCarryCodes = _db.Queryable<WmsCarryH>()
|
||||
.InnerJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
|
||||
.Where((a, b) => a.id == wmsCarryH.id).Select((a, b) => b).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError($"【WmsPrdReturnService ModifyAsync】当前载具的规格id是{wmsCarryH.carrystd_id} 无法处理此类型的载具!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (wmsCarryCodes.Count == 0)
|
||||
{
|
||||
Logger.LogWarning($"【WmsPrdReturnService ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码");
|
||||
return;
|
||||
}
|
||||
|
||||
await _db.Ado.BeginTranAsync();
|
||||
// 更新已转数量
|
||||
List<WmsPrdReturnD> wmsPrdReturnDs = _db.Queryable<WmsPrdReturnD>().Where(r => r.bill_id == input.source_id).ToList();
|
||||
foreach (WmsPrdReturnD wmsPrdReturnD in wmsPrdReturnDs)
|
||||
{
|
||||
decimal qty = wmsCarryCodes.Where(r => r.material_id == wmsPrdReturnD.material_id).Sum(r => r.codeqty);
|
||||
wmsPrdReturnD.ytqty = wmsPrdReturnD.ytqty + qty;
|
||||
}
|
||||
|
||||
|
||||
bool isOk = await _db.Updateable(wmsPrdReturnDs).UpdateColumns(r => r.ytqty).ExecuteCommandAsync() > 0;
|
||||
|
||||
// 如果所有明细已完成 更新主表状态为完成
|
||||
wmsPrdReturnDs = _db.Queryable<WmsPrdReturnD>()
|
||||
.Where(a => a.bill_id == input.source_id && a.ytqty < a.qty).ToList();
|
||||
bool isOk2 = true;
|
||||
if (wmsPrdReturnDs.Count == 0)
|
||||
{
|
||||
isOk2 = await _db.Updateable<WmsPrdReturnH>().SetColumns(it => new WmsPrdReturnH { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID })
|
||||
.Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync();
|
||||
}
|
||||
|
||||
// require_code是任务单
|
||||
//string mo_task_code = input.require_code;
|
||||
|
||||
if (!isOk || !isOk2)
|
||||
{
|
||||
throw Oops.Oh(ErrorCode.COM1001);
|
||||
}
|
||||
await _db.Ado.CommitTranAsync();
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.Message);
|
||||
Logger.LogError("【WmsPrdReturnService ModifyAsync】" + ex.StackTrace);
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user