Files
tnb.server/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs

511 lines
25 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Dynamic;
using Aop.Api.Domain;
using JNPF.Common.Core.Manager;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Security;
using JNPF.FriendlyException;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using Org.BouncyCastle.Asn1;
using Senparc.Weixin.MP.AdvancedAPIs.Card;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
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_WMSCARRYBIND_ID)]
public class WmsCarryBindService : BaseWareHouseService, IWmsCarryBindService
{
private readonly ISqlSugarClient _db;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IUserManager _userManager;
private readonly IBillRullService _billRullService;
public WmsCarryBindService(
ISqlSugarRepository<WmsCarryH> repository,
IRunService runService,
IVisualDevService visualDevService,
IUserManager userManager,
IBillRullService billRullService)
{
_db = repository.AsSugarClient();
_runService = runService;
_visualDevService = visualDevService;
_userManager = userManager;
_billRullService = billRullService;
OverideFuncs.CreateAsync = CarryBind;
}
[NonAction]
public async Task<dynamic> CarryBind(VisualDevModelDataCrInput input)
{
bool isOk = false;
try
{
await _db.Ado.BeginTranAsync();
VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCARRYBIND_ID, true);
await _runService.Create(templateEntity, input);
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
string? carryId = input.data.ContainsKey("carry_id") ? input.data["carry_id"]?.ToString() : "";
string? subCarryId = input.data.ContainsKey("membercarry_id") ? input.data["membercarry_id"]?.ToString() : "";
WmsCarryH? carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == carryId);
WmsCarryH? subCarry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == subCarryId);
if (carry != null && subCarry != null)
{
carry.carry_status = ((int)EnumCarryStatus.).ToString();
int row = await _db.Updateable(carry).ExecuteCommandAsync();
subCarry.carry_status = ((int)EnumCarryStatus.).ToString();
row = await _db.Updateable(subCarry).ExecuteCommandAsync();
//更新载具明细表
WmsCarryD wmsCarryD = new()
{
id = SnowflakeIdHelper.NextId(),
carry_id = carry.id,
org_id = carry?.org_id!,
membercarry_id = subCarry.id,
membercarry_code = subCarry.carry_code,
loc = input.data[nameof(WmsCarrybindH.loc)].ParseToInt(1),
create_id = _userManager.UserId,
create_time = DateTime.Now
};
row = await _db.Insertable(wmsCarryD).ExecuteCommandAsync();
List<WmsCarryCode> items = await _db.Queryable<WmsCarryCode>().Where(it => it.carry_id == subCarryId).ToListAsync();
List<WmsCarrybindCode> wmsCarrybindCodes = new();
//更新载具绑定条码表
for (int i = 0; i < items.Count; i++)
{
WmsCarrybindCode wmsCarrybindCode = new()
{
id = SnowflakeIdHelper.NextId(),
org_id = (subCarry != null && subCarry.org_id != null) ? subCarry.org_id : _userManager.User.OrganizeId,
carrybind_id = input.data["ReturnIdentity"]?.ToString()!,
material_id = items[i].material_id,
material_code = items[i].material_code,
barcode = items[i].barcode,
code_batch = items[i].code_batch,
codeqty = items[i].codeqty,
membercarry_id = subCarry?.id,
membercarry_code = subCarry?.carry_code,
unit_id = items[i].unit_id,
unit_code = items[i].unit_code,
create_id = _userManager.UserId,
create_time = DateTime.Now
};
wmsCarrybindCodes.Add(wmsCarrybindCode);
}
row = await _db.Insertable(wmsCarrybindCodes).ExecuteCommandAsync();
isOk = row > 0;
if (!isOk)
{
throw Oops.Oh(ErrorCode.COM1001);
}
}
else
{
if (carry == null || subCarry == null)
{
throw new AppFriendlyException("没有可用的主载具", 500);
}
}
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
throw;
}
return Task.FromResult(true);
}
[HttpPost]
public async Task<dynamic> GetInfoByCode(string code)
{
var data = await _db.Queryable<WmsTempCode>().Where(p => p.barcode == code).FirstAsync();
if (data == null)
throw new AppFriendlyException("没有条码信息", 500);
var result = data.Adapt<CarryMaterialDetail>();
return result;
}
/// <summary>
/// 仅原材料仓八工位PDA使用
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost]
public async Task CarryMaterialBind(CarryMaterialBindInput input)
{
try
{
WmsCarryH? carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.carry_code == input.carrycode);
if (carry == null)
{
throw new Exception($"托盘{input.carrycode}不存在!");
}
BasLocation carrryLoc = await _db.Queryable<BasLocation>().Where(r => r.id == carry.location_id).FirstAsync();
if (carrryLoc != null && carrryLoc.is_type == "0")
{
throw new Exception($"托盘{carry.carry_code}在存储库位中,不能绑定!");
}
var _WmsCarryCode = _db.Queryable<WmsCarryCode>().Where(it => it.carry_id == carry.id).OrderByDescending(it => it.id).First();
if (_WmsCarryCode != null)
{
throw new Exception($"托盘{input.carrycode}已绑定物料!");
}
var WmsTempCodes = await _db.Queryable<WmsTempCode>().Where(it => input.details.Select(r => r.barcode).Contains(it.barcode)).ToListAsync();
if (WmsTempCodes.DistinctBy(r => r.required_type).Count() != 1)
{
throw new Exception($"不能绑定多个不同类型单据打印的条码!:{string.Join(',', WmsTempCodes.DistinctBy(r => r.required_type).Select(r => r.barcode).ToList())}");
}
var bill_group = WmsTempCodes.GroupBy(r => new { r.require_id, r.required_type });
foreach (var group in bill_group)
{
string required_type = group.Key.required_type;
switch (required_type)
{
case WmsWareHouseConst.BILLTYPE_PURCHASE_ID:
{
decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum();
WmsPurchaseD wmsPurchaseD = await _db.Queryable<WmsPurchaseD>().Where(r => r.id == group.Key.require_id).FirstAsync();
if (wmsPurchaseD == null)
{
throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源采购收货明细不存在!");
}
// 收货质检之后不能绑定
if (!string.IsNullOrEmpty(wmsPurchaseD.qc_res) && wmsPurchaseD.qc_res != "await")
{
WmsPurchaseH wmsPurchaseH = await _db.Queryable<WmsPurchaseH>().Where(r => r.id == wmsPurchaseD.bill_id).FirstAsync();
throw new Exception($"采购收货单{wmsPurchaseH.bill_code}中物料为 {wmsPurchaseD.material_code} 批次为{wmsPurchaseD.code_batch}的明细已进行过收货质检,此明细不能再绑定物料!");
}
decimal? bind_qty = wmsPurchaseD.bind_qty ?? 0;
if (sum + bind_qty > wmsPurchaseD.purchase_arriveqty)
{
throw new Exception($"托盘{input.carrycode} 物料{wmsPurchaseD.material_code} 当前绑定数量为{sum} 剩余可绑定数量为{(wmsPurchaseD.purchase_arriveqty - bind_qty).ParseToFloat()}");
}
wmsPurchaseD.bind_qty = sum + bind_qty;
await _db.Updateable(wmsPurchaseD).ExecuteCommandAsync();
break;
}
case WmsWareHouseConst.BILLTYPE_OUTSOURCE_ID:
{
decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum();
WmsOutsourceD wmsOutsourceD = await _db.Queryable<WmsOutsourceD>().Where(r => r.id == group.Key.require_id).FirstAsync();
if (wmsOutsourceD == null)
{
throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源委外收货明细不存在!");
}
decimal? bind_qty = wmsOutsourceD.bind_qty ?? 0;
if (sum + bind_qty > wmsOutsourceD.outsource_quantity)
{
throw new Exception($"托盘{input.carrycode} 物料{wmsOutsourceD.matcode} 当前绑定数量为{sum} 剩余可绑定数量为{wmsOutsourceD.actual_quantity - bind_qty}");
}
wmsOutsourceD.bind_qty = sum + bind_qty;
await _db.Updateable(wmsOutsourceD).ExecuteCommandAsync();
break;
}
case WmsWareHouseConst.BILLTYPE_RAWMATTRANSFERINSTOCK_ID:
{
decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum();
WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable<WmsRawmatTransferinstockD>().Where(r => r.id == group.Key.require_id).FirstAsync();
if (wmsRawmatTransferinstockD == null)
{
throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源原材料调拨入库明细不存在!");
}
decimal? bind_qty = wmsRawmatTransferinstockD.bind_qty ?? 0;
if (sum + bind_qty > wmsRawmatTransferinstockD.qty)
{
throw new Exception($"托盘{input.carrycode} 物料{wmsRawmatTransferinstockD.matcode} 当前绑定数量为{sum} 剩余可绑定数量为{wmsRawmatTransferinstockD.actual_qty - bind_qty}");
}
wmsRawmatTransferinstockD.bind_qty = sum + bind_qty;
await _db.Updateable(wmsRawmatTransferinstockD).ExecuteCommandAsync();
break;
}
}
}
WmsCarrybindH wmsCarrybindH = new WmsCarrybindH();
wmsCarrybindH.carry_id = carry.id;
wmsCarrybindH.carry_code = carry.carry_code;
wmsCarrybindH.create_id = input.create_id;
wmsCarrybindH.create_time = DateTime.Now;
wmsCarrybindH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsCarrybindH.location_id = WmsWareHouseConst.LOCATION_YCLBGWDRK;
wmsCarrybindH.location_code = "YCLBGWDRK";
List<WmsCarryCode> WmsCarryCodes = new List<WmsCarryCode>();
List<WmsCarrybindCode> wmsCarrybindCodes = new List<WmsCarrybindCode>();
List<WmsTempCode> wmsTempCodes = await _db.Queryable<WmsTempCode>().Where(r => input.details.Select(c => c.barcode).Contains(r.barcode)).ToListAsync();
foreach (var detail in input.details)
{
var WmsCarryCode = detail.Adapt<WmsCarryCode>();
WmsCarryCode.id = SnowflakeIdHelper.NextId();
WmsCarryCode.carry_id = carry.id;
WmsCarryCode.is_out = 0;
WmsCarryCode.codeqty = detail.codeqty;
WmsCarryCode.create_id = input.create_id;
WmsCarryCode.create_time = DateTime.Now;
WmsCarryCodes.Add(WmsCarryCode);
WmsTempCode wmsTempCode = wmsTempCodes.Where(r => r.barcode == detail.barcode).First();
if (wmsTempCode == null)
{
throw new Exception($"条码{wmsTempCode.barcode}在系统中不存在");
}
wmsTempCode.codeqty = detail.codeqty;
var wmsCarrybindCode = detail.Adapt<WmsCarrybindCode>();
wmsCarrybindCode.carrybind_id = wmsCarrybindH.id;
wmsCarrybindCodes.Add(wmsCarrybindCode);
}
int rows = 0;
if (WmsCarryCodes.Count > 0)
{
rows = await _db.Insertable(WmsCarryCodes).ExecuteCommandAsync();
await _db.Insertable(wmsCarrybindH).ExecuteCommandAsync();
await _db.Insertable(wmsCarrybindCodes).ExecuteCommandAsync();
await _db.Updateable(wmsTempCodes).ExecuteCommandAsync();
}
await _db.Updateable<WmsCarryH>().SetColumns(r => new WmsCarryH
{
location_id = WmsWareHouseConst.LOCATION_YCLBGWDRK,
location_code = "YCLBGWDRK",
carry_status = "1"
}).Where(r => r.id == carry.id).ExecuteCommandAsync();
if (rows == 0)
{
throw new Exception($"物料列表为空,不能提交绑定,可能的原因;1.需要检查扫码设置(新PDA) 2.未扫到有效的二维码 详细信息:接收到{input.details.Count}个条码 成功绑定的条码数量为0个");
}
}
catch (PostgresException ex)
{
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"绑定失败(1.可能是存在已被绑定的条码 2.系统中存在其他与此托盘编号相同的托盘 3.存在字段传了空值) {ex.Message}", 500);
}
catch (Exception ex)
{
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"绑定失败 {ex.Message}", 500);
}
}
[NonAction]
public async Task CarryMaterialBind(CarryMaterialBindInput input, ISqlSugarClient dbConn = null)
{
var db = _db;
if (dbConn != null)
db = dbConn;
try
{
WmsCarryH? carry = await db.Queryable<WmsCarryH>().SingleAsync(it => it.carry_code == input.carrycode);
if (carry == null)
{
throw new Exception($"托盘{carry.carry_code}不存在!");
}
List<WmsCarryCode> repeat_wmsCarryCodes = await db.Queryable<WmsCarryCode>().Where(r => input.details.Select(x=>x.barcode).Contains(r.barcode)).ToListAsync();
if (repeat_wmsCarryCodes.Count > 0)
{
throw new Exception($"以下条码已被绑定:{string.Join(',', repeat_wmsCarryCodes.Select(r => r.barcode))}");
}
List<WmsCarryCode> WmsCarryCodes = new List<WmsCarryCode>();
WmsCarrybindH wmsCarrybindH = new WmsCarrybindH();
wmsCarrybindH.carry_id = carry.id;
wmsCarrybindH.carry_code = carry.carry_code;
wmsCarrybindH.create_id = input.create_id;
wmsCarrybindH.create_time = DateTime.Now;
wmsCarrybindH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsCarrybindH.location_id = carry.location_id;
wmsCarrybindH.location_code = carry.location_code;
List<WmsCarrybindCode> wmsCarrybindCodes = new List<WmsCarrybindCode>();
foreach (var detail in input.details)
{
var WmsCarryCode = detail.Adapt<WmsCarryCode>();
WmsCarryCode.id = SnowflakeIdHelper.NextId();
WmsCarryCode.carry_id = carry.id;
WmsCarryCode.is_out = 0;
WmsCarryCode.create_id = input.create_id;
WmsCarryCode.create_time = DateTime.Now;
WmsCarryCodes.Add(WmsCarryCode);
var wmsCarrybindCode = detail.Adapt<WmsCarrybindCode>();
wmsCarrybindCode.carrybind_id = wmsCarrybindH.id;
wmsCarrybindCodes.Add(wmsCarrybindCode);
}
int rows = 0;
if (WmsCarryCodes.Count > 0)
{
rows = await db.Insertable(WmsCarryCodes).ExecuteCommandAsync();
await _db.Insertable(wmsCarrybindH).ExecuteCommandAsync();
await _db.Insertable(wmsCarrybindCodes).ExecuteCommandAsync();
}
if (rows == 0)
{
throw new Exception($"物料列表为空,不能提交绑定,可能的原因;1.需要检查扫码设置(新PDA) 2.未扫到有效的二维码 详细信息:接收到{input.details.Count}个条码 成功绑定的条码数量为0个");
}
}
catch (PostgresException ex)
{
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"绑定失败(1.可能是存在已被绑定的条码 2.存在其他与此载具编号相同的载具 3.存在字段传了空值) {ex.Message}", 500);
}
catch (Exception ex)
{
Logger.LogError(ex.Message);
Logger.LogError(ex.StackTrace);
throw new AppFriendlyException($"绑定失败 {ex.Message}", 500);
}
}
/// <summary>
/// 绑定料箱到料架
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="AppFriendlyException"></exception>
[NonAction]
public async Task<Entities.Dto.Outputs.Result> CarryBind(CarryBindInput input, ISqlSugarClient dbConn = null)
{
bool isOk = false;
var db = _db;
if (dbConn != null)
db = dbConn;
try
{
if (input == null)
{
throw new ArgumentNullException(nameof(input));
}
await db.Ado.BeginTranAsync();
WmsCarryH? carry = await db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.carry_id);
WmsCarryH? subCarry = await db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.membercarry_id);
if (carry != null && subCarry != null)
{
// 插入子载具绑定记录
WmsCarrybindH wmsCarrybindH = new WmsCarrybindH();
wmsCarrybindH.carry_id = carry.id;
wmsCarrybindH.carry_code = carry.carry_code;
wmsCarrybindH.membercarry_id = input.membercarry_id;
wmsCarrybindH.membercarry_code = input.membercarry_code;
wmsCarrybindH.create_id = input.create_id;
wmsCarrybindH.create_time = DateTime.Now;
wmsCarrybindH.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsCarrybindH.location_id = carry.location_id;
wmsCarrybindH.location_code = carry.location_code;
List<WmsCarrybindCode> wmsCarrybindCodes = new List<WmsCarrybindCode>();
List<WmsCarryCode> WmsCarryCodes = db.Queryable<WmsCarryCode>().Where(r => r.carry_id == input.membercarry_id).ToList();
foreach (var detail in WmsCarryCodes)
{
var wmsCarrybindCode = detail.Adapt<WmsCarrybindCode>();
wmsCarrybindCode.id = SnowflakeIdHelper.NextId();
wmsCarrybindCode.membercarry_id = input.membercarry_id;
wmsCarrybindCode.membercarry_code = input.membercarry_code;
wmsCarrybindCode.carrybind_id = wmsCarrybindH.id;
wmsCarrybindCode.org_id = WmsWareHouseConst.AdministratorOrgId;
wmsCarrybindCodes.Add(wmsCarrybindCode);
}
await db.Insertable(wmsCarrybindH).ExecuteCommandAsync();
await db.Insertable(wmsCarrybindCodes).ExecuteCommandAsync();
WmsCarryD wmsCarryD = new()
{
carry_id = input.carry_id,
membercarry_id = input.membercarry_id,
membercarry_code = input.membercarry_code,
loc = 1,
create_time = DateTime.Now
};
int row = await db.Insertable(wmsCarryD).ExecuteCommandAsync();
isOk = row > 0;
if (!isOk)
{
throw Oops.Oh(ErrorCode.COM1001);
}
await db.Ado.CommitTranAsync();
Logger.LogInformation($"【CarryBind】 {input.membercarry_code}成功绑定到{input.carry_code}");
}
else
{
if (carry == null || subCarry == null)
{
throw new AppFriendlyException("没有可用的主载具", 500);
}
}
}
catch (Exception ex)
{
Logger.LogError($"【CarryBind】 {ex.Message}");
Logger.LogError($"【CarryBind】 {ex.StackTrace}");
await db.Ado.RollbackTranAsync();
return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message);
}
return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功");
}
/* public override async Task ModifyAsync(WareHouseUpInput input)
{
if (input == null) throw new ArgumentNullException(nameof(input));
var isOk = await _db.Updateable<WmsCarryReplaceH>().SetColumns(it => new WmsCarryReplaceH { status = input.bizTypeId }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync();
if (!isOk) throw Oops.Oh(ErrorCode.COM1001);
}*/
}
}