Browse Source

添加任务服务

master
taoleite 3 months ago
parent
commit
015eb21a76
  1. 3
      NewWMSProject/src/NewWMSProject/NewWMSProject.csproj
  2. 91
      NewWMSWebAPI/Helper/Appsettings.cs
  3. 581
      NewWMSWebAPI/Helper/Enum.cs
  4. 14
      NewWMSWebAPI/Helper/JsonPolicy.cs
  5. 92
      NewWMSWebAPI/Helper/SnowFlake.cs
  6. 49
      NewWMSWebAPI/Helper/StringFormat.cs
  7. 10
      NewWMSWebAPI/NewWMSWebAPI.csproj
  8. 370
      NewWMSWebAPI/TaskService/Implement/ManageHelper.cs
  9. 462
      NewWMSWebAPI/TaskService/Implement/ManagePreOut.cs
  10. 19
      NewWMSWebAPI/TaskService/Interface/IManageHelper.cs
  11. 13
      NewWMSWebAPI/TaskService/Interface/IManagePreOut.cs

3
NewWMSProject/src/NewWMSProject/NewWMSProject.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@ -7,6 +7,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\EFCoreDatabase\EFCoreDatabase.csproj" />
<ProjectReference Include="..\NewWMSProject.Client\NewWMSProject.Client.csproj" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.13" />
</ItemGroup>

91
NewWMSWebAPI/Helper/Appsettings.cs

@ -0,0 +1,91 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
namespace NewWMSWebAPI.Helper
{
public class Appsettings
{
/// <summary>
/// appsettings.json操作类
/// </summary>
static IConfiguration Configuration { get; set; }
static string contentPath { get; set; }
public Appsettings(string contentPath)
{
string Path = "appsettings.json";
//如果你把配置文件 是 根据环境变量来分开了,可以这样写
//Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json";
Configuration = new ConfigurationBuilder()
.SetBasePath(contentPath)
.Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })//这样的话,可以直接读目录里的json文件,而不是 bin 文件夹下的,所以不用修改复制属性
.Build();
}
public Appsettings(IConfiguration configuration)
{
Configuration = configuration;
}
public static string app(string sections)
{
try
{
return Configuration[sections];
}
catch (Exception)
{
return "";
}
}
/// <summary>
/// 封装要操作的字符
/// </summary>
/// <param name="sections">节点配置</param>
/// <returns></returns>
public static string app(params string[] sections)
{
try
{
if (sections.Any())
{
return Configuration[string.Join(":", sections)];
}
}
catch (Exception) { }
return "";
}
/// <summary>
/// 返回实体对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sections"></param>
/// <returns></returns>
public static T app<T>(string sections)
{
return Configuration.GetSection(sections).Get<T>();
}
/// <summary>
/// 递归获取配置信息数组
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sections"></param>
/// <returns></returns>
public static List<T> app<T>(params string[] sections)
{
List<T> list = new List<T>();
Configuration.Bind(string.Join(":", sections), list);
return list;
}
}
}

581
NewWMSWebAPI/Helper/Enum.cs

