Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2024-07-26 11:57:06 +08:00
14 changed files with 478 additions and 68 deletions

View File

@@ -664,7 +664,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
foreach (WmsCarryH wmsCarryH in items)
{
BasLocation startlocation = await db_YCLInternalTransfer.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, passage = startlocation.passage, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_Purchase_ID };
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, passage = startlocation.passage, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_Purchase_ID, PolicyCode = WmsWareHouseConst.POLICY_YCLINSTOCK };
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
if (endLocations.Count() == 0)

View File

@@ -537,5 +537,15 @@
/// 原材料八工位待入库
/// </summary>
public const string LOCATION_YCLBGWDRK = "35750287617301";
/// <summary>
/// 原材料仓内转移策略
/// </summary>
public const string POLICY_YCLINSTOCK = "WISP202407250001";
/// <summary>
/// 原材料仓先进先出
/// </summary>
public const string POLICY_YCLOUTSTOCK = "WOSP202407250001";
}
}

View File

@@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
{
public class OutsourceOrderInput
{
/// <summary>
/// 单号
/// </summary>
public string? outsource_order { get; set; }
/// <summary>
/// 联系人
/// </summary>
public string? contact_person { get; set; }
/// <summary>
/// 电话
/// </summary>
public string? tel { get; set; }
/// <summary>
/// 供应商编号
/// </summary>
public string? supplier_code { get; set; }
/// <summary>
/// 凭证日期
/// </summary>
public DateTime? certificate_date { get; set; }
/// <summary>
/// 供货日期
/// </summary>
public DateTime? ship_date { get; set; }
/// <summary>
/// 主表pk
/// </summary>
public string? erp_pk { get; set; }
public List<OutsourceOrderDetail> details { get; set; }
}
public class OutsourceOrderDetail
{
/// <summary>
/// 行号
/// </summary>
public string? lineno { get; set; }
/// <summary>
/// 物品代码
/// </summary>
public string? material_code { get; set; }
/// <summary>
/// 单位代码
/// </summary>
public string? unit_code { get; set; }
/// <summary>
/// 委外数量
/// </summary>
public decimal? outsource_quantity { get; set; }
/// <summary>
/// 库存地点编号
/// </summary>
public string? stock_location { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 交货日期
/// </summary>
public DateTime? delivery_date { get; set; }
/// <summary>
/// 子表主键
/// </summary>
public string erp_line_pk { get; set; }
}
}

View File

@@ -31,5 +31,8 @@
// 巷道
public string passage { get; set; }
// 策略编号
public string PolicyCode { get; set; }
}
}

View File

@@ -49,5 +49,8 @@
// 是否过滤载具占用状态
public bool filter_carry_status { get; set; } = true;
// 策略编号
public string PolicyCode { get; set; }
}
}

View File

