11 changed files with 1702 additions and 2 deletions
@ -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; |
|||
} |
|||
} |
|||
|
|||
} |
@ -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
|
|||
} |
@ -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(); |
|||
|
|||
} |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
@ -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"); |
|||
} |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
@ -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; |
|||
} |
|||
|
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -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…
Reference in new issue