@ -0,0 +1,581 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NewWMSWebAPI.Helper
{
#region ------FLAG
/// <summary>
/// 激活或非激活标识
/// </summary>
public enum FLAG
{
/// <summary>
/// 激活
/// </summary>
Enable = 1,
/// <summary>
/// 非激活
/// </summary>
DisEnable = 0
}
#endregion
public enum CONTROL_TYPE
{
Up = 1,
Down = 2,
Move = 3,
MoveStation = 4
}
public enum OPERATIONAL_STATUS
{
Online ,
Offline
}
public enum STACKER_STATUS
{
Offline,
Idle,
Faulted,
InCycle
}
#region ------PLAN
/// <summary>
/// 计划类型分组
/// </summary>
public enum PLAN_TYPE_GROUP
{
/// <summary>
/// 仓储类
/// </summary>
StoreGroup = 1,
/// <summary>
/// 工位类
/// </summary>
WorkStationGroup = 2,
/// <summary>
/// 生产装配类
/// </summary>
ProduceGroup = 3
}
/// <summary>
/// 计划状态
/// </summary>
public enum PLAN_STATUS
{
/// <summary>
/// MES创建
/// </summary>
Saved,
/// <summary>
/// 等待执行
/// </summary>
Waiting,
/// <summary>
/// 清线中
/// </summary>
Clearing,
/// <summary>
/// 执行中
/// </summary>
Executing,
/// <summary>
/// 暂停
/// </summary>
Pause,
/// <summary>
/// 删除
/// </summary>
Delete,
/// <summary>
/// 终止
/// </summary>
Stop,
/// <summary>
/// 等待排产
/// </summary>
RouteWaiting,
/// <summary>
/// 等待生产
/// </summary>
ProduceWaiting,
/// <summary>
/// 执行生产
/// </summary>
ProduceExecuting,
/// <summary>
/// 暂停生产
/// </summary>
ProducePause,
/// <summary>
/// 完成
/// </summary>
Complete,
/// <summary>
/// 审核完毕
/// </summary>
Finish
}
/// <summary>
/// 工艺流程任务类型
/// </summary>
public enum PLAN_INOUT
{
/// <summary>
/// 入库
/// </summary>
In = 1,
/// <summary>
/// 出库
/// </summary>
Out = 2,
/// <summary>
/// 移库
/// </summary>
Move = 3,
/// <summary>
/// 拣选,回流
/// </summary>
Sort = 4
}
#endregion
#region ------MANAGE------CONTROL
/// <summary>
/// 管理任务类型
/// </summary>
public enum MANAGE_TYPE
{
//入库
IN = 101,
//出库
OUT = 201,
//配盘
BINDING = 301,
//取消配盘
CANCLEBINDING = 302,
//移库
MOVE = 303,
//上架
UP = 401,
//搬运容器上架
UPPALLET = 402,
//下架
DOWN = 501,
//搬运容器下架
DOWNPALLET = 502
}
/// <summary>
/// 任务状态
/// </summary>
public enum MANAGE_STATUS
{
//WaitingSend,
//WaitingExecute,
//Waitting,
//Error,
//Cancel,
//Complete,
//Executing = 10,
//WaitConfirm = 20,
//ConfirmFinish = 30,
/// <summary>
/// 等待发送
/// </summary>
WaitingSend,
/// <summary>
/// 等待执行
/// </summary>
WaitingExecute,
/// <summary>
/// 监控任务获取
/// </summary>
OrderCatched,
/// <summary>
/// 执行中
/// </summary>
Executing,
/// <summary>
/// 调度删除任务
/// </summary>
Cancel,
/// <summary>
/// 设备错误
/// </summary>
Error,
/// <summary>
/// 输送完成
/// </summary>
Complete,
/// <summary>
/// 异常完成
/// </summary>
ExceptionComplete,
/// <summary>
/// 等待确认
/// </summary>
WaitingConfirm,
/// <summary>
/// 任务完成
/// </summary>
LogicFinish,
/// <summary>
/// 逻辑完成异常
/// </summary>
LogicError
}
/// <summary>
/// 控制任务状态
/// </summary>
public enum CONTROL_STATUS
{
/// <summary>
/// 等待
/// </summary>
Wait = 0,
/// <summary>
/// 设备错误
/// </summary>
DeviceError = 3,
/// <summary>
/// 调度已经获取任务
/// </summary>
Control_Readed = 7,
/// <summary>
/// 开始运行
/// </summary>
Runing = 10,
/// <summary>
/// 堆垛机运行
/// </summary>
DeviceRuning = 11,
/// <summary>
/// 调度申请改道
/// </summary>
LterRouteApply = 30,
/// <summary>
/// 管理答复改道申请
/// </summary>
LterRouteReplay = 40,
/// <summary>
/// 异常完成
/// </summary>
TaskAbend = 990,
/// <summary>
/// 任务被删除
/// </summary>
TaskDelete = 900,
/// <summary>
/// 堆垛机的取空处理
/// </summary>
EmptyOutPut = 980,
/// <summary>
/// 堆垛机的送货重需要改路径处理
/// </summary>
RepeatInput = 970,
/// <summary>
/// 任务完成
/// </summary>
Finish = 999
}
/// <summary>
/// 指令申请状态
/// </summary>
public enum CONTROL_APPLY_STATUS
{
/// <summary>
/// 等待
/// </summary>
Waiting = 0,
/// <summary>
/// 读取
/// </summary>
Read = 1,
/// <summary>
/// 完成
/// </summary>
Finish = 2,
/// <summary>
/// 异常
/// </summary>
Error = 3
}
#endregion
#region ------WAREHOUSE
/// <summary>
/// 库区类型
/// </summary>
public enum AREA_TYPE
{
/// <summary>
/// 立库
/// </summary>
LiKu,
/// <summary>
/// 虚拟库/平库
/// </summary>
XuNiKu
}
/// <summary>
/// 货位类型
/// </summary>
public enum CELL_TYPE
{
/// <summary>
/// 货位
/// </summary>
Cell,
/// <summary>
/// 站台/输送台
/// </summary>
Station,
/// <summary>
/// 异常站台/工位
/// </summary>
ErrorStation,
/// <summary>
/// 生产工位
/// </summary>
WorkStation
}
/// <summary>
/// 货位存储类型
/// </summary>
public enum CELL_STORAGE_TYPE
{
/// <summary>
/// 存储单托盘
/// </summary>
SinglePallet,
/// <summary>
/// 存储多托盘
/// </summary>
Multiple
}
/// <summary>
/// 货位类别
/// </summary>
public enum CELL_FORK_TYPE
{
/// <summary>
/// 普通
/// </summary>
Normal,
/// <summary>
/// 双伸
/// </summary>
Double,
/// <summary>
/// 双叉
/// </summary>
Multi
}
/// <summary>
/// 货位任务类型
/// </summary>
public enum CELL_INOUT
{
/// <summary>
/// 入
/// </summary>
In = 1,
/// <summary>
/// 出
/// </summary>
Out = 2,
/// <summary>
/// 可入可出
/// </summary>
InOut = 3
}
/// <summary>
/// 货位存储状态
/// </summary>
public enum CELL_STATUS
{
/// <summary>
/// 满货
/// </summary>
Full,
/// <summary>
/// 有货
/// </summary>
Have,
/// <summary>
/// 无货
/// </summary>
Nohave,
/// <summary>
/// 空托盘
/// </summary>
Pallet,
/// <summary>
/// 异常货位
/// </summary>
Exception,
/// <summary>
/// 禁用
/// </summary>
Forbiden
}
/// <summary>
/// 货位运行状态
/// </summary>
public enum RUN_STATUS
{
/// <summary>
/// 禁用
/// </summary>
Disable,
/// <summary>
/// 待用
/// </summary>
Enable,
/// <summary>
/// 运行
/// </summary>
Run,
/// <summary>
/// 选定
/// </summary>
Selected
}
/// <summary>
/// 任务执行的设备类型
/// </summary>
public enum DEVICE_TYPE
{
/// <summary>
/// 系统设备
/// </summary>
system,
/// <summary>
/// 自动设备
/// </summary>
auto,
/// <summary>
/// AGV设备
/// </summary>
agv
}
#endregion
#region -----PRODUCE
/// <summary>
/// 物料状态
/// </summary>
public enum GOODS_STATUS
{
/// <summary>
/// 待加工
/// </summary>
Waiting = 1,
/// <summary>
/// 执行中
/// </summary>
Executing = 2,
/// <summary>
/// 工序完工
/// </summary>
Finish = 3,
/// <summary>
/// 制件完工
/// </summary>
Complet = 4
}
/// <summary>
/// 工作模式:串行模式或并行模式
/// </summary>
public enum WORK_MODE
{
/// <summary>
/// 串行
/// </summary>
Serial = 1,
/// <summary>
/// 并行
/// </summary>
Parallel = 2
}
/// <summary>
/// 排产状态
/// </summary>
public enum ROUTE_STATUS
{
/// <summary>
/// 等待排产
/// </summary>
Waiting,
/// <summary>
/// 排产执行
/// </summary>
Executing,
/// <summary>
/// 排产暂停
/// </summary>
Pause,
/// <summary>
/// 排产停止
/// </summary>
Stop,
/// <summary>
/// 排产完成
/// </summary>
Finish
}
/// <summary>
/// 工位操作模式
/// </summary>
public enum STATION_OP_MODE
{
/// <summary>
/// 送料模式
/// </summary>
Send = 1,
/// <summary>
/// 生产模式
/// </summary>
Produce = 2,
/// <summary>
/// 回库模式
/// </summary>
Back = 3
}
#endregion
}