@@ -0,0 +1,122 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 委外订单表子表
/// </summary>
[SugarTable("wms_outsource_order_d")]
public partial class WmsOutsourceOrderD : BaseEntity<string>
{
public WmsOutsourceOrderD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 主表id
/// </summary>
public string? fk_wms_outsource_order_id { get; set; }
/// <summary>
/// 物料id
/// </summary>
public string? matcode_id { get; set; }
/// <summary>
/// 物料编号
/// </summary>
public string? matcode { get; set; }
/// <summary>
/// 物料描述
/// </summary>
public string? matspecification { get; set; }
/// <summary>
/// 单位
/// </summary>
public string? unit { get; set; }
/// <summary>
/// 采购数量
/// </summary>
public decimal? outsource_quantity { get; set; }
/// <summary>
/// 实收数量
/// </summary>
public decimal? actual_quantity { get; set; }
/// <summary>
/// 库存地点ID
/// </summary>
public string? stock_location_id { get; set; }
/// <summary>
/// 库存地点
/// </summary>
public string? stock_location { get; set; }
/// <summary>
/// 批次
/// </summary>
public string? code_batch { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 交货日期
/// </summary>
public string? delivery_date { get; set; }
/// <summary>
/// 净价
/// </summary>
public string? net_price { get; set; }
/// <summary>
/// 货币
/// </summary>
public string? currency { get; set; }
/// <summary>
/// 工厂
/// </summary>
public string? factory { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// erp_line_pk
/// </summary>
public string? erp_line_pk { get; set; }
}

View File

@@ -0,0 +1,122 @@
using JNPF.Common.Contracts;
using JNPF.Common.Security;
using SqlSugar;
namespace Tnb.WarehouseMgr.Entities.Entity;
/// <summary>
/// 委外订单
/// </summary>
[SugarTable("wms_outsource_order_h")]
public partial class WmsOutsourceOrderH : BaseEntity<string>
{
public WmsOutsourceOrderH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 采购订单号
/// </summary>
public string? outsource_order { get; set; }
/// <summary>
/// 联系人
/// </summary>
public string? contact_person { get; set; }
/// <summary>
/// 电话
/// </summary>
public string? tel { get; set; }
/// <summary>
/// 供应商ID
/// </summary>
public string? supplier_id { get; set; }
/// <summary>
/// 供应商编号
/// </summary>
public string? supplier_code { get; set; }
/// <summary>
/// 供应商名称
/// </summary>
public string? supplier_name { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? remark { get; set; }
/// <summary>
/// 扩展字段
/// </summary>
public string? extras { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public string? time_stamp { get; set; }
/// <summary>
/// 单据类型
/// </summary>
public string? document_type { get; set; }
/// <summary>
/// 凭证日期
/// </summary>
public string? certificate_date { get; set; }
/// <summary>
/// 创建用户
/// </summary>
public string? create_id { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 修改用户
/// </summary>
public string? modify_id { get; set; }
/// <summary>
/// 修改时间
/// </summary>
public DateTime? modify_time { get; set; }
/// <summary>
/// 所属组织
/// </summary>
public string? org_id { get; set; }
/// <summary>
/// 流程任务Id
/// </summary>
public string? f_flowtaskid { get; set; }
/// <summary>
/// 流程引擎Id
/// </summary>
public string? f_flowid { get; set; }
/// <summary>
/// erp_pk
/// </summary>
public string? erp_pk { get; set; }
/// <summary>
/// erp_bill_code
/// </summary>
public string? erp_bill_code { get; set; }
/// <summary>
/// 供货日期
/// </summary>
public DateTime? ship_date { get; set; }
}

View File

@@ -42,12 +42,12 @@ public partial class WmsPurchaseOrderD : BaseEntity<string>
/// <summary>
/// 采购数量
/// </summary>
public string? purchase_quantity { get; set; }
public decimal? purchase_quantity { get; set; }
/// <summary>
/// 实收数量
/// </summary>
public string? actual_quantity { get; set; }
public decimal? actual_quantity { get; set; }
/// <summary>
/// 库存地点ID

View File

@@ -40,13 +40,6 @@ namespace Tnb.WarehouseMgr.Interfaces
/// <returns></returns>
Task<List<WmsCarryH>> OutStockStrategy([FromQuery] OutStockStrategyQuery input);
/// <summary>
/// 原材料仓出库策略
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
Task<List<WmsCarryH>> OutStockStrategyYCL([FromQuery] OutStockStrategyQuery input);
/// <summary>
/// 缓存仓出库策略
/// </summary>
/// <param name="input"></param>

View File

@@ -344,7 +344,7 @@ namespace Tnb.WarehouseMgr
{
Logger.Error($"【UnloadConfirm】 根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
}
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
if (elevator != null && s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
{
if (!TimedTaskBackgroundService.elevatorStatus[elevatorCode.ToString()])
{

View File

@@ -362,14 +362,14 @@ namespace Tnb.WarehouseMgr
wmsPurchaseOrderD.fk_wms_purchase_order_id = wmsPurchaseOrderH.id;
wmsPurchaseOrderD.matcode = detail.material_code;
wmsPurchaseOrderD.unit = detail.unit_code;
wmsPurchaseOrderD.purchase_quantity = detail.purchase_quantity.ToString();
wmsPurchaseOrderD.purchase_quantity = detail.purchase_quantity;
wmsPurchaseOrderD.stock_location = detail.stock_location;
wmsPurchaseOrderD.code_batch = detail.code_batch;
wmsPurchaseOrderD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss");
wmsPurchaseOrderD.erp_line_pk = detail.erp_line_pk;
wmsPurchaseOrderD.create_id = WmsWareHouseConst.ErpUserId;
wmsPurchaseOrderD.create_time = DateTime.Now;
wmsPurchaseOrderD.actual_quantity = "0";
wmsPurchaseOrderD.actual_quantity = 0;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
@@ -401,6 +401,112 @@ namespace Tnb.WarehouseMgr
}
}
/// <summary>
/// 委外订单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> OutsourceOrder(OutsourceOrderInput input)
{
LoggerErp2Mes.LogInformation($"【OutsourceOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}");
var db = _repository.AsSugarClient();
if (string.IsNullOrEmpty(input.erp_pk))
{
_LoggerErp2Mes.LogWarning($"【OutsourceOrderInput】主表主键不能为空");
return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!");
}
int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count();
if (count_erp_line_pk > 0)
{
_LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】子表主键不能为空");
throw new AppFriendlyException($@"子表主键不能为空!", 500);
}
var wmsPurchaseOrdersDistinct = input.details.Select(r => new
{
material_id = r.material_code,
code_batch = r.code_batch,
}).Distinct();
if (wmsPurchaseOrdersDistinct.Count() < input.details.Count)
{
_LoggerErp2Mes.LogWarning($@"【OutsourceOrderInput】表体存在物料和批号重复的明细");
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
}
try
{
await db.Ado.BeginTranAsync();
WmsOutsourceOrderH wmsOutsourceOrderH = new WmsOutsourceOrderH();
string Code = await _billRuleService.GetBillNumber("Purchase");
wmsOutsourceOrderH.outsource_order = Code;
wmsOutsourceOrderH.erp_bill_code = input.outsource_order;
wmsOutsourceOrderH.contact_person = input.contact_person;
wmsOutsourceOrderH.tel = input.tel;
wmsOutsourceOrderH.supplier_code = input.supplier_code;
wmsOutsourceOrderH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss");
wmsOutsourceOrderH.ship_date = input.ship_date;
wmsOutsourceOrderH.erp_pk = input.erp_pk;
wmsOutsourceOrderH.create_id = WmsWareHouseConst.ErpUserId;
wmsOutsourceOrderH.create_time = DateTime.Now;
var supplier = await db.Queryable<BasSupplier>().Where(p => p.supplier_code == input.supplier_code).FirstAsync();
if (supplier != null)
{
wmsOutsourceOrderH.supplier_id = supplier.id;
wmsOutsourceOrderH.supplier_name = supplier.supplier_name;
}
await db.Insertable(wmsOutsourceOrderH).ExecuteCommandAsync();
List<WmsOutsourceOrderD> wmsOutsourceOrderDs = new List<WmsOutsourceOrderD>();
foreach (var detail in input.details)
{
WmsOutsourceOrderD wmsOutsourceOrderD = new WmsOutsourceOrderD();
wmsOutsourceOrderD.fk_wms_outsource_order_id = wmsOutsourceOrderH.id;
wmsOutsourceOrderD.matcode = detail.material_code;
wmsOutsourceOrderD.unit = detail.unit_code;
wmsOutsourceOrderD.outsource_quantity = detail.outsource_quantity;
wmsOutsourceOrderD.stock_location = detail.stock_location;
wmsOutsourceOrderD.code_batch = detail.code_batch;
wmsOutsourceOrderD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss");
wmsOutsourceOrderD.erp_line_pk = detail.erp_line_pk;
wmsOutsourceOrderD.create_id = WmsWareHouseConst.ErpUserId;
wmsOutsourceOrderD.create_time = DateTime.Now;
wmsOutsourceOrderD.actual_quantity = 0;
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsOutsourceOrderD.matcode_id = material.id;
wmsOutsourceOrderD.matspecification = material.material_specification;
}
wmsOutsourceOrderDs.Add(wmsOutsourceOrderD);
}
await db.Insertable(wmsOutsourceOrderDs).ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【OutsourceOrderInput】成功生成单据:{Code}");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
catch (Exception ex)
{
LoggerErp2Mes.LogError($"【OutsourceOrderInput】{ex.Message}");
LoggerErp2Mes.LogError($"【OutsourceOrderInput】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
}
}
/// <summary>
/// 转库单
/// </summary>

View File

@@ -216,7 +216,8 @@ namespace Tnb.WarehouseMgr
try
{
var db = _db.CopyNew();
WmsInstockPolicies policy = await db.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
WmsInstockPolicies policy = await db.Queryable<WmsInstockPolicies>().Where(it => it.status == 1 && (string.IsNullOrEmpty(input.PolicyCode)||
it.bill_code == input.PolicyCode)).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用的策略", 500);
@@ -466,7 +467,8 @@ namespace Tnb.WarehouseMgr
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> whereExpr = whereExprable.ToExpression();
WmsInstockPolicies policy = await cyDb.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
WmsOutstockPolicies policy = await cyDb.Queryable<WmsOutstockPolicies>().Where(it => it.status == 1 && (string.IsNullOrEmpty(input.PolicyCode) ||
it.bill_code == input.PolicyCode)).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用策略", 500);
@@ -484,51 +486,6 @@ namespace Tnb.WarehouseMgr
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}
/// <summary>
/// 原材料仓出库策略
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
public async Task<List<WmsCarryH>> OutStockStrategyYCL([FromQuery] OutStockStrategyQuery input)
{
Expressionable<WmsCarryH, WmsCarryCode, BasLocation> whereExprable = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
.And((a, b, c) => a.is_lock == 0 && c.is_lock == 0)
.And((a, b, c) => !string.IsNullOrEmpty(a.location_id))
.And((a, b, c) => c.is_type == ((int)EnumLocationType.).ToString())
.And((a, b, c) => a.out_status == "0")
.And((a, b, c) => c.wh_id == input.warehouse_id)
.AndIF(!string.IsNullOrEmpty(input.material_id), (a, b, c) => b.material_id == input.material_id)
.AndIF(!string.IsNullOrEmpty(input.code_batch), (a, b, c) => b.code_batch == input.code_batch)
.AndIF(!string.IsNullOrEmpty(input.material_specification), (a, b, c) => b.material_specification == input.material_specification)
.AndIF(!string.IsNullOrEmpty(input.container_no), (a, b, c) => b.container_no == input.container_no)
.AndIF(!string.IsNullOrEmpty(input.carrystd_id), (a, b, c) => a.carrystd_id == input.carrystd_id);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> carryStatusFilterExp = !input.material_id.IsNullOrWhiteSpace()
? (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString()
: (a, b, c) => a.carry_status == ((int)EnumCarryStatus.).ToString();
_ = whereExprable.And(carryStatusFilterExp);
Expression<Func<WmsCarryH, WmsCarryCode, BasLocation, bool>> whereExpr = whereExprable.ToExpression();
SqlSugarClient cyDb = _db.CopyNew();
WmsInstockPolicies policy = await cyDb.Queryable<WmsInstockPolicies>().Where(it => it.status == 1).FirstAsync();
if (policy == null)
{
throw new AppFriendlyException("没有可用策略", 500);
}
List<WmsCarryH> items = await cyDb.Queryable<WmsCarryH>().LeftJoin<WmsCarryCode>((a, b) => a.id == b.carry_id)
.LeftJoin<BasLocation>((a, b, c) => a.location_id == c.id)
.Where(whereExpr)
//.OrderByIF((a,b,c)=>SqlFunc.IsNullOrEmpty())
.OrderBy(policy.policy)
.Select<WmsCarryH>()
.ToListAsync();
items = items.DistinctBy(r => r.id).ToList();
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}
/// <summary>
/// 缓存仓出库策略
/// </summary>

View File

@@ -219,15 +219,18 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException("批号不可为空", 500);
}
//入库取终点 //出库起点
OutStockStrategyQuery inStockStrategyInput = new()
OutStockStrategyQuery outStockStrategyInput = new()
{
warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID,
material_id = input.material_id,
code_batch = input.code_batch,
Size = input.palletCount
Size = input.palletCount,
Region_id = WmsWareHouseConst.REGION_Purchase_ID,
PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK,
AvoidBusyPassage = true
};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput);
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
decimal qty = _db.Queryable<WmsCarryCode>().Where(r => items.Select(a => a.id).Contains(r.carry_id) && r.material_id == input.material_id && r.code_batch == input.code_batch).Sum(r => r.codeqty);
@@ -332,9 +335,10 @@ namespace Tnb.WarehouseMgr
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
OutStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, code_batch = input.code_batch, Size = input.palletCount };
List<WmsCarryH> items = await _wareHouseService.OutStockStrategyYCL(inStockStrategyInput);
OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id,
code_batch = input.code_batch, Size = input.palletCount,Region_id = WmsWareHouseConst.REGION_Purchase_ID,PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK,
AvoidBusyPassage = true};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
if (items.Count == 0)
{

View File

@@ -101,7 +101,7 @@ namespace Tnb.WarehouseMgr
{
warehouse_id = WmsWareHouseConst.WAREHOUSE_BCK_ID
};
List<WmsCarryH> carrys = await _wareHouseService.OutStockStrategyYCL(outStockStrategyInput);
List<WmsCarryH> carrys = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
if (carrys.Count == 0)
{
throw new Exception("【WmsPackOutstockService-Distribute】四楼包材库没有可用的托盘");