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

This commit is contained in:
2024-07-16 09:21:25 +08:00
11 changed files with 822 additions and 27 deletions

View File

@@ -53,6 +53,7 @@
/// 四楼灭菌仓
/// </summary>
public const string WAREHOUSE_MJC_ID = "35412482304021";
/// <summary>
/// 二楼包材区
/// </summary>

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 PurchaseOrderInput
{
/// <summary>
/// 单号
/// </summary>
public string? purchase_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<PurchaseOrderDetail> details { get; set; }
}
public class PurchaseOrderDetail
{
/// <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? purchase_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

@@ -108,4 +108,9 @@ public partial class WmsPurchaseD : BaseEntity<string>
/// </summary>
[SugarColumn(IsIgnore = true)]
public string? container_no { get; set; }
/// <summary>
///
/// </summary>
public string? erp_line_pk { get; set; }
}

View File

@@ -145,4 +145,15 @@ public partial class WmsPurchaseH : BaseEntity<string>, IPurchaseAndSaleAuitEnti
/// </summary>
public int? audit_status { get; set; }
/// <summary>
///
/// </summary>
public string? erp_pk { get; set; }
/// <summary>
/// erp采购订单号
/// </summary>
public string? erp_bill_code { 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_purchase_order_d")]
public partial class WmsPurchaseOrderD : BaseEntity<string>
{
public WmsPurchaseOrderD()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 主表id
/// </summary>
public string? fk_wms_purchase_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 string? purchase_quantity { get; set; }
/// <summary>
/// 实收数量
/// </summary>
public string? 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_purchase_order_h")]
public partial class WmsPurchaseOrderH : BaseEntity<string>
{
public WmsPurchaseOrderH()
{
id = SnowflakeIdHelper.NextId();
}
/// <summary>
/// 采购订单号
/// </summary>
public string? purchase_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

@@ -1,4 +1,5 @@
using System.Text;
using Aop.Api.Domain;
using JNPF.Common.Enums;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
@@ -9,6 +10,7 @@ using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using SqlSugar;
using Tnb.BasicData.Entities;
using Tnb.WarehouseMgr.Entities;
@@ -290,11 +292,118 @@ namespace Tnb.WarehouseMgr
await db.Insertable(WmsInstockDs).ExecuteCommandAsync();
}
/// <summary>
/// 采购订单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> PurchaseOrder(PurchaseOrderInput input)
{
LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}");
var db = _repository.AsSugarClient();
if (string.IsNullOrEmpty(input.erp_pk))
{
_LoggerErp2Mes.LogWarning($"【PurchaseOrderInput】主表主键不能为空");
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($@"【PurchaseOrderInput】子表主键不能为空");
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($@"【PurchaseOrderInput】表体存在物料和批号重复的明细");
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
}
try
{
await db.Ado.BeginTranAsync();
WmsPurchaseOrderH wmsPurchaseOrderH = new WmsPurchaseOrderH();
string Code = await _billRuleService.GetBillNumber("Purchase");
wmsPurchaseOrderH.purchase_order = Code;
wmsPurchaseOrderH.erp_bill_code = input.purchase_order;
wmsPurchaseOrderH.contact_person = input.contact_person;
wmsPurchaseOrderH.tel = input.tel;
wmsPurchaseOrderH.supplier_code = input.supplier_code;
wmsPurchaseOrderH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss");
wmsPurchaseOrderH.ship_date = input.ship_date;
wmsPurchaseOrderH.erp_pk = input.erp_pk;
wmsPurchaseOrderH.create_id = WmsWareHouseConst.ErpUserId;
wmsPurchaseOrderH.create_time = DateTime.Now;
var supplier = await db.Queryable<BasSupplier>().Where(p => p.supplier_code == input.supplier_code).FirstAsync();
if (supplier != null)
{
wmsPurchaseOrderH.supplier_id = supplier.id;
wmsPurchaseOrderH.supplier_name = supplier.supplier_name;
}
await db.Insertable(wmsPurchaseOrderH).ExecuteCommandAsync();
List<WmsPurchaseOrderD> wmsPurchaseOrderDs = new List<WmsPurchaseOrderD>();
foreach (var detail in input.details)
{
WmsPurchaseOrderD wmsPurchaseOrderD = new WmsPurchaseOrderD();
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.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";
var material = await db.Queryable<BasMaterial>().Where(p => p.code == detail.material_code).FirstAsync();
if (material != null)
{
wmsPurchaseOrderD.matcode_id = material.id;
wmsPurchaseOrderD.matspecification = material.material_specification;
}
wmsPurchaseOrderDs.Add(wmsPurchaseOrderD);
}
await db.Insertable(wmsPurchaseOrderDs).ExecuteCommandAsync();
await db.Ado.CommitTranAsync();
LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}");
return await ToApiResult(HttpStatusCode.OK, "成功");
}
catch (Exception ex)
{
LoggerErp2Mes.LogError($"【PurchaseOrderInput】{ex.Message}");
LoggerErp2Mes.LogError($"【PurchaseOrderInput】{ex.StackTrace}");
await db.Ado.RollbackTranAsync();
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
}
}
/// <summary>
/// 转库单
/// </summary>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Result> MaterialTransfer(MaterialTransferInput input)
public async Task<Entities.Dto.Outputs.Result> MaterialTransfer(MaterialTransferInput input)
{
LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(input)}");
var db = _repository.AsSugarClient();
@@ -442,9 +551,9 @@ namespace Tnb.WarehouseMgr
}
}
protected Task<Result> ToApiResult(HttpStatusCode statusCode, string msg)
protected Task<Entities.Dto.Outputs.Result> ToApiResult(HttpStatusCode statusCode, string msg)
{
Result result = new()
Entities.Dto.Outputs.Result result = new()
{
code = statusCode,
msg = msg

View File

@@ -654,13 +654,13 @@ namespace Tnb.WarehouseMgr
public async Task<bool> Check(string code, string action)
{
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action}");
Logger.Information($"【Check】 判断KIVA是否可以{action} {code}");
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
Dictionary<string, string[]> getdic = new Dictionary<string, string[]>();
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "AllowCtuFullOut_CS02", });
getdic.Add("ZSSSXCTU01", new string[] { "YTCS", "AllowAgvEmptyOut_CS01" });
getdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowAgvEmptyOut_CS03" });
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "左输送线下层允许入箱4", });
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线下层允许入箱2", });
getdic.Add("ZSSSXCTU01", new string[] { "YTCS", "输送线上层允许出箱1" });
getdic.Add("ZSSSXCTU02", new string[] { "YTCS", "输送线上层允许出箱3" });
#region
putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2允许入空箱", });
@@ -754,18 +754,18 @@ namespace Tnb.WarehouseMgr
strs = getdic.Where(p => p.Key == code).First().Value;
bool flag = await _redisData.HashExists(strs[0], strs[1]);
Logger.Information($"【Check】{action} 判断CTU是否可以取货1 获取{code}的标签{strs[1]}是否存在 结果为:{flag} ");
Logger.Information($"【Check】{action} 判断KIVA是否可以取货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} ");
if (!flag)
{
throw new Exception($"【Check】{action} 判断CTU是否可以取货1 获取{code}的标签{strs[1]}是否存在 结果为:{flag} ");
throw new Exception($"【Check】{action} 判断KIVA是否可以取货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} ");
}
string data = _redisData.GetHash(strs[0], strs[1]).Result;
JObject? res = JsonConvert.DeserializeObject<JObject>(data);
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
Logger.Information($"【Check】{action} 判断CTU是否可以取货2 获取{code}的标签{strs[1]}信号值 结果为:{result} ");
Logger.Information($"【Check】{action} 判断KIVA是否可以取货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result} ");
if (!result)
{
throw new Exception($"【Check】{action} 判断CTU是否可以取货2 获取{code}的标签{strs[1]}信号值 结果为:{result} ");
throw new Exception($"【Check】{action} 判断KIVA是否可以取货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result} ");
}
return true;
}
@@ -776,18 +776,18 @@ namespace Tnb.WarehouseMgr
strs = putdic.Where(p => p.Key == code).First().Value;
bool flag = await _redisData.HashExists(strs[0], strs[1]);
Logger.Information($"【Check】 判断CTU是否可以取货1 {code} {action} flag:{flag} ");
Logger.Information($"【Check】 判断CTU是否可以放货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} ");
if (!flag)
{
throw new Exception($"【Check】 判断CTU是否可以取货1 {code} {action} flag:{flag} ");
throw new Exception($"【Check】 判断CTU是否可以放货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} ");
}
string data = _redisData.GetHash(strs[0], strs[1]).Result;
JObject? res = JsonConvert.DeserializeObject<JObject>(data);
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
Logger.Information($"【Check】 判断CTU是否可以取货2 {code} {action} result:{result} ");
Logger.Information($"【Check】 判断CTU是否可以放货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result}");
if (!result)
{
throw new Exception($"【Check】 判断CTU是否可以取货2 {code} {action} result:{result} ");
throw new Exception($"【Check】 判断CTU是否可以放货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result} ");
}
return true;
}

View File

@@ -69,10 +69,10 @@ namespace Tnb.WarehouseMgr
{
throw new Exception($"载具{wmsCarryH.carry_code}已锁定");
}
if (wmsCarryH.carry_status == "1")
{
throw new Exception($"载具{wmsCarryH.carry_code}已占用");
}
//if (wmsCarryH.carry_status == "1")
//{
// throw new Exception($"载具{wmsCarryH.carry_code}已占用");
//}
if (basLocation.is_lock == 1)
{

View File

@@ -176,6 +176,16 @@ namespace Tnb.WarehouseMgr
List<Tuple<string, WmsCarryH, WmsCarryCode, BasLocation>> items_pretask = items.Where(r => r.Item1 == "预任务").ToList();
Logger.LogInformation($"【Distribute】 预计生成{items_pretask.Count}条预任务");
List<BasLocation> endLocations = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").ToListAsync();
if (endLocations.Count < items_pretask.Count)
{
throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500);
}
// 预任务逻辑
foreach (Tuple<string, WmsCarryH, WmsCarryCode, BasLocation> item in items_pretask)
{