14
NewWMSWebAPI/Helper/JsonPolicy.cs

@ -0,0 +1,14 @@
using System.Text.Json;
namespace NewWMSWebAPI.Helper
{
public class JsonPolicy
{
public class UpperCaseNamingPolicy : JsonNamingPolicy
{
public override string ConvertName(string name) =>
name.ToUpper();
}
}
}

92
NewWMSWebAPI/Helper/SnowFlake.cs

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewWMSWebAPI.Helper
{
/// <summary>
/// 雪花算法生成唯一ID
/// </summary>
public class SnowFlake
{
public class SnowflakeIDcreator
{
private static long workerId = 1; //机器ID
private static long twepoch = 68020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳
private static long sequence = 0L;
private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义)
private static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID
private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码
private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数
private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数
private static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成
private static long lastTimestamp = -1L;
private static object lockObj = new object();
/// <summary>
/// 设置机器码
/// </summary>
/// <param name="id">机器码</param>
public static void SetWorkerID(long id)
{
SnowflakeIDcreator.workerId = id;
}
public static long nextId()
{
lock (lockObj)
{
long timestamp = timeGen();
if (lastTimestamp == timestamp)
{ //同一微秒中生成ID
SnowflakeIDcreator.sequence = (SnowflakeIDcreator.sequence + 1) & SnowflakeIDcreator.sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限
if (SnowflakeIDcreator.sequence == 0)
{
//一微妙内产生的ID计数已达上限,等待下一微妙
timestamp = tillNextMillis(lastTimestamp);
}
}
else
{ //不同微秒生成ID
SnowflakeIDcreator.sequence = 0; //计数清0
}
if (timestamp < lastTimestamp)
{ //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过
throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds",
lastTimestamp - timestamp));
}
lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳
long nextId = (timestamp - twepoch << timestampLeftShift) | SnowflakeIDcreator.workerId << SnowflakeIDcreator.workerIdShift | SnowflakeIDcreator.sequence;
return nextId;
}
}
/// <summary>
/// 获取下一微秒时间戳
/// </summary>
/// <param name="lastTimestamp"></param>
/// <returns></returns>
private static long tillNextMillis(long lastTimestamp)
{
long timestamp = timeGen();
while (timestamp <= lastTimestamp)
{
timestamp = timeGen();
}
return timestamp;
}
/// <summary>
/// 生成当前时间戳
/// </summary>
/// <returns></returns>
private static long timeGen()
{
return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
}
}
}
}

49
NewWMSWebAPI/Helper/StringFormat.cs

