From 9c8d50022cd60b6c553c472eeb76eddf312e6a45 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Fri, 19 Jul 2024 15:11:53 +0800
Subject: [PATCH 1/2] =?UTF-8?q?8=E7=BA=BF=E5=85=A5=E4=B8=AD=E5=82=A8?=
=?UTF-8?q?=E4=BB=93=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Consts/WmsWareHouseConst.cs | 4 +
.../MaterialTransferDistributeYCL2ZCCInput.cs | 41 +++
.../Entity/WmsMaterialTransferD.cs | 9 +
.../Tnb.WarehouseMgr/WareHouseService.cs | 6 +-
.../WmsMaterialTransferService.cs | 302 +++++++++++++-----
5 files changed, 275 insertions(+), 87 deletions(-)
create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
index cafef67d..61f3b426 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
@@ -470,6 +470,10 @@
///
public const string ZZCSSX111012 = "32609251845653";
///
+ /// 一楼中储仓入库工位
+ ///
+ public const string ZZCSSX011008 = "32609223625237";
+ ///
/// 料箱id
///
public const string LIAOXIANGID = "26037262680357";
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs
new file mode 100644
index 00000000..72524f7f
--- /dev/null
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeYCL2ZCCInput.cs
@@ -0,0 +1,41 @@
+namespace Tnb.WarehouseMgr.Entities.Dto
+{
+ ///
+ /// 库房业务更新输入参数
+ ///
+ public class MaterialTransferDistributeYCL2ZCCInput
+ {
+ ///
+ /// 组织ID
+ ///
+ public string org_id { get; set; }
+ ///
+ /// 创建用户
+ ///
+ public string create_id { get; set; }
+
+ ///
+ /// 来源单据id
+ ///
+ public string? source_id { get; set; }
+
+ ///
+ /// 载具
+ ///
+ public List? details { get; set; }
+
+ }
+
+ public class MaterialTransferDistributeYCL2ZCCDetailInput
+ {
+ ///
+ /// 载具编码
+ ///
+ public string? carry_code { get; set; }
+
+ ///
+ /// 物料数量
+ ///
+ public decimal qty { get; set; }
+ }
+}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs
index ccfcfe42..687d5519 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs
@@ -80,6 +80,15 @@ public partial class WmsMaterialTransferD : BaseEntity
///
public decimal? yzqty { get; set; }
+ ///
+ /// 已下发数量(入库)
+ ///
+ public decimal? yxfqty_rk { get; set; }
+
+ ///
+ /// 已转数量(入库)
+ ///
+ public decimal? yzqty_rk { get; set; }
///
/// 主表ID
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
index 4a265303..7b7e8877 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
@@ -2296,7 +2296,7 @@ namespace Tnb.WarehouseMgr
WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.id == carry.id).FirstAsync();
// 同步料架下的载具位置
- if (wmsCarryH.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID)
+ if (wmsCarryH != null && wmsCarryH.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID)
{
List carrys = _db.Queryable()
.InnerJoin((a, b) => a.membercarry_id == b.id).Where((a, b) => a.carry_id == carry.id).Select((a, b) => b).ToList();
@@ -3119,7 +3119,7 @@ namespace Tnb.WarehouseMgr
List wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == rackid).ToList();
int move_num = 6;
- string[] endlocations = new string[2] { WmsWareHouseConst.ZZCSSX111011, WmsWareHouseConst.ZZCSSX111012 };
+ string[] startlocations = new string[2] { WmsWareHouseConst.ZZCSSX111011, WmsWareHouseConst.ZZCSSX111012 };
BasLocation startLocation = null;
int index = 0;
@@ -3139,7 +3139,7 @@ namespace Tnb.WarehouseMgr
// 每6个重新获取一次起点
if (index % move_num == 0)
{
- startLocation = await _db.Queryable().Where(r => endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
+ startLocation = await _db.Queryable().Where(r => startlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
}
BasLocation endLocation = endLocations[0];
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
index 5ebb027f..69f0f1db 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
@@ -66,6 +66,7 @@ namespace Tnb.WarehouseMgr
private readonly IWmsCarryQueryService _wmsCarryQueryService;
public static SemaphoreSlim s_taskDistributeToZCC = new(1);
+ public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1);
public WmsMaterialTransferService(
ISqlSugarRepository repository,
@@ -292,7 +293,7 @@ namespace Tnb.WarehouseMgr
///
- /// 按托下发
+ /// 按托下发(到集中供料或外协)
///
///
///
@@ -322,12 +323,12 @@ namespace Tnb.WarehouseMgr
WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id);
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id);
- if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty)
+ await s_taskExecuteSemaphore.WaitAsync();
+ if (wmsMaterialTransferD.yxfqty >= wmsMaterialTransferD.qty)
{
throw new AppFriendlyException("已下发数量已达到转库数量", 500);
}
- await s_taskExecuteSemaphore.WaitAsync();
await _db.Ado.BeginTranAsync();
//入库取终点 //出库起点
@@ -432,6 +433,120 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功");
}
+ ///
+ /// PDA操作(8线到中储仓)
+ ///
+ ///
+ ///
+ [HttpPost, NonUnify, AllowAnonymous]
+ public async Task DistributeYCL2ZCC(MaterialTransferDistributeYCL2ZCCInput input)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(input.source_id))
+ {
+ throw new AppFriendlyException("来源单据id不可为空", 500);
+ }
+ if (input.details.Count == 0)
+ {
+ throw new AppFriendlyException("请先扫描料箱", 500);
+ }
+
+ input.details.ForEach(r =>
+ {
+ if (string.IsNullOrEmpty(r.carry_code))
+ {
+ throw new AppFriendlyException($"料箱编码不能为空", 500);
+ }
+ if (r.qty <= 0)
+ {
+ throw new AppFriendlyException($"料箱{r.carry_code}的数量必须大于0", 500);
+ }
+ });
+
+ await s_taskDistributeYCL2ZCC.WaitAsync();
+ WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id);
+ WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id);
+
+ if (wmsMaterialTransferD.yxfqty_rk >= wmsMaterialTransferD.qty)
+ {
+ throw new AppFriendlyException("已下发数量已达到转库数量", 500);
+ }
+
+ decimal qty = input.details.Sum(r => r.qty);
+ if (qty > wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty_rk)
+ {
+ throw new AppFriendlyException($"下发数量{qty}已超过可下发数量{wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty_rk}", 500);
+ }
+
+ await _db.Ado.BeginTranAsync();
+ //入库取终点 //出库起点
+ InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_ZC_ID, Size = input.details.Count };
+ List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
+ if (endLocations.Count == 0)
+ {
+ Logger.LogWarning("没有可用的入库库位");
+ throw new AppFriendlyException("没有可用的入库库位", 500);
+ }
+
+ if (input.details.Count > endLocations.Count)
+ {
+ throw new AppFriendlyException("可用的入库库位数量少于扫描的料箱数量", 500);
+ }
+
+ int index = 0;
+
+ List wmsCarryHs = await _db.Queryable().Where(r => input.details.Select(x => x.carry_code).Contains(r.carry_code)).ToListAsync();
+
+ foreach (var wmsCarryH in input.details)
+ {
+ BasLocation startLocation = await _db.Queryable().Where(r => r.id == WmsWareHouseConst.ZZCSSX011008).FirstAsync();
+
+ BasLocation endLocation = endLocations[index];
+
+ CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
+ commonCreatePretaskInput.startlocation_id = startLocation.id;
+ commonCreatePretaskInput.endlocation_id = endLocation.id;
+ commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID;
+ commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
+ commonCreatePretaskInput.source_id = input.source_id;
+ commonCreatePretaskInput.carry_id = wmsCarryHs[index].id;
+ commonCreatePretaskInput.carry_code = wmsCarryHs[index].carry_code;
+ commonCreatePretaskInput.isExcuteMission = false;
+
+ Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db);
+
+ if (res.code != HttpStatusCode.OK)
+ {
+ Logger.LogInformation($@"生成预任务失败");
+ throw new AppFriendlyException($@"生成预任务失败", 500);
+ }
+
+ index++;
+ }
+
+ // 更新子表已下发数量
+ await _db.Updateable().SetColumns(r => r.yxfqty_rk == r.yxfqty_rk + qty).Where(r => r.id == input.source_id).ExecuteCommandAsync();
+
+ await _db.Ado.CommitTranAsync();
+ }
+ catch (Exception ex)
+ {
+ await _db.Ado.RollbackTranAsync();
+ Logger.LogError("【Distribute】" + ex.Message);
+ Logger.LogError("【Distribute】" + ex.StackTrace);
+ return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
+ }
+ finally
+ {
+ _ = s_taskDistributeYCL2ZCC.Release();
+ InvokeGenPretaskExcute();
+ }
+
+ return await ToApiResult(HttpStatusCode.OK, "成功");
+ }
+
+
///
/// 按料架下发(缓存仓)
///
@@ -770,7 +885,6 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功");
}
-
public override async Task ModifyAsync(WareHouseUpInput input)
{
if (input == null)
@@ -788,10 +902,21 @@ namespace Tnb.WarehouseMgr
}
await _db.Ado.BeginTranAsync();
- // 更新已转数量
- bool isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty) })
- .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync();
-
+ bool isOk = false;
+ // 入库回写入库数量字段
+ if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID)
+ {
+ // 更新已转数量(入库)
+ isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty_rk = it.yzqty_rk + wmsCarryCodes.Sum(r => r.codeqty) })
+ .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync();
+ }
+ else
+ {
+ // 更新已转数量
+ isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCodes.Sum(r => r.codeqty) })
+ .Where(it => it.id == input.source_id).ExecuteCommandHasChangeAsync();
+ }
+
// 如果所有明细已完成 更新主表状态为完成
WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.source_id).SingleAsync();
List wmsMaterialTransferDs = _db.Queryable()
@@ -814,87 +939,96 @@ namespace Tnb.WarehouseMgr
if (input.area_code == "E")
await sign(input);
-
- WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id);
- List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x=>x.id).ToListAsync();
- DictionaryDataEntity unitData = await _db.Queryable()
- .LeftJoin((x, y) => x.Id == y.DictionaryTypeId)
- .Where((x, y) => x.EnCode == DictConst.MeasurementUnit && y.EnCode == wmsMaterialTransferd.unit_id)
- .Select((x,y)=>y)
- .FirstAsync();
- List ids = new List();
- ids.Add(wmsMaterialTransfer.create_id);
- ids.Add(WmsWareHouseConst.AdministratorOrgId);
- ids.Add(wmsMaterialTransfer.warehouse_outstock);
- ids.Add(wmsMaterialTransfer.warehouse_instock);
- ids.Add(wmsMaterialTransferd.material_id);
- if (unitData != null)
+ // 其它入库
+ if (input.wmsDistaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID)
{
- ids.Add(unitData.Id);
+
}
- List erpExtendFields = await _db.Queryable().Where(x=>ids.Contains(x.table_id)).ToListAsync();
-
- ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (wmsMaterialTransfer.org_id ?? WmsWareHouseConst.AdministratorOrgId));
- string erpCreateId = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.create_id)?.user_id ?? "";
-
- List> requestData = new List>();
- Dictionary erpRequestData = new Dictionary();
- string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- erpRequestData.Add("billmaker",erpCreateId);
- erpRequestData.Add("cdptid","1001A1100000000JRLI1");// 先写死
- erpRequestData.Add("cdptvid","0001A11000000007GGO8");// 先写死
- erpRequestData.Add("corpoid",erpOrg.corpoid);
- erpRequestData.Add("corpvid",erpOrg.corpoid);
- erpRequestData.Add("cothercalbodyoid",erpOrg.pk_org);
- erpRequestData.Add("cotherwhid",erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.warehouse_instock)?.cotherwhid ?? "");
- erpRequestData.Add("creationtime",nowStr);
- erpRequestData.Add("creator",erpCreateId);
- erpRequestData.Add("ctrantypeid","0001H11000000000D31W");
- erpRequestData.Add("cwarehouseid",erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? "");
- erpRequestData.Add("dbilldate",nowStr);
- erpRequestData.Add("dmakedate",nowStr);
- erpRequestData.Add("ntotalnum",wmsCarryCodes.Sum(r => r.codeqty));
- erpRequestData.Add("pk_group",erpOrg.pk_group);
- erpRequestData.Add("pk_org",erpOrg.pk_org);
- erpRequestData.Add("pk_org_v",erpOrg.pk_org_v);
- erpRequestData.Add("vbillcode",wmsMaterialTransfer.bill_code);
- erpRequestData.Add("vtrantypecode","4I-01");//其他出库 先写死
- List> erpRequestDataDetails = new List>();
- erpRequestDataDetails.Add(new Dictionary()
+ // 其它出库
{
- ["cbodytranstypecode"] = "4I-01",
- ["cbodywarehouseid"] = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? "",
- ["cmaterialoid"] = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransferd.material_id)?.cmaterialoid ?? "",
- ["cmaterialvid"] = erpExtendFields.Find(x=>x.table_id==wmsMaterialTransferd.material_id)?.cmaterialvid ?? "",
- ["corpoid"] = erpOrg.corpoid,
- ["corpvid"] = erpOrg.corpvid,
- ["crowno"] = wmsMaterialTransferd.lineno,
- ["csourcebillbid"] = wmsMaterialTransferd.erp_line_pk,
- ["csourcebillhid"] = wmsMaterialTransfer.erp_pk,
- ["cunitid"] = erpExtendFields.Find(x=>x.table_id==unitData.Id)?.cunitid ?? "",
- ["cvendorid"] = "",
- ["cvendorvid"] = "",
- ["dbizdate"] = nowStr,
- ["nnum"] = wmsCarryCodes.Sum(r => r.codeqty),
- ["nshouldnum"] = wmsMaterialTransferd.qty,
- ["pk_group"] = erpOrg.pk_group,
- ["pk_org"] = erpOrg.pk_org,
- ["pk_org_v"] = erpOrg.pk_org_v,
- ["vbatchcode"] = wmsMaterialTransferd.code_batch,
- });
- erpRequestData.Add("dtls",erpRequestDataDetails);
- requestData.Add(erpRequestData);
+ WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id);
+ List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync();
+ DictionaryDataEntity unitData = await _db.Queryable()
+ .LeftJoin((x, y) => x.Id == y.DictionaryTypeId)
+ .Where((x, y) => x.EnCode == DictConst.MeasurementUnit && y.EnCode == wmsMaterialTransferd.unit_id)
+ .Select((x, y) => y)
+ .FirstAsync();
+ List ids = new List();
+ ids.Add(wmsMaterialTransfer.create_id);
+ ids.Add(WmsWareHouseConst.AdministratorOrgId);
+ ids.Add(wmsMaterialTransfer.warehouse_outstock);
+ ids.Add(wmsMaterialTransfer.warehouse_instock);
+ ids.Add(wmsMaterialTransferd.material_id);
+ if (unitData != null)
+ {
+ ids.Add(unitData.Id);
+ }
+ List erpExtendFields = await _db.Queryable().Where(x => ids.Contains(x.table_id)).ToListAsync();
- ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord();
- thirdWebapiRecord.id = SnowflakeIdHelper.NextId();
- thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
- thirdWebapiRecord.name = "其它出库";
- thirdWebapiRecord.method = "POST";
- thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN+"uapws/rest/generalout/save";
- thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
- thirdWebapiRecord.create_time = DateTime.Now;
+ ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (wmsMaterialTransfer.org_id ?? WmsWareHouseConst.AdministratorOrgId));
+ string erpCreateId = erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.create_id)?.user_id ?? "";
- await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
+ List> requestData = new List>();
+ Dictionary erpRequestData = new Dictionary();
+ string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ erpRequestData.Add("billmaker", erpCreateId);
+ erpRequestData.Add("cdptid", "1001A1100000000JRLI1");// 先写死
+ erpRequestData.Add("cdptvid", "0001A11000000007GGO8");// 先写死
+ erpRequestData.Add("corpoid", erpOrg.corpoid);
+ erpRequestData.Add("corpvid", erpOrg.corpoid);
+ erpRequestData.Add("cothercalbodyoid", erpOrg.pk_org);
+ erpRequestData.Add("cotherwhid", erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.warehouse_instock)?.cotherwhid ?? "");
+ erpRequestData.Add("creationtime", nowStr);
+ erpRequestData.Add("creator", erpCreateId);
+ erpRequestData.Add("ctrantypeid", "0001H11000000000D31W");
+ erpRequestData.Add("cwarehouseid", erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? "");
+ erpRequestData.Add("dbilldate", nowStr);
+ erpRequestData.Add("dmakedate", nowStr);
+ erpRequestData.Add("ntotalnum", wmsCarryCodes.Sum(r => r.codeqty));
+ erpRequestData.Add("pk_group", erpOrg.pk_group);
+ erpRequestData.Add("pk_org", erpOrg.pk_org);
+ erpRequestData.Add("pk_org_v", erpOrg.pk_org_v);
+ erpRequestData.Add("vbillcode", wmsMaterialTransfer.bill_code);
+ erpRequestData.Add("vtrantypecode", "4I-01");//其他出库 先写死
+ List> erpRequestDataDetails = new List>();
+ erpRequestDataDetails.Add(new Dictionary()
+ {
+ ["cbodytranstypecode"] = "4I-01",
+ ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == wmsMaterialTransfer.warehouse_outstock)?.cotherwhid ?? "",
+ ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == wmsMaterialTransferd.material_id)?.cmaterialoid ?? "",
+ ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == wmsMaterialTransferd.material_id)?.cmaterialvid ?? "",
+ ["corpoid"] = erpOrg.corpoid,
+ ["corpvid"] = erpOrg.corpvid,
+ ["crowno"] = wmsMaterialTransferd.lineno,
+ ["csourcebillbid"] = wmsMaterialTransferd.erp_line_pk,
+ ["csourcebillhid"] = wmsMaterialTransfer.erp_pk,
+ ["cunitid"] = erpExtendFields.Find(x => x.table_id == unitData.Id)?.cunitid ?? "",
+ ["cvendorid"] = "",
+ ["cvendorvid"] = "",
+ ["dbizdate"] = nowStr,
+ ["nnum"] = wmsCarryCodes.Sum(r => r.codeqty),
+ ["nshouldnum"] = wmsMaterialTransferd.qty,
+ ["pk_group"] = erpOrg.pk_group,
+ ["pk_org"] = erpOrg.pk_org,
+ ["pk_org_v"] = erpOrg.pk_org_v,
+ ["vbatchcode"] = wmsMaterialTransferd.code_batch,
+ });
+ erpRequestData.Add("dtls", erpRequestDataDetails);
+ requestData.Add(erpRequestData);
+
+ ThirdWebapiRecord thirdWebapiRecord = new ThirdWebapiRecord();
+ thirdWebapiRecord.id = SnowflakeIdHelper.NextId();
+ thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
+ thirdWebapiRecord.name = "其它出库";
+ thirdWebapiRecord.method = "POST";
+ thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/generalout/save";
+ thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
+ thirdWebapiRecord.create_time = DateTime.Now;
+
+ await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
+ }
+
+
await _db.Ado.CommitTranAsync();
}
From 401d921f49c45b5b5fa3cb2f650e8aa157f70719 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Mon, 22 Jul 2024 10:59:20 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BA=8C=E6=A5=BC=E7=A9=BA=E6=89=98?=
=?UTF-8?q?=E5=88=B0=E7=A0=81=E5=9E=9B=E7=BA=BF=EF=BC=8C=E5=BA=93=E5=AD=98?=
=?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=8F=98=E6=9B=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Tnb.ProductionMgr/RedisBackGround.cs | 181 ++++++++++++++++--
.../Consts/WmsWareHouseConst.cs | 12 ++
.../OutStockStrategyZCC2Floor2Query.cs | 4 +
.../Tnb.WarehouseMgr/WareHouseService.cs | 4 +-
.../WmsCarryStockReportService.cs | 16 +-
.../WmsMaterialTransferService.cs | 158 ++++++++++++++-
6 files changed, 334 insertions(+), 41 deletions(-)
diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
index 2ee09157..1b8a9a6d 100644
--- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
@@ -90,6 +90,9 @@ namespace Tnb.ProductionMgr
private static Timer? PackOutstockServicetimer;
// 检查到电梯任务异常断开后处理
private Thread? ElevatorTaskExceptionHandleThread;
+ // 二楼空托盘自动补充到线边
+ private static Timer? F2KTPsupplementtimer;
+
public SemaphoreSlim s_taskCheckGet = new(1);
public SemaphoreSlim s_taskScan = new(1);
@@ -106,6 +109,7 @@ namespace Tnb.ProductionMgr
public SemaphoreSlim s_taskFloor4DMJ2MJXService = new(1);
public SemaphoreSlim s_taskFloor4MJX2MJCService = new(1);
public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1);
+ public SemaphoreSlim s_taskF2KTPsupplement = new(1);
private StackExRedisHelper _redisData;
private readonly IPrdInstockService _prdInstockService;
@@ -127,7 +131,8 @@ namespace Tnb.ProductionMgr
private ISqlSugarClient db_Floor4MJX2MJC;
private ISqlSugarClient db_Floor4DMC2CPK;
private ISqlSugarClient db_ElevatorTaskExceptionHandle;
-
+ private ISqlSugarClient db_F2KTPsupplement;
+
private readonly IWmsPDAScanInStockService _wmsPDAScanInStock;
private readonly IUserManager _userManager;
@@ -183,6 +188,7 @@ namespace Tnb.ProductionMgr
db_Floor4MJX2MJC = repository.CopyNew();
db_Floor4DMC2CPK = repository.CopyNew();
db_ElevatorTaskExceptionHandle = repository.CopyNew();
+ db_F2KTPsupplement = repository.CopyNew();
}
#endregion
@@ -1922,13 +1928,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线");
- if (true)
- {
- return;
- }
-
Dictionary putdic = new Dictionary();
- putdic.Add("SLD1", new string[] { "设备名", "信号" });
+ putdic.Add("MJQ-FAN01", new string[] { "4楼上料输送西区", "上料工位1请求送盘" });
+ putdic.Add("MJQ-FAN02", new string[] { "4楼上料输送西区", "上料工位2请求送盘" });
+ putdic.Add("MJQ-FAN03", new string[] { "4楼上料输送西区", "上料工位3请求送盘" });
+ putdic.Add("MJQ-FAN04", new string[] { "4楼上料输送西区", "上料工位4请求送盘" });
//Dictionary putdic = new Dictionary();
//List endLocations = db_Floor4DMJ2MJX.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_DMJC_ID
@@ -1958,7 +1962,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
if (items.Count < 1)
{
- LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的空载具");
+ LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的载具");
break;
}
BasLocation endlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.location_code == key).FirstAsync();
@@ -2027,13 +2031,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓");
- if (true)
- {
- return;
- }
-
Dictionary getdic = new Dictionary();
- getdic.Add("SLD1", new string[] { "设备名", "信号", "条码信号" });
+ getdic.Add("MJQ-QU02", new string[] { "4下上料输送西区", "下料工位2请求取盘", "下料工位2条码" });
+ getdic.Add("MJQ-QU01", new string[] { "4下上料输送西区", "下料工位1请求取盘", "下料工位1条码" });
//List startLocations = db_Floor4MJX2MJC.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_MJC_ID
//&& r.is_type == ((int)EnumLocationType.分拣库位).ToString() && r.is_lock == 0).ToList();
@@ -2051,7 +2051,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
bool result = await GetBoolTag(strs[0], strs[1]);
if (result)
{
- LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 上料点 {key} {strs[1]}采集到 {result}");
+ LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[1]}采集到 {result}");
InStockStrategyQuery inStockStrategyInput = new()
{
@@ -2070,7 +2070,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.location_code == key).FirstAsync();
BasLocation endlocation = items[0];
- string carry_code = "";
+ string carry_code = await GetStringTag(strs[0], strs[2]);
+ LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[2]}采集到 {carry_code}");
WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable().Where(r => r.carry_code == carry_code).FirstAsync();
//锁定起点库位
@@ -2160,7 +2161,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
if (wmsFloor4StewingConfig == null)
{
- LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)");
+ LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)");
return;
}
int hours = 168;
@@ -2187,7 +2188,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
await db_Floor4DMC2CPK.Ado.BeginTranAsync();
- BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
+ BasLocation startlocation = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
InStockStrategyQuery inStockStrategyInput = new()
{
@@ -2253,6 +2254,107 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
}
}
+ ///
+ /// 二楼空托盘自动补充到线边
+ ///
+ ///
+ private async void F2KTPsupplement(object? args)
+ {
+ if (s_taskF2KTPsupplement.CurrentCount == 0)
+ return;
+ await s_taskF2KTPsupplement.WaitAsync();
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+ try
+ {
+ Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行二楼空托盘自动补充到线边");
+ LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行二楼空托盘自动补充到线边");
+
+ Dictionary putdic = new Dictionary();
+ putdic.Add("ZZ-01-01", new string[] { "外包装箱码垛线", "WBZX_x1_AGV_fan" });
+ putdic.Add("ZZ-02-01", new string[] { "外包装箱码垛线", "WBZX_x2_AGV_fan" });
+
+ foreach (var key in putdic.Keys)
+ {
+ await db_F2KTPsupplement.Ado.BeginTranAsync();
+ var strs = putdic.Where(p => p.Key == key).First().Value;
+ bool result = await GetBoolTag(strs[0], strs[1]);
+ if (result)
+ {
+
+ LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 上料点 {key} {strs[1]}采集到 {result}");
+
+ OutStockStrategyQuery outStockStrategyInput = new()
+ {
+ warehouse_id = WmsWareHouseConst.WAREHOUSE_F2KTQ_ID,
+ Size = 1
+ };
+ List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
+
+ if (items.Count < 1)
+ {
+ LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 没有可以出库的空载具");
+ break;
+ }
+ BasLocation endlocation = await db_F2KTPsupplement.Queryable().Where(r => r.location_code == key).FirstAsync();
+
+ if (endlocation.is_use == "1")
+ {
+ LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已占用");
+ continue;
+ }
+ if (endlocation.is_lock == 1)
+ {
+ LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已锁定");
+ continue;
+ }
+
+ WmsCarryH wmsCarryH = items[0];
+
+ //锁定起点库位
+ await db_F2KTPsupplement.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == wmsCarryH.location_id).ExecuteCommandAsync();
+ //锁定终点库位
+ await db_F2KTPsupplement.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync();
+
+ bool result_createPretask = await createPretask(wmsCarryH.location_id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerF2KTPsupplement, db_F2KTPsupplement);
+ if (!result_createPretask)
+ {
+ LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败");
+ throw new Exception($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败");
+ }
+ LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成成功");
+
+ }
+ await db_F2KTPsupplement.Ado.CommitTranAsync();
+ }
+ _ = _wareHouseService.GenTaskExecute();
+ }
+ catch (ObjectDisposedException ex)
+ {
+ LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.Message}");
+ LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.StackTrace}");
+ if (ex.Source == "Npgsql")
+ db_F2KTPsupplement = _repository.AsSugarClient().CopyNew();
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine("【二楼空托盘自动补充到线边】" + ex.Message);
+ LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.Message}");
+ LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.StackTrace}");
+ // 数据库连接断开时会报错
+ try { await db_F2KTPsupplement.Ado.RollbackTranAsync(); } catch { };
+ }
+ finally
+ {
+ s_taskF2KTPsupplement.Release();
+ if (!db_F2KTPsupplement.Ado.Transaction.IsNull())
+ try { await db_F2KTPsupplement.Ado.CommitTranAsync(); } catch { };
+ _wareHouseService.GenTaskExecute();
+ stopwatch.Stop();
+ Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束二楼空托盘自动补充到线边 {stopwatch.ElapsedMilliseconds} ms");
+ LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束二楼空托盘自动补充到线边 {stopwatch.ElapsedMilliseconds} ms");
+ }
+ }
#endregion
public Task StartAsync(CancellationToken cancellationToken)
@@ -2287,10 +2389,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
ElevatorTaskExceptionHandleThread = new Thread(ElevatorTaskExceptionHandle);
ElevatorTaskExceptionHandleThread.Start();
- //Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
- //Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
- //Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
+ Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
+ Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
+ Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
+ F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
return Task.CompletedTask;
}
@@ -2321,6 +2424,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
Floor4MJX2MJCtimer?.Dispose();
Floor4DMC2CPKtimer?.Dispose();
ElevatorTaskExceptionHandleThread.Abort();
+ F2KTPsupplementtimer?.Dispose();
+
}
#region 日志
@@ -2710,6 +2815,40 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
return _LoggerFloor4DMC2CPK;
}
}
+
+ protected string _LoggerF2KTPsupplementFileName = "";
+ protected ILogger _LoggerF2KTPsupplement;
+ protected ILogger LoggerF2KTPsupplement
+ {
+ get
+ {
+ string newFileName = $"{AppContext.BaseDirectory}/logs/custom二楼空托盘补充{DateTime.Now:yyyyMMdd}.log";
+ if (_LoggerF2KTPsupplementFileName != newFileName)
+ {
+ ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts =>
+ {
+
+ //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
+ cfgOpts.MessageFormat = (logMsg) =>
+ {
+ var logLevel = s_logLevelMap[logMsg.LogLevel];
+ var sb = new StringBuilder();
+ _ = sb.Append($"[{logLevel}] ");
+ _ = sb.Append($"{logMsg.LogName} ");
+ _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
+ _ = sb.Append($"#{logMsg.EventId.Id} ");
+ _ = sb.Append(logMsg.Message + " ");
+ _ = sb.Append(logMsg.Exception?.ToString());
+ return sb.ToString();
+ };
+
+ }));
+ _LoggerF2KTPsupplement = loggerFactory.CreateLogger(this.GetType());
+ _LoggerF2KTPsupplementFileName = newFileName;
+ }
+ return _LoggerF2KTPsupplement;
+ }
+ }
#endregion
}
}
\ No newline at end of file
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
index 61f3b426..2f04548c 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs
@@ -472,8 +472,20 @@
///
/// 一楼中储仓入库工位
///
+ public const string ZZCSSX021007 = "32609215284757";
+ ///
+ /// 一楼中储仓入库工位
+ ///
public const string ZZCSSX011008 = "32609223625237";
///
+ /// 一楼中储仓入库工位
+ ///
+ public const string ZZCSSX121009 = "32609229889045";
+ ///
+ /// 一楼中储仓入库工位
+ ///
+ public const string ZZCSSX121010 = "32609238573589";
+ ///
/// 料箱id
///
public const string LIAOXIANGID = "26037262680357";
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs
index 540f2b1c..943c39eb 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs
@@ -49,6 +49,10 @@
///
///
public string? material_code { get; set; }
+ ///
+ ///
+ ///
+ public string[] endlocations { get; set; }
}
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
index 7b7e8877..fd0770c7 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
@@ -586,7 +586,7 @@ namespace Tnb.WarehouseMgr
List>? carrys = new List>();
// 6个下发一条任务链
- int move_num = 6;
int endlocation_index = 0;
string[] endlocations = new string[2] { "32609229889045", "32609238573589" };
+ int move_num = 6;
int endlocation_index = 0;
BasLocation endlocation_ssx = null;
for (int i = 0; i < itemsASC.Count; i++)
@@ -602,7 +602,7 @@ namespace Tnb.WarehouseMgr
// 每6个重新获取一次终点
if (i % move_num == 0)
{
- endlocation_ssx = await _db.Queryable().Where(r => endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
+ endlocation_ssx = await _db.Queryable().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
}
// 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑)
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs
index ff4e2079..2b12868d 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs
@@ -38,13 +38,13 @@ namespace Tnb.WarehouseMgr
public async Task CarryStock(CarryStockInput input)
{
var warehouse_id = "";
- var carry_id = "";
- var material_id = "";
+ var carry_code = "";
+ var material_code = "";
if (!input.queryJson.IsNullOrWhiteSpace())
{
warehouse_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.warehouse_id));
- carry_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_id));
- material_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_id));
+ carry_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_code));
+ material_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_code));
}
@@ -58,8 +58,8 @@ namespace Tnb.WarehouseMgr
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1"
&& ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code)))
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
- .WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d) => b.id == carry_id)
- .WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f) => f.id == material_id)
+ .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code))
+ .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => f.code.Contains(material_code))
.OrderByDescending((a, b, c, d, e, f) => b.carry_code)
.Select((a, b, c, d, e, f) => new WmsCarryStockReport
{
@@ -97,8 +97,8 @@ namespace Tnb.WarehouseMgr
.InnerJoin((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id)
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" && b.carry_status != "0" && b.carry_status != "6")
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
- .WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d, e) => b.id == carry_id || e.membercarry_id == carry_id)
- .WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f, g) => g.id == material_id)
+ .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code)|| h.carry_code.Contains(carry_code))
+ .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code))
.Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport
{
warehouse_name = c.whname,
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
index 69f0f1db..cf72a161 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
@@ -67,6 +67,8 @@ namespace Tnb.WarehouseMgr
public static SemaphoreSlim s_taskDistributeToZCC = new(1);
public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1);
+ public static SemaphoreSlim s_taskDistributeZCCToYCL = new(1);
+
public WmsMaterialTransferService(
ISqlSugarRepository repository,
@@ -291,7 +293,6 @@ namespace Tnb.WarehouseMgr
}
}
-
///
/// 按托下发(到集中供料或外协)
///
@@ -439,7 +440,7 @@ namespace Tnb.WarehouseMgr
///
///
[HttpPost, NonUnify, AllowAnonymous]
- public async Task DistributeYCL2ZCC(MaterialTransferDistributeYCL2ZCCInput input)
+ public async Task DistributeYCLToZCC(MaterialTransferDistributeYCL2ZCCInput input)
{
try
{
@@ -936,6 +937,8 @@ namespace Tnb.WarehouseMgr
throw Oops.Oh(ErrorCode.COM1001);
}
+ await _db.Ado.CommitTranAsync();
+
if (input.area_code == "E")
await sign(input);
@@ -945,6 +948,7 @@ namespace Tnb.WarehouseMgr
}
// 其它出库
+ else
{
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id);
List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync();
@@ -1027,16 +1031,12 @@ namespace Tnb.WarehouseMgr
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
}
-
-
-
- await _db.Ado.CommitTranAsync();
}
catch(Exception ex)
{
Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.Message);
Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.StackTrace);
- await _db.Ado.RollbackTranAsync();
+ //await _db.Ado.RollbackTranAsync();
}
}
@@ -1100,11 +1100,11 @@ namespace Tnb.WarehouseMgr
material_id = wmsMaterialTransferD.material_id,
code_batch = wmsMaterialTransferD.code_batch,
needOut = needOut,
- material_code = wmsMaterialTransferD.material_code
-
+ material_code = wmsMaterialTransferD.material_code,
+ endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 }
};
- List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
+ List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
foreach (var item in carrys)
{
@@ -1183,6 +1183,144 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功");
}
+ ///
+ /// 中储仓退料到原材料仓
+ ///
+ ///
+ ///
+ ///
+ [HttpPost, NonUnify, AllowAnonymous]
+ public async Task DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input)
+ {
+ s_taskDistributeZCCToYCL.Wait();
+
+ try
+ {
+ WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable().Where(r => r.id == input.source_id).First();
+ if (wmsMaterialTransfer == null)
+ {
+ Logger.LogWarning($"不存在id为{input.source_id}的转库单!");
+ throw new AppFriendlyException($"不存在id为{input.source_id}的转库单!", 500);
+ }
+ if (wmsMaterialTransfer.status != WmsWareHouseConst.BILLSTATUS_ADD_ID)
+ {
+ Logger.LogWarning($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓退料到原材料仓任务!");
+ throw new AppFriendlyException($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓退料到原材料仓任务!", 500);
+ }
+
+ List wmsMaterialTransferds = _db.Queryable().Where(r => r.bill_id == input.source_id).ToList();
+
+ var wmsMaterialTransferdsDistinct = wmsMaterialTransferds.Select(r => new
+ {
+ material_id = r.material_id,
+ code_batch = r.code_batch,
+ }).Distinct();
+ if (wmsMaterialTransferdsDistinct.Count() < wmsMaterialTransferds.Count)
+ {
+ Logger.LogWarning($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!");
+ throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!", 500);
+ }
+
+ // 转库单载具子表
+ List wmsMaterialTransferCarrys = new List();
+
+ foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds)
+ {
+ // 需要转库数量
+ decimal? needOut = wmsMaterialTransferD.qty;
+
+ //出库取起点,获取所有符合输入的载具规格的载具
+ OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new()
+ {
+ warehouse_id = "2",
+ material_id = wmsMaterialTransferD.material_id,
+ code_batch = wmsMaterialTransferD.code_batch,
+ needOut = needOut,
+ material_code = wmsMaterialTransferD.material_code,
+ endlocations = new string[] {WmsWareHouseConst.ZZCSSX021007 }
+ };
+ List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
+
+
+ foreach (var item in carrys)
+ {
+ WmsCarryH wmsCarryH = item.Item1;
+ decimal codeqty = item.Item2;
+ BasLocation endlocation_ssx = item.Item3;
+
+ // 转库单载具子表
+ WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry();
+ wmsMaterialTransferCarry.bill_id = input.source_id;
+ wmsMaterialTransferCarry.carry_id = wmsCarryH.id;
+ wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code;
+ wmsMaterialTransferCarry.create_id = input.create_id;
+ wmsMaterialTransferCarry.create_time = DateTime.Now;
+ wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id;
+ wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code;
+ wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id;
+ wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code;
+ wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id;
+ wmsMaterialTransferCarry.qty = codeqty;
+ wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry);
+ }
+ }
+
+ await _db.Ado.BeginTranAsync();
+
+ await _db.Updateable().SetColumns(r => new WmsMaterialTransfer
+ {
+ status = WmsWareHouseConst.BILLSTATUS_ON_ID,
+ carry_count = wmsMaterialTransferCarrys.Count,
+ remainbindracknum = wmsMaterialTransferCarrys.Count
+ }).Where(r => r.id == input.source_id).ExecuteCommandAsync();
+ Logger.LogInformation($"【DistributeZCCToYCL】更新转库单{wmsMaterialTransfer.bill_code}主表的数据");
+
+ await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync();
+ Logger.LogInformation($"【DistributeZCCToYCL】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据");
+
+ foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys)
+ {
+ CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
+ commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id;
+ commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id;
+ commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id;
+ commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code;
+ commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
+ commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
+ commonCreatePretaskInput.source_id = wmsMaterialTransferCarry.mat_bill_id;
+ commonCreatePretaskInput.isExcuteMission = false;
+
+ var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
+ if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
+ {
+ Logger.LogInformation($"【DistributeZCCToYCL生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}");
+ throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500);
+ }
+
+ await _db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync();
+ }
+ Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功");
+
+
+ await _db.Ado.CommitTranAsync();
+ }
+ catch (Exception ex)
+ {
+ await _db.Ado.RollbackTranAsync();
+ Logger.LogError("【DistributeZCCToYCL】" + ex.Message);
+ Logger.LogError("【DistributeZCCToYCL】" + ex.StackTrace);
+ return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
+ }
+ finally
+ {
+ s_taskDistributeZCCToYCL.Release();
+ InvokeGenPretaskExcute();
+ }
+ return await ToApiResult(HttpStatusCode.OK, "成功");
+ }
+
+
+
///
/// 从暂存仓呼叫料架到产线
///