@ -0,0 +1,49 @@
using System;
namespace NewWMSWebAPI.Helper
{
public class StringFormat
{
public static string GetDateTime()
{
return System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
public static string GetGUID()
{
return System.Guid.NewGuid().ToString();
}
/// <summary>
/// 获得IP地址
/// </summary>
/// <returns></returns>
public static string GetIpAddr()
{
return System.Net.Dns.GetHostAddresses(Environment.MachineName)[0].ToString();
}
/// <summary>
/// 获得计算机名
/// </summary>
/// <returns></returns>
public static string GetHostName()
{
return System.Net.Dns.GetHostName().ToString();
}
public static string GetCurDateTimeString()
{
return System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
/// <summary>
/// 获得日期
/// </summary>
/// <returns></returns>
public static string GetCurDateString()
{
return System.DateTime.Now.ToString("yyyy-MM-dd");
}
}
}

10
NewWMSWebAPI/NewWMSWebAPI.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@ -10,4 +10,12 @@
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EFCoreDatabase\EFCoreDatabase.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="TaskService\" />
</ItemGroup>
</Project>

370
NewWMSWebAPI/TaskService/Implement/ManageHelper.cs

@ -0,0 +1,370 @@
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using EFCoreDatabase.Data;
using EFCoreDatabase.Entities;
using EFCoreDatabase.Repositories.Interface;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NewWMSWebAPI.TaskService.Interface;
namespace NewWMSWebAPI.TaskService.Implement
{
public class ManageHelper : IManageHelper
{
private readonly ILogger<ManageHelper> _logger;
private readonly DmDBContext _context;
private readonly IManageRepository _manageRepository;
private readonly IWhCellRepository _whCellRepository;
private readonly IStorageRepository _storageRepository;
private readonly IControlRepository _controlRepository;
private readonly IControlHisRepository _controlHisRepository;
public ManageHelper(ILogger<ManageHelper> logger, DmDBContext context, IManageRepository manageRepository, IWhCellRepository WhCellRepository, IStorageRepository storageRepository, IControlRepository controlRepository, IControlHisRepository controlHisRepository)
{
_logger = logger;
_context = context;
_manageRepository = manageRepository;
_whCellRepository = WhCellRepository;
_storageRepository = storageRepository;
_controlRepository = controlRepository;
_controlHisRepository = controlHisRepository;
}
/// <summary>
/// 创建移库任务
/// </summary>
/// <param name="mMANAGE_MAIN"></param>
/// <param name="lsMANAGE_LIST"></param>
/// <param name="bTrans"></param>
/// <param name="bCheckStorage"></param>
/// <param name="bComplete"></param>
/// <param name="bAutoSendControl"></param>
/// <param name="sResult"></param>
/// <returns></returns>
public bool ManageMoveTaskCreate(MANAGE_MAIN mMANAGE_MAIN,
List<MANAGE_LIST> lsMANAGE_LIST,
bool bTrans,
bool bComplete,
bool bAutoSendControl,
out string sResult)
{
bool bResult = true;
sResult = string.Empty;
int MANAGE_ID = 0;
if (_manageRepository.GetManageMain("stockBarcode", mMANAGE_MAIN.STOCK_BARCODE) != null)
{
bResult = false;
sResult = string.Format("托盘条码{0}已经存在任务", mMANAGE_MAIN.STOCK_BARCODE);
return bResult;
}
WH_CELL mWH_CELL_START = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID);
WH_CELL mWH_CELL_END = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID);
STORAGE_MAIN storageMain = _storageRepository.GetStorageMainByCellId(mMANAGE_MAIN.START_CELL_ID);
if (storageMain != null)
{
var lsStorageList = _storageRepository.GetStorageLists(storageMain.STORAGE_ID);
bResult = _manageRepository.AddManageMain(mMANAGE_MAIN, out MANAGE_ID);
if (bResult)
{
foreach (var mMANAGE_LIST in lsMANAGE_LIST)
{
mMANAGE_LIST.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID;
_manageRepository.AddManageList(mMANAGE_LIST);
}
}
if (mWH_CELL_START != null)
{
mWH_CELL_START.RUN_STATUS = "Selected";
bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_START);
if (!bResult)
{
sResult = $"更新开始货位{mWH_CELL_START.CELL_CODE}状态错误\n{sResult}";
return false;
}
}
if (mWH_CELL_END != null)
{
mWH_CELL_END.RUN_STATUS = "Selected";
bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_END);
if (!bResult)
{
sResult = $"更新结束货位{mWH_CELL_END.CELL_CODE}状态错误\n{sResult}";
return false;
}
}
if (bAutoSendControl)
{
bResult = ManageDownLoad(mMANAGE_MAIN.STOCK_BARCODE, false, out sResult);
if (!bResult)
{
return bResult;
}
}
}
else
{
//库存出现问题
}
return bResult;
}
private static readonly object locker = new object();
/// <summary>
/// 下达控制任务
/// </summary>
/// <param name="stockBarcode">托盘号</param>
/// <param name="bTrans">事务控制</param>
/// <param name="sResult">结果信息</param>
/// <returns></returns>
public bool ManageDownLoad(string stockBarcode, bool bTrans, out string sResult)
{
bool bResult = true;
sResult = string.Empty;
//tlt20231222:新增WebService接口,调用主程序生成控制任务;保证控制任务生成时,每个线程都保持在一个方法中
//MANAGE_MAIN mMANAGE_MAIN1 = _manageRepository.GetManageMain("stockBarcode", stockBarcode);
//WH_CELL mSTART_CELL1 = _whCellRepository.GetCell(mMANAGE_MAIN1.START_CELL_ID);
//Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//I_ManageServiceClient client = new I_ManageServiceClient();
//ManageDownLoadByInterfaceRequest ControlRequest = new ManageDownLoadByInterfaceRequest();
//ControlRequest.MANAGE_ID = mMANAGE_MAIN1.MANAGE_ID;
//ControlRequest.START_CELL_CODE = mSTART_CELL1.CELL_CODE;
//ControlRequest.bTrans = bTrans;
//var response = client.ManageDownLoadByInterfaceAsync(ControlRequest);
//if (response.Result.ManageDownLoadByInterfaceResult)
//{
// IO_CONTROL mIO_CONTROL = _controlRepository.GetIoControl(mMANAGE_MAIN1.MANAGE_ID);
// _logger.LogInformation(
// $"Create Control task Success! Control_ID {mIO_CONTROL.CONTROL_ID} " +
// $"bucketId:{mIO_CONTROL.STOCK_BARCODE};" +
// $"Start position :{mIO_CONTROL.START_DEVICE_CODE};" +
// $"End position:{mIO_CONTROL.END_DEVICE_CODE};" +
// $"RFID string:{mIO_CONTROL.RF_DATA}\r\n");
// return true;
//}
//else
//{
// //tlt20231222:报错,出现问题
// sResult = response.Result.sResult;
// _logger.LogInformation($"Create Control task Failed! Manage main info {mMANAGE_MAIN1.STOCK_BARCODE};Error message:{sResult}");
// return false;
//}
int END_CELL_ID = 0;
lock(locker)
{
//获取主任务
MANAGE_MAIN mMANAGE_MAIN = _manageRepository.GetManageMain("stockBarcode", stockBarcode);
#region validation
if (null == mMANAGE_MAIN)
{
bResult = false;
sResult = $"Could not find task(bucket number:{stockBarcode})";
return false;
}
if (mMANAGE_MAIN.MANAGE_STATUS == "Error")
{
bResult = false;
sResult = $"Manage task error-{stockBarcode}";
return false;
}
WH_CELL mSTART_CELL = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID);
if (null == mSTART_CELL)
{
bResult = false;
sResult = "Could not find starting position";
return false;
}
WH_CELL mEND_CELL = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID);
if (null == mEND_CELL)
{
bResult = false;
sResult = "Could not find ending position";
return bResult;
}
//tlt20230327:所有的管理任务都不考虑路径状态,因为在接口中无法再次重新生成控制任务
if (!mMANAGE_MAIN.MANAGE_TYPE_CODE.Contains("Manage"))//&& mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManagePreIn"&& mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManagePreOut"&& mMANAGE_MAIN.MANAGE_TYPE_CODE!= "ManageException")
{
bResult = _controlRepository.GetControlRoutes(mSTART_CELL.DEVICE_CODE, mEND_CELL.DEVICE_CODE)
.Count > 0;
if (!bResult)
{
sResult =
$"{mSTART_CELL.CELL_CODE}-{mEND_CELL.CELL_CODE} have no path available,Please check the device status in WCS!";
return false;
}
}
#endregion
////路径校验
//if (mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManageMove")
//{
// bResult = _controlRepository.GetControlRoutes(mSTART_CELL.DEVICE_CODE, mEND_CELL.DEVICE_CODE).Count > 0;
// if (!bResult)
// {
// sResult = $"{mSTART_CELL.CELL_CODE}-{mEND_CELL.CELL_CODE}之间无可用路径,请检查设备状态!";
// return bResult;
// }
//}
MANAGE_LIST bucketList = _manageRepository.GetManageList(mMANAGE_MAIN.MANAGE_ID)[0];
IO_CONTROL mIO_CONTROL = _controlRepository.GetIoControl(mMANAGE_MAIN.MANAGE_ID);
bResult = null == mIO_CONTROL;
if (!bResult)
{
sResult = $"{mMANAGE_MAIN.STOCK_BARCODE}'s control task already exists!";
return bResult;
}
int CONTROL_TASK_TYPE = 0;
mIO_CONTROL = new IO_CONTROL();
string IN_OUT_TYPE = $"{mSTART_CELL.CELL_TYPE}-{mEND_CELL.CELL_TYPE}".ToLower();
switch (IN_OUT_TYPE)
{
case "station-cell"://站台-货位-入
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Up.ToString("d"));
break;
case "cell-station"://货位-站台-出
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Down.ToString("d"));
break;
case "cell-cell"://货位-货位-移
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Move.ToString("d"));
break;
case "station-station"://站台-站台-移
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.MoveStation.ToString("d"));
break;
}
mIO_CONTROL.RELATIVE_CONTROL_ID = -1;
mIO_CONTROL.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID;
mIO_CONTROL.STOCK_BARCODE = mMANAGE_MAIN.STOCK_BARCODE;
//mIO_CONTROL.CELL_GROUP = mEND_CELL.CELL_GROUP;
mIO_CONTROL.CONTROL_TASK_LEVEL = string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_LEVEL) ? "0" : mMANAGE_MAIN.MANAGE_LEVEL;
mIO_CONTROL.PRE_CONTROL_STATUS = string.Empty;
mIO_CONTROL.CONTROL_TASK_TYPE = CONTROL_TASK_TYPE;
mIO_CONTROL.START_DEVICE_CODE = mSTART_CELL.CELL_CODE;
mIO_CONTROL.END_DEVICE_CODE = mEND_CELL.CELL_CODE;
mIO_CONTROL.CONTROL_BEGIN_TIME = Helper.StringFormat.GetCurDateTimeString();//当前系统时间
//单叉状态25 双叉状态0 string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_FORK) || !mMANAGE_MAIN.MANAGE_FORK.Equals("1") ? 0 : 25;
if (!string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_LEVEL) && mMANAGE_MAIN.MANAGE_LEVEL.Trim().Equals("fabricate_waiting_for_earlier_request_finishing"))
{
mIO_CONTROL.CONTROL_STATUS = 1024;
}
else
{
mIO_CONTROL.CONTROL_STATUS = mMANAGE_MAIN.MANAGE_REMARK == "Block" ? 233 : 0;
}
mIO_CONTROL.CONTROL_REMARK = mMANAGE_MAIN.MANAGE_REMARK;//出库任务用来传输最终站台
mIO_CONTROL.START_WAREHOUSE_CODE = "1";
mIO_CONTROL.END_WAREHOUSE_CODE = "1";
mIO_CONTROL.CELL_GROUP = "0";
mIO_CONTROL.RF_DATA = "0";
mIO_CONTROL.UNLOADING_TASK_COUNT = Convert.ToInt32(bucketList.GOODS_PROPERTY8);//tlt20230717:设置当前的出库任务数量
//mIO_CONTROL.CONTROL_REMARK = bucketList.BUCKET_TRANSACTION_NUMBER;
//添加控制任务
bResult = _controlRepository.AddIoControl(mIO_CONTROL);
if (bResult)
{
_logger.LogInformation(
$"Create Control task Success! Control_ID {mIO_CONTROL.CONTROL_ID} " +
$"bucketId:{mIO_CONTROL.STOCK_BARCODE};" +
$"Start position :{mIO_CONTROL.START_DEVICE_CODE};" +
$"End position:{mIO_CONTROL.END_DEVICE_CODE};" +
$"RFID string:{mIO_CONTROL.RF_DATA}\r\n");
mMANAGE_MAIN.MANAGE_STATUS = Helper.MANAGE_STATUS.WaitingExecute.ToString();
mMANAGE_MAIN.MANAGE_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
_manageRepository.UpdateManageMain(mMANAGE_MAIN);
}
else
{
_logger.LogInformation(
$"Create Control task Failed! Control_ID {mIO_CONTROL.CONTROL_ID} " +
$"bucketId:{mIO_CONTROL.STOCK_BARCODE};" +
$"Start position :{mIO_CONTROL.START_DEVICE_CODE};" +
$"End position:{mIO_CONTROL.END_DEVICE_CODE};" +
$"RFID string:{mIO_CONTROL.RF_DATA}\r\n");
}
return true;
}
}
}
}

462
NewWMSWebAPI/TaskService/Implement/ManagePreOut.cs

@ -0,0 +1,462 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using Michelin_WebAPI.Data;
using Michelin_WebAPI.Entities;
using Michelin_WebAPI.Repositories.Interface;
using Michelin_WebAPI.TaskServices.Interface;
using Microsoft.EntityFrameworkCore.Storage;
using System.Linq;
using AutoMapper;
using Microsoft.Extensions.Logging;
using Michelin_WebAPI.Helper;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
namespace Michelin_WebAPI.TaskServices.Implement
{
public class ManagePreOut:IManagePreOut
{
private readonly MichelinDBContext _context;
private readonly IMapper _mapper;
private readonly IManageRepository _manageRepository;
private readonly IWhCellRepository _whCellRepository;
private readonly IStorageRepository _storageRepository;
private readonly IManageHelper _manageHelper;
private readonly ILogger<ManagePreOut> _logger;
public ManagePreOut(IManageRepository manageRepository, IWhCellRepository whCellRepository, IStorageRepository storageRepository, IManageHelper manageHelper, MichelinDBContext context, IMapper mapper, ILogger<ManagePreOut> logger)
{
_manageRepository = manageRepository;
_whCellRepository = whCellRepository;
_storageRepository = storageRepository;
_manageHelper = manageHelper;
_context = context;
_mapper = mapper;
_logger = logger;
}
public bool FabricateListCreate(List<MANAGE_MAIN> manageMains, out string sResult)
{
//检查当前的manageMains中的雪花ID是否为同一个
var snowFlakeList = manageMains.Select(x => x.BUCKET_GROUP).Distinct();
//tlt20231211:当前雪花ID有问题:需要进行重新赋值,将所有的雪花ID重新赋值
if (snowFlakeList.Any())
{
_logger.LogInformation($"1.ManageMains with old bucket_group number :{JsonConvert.SerializeObject(snowFlakeList)}");
var bucketGroup = SnowFlake.SnowflakeIDcreator.nextId().ToString();
foreach (var manageMain in manageMains)
{
manageMain.BUCKET_GROUP = bucketGroup;
}
_logger.LogInformation($"2.Because the bucket_group number is not same, Modified the Bucket_Group number :{bucketGroup};ManageMains :{JsonConvert.SerializeObject(manageMains.Select(x => new { x.STOCK_BARCODE, x.BUCKET_GROUP }).Distinct())} ");
}
bool bResult = true;
sResult = string.Empty;
var transaction = _context.Database.BeginTransaction();
try
{
foreach (var manageMain in manageMains)
{
var bucketMain =
_storageRepository.GetStorageMainByBucket(manageMain.STOCK_BARCODE);
var bucketLists = _storageRepository.GetStorageLists(bucketMain.STORAGE_ID);
var lstManageList = new List<MANAGE_LIST>();
//根据autoMapper映射变量信息
lstManageList.AddRange(bucketLists.Select(storageList => _mapper.Map<MANAGE_LIST>(storageList)));
//tlt20230717:设置GOODS_PROPERTY8为本次出库桶数量
foreach (var manageList in lstManageList)
{
manageList.GOODS_PROPERTY8 = manageMains.Count.ToString();
}
bResult = ManageCreate(manageMain, lstManageList, false, true, false, out sResult);
if (!bResult)
break;
}
}
catch (Exception ex)
{
bResult = false;
Console.WriteLine(ex.Message);
sResult = ex.Message;
_logger.LogError($"FabricateListCreate Exception:{ex.Message}");
}
finally
{
if (bResult)
{
transaction.Commit();
}
else
{
transaction.Rollback();
}
}
return bResult;
}
public bool ManageCreate(MANAGE_MAIN mMANAGE_MAIN,
List<MANAGE_LIST> lsMANAGE_LIST,
bool bTrans,
bool bAutoSendControl,
bool bComplete, out string sResult)
{
bool bResult = true;
sResult = string.Empty;
int MANAGE_ID = 0;
WH_CELL mWH_CELL_START = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID);
WH_CELL mWH_CELL_END = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID);
try
{
_manageRepository.AddManageMain(mMANAGE_MAIN, out var manage_id);
foreach (var mMANAGE_LIST in lsMANAGE_LIST)
{
mMANAGE_LIST.MANAGE_ID = manage_id;
mMANAGE_LIST.PLAN_LIST_ID = 0;
_manageRepository.AddManageList(mMANAGE_LIST);
}
if (mWH_CELL_START != null)
{
mWH_CELL_START.RUN_STATUS = "Selected";
bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_START);
if (!bResult)
{
sResult = $"Update start position {mWH_CELL_START.CELL_CODE}status error\n{sResult}";
return false;
}
}
if (mWH_CELL_END != null)
{
mWH_CELL_END.RUN_STATUS = "Selected";
bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_END);
if (!bResult)
{
sResult = $"Update end position {mWH_CELL_END.CELL_CODE} status error\n{sResult}";
return false;
}
}
MANAGE_ID = mMANAGE_MAIN.MANAGE_ID;
//当出库任务为主库区,并且是立库区
if (mWH_CELL_START is {WAREHOUSE_ID: 1, AREA_ID: 1})
{
//倒库逻辑:
//tlt:判断预留倒库货位是否有货
//首先判断当前出库货位是否为远端货位
if (mWH_CELL_START.CELL_FORK_TYPE == "Far")
{
//判断近端是否有货:通过CELL_GROUP来判断当前货位的近端货位状态
WH_CELL dtCell = _context.Wh_Cell.FirstOrDefault(x =>
x.CELL_CODE != mWH_CELL_START.CELL_CODE && x.CELL_GROUP == mWH_CELL_START.CELL_CODE && x.CELL_FORK_TYPE == "Near" && x.CELL_STATUS != "Nohave");
//近端货位有货
if ( dtCell!=null)
{
//近端托盘判断:是否有任务存在
if (dtCell.RUN_STATUS != "Selected")
{
//无任务存在就要执行移库操作
//创建移库管理任务
MANAGE_MAIN mManageMain = new MANAGE_MAIN();
List<MANAGE_LIST> lstManageList = new List<MANAGE_LIST>();
//获取库存主信息
STORAGE_MAIN sStorageMain = _storageRepository.GetStorageMainByCellId(dtCell.CELL_ID);
List<STORAGE_LIST> tempStorageList;
if (sStorageMain != null)
{
tempStorageList = _storageRepository.GetStorageLists(sStorageMain.STORAGE_ID);
}
else
{
//错误:未找到库存信息
sResult = "未找到近端库存信息";
bResult = false;
return false;
}
//添加管理任务
mManageMain.STOCK_BARCODE = sStorageMain.STOCK_BARCODE;
mManageMain.MANAGE_STATUS = "WaitingSend";
mManageMain.MANAGE_TYPE_CODE = "ManageMove";
mManageMain.MANAGE_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
mManageMain.START_CELL_ID = sStorageMain.CELL_ID;
//终止货位获取:根据货货位分配原则来进行分配
bool tResult = GetMoveEndPosition(dtCell, out int endCellId);
//当前巷道预留倒库货位
if (tResult)
{
mManageMain.END_CELL_ID = endCellId;
}
else
{
//无可用货位
sResult = "未找到倒库货位,无法倒库";
bResult = false;
return false;
}
mManageMain.MANAGE_OPERATOR = "AutoMove";
mManageMain.MANAGE_LEVEL = string.Empty;
mManageMain.MANAGE_REMARK = string.Empty;
//tlt20220629:新属性添加
mManageMain.WEIGHT_PALLET = sStorageMain.WEIGHT_PALLET;
mManageMain.PG_CODE = sStorageMain.PG_CODE;
mManageMain.TRANSACTION_NUMBER = sStorageMain.TRANSACTION_NUMBER;
mManageMain.BUCKET_NUMBER = sStorageMain.BUCKET_NUMBER;
mManageMain.BUCKET_GROUP = sStorageMain.BUCKET_GROUP;
mManageMain.OperationRequestID = sStorageMain.OperationRequestID;
mManageMain.OperationToExecuteID = sStorageMain.OperationToExecuteID;
mManageMain.VirtualNameMachinePalletizer = sStorageMain.VirtualNameMachinePalletizer;
mManageMain.MFDCode = sStorageMain.MFDCode;
mManageMain.MATIND = sStorageMain.MATIND;
mManageMain.NIP = sStorageMain.NIP;
mManageMain.IMP = sStorageMain.IMP;
mManageMain.ItemIdentification = sStorageMain.ItemIdentification;
mManageMain.ItemTraceability = sStorageMain.ItemTraceability;
mManageMain.ItemHdvDate = sStorageMain.ItemHdvDate;
mManageMain.ItemHdvTime = sStorageMain.ItemHdvTime;
mManageMain.ItemFabricationDate = sStorageMain.ItemFabricationDate;
mManageMain.ItemFabricationTime = sStorageMain.ItemFabricationTime;
//添加list
foreach (STORAGE_LIST mSTORAGE_LIST in tempStorageList)
{
//根据映射关系添加信息
var mManageList = _mapper.Map<MANAGE_LIST>(mSTORAGE_LIST);
////////////////////////////////////////////////////////////////////
lstManageList.Add(mManageList);
}
//根据终止节点下移库任务
bResult = _manageHelper.ManageMoveTaskCreate(mManageMain,
lstManageList,
false,
false,
true, out sResult);
}
}
else //无货的情况下,查看货位状态
{
//查看近端货位是否有入库任务
WH_CELL dtCELL = _context.Wh_Cell.First(x => x.CELL_GROUP == mWH_CELL_START.CELL_CODE &&
x.CELL_FORK_TYPE == "Near" &&
x.WAREHOUSE_ID == mWH_CELL_START.WAREHOUSE_ID);
if (dtCELL.RUN_STATUS == "Selected")
{
MANAGE_MAIN manageMain =
_context.Manage_Main.FirstOrDefault(x => x.END_CELL_ID == dtCELL.CELL_ID);
if (manageMain != null)
{
mMANAGE_MAIN.MANAGE_REMARK = "Block";
_manageRepository.UpdateManageMain(mMANAGE_MAIN);
}
}
}
}
if (bAutoSendControl)
{
bResult = _manageHelper.ManageDownLoad(mMANAGE_MAIN.STOCK_BARCODE, false, out sResult);
}
if (!bResult)
{
return false;
}
}
sResult = $"Bucket {mMANAGE_MAIN.STOCK_BARCODE} create the unloading task success!";
}
catch (Exception ex)
{
bResult = false;
sResult = ex.Message;
}
//finally
//{
// if (bResult)
// {
// transaction.Commit();
// }
// else
// {
// transaction.Rollback();
// }
//}
return bResult;
}
/// <summary>
/// 获取移库货位
/// </summary>
/// <param name="dtCell"></param>
/// <param name="endCellId"></param>
/// <returns></returns>
public bool GetMoveEndPosition(WH_CELL dtCell, out int endCellId)
{
_logger.LogInformation($"Function:GetMoveEndPosition; start cell code:{dtCell.CELL_CODE};the begin time:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}");
endCellId = 0;
#region 旧逻辑
//var list = _context.Reserve_Cell.Where(y => y.DEVICE_CODE == dtCell.DEVICE_CODE).ToList();
//var nearList = _context.Wh_Cell.Where(y => y.CELL_STATUS == "Nohave" && y.RUN_STATUS == "Enable" && y.CELL_FORK_TYPE == "Near" && y.WAREHOUSE_ID == dtCell.WAREHOUSE_ID && y.DEVICE_CODE == dtCell.DEVICE_CODE).ToList();
//whCells = _context.Wh_Cell.Where(x =>
// x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Far" &&
// x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" &&
// x.CELL_STORAGE_TYPE == "SinglePallet" && !list.Select(y => y.CELL_CODE).Contains(x.CELL_CODE) && nearList.Select(z => z.CELL_CODE).Contains(x.CELL_GROUP))
// .OrderBy(y => y.CELL_Y)
// .ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList();
//tlt20240109:替换获取货位逻辑
//var whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID,CELL_CODE,CELL_GROUP
// FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}'
// AND CELL_FORK_TYPE = 'Near'
// AND CELL_STATUS = 'Nohave'
// AND RUN_STATUS = 'Enable'
// AND CELL_TYPE = 'Cell'
// AND CELL_STORAGE_TYPE = 'SinglePallet'
// AND CELL_ID NOT IN ( SELECT CELL_ID FROM RESERVE_CELL )
// AND CELL_GROUP IN ( SELECT CELL_CODE FROM V_STORAGE_LIST WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND RUN_STATUS = 'Enable' AND CELL_STATUS = 'Full' AND CELL_FORK_TYPE = 'Far' )
// ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList();
#endregion
var whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID, WAREHOUSE_ID,AREA_ID,LOGIC_ID,CELL_NAME,CELL_CODE,CELL_TYPE,DEVICE_CODE,CELL_Z,CELL_X,CELL_Y,CELL_INOUT,CELL_MODEL,CELL_STATUS,RUN_STATUS,CELL_FORK_TYPE,CELL_LOGICAL_NAME,LANE_WAY,CELL_GROUP,SHELF_TYPE,SHELF_NEIGHBOUR,CELL_STORAGE_TYPE,LOCK_DEVICE_CODE,CELL_WIDTH,CELL_HEIGHT,LOCK_CELL_ID,BELONG_AREA,BELONG_ZCQ_ID,CELL_FLAG,CELL_TRANS_FLAG
FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}'
AND CELL_FORK_TYPE = 'Far'
AND CELL_STATUS = 'Nohave'
AND RUN_STATUS = 'Enable'
AND CELL_TYPE = 'Cell'
AND CELL_STORAGE_TYPE = 'SinglePallet'
AND CELL_ID NOT IN ( SELECT CELL_ID FROM RESERVE_CELL )
AND CELL_CODE IN ( SELECT CELL_GROUP FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND RUN_STATUS = 'Enable' AND CELL_STATUS = 'Nohave' AND CELL_FORK_TYPE = 'Near' )
ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList();
#region 旧逻辑
//Where(x =>
// x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Far" &&
// x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" &&
// x.CELL_STORAGE_TYPE == "SinglePallet" && !list.Select(y => y.CELL_ID).Contains(x.CELL_ID) && nearList.Select(z => z.CELL_CODE).Contains(x.CELL_GROUP))
//.OrderBy(y => y.CELL_Y)
//.ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList();
#endregion
//tlt20240109:选择远端有货且无任务,近端无货的货位
if (whCells.Count > 0)
{
//返回数值
string temp = whCells[0].CELL_CODE;
endCellId = whCells[0].CELL_ID;//返回第一个符合条件的数值
}
else
{
#region 旧逻辑
//var farList = _context.Wh_Cell.Where(y => y.CELL_STATUS == "Full" && y.RUN_STATUS == "Enable" && y.CELL_FORK_TYPE == "Far" && y.WAREHOUSE_ID == dtCell.WAREHOUSE_ID && y.DEVICE_CODE == dtCell.DEVICE_CODE).ToList();
//whCells = _context.Wh_Cell.Where(x =>
// x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Near" &&
// x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" &&
// x.CELL_STORAGE_TYPE == "SinglePallet" && !list.Select(y => y.CELL_CODE).Contains(x.CELL_CODE) && farList.Select(z => z.CELL_CODE).Contains(x.CELL_GROUP))
// .OrderBy(y => y.CELL_Y).ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList();
#endregion
//获取远端有货,近端无货的货位,远端存在同属性货位
whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID, WAREHOUSE_ID,AREA_ID,LOGIC_ID,CELL_NAME,CELL_CODE,CELL_TYPE,DEVICE_CODE,CELL_Z,CELL_X,CELL_Y,CELL_INOUT,CELL_MODEL,CELL_STATUS,RUN_STATUS,CELL_FORK_TYPE,CELL_LOGICAL_NAME,LANE_WAY,CELL_GROUP,SHELF_TYPE,SHELF_NEIGHBOUR,CELL_STORAGE_TYPE,LOCK_DEVICE_CODE,CELL_WIDTH,CELL_HEIGHT,LOCK_CELL_ID,BELONG_AREA,BELONG_ZCQ_ID,CELL_FLAG,CELL_TRANS_FLAG
FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}'
AND CELL_FORK_TYPE = 'Near'
AND CELL_STATUS = 'Nohave'
AND RUN_STATUS = 'Enable'
AND CELL_TYPE = 'Cell'
AND CELL_STORAGE_TYPE = 'SinglePallet'
AND CELL_ID NOT IN ( SELECT CELL_ID FROM RESERVE_CELL )
AND CELL_GROUP IN ( SELECT CELL_CODE FROM V_STORAGE_LIST WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND RUN_STATUS = 'Enable' AND CELL_STATUS = 'Full' AND CELL_FORK_TYPE = 'Far' )
ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList();
if (whCells.Count > 0)
{
endCellId = whCells[0].CELL_ID;//返回第一个符合条件的数值
}
else
{
#region 旧逻辑
//whCells = _context.Wh_Cell.Where(x =>
// x.DEVICE_CODE == dtCell.DEVICE_CODE && x.CELL_FORK_TYPE == "Near" &&
// x.CELL_STATUS == "Nohave" && x.RUN_STATUS == "Enable" && x.CELL_TYPE == "Cell" &&
// x.CELL_STORAGE_TYPE == "SinglePallet" && list.Select(y => y.CELL_CODE).Contains(x.CELL_CODE))
// .OrderBy(y => y.CELL_Y).ThenByDescending(z => z.CELL_X).ThenBy(w => w.CELL_Z).ToList();
#endregion
//选取本巷道的预留货位
whCells = _context.Wh_Cell.FromSqlRaw($@"SELECT CELL_ID, WAREHOUSE_ID,AREA_ID,LOGIC_ID,CELL_NAME,CELL_CODE,
CELL_TYPE,DEVICE_CODE,CELL_Z,CELL_X,CELL_Y,CELL_INOUT,CELL_MODEL,
CELL_STATUS,RUN_STATUS,CELL_FORK_TYPE,CELL_LOGICAL_NAME,LANE_WAY,
CELL_GROUP,SHELF_TYPE,SHELF_NEIGHBOUR,CELL_STORAGE_TYPE,LOCK_DEVICE_CODE,
CELL_WIDTH,CELL_HEIGHT,LOCK_CELL_ID,BELONG_AREA,BELONG_ZCQ_ID,CELL_FLAG,CELL_TRANS_FLAG
FROM WH_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}'
AND CELL_FORK_TYPE = 'Near'
AND CELL_STATUS = 'Nohave'
AND RUN_STATUS = 'Enable'
AND CELL_TYPE = 'Cell'
AND CELL_STORAGE_TYPE = 'SinglePallet'
AND CELL_ID IN ( SELECT CELL_ID FROM RESERVE_CELL WHERE DEVICE_CODE = '{dtCell.DEVICE_CODE}' AND FLAG = 1 )
ORDER BY CELL_Y,CELL_X DESC, CELL_Z").ToList();
if (whCells.Count > 0)
{
endCellId = whCells[0].CELL_ID;//返回第一个符合条件的数值
}
else
{
//报错:当前巷道无可用倒库货位
return false;
}
}
}
_logger.LogInformation($"Function:GetMoveEndPosition; start cell code:{dtCell.CELL_CODE};end cell code:{whCells[0]?.CELL_CODE};the end time:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}");
return true;
}
}
}

19
NewWMSWebAPI/TaskService/Interface/IManageHelper.cs

@ -0,0 +1,19 @@
using System.Collections.Generic;
using EFCoreDatabase.Entities;
namespace NewWMSWebAPI.TaskService.Interface
{
public interface IManageHelper
{
public bool ManageMoveTaskCreate(MANAGE_MAIN mMANAGE_MAIN,
List<MANAGE_LIST> lsMANAGE_LIST,
bool bTrans,
bool bComplete,
bool bAutoSendControl,
out string sResult);
public bool ManageDownLoad(string stockBarcode, bool bTrans, out string sResult);
}
}

13
NewWMSWebAPI/TaskService/Interface/IManagePreOut.cs

@ -0,0 +1,13 @@
using System.Collections.Generic;
using Michelin_WebAPI.Entities;
namespace Michelin_WebAPI.TaskServices.Interface
{
public interface IManagePreOut
{
public bool FabricateListCreate(List<MANAGE_MAIN> manageMains,out string sResult);
public bool ManageCreate(MANAGE_MAIN mMANAGE_MAIN, List<MANAGE_LIST> lsMANAGE_LIST, bool bTrans,
bool bAutoSendControl, bool bComplete, out string sResult);
}
}
Loading…
Cancel
Save