diff --git a/WCS.BLL/Config/JsConfig.cs b/WCS.BLL/Config/JsConfig.cs
index 7390edf..83b67ab 100644
--- a/WCS.BLL/Config/JsConfig.cs
+++ b/WCS.BLL/Config/JsConfig.cs
@@ -18,6 +18,18 @@ namespace WCS.BLL.Config
///
public bool IsSameMatCodeOut { get; set; }
///
+ /// 数据-数据库路径
+ ///
+ public string DataDbPath { get; set; }
+ ///
+ /// 日志-数据库路径
+ ///
+ public string LogDbPath { get; set; }
+ ///
+ /// 权限-数据库路径
+ ///
+ public string AuthDbPath { get; set; }
+ ///
/// 是否接入WMS系统
///
public bool IsAccessWMS { get; set; }
@@ -25,5 +37,26 @@ namespace WCS.BLL.Config
/// WMS系统
///
public string? WMSUrl { get; set; }
+
+ public bool IsResetDBOrTable { get; set; }
+ #region 盟讯公司后台配置
+ public bool IsMx { get; set; }
+ ///
+ /// 回传Mes入库/移库
+ ///
+ public string InputStockInStr { get; set; }
+ ///
+ /// 回传Mes出库
+ ///
+ public string BunkerOutStr { get; set; }
+ ///
+ /// 通过条码查询物料信息接口
+ ///
+ public string QueryBybar { get; set; }
+ ///
+ /// 后台配置的组别
+ ///
+ public string GroupName { get; set; }
+ #endregion
}
}
diff --git a/WCS.BLL/Config/LocalStatic.cs b/WCS.BLL/Config/LocalStatic.cs
new file mode 100644
index 0000000..fc33ce1
--- /dev/null
+++ b/WCS.BLL/Config/LocalStatic.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.BLL.Config
+{
+ public static class LocalStatic
+ {
+ ///
+ /// 0x02绿色 0x04蓝色
+ ///
+ public static byte CurrentOutStoreColor = 0x02;
+ }
+}
diff --git a/WCS.BLL/DbModels/DingDingSendUser.cs b/WCS.BLL/DbModels/DingDingSendUser.cs
new file mode 100644
index 0000000..d19c848
--- /dev/null
+++ b/WCS.BLL/DbModels/DingDingSendUser.cs
@@ -0,0 +1,19 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.BLL.DbModels
+{
+ [SugarTable("ding_ding_send_user")]
+ public class DingDingSendUser
+ {
+ ///
+ /// 工号
+ ///
+ [SugarColumn(ColumnName = "user_name", Length = 50, IsNullable = true, ColumnDescription = "创建人")]
+ public string UserName { get; set; }
+ }
+}
diff --git a/WCS.BLL/DbModels/DocumentSerialNumber.cs b/WCS.BLL/DbModels/DocumentSerialNumber.cs
index c5efd11..1860f35 100644
--- a/WCS.BLL/DbModels/DocumentSerialNumber.cs
+++ b/WCS.BLL/DbModels/DocumentSerialNumber.cs
@@ -12,7 +12,7 @@ namespace WCS.BLL.DbModels
///
/// 用于记录单据生成到哪个序号了
///
- [SugarTable("document_serial_number")]
+ [SugarTable("wcs_document_serial_number")]
public class DocumentSerialNumber
{
///
diff --git a/WCS.BLL/DbModels/InOutRecord.cs b/WCS.BLL/DbModels/InOutRecord.cs
index 08014b8..080816f 100644
--- a/WCS.BLL/DbModels/InOutRecord.cs
+++ b/WCS.BLL/DbModels/InOutRecord.cs
@@ -12,7 +12,7 @@ namespace WCS.BLL.DbModels
///
/// 出入库记录
///
- [SugarTable("in_out_record")]
+ [SugarTable("wcs_in_out_record")]
public class InOutRecord
{
///
@@ -115,6 +115,33 @@ namespace WCS.BLL.DbModels
[SugarColumn(ColumnName = "operate_user", Length = 100, IsNullable = true, ColumnDescription = "创建人")]
public string OperateUser { get; set; }
+ ///
+ /// 串联绑定后的大货架编码
+ ///
+ [SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
+ public string? BigShelfCode { get; set; } = string.Empty;
+ ///
+ /// Row 行
+ ///
+ [SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")]
+ public string R { get; set; }
+ ///
+ /// Column 列
+ ///
+ [SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")]
+ public string C { get; set; }
+ ///
+ /// Column 位
+ ///
+ [SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")]
+ public string Wei { get; set; }
+
+ ///
+ /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
+ ///
+ [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
+ public string GroupName { get; set; }
+
///
/// 序号
///
diff --git a/WCS.BLL/DbModels/InventoryDetail.cs b/WCS.BLL/DbModels/InventoryDetail.cs
index 3707137..93ddf90 100644
--- a/WCS.BLL/DbModels/InventoryDetail.cs
+++ b/WCS.BLL/DbModels/InventoryDetail.cs
@@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
///
/// 库存明细表
///
- [SugarTable("inventory_detail")]
+ [SugarTable("wcs_inventory_detail")]
public class InventoryDetail
{
///
@@ -102,7 +102,38 @@ namespace WCS.BLL.DbModels
///
[SugarColumn(ColumnName = "is_locked", IsNullable = false, ColumnDescription = "物料是否已被锁定")]
public bool IsLocked { get; set; } = false;
+ ///
+ /// 串联绑定后的大货架编码
+ ///
+ [SugarColumn(ColumnName = "big_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
+ public string? BigShelfCode { get; set; } = string.Empty;
+ ///
+ /// Row 行
+ ///
+ [SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")]
+ public string R { get; set; }
+ ///
+ /// Column 列
+ ///
+ [SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")]
+ public string C { get; set; }
+ ///
+ /// Column 位
+ ///
+ [SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")]
+ public string Wei { get; set; }
+ ///
+ /// WarehouseCode 仓库代码
+ ///
+ [SugarColumn(ColumnName = "WarehouseCode", Length = 10, IsNullable = true, ColumnDescription = "仓库代码")]
+ public string WarehouseCode { get; set; }
+
+ ///
+ /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
+ ///
+ [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
+ public string GroupName { get; set; }
///
/// 序号
///
diff --git a/WCS.BLL/DbModels/MatBaseInfo.cs b/WCS.BLL/DbModels/MatBaseInfo.cs
index 6f234ae..2b1b4a4 100644
--- a/WCS.BLL/DbModels/MatBaseInfo.cs
+++ b/WCS.BLL/DbModels/MatBaseInfo.cs
@@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
///
///物料基础信息
///
- [SugarTable("mat_base_info")]
+ [SugarTable("wcs_mat_base_info")]
public partial class MatBaseInfo
{
///
diff --git a/WCS.BLL/DbModels/MatInfo.cs b/WCS.BLL/DbModels/MatInfo.cs
index 9c392f7..896f613 100644
--- a/WCS.BLL/DbModels/MatInfo.cs
+++ b/WCS.BLL/DbModels/MatInfo.cs
@@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
///
///物料信息表
///
- [SugarTable("mat_info")]
+ [SugarTable("wcs_mat_info")]
public class MatInfo
{
///
diff --git a/WCS.BLL/DbModels/ModuleInfo.cs b/WCS.BLL/DbModels/ModuleInfo.cs
index 59eeedc..77d31c6 100644
--- a/WCS.BLL/DbModels/ModuleInfo.cs
+++ b/WCS.BLL/DbModels/ModuleInfo.cs
@@ -11,7 +11,7 @@ namespace WCS.DAL.DbModels
///
///模组信息表
///
- [SugarTable("module_info")]
+ [SugarTable("wcs_module_info")]
public class ModuleInfo
{
@@ -27,6 +27,12 @@ namespace WCS.DAL.DbModels
[SugarColumn(ColumnName = "module_code", Length = 50, IsNullable = false, ColumnDescription = "模组编码")]
public string ModuleCode { get; set; }
+ ///
+ /// 货架类型Id
+ ///
+ [SugarColumn(ColumnName = "shelf_type_id", IsNullable = false,DefaultValue ="0", ColumnDescription = "货架类型Id")]
+ public int ShelfTypeId { get; set; }
+
///
/// 货架Id
///
@@ -56,7 +62,11 @@ namespace WCS.DAL.DbModels
///
[SugarColumn(ColumnName = "client_ip", Length = 50, IsNullable = false, ColumnDescription = "货架对应Can模块的Ip")]
public string CleintIp { get; set; }
-
+ ///
+ /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
+ ///
+ [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
+ public string GroupName { get; set; }
///
/// R 行
///
diff --git a/WCS.BLL/DbModels/OrderLight.cs b/WCS.BLL/DbModels/OrderLight.cs
index 21fa02a..2d55396 100644
--- a/WCS.BLL/DbModels/OrderLight.cs
+++ b/WCS.BLL/DbModels/OrderLight.cs
@@ -20,7 +20,7 @@ namespace WCS.BLL.DbModels
///
/// 出库单据号
///
- [SugarColumn(ColumnName = "order_number", Length = 50, IsNullable = false, ColumnDescription = "出库单据号")]
+ [SugarColumn(ColumnName = "order_number", Length = 50, IsNullable = true, ColumnDescription = "出库单据号")]
public string OrderNumber { get; set; }
///
diff --git a/WCS.BLL/DbModels/OutOrder.cs b/WCS.BLL/DbModels/OutOrder.cs
index ae62913..aa8c4a3 100644
--- a/WCS.BLL/DbModels/OutOrder.cs
+++ b/WCS.BLL/DbModels/OutOrder.cs
@@ -6,7 +6,7 @@ namespace WCS.BLL.DbModels
///
/// 出库单据
///
- [SugarTable("out_order")]
+ [SugarTable("wcs_out_order")]
public class OutOrder
{
///
@@ -49,15 +49,25 @@ namespace WCS.BLL.DbModels
///
/// 单据同步类型
///
- [SugarColumn(ColumnName = "sync_type",IsNullable = false, ColumnDescription = "单据同步类型:ByMatCode,ByMatSn")]
+ [SugarColumn(ColumnName = "sync_type", IsNullable = false, ColumnDescription = "单据同步类型:ByMatCode,ByMatSn")]
public SyncTypeEnum SyncType { get; set; }
+ ///
+ /// 货架类型名称
+ ///
+ [SugarColumn(ColumnName = "shelf_type_name", Length = 50, IsNullable = false, ColumnDescription = "货架类型名称")]
+ public string ShelfTypeName { get; set; }
+ ///
+ /// 货架类型Id
+ ///
+ [SugarColumn(ColumnName = "shelf_type_id", IsNullable = false, DefaultValue = "0", ColumnDescription = "货架类型Id")]
+ public int ShelfTypeId { get; set; } = 0;
///
- /// 单据货架类型 : 单灯单据还是货架单据
- ///
- [SugarColumn(ColumnName = "shelf_type", IsNullable = false, ColumnDescription = "货架类型 是信息化货架还是智能货架")]
- public ShelfTypeEnum ShelfType { get; set; }
+ /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
+ ///
+ [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
+ public string GroupName { get; set; } = string.Empty;
///
/// 创建时间
@@ -71,6 +81,12 @@ namespace WCS.BLL.DbModels
[SugarColumn(ColumnName = "create_user", Length = 100, IsNullable = true, ColumnDescription = "操作员")]
public string CreateUser { get; set; }
+ ///
+ /// 是否是盟讯公司盘点生成的出库单
+ ///
+ [SugarColumn(ColumnName = "is_MXPD", IsNullable = true, ColumnDescription = "是否是盟讯公司盘点生成的出库单")]
+ public bool? IsMXPD { get; set; } = false;
+
///
/// 用于绑定DataGrid中是否选择
///
@@ -82,6 +98,12 @@ namespace WCS.BLL.DbModels
///
[SugarColumn(IsIgnore = true)]
public int RowNumber { get; set; }
+
+ ///
+ /// 返回当前是否正在进行出库
+ ///
+ [SugarColumn(IsIgnore = true)]
+ public bool IsOuting { get; set; } = false;
}
}
diff --git a/WCS.BLL/DbModels/OutOrderDetail.cs b/WCS.BLL/DbModels/OutOrderDetail.cs
index 73550b5..477c0e1 100644
--- a/WCS.BLL/DbModels/OutOrderDetail.cs
+++ b/WCS.BLL/DbModels/OutOrderDetail.cs
@@ -6,7 +6,7 @@ namespace WCS.BLL.DbModels
///
/// 出库单据明细表
///
- [SugarTable("out_order_detail")]
+ [SugarTable("wcs_out_order_detail")]
public class OutOrderDetail
{
///
diff --git a/WCS.BLL/DbModels/OutOrderMatDetail.cs b/WCS.BLL/DbModels/OutOrderMatDetail.cs
index 84e1fa5..4061dca 100644
--- a/WCS.BLL/DbModels/OutOrderMatDetail.cs
+++ b/WCS.BLL/DbModels/OutOrderMatDetail.cs
@@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
///
/// 出库物料明细(库存数据加锁后缓存对应的数据并记录状态)
///
- [SugarTable("out_order_mat_detail")]
+ [SugarTable("wcs_out_order_mat_detail")]
public class OutOrderMatDetail
{
///
@@ -127,6 +127,12 @@ namespace WCS.BLL.DbModels
[SugarColumn(ColumnName = "create_user", Length = 100, IsNullable = true, ColumnDescription = "操作员")]
public string CreateUser { get; set; }
+ ///
+ /// 是否是盟讯公司盘点生成的出库单
+ ///
+ [SugarColumn(ColumnName = "is_MXPD", IsNullable = true, ColumnDescription = "是否是盟讯公司盘点生成的出库单")]
+ public bool? IsMXPD { get; set; } = false;
+
///
/// 用于绑定中显示序号
///
diff --git a/WCS.BLL/DbModels/ShelfInfo.cs b/WCS.BLL/DbModels/ShelfInfo.cs
index df5f5f6..8448f0b 100644
--- a/WCS.BLL/DbModels/ShelfInfo.cs
+++ b/WCS.BLL/DbModels/ShelfInfo.cs
@@ -8,7 +8,7 @@ using WCS.BLL.HardWare;
namespace WCS.DAL.DbModels
{
- [SugarTable("shelf_info")]
+ [SugarTable("wcs_shelf_info")]
public class ShelfInfo
{
@@ -42,6 +42,12 @@ namespace WCS.DAL.DbModels
[SugarColumn(ColumnName = "current_mode", IsNullable = false, ColumnDescription = "货架当前状态")]
public Mode CurrentMode { get; set; }
+ ///
+ /// 货架设置当前模式的时间
+ ///
+ [SugarColumn(ColumnName = "set_current_mode_time", IsNullable = true, ColumnDescription = "设置货架当前模式的时间")]
+ public DateTime SetCurrentModeTime { get; set; }
+
///
/// 货架行数
///
@@ -83,7 +89,7 @@ namespace WCS.DAL.DbModels
/// 串联绑定后的大货架编码
///
[SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
- public string? BindShelfCode { get; set; } = string.Empty;
+ public string? BigShelfCode { get; set; } = string.Empty;
///
/// 序号
diff --git a/WCS.BLL/DbModels/ShelfTypeInfo.cs b/WCS.BLL/DbModels/ShelfTypeInfo.cs
index 6b0db4b..5e84a14 100644
--- a/WCS.BLL/DbModels/ShelfTypeInfo.cs
+++ b/WCS.BLL/DbModels/ShelfTypeInfo.cs
@@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
///
/// 货架类型
///
- [SugarTable("shelf_type")]
+ [SugarTable("wcs_shelf_type")]
public class ShelfTypeInfo
{
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsNullable = false, IsIdentity = true)]
diff --git a/WCS.BLL/DbModels/StockTakingOrder.cs b/WCS.BLL/DbModels/StockTakingOrder.cs
index 47498ce..ccd2e36 100644
--- a/WCS.BLL/DbModels/StockTakingOrder.cs
+++ b/WCS.BLL/DbModels/StockTakingOrder.cs
@@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
///
/// 盘点单据
///
- [SugarTable("stock_taking_order")]
+ [SugarTable("wcs_stock_taking_order")]
public class StockTakingOrder
{
///
diff --git a/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs b/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs
index 203ebb3..83b9c33 100644
--- a/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs
+++ b/WCS.BLL/DbModels/StockTakingOrderMatDetail.cs
@@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
///
/// 盘点单据物料明细
///
- [SugarTable("stock_taking_order_matdetail")]
+ [SugarTable("wcs_stock_taking_order_matdetail")]
public class StockTakingOrderMatDetail
{
///
diff --git a/WCS.BLL/DbModels/StoreInfo.cs b/WCS.BLL/DbModels/StoreInfo.cs
index 0f84620..1b6a409 100644
--- a/WCS.BLL/DbModels/StoreInfo.cs
+++ b/WCS.BLL/DbModels/StoreInfo.cs
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace WCS.DAL.DbModels
{
- [SugarTable("store_info")]
+ [SugarTable("wcs_store_info")]
public partial class StoreInfo
{
///
@@ -21,12 +21,16 @@ namespace WCS.DAL.DbModels
///
[SugarColumn(ColumnName = "store_code", Length = 50, IsNullable = false, ColumnDescription = "库位编码")]
public string StoreCode { get; set; }
-
+ ///
+ /// 货架类型Id
+ ///
+ [SugarColumn(ColumnName = "shelf_type_id", IsNullable = false, DefaultValue = "0", ColumnDescription = "货架类型Id")]
+ public int ShelfTypeId { get; set; }
///
/// 模组Id
///
[SugarColumn(ColumnName = "module_id", IsNullable = false, ColumnDescription = "模组Id")]
- public int ModuleId { get; set; }
+ public int ModuleId { get; set; }
///
/// 模组编号
@@ -88,6 +92,33 @@ namespace WCS.DAL.DbModels
[SugarColumn(ColumnName = "offset_voltage", IsNullable = true, ColumnDescription = "电压偏移值")]
public decimal OffsetVoltage { get; set; }
+ ///
+ /// 串联绑定后的大货架编码
+ ///
+ [SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
+ public string? BigShelfCode { get; set; } = string.Empty;
+ ///
+ /// Row 行
+ ///
+ [SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")]
+ public string R { get; set; }
+ ///
+ /// Column 列
+ ///
+ [SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")]
+ public string C { get; set; }
+ ///
+ /// Column 位
+ ///
+ [SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")]
+ public string Wei { get; set; }
+
+ ///
+ /// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
+ ///
+ [SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
+ public string GroupName { get; set; }
+
///
/// 序号
///
diff --git a/WCS.BLL/DbModels/SystemApiLogRecord.cs b/WCS.BLL/DbModels/SystemApiLogRecord.cs
index e1ae5a9..6746e34 100644
--- a/WCS.BLL/DbModels/SystemApiLogRecord.cs
+++ b/WCS.BLL/DbModels/SystemApiLogRecord.cs
@@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
///
/// 系统接口日志记录
///
- [SugarTable("system_api_log_record")]
+ [SugarTable("wcs_system_api_log_record")]
public class SystemApiLogRecord
{
///
diff --git a/WCS.BLL/HardWare/IShelfBase.cs b/WCS.BLL/HardWare/IShelfBase.cs
index c346d22..9738217 100644
--- a/WCS.BLL/HardWare/IShelfBase.cs
+++ b/WCS.BLL/HardWare/IShelfBase.cs
@@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using WCS.BLL.DbModels;
using WCS.Model;
+using static WCS.BLL.HardWare.WarningLight;
namespace WCS.BLL.HardWare
{
@@ -38,12 +39,18 @@ namespace WCS.BLL.HardWare
public int ColumnCounts { get; set; }
public int LightId { get; set; }
+ public LightColorEnum LightColor { get; set; }
public List ModuleIds { get; set; }
+ public List Modules { get; set; }
public string ClientIp { get; set; }
///
/// 货架当前模式
///
public Mode CurrentMode { get; set; }
+ ///
+ /// 设置到当前模式的时间
+ ///
+ public DateTime SetCurrentModeTime { get; set; }
public MatInfoResponse InStoreData { get; set; }
@@ -57,6 +64,8 @@ namespace WCS.BLL.HardWare
/// 货架组别
///
public string GroupName { get; set; }
+
+ public string WebSocketIpAddress { get; set; }
///
/// 模组
///
@@ -65,7 +74,7 @@ namespace WCS.BLL.HardWare
///
/// 设置货架模式
///
- public void SetCurrentMode();
+ public void SetCurrentMode(Mode mode);
///
/// 货架进入入库模式
@@ -96,7 +105,7 @@ namespace WCS.BLL.HardWare
///
/// 货架单个确认盘点
///
- public bool ConfirmStocktakingSingle(int BoardId,int LightNumber);
+ public bool ConfirmStocktakingSingle(int BoardId, int LightNumber);
///
/// 货架退出盘点模式
diff --git a/WCS.BLL/HardWare/IWarningLightBase.cs b/WCS.BLL/HardWare/IWarningLightBase.cs
index 0c3a291..b9e41d3 100644
--- a/WCS.BLL/HardWare/IWarningLightBase.cs
+++ b/WCS.BLL/HardWare/IWarningLightBase.cs
@@ -15,6 +15,8 @@ namespace WCS.BLL.HardWare
红色 = 0x01,
绿色 = 0x02,
蓝色 = 0x03,
+ //关闭仅用于后台暂存和判断使用 不用于协议
+ 关闭 = 0x11,
}
public enum LightModeEnum
{
diff --git a/WCS.BLL/HardWare/SingleLightShelf.cs b/WCS.BLL/HardWare/SingleLightShelf.cs
index e09ab83..925297c 100644
--- a/WCS.BLL/HardWare/SingleLightShelf.cs
+++ b/WCS.BLL/HardWare/SingleLightShelf.cs
@@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using WCS.BLL.DbModels;
using WCS.Model;
+using static WCS.BLL.HardWare.WarningLight;
namespace WCS.BLL.HardWare
{
@@ -21,10 +22,14 @@ namespace WCS.BLL.HardWare
public string OrderNumber { get; set; }
public int LightId { get; set; }
+ public LightColorEnum LightColor { get; set; }
public List ModuleIds { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public string ClientIp { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public List ExceptionMessages { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public bool IsWarning { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+ public string WebSocketIpAddress { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+ public List Modules { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+ public DateTime SetCurrentModeTime { get; set; }
public bool ConfirmStocktakingSingle(int BoardId, int LightNumber)
{
@@ -34,58 +39,58 @@ namespace WCS.BLL.HardWare
public void GoInInstore(string IPAdress)
{
//找到对应的灯 亮灯
-
+
}
public void GoInOutstore(List MatDetails, OutOrder outOrder)
{
- throw new NotImplementedException();
+
}
public void GoInStocktaking()
{
- throw new NotImplementedException();
+
}
public void GoInStocktaking(List MatDetails, StockTakingOrder outOrder)
{
- throw new NotImplementedException();
+
}
public void GoOutInstore()
{
//找到已亮灯的 灭灯
- throw new NotImplementedException();
+
}
public void GoOutOutstore()
{
- throw new NotImplementedException();
+
}
public void GoOutStocktaking()
{
- throw new NotImplementedException();
+
}
public void Reset()
{
- throw new NotImplementedException();
+ return;
}
- public void SetCurrentMode()
+ public void SetCurrentMode(Mode mode)
{
- throw new NotImplementedException();
+
}
public void ShelfCheck()
{
- throw new NotImplementedException();
+
}
public void Warning()
{
- throw new NotImplementedException();
+
}
}
}
diff --git a/WCS.BLL/HardWare/SmartShelf.cs b/WCS.BLL/HardWare/SmartShelf.cs
index 638efec..9ee8b49 100644
--- a/WCS.BLL/HardWare/SmartShelf.cs
+++ b/WCS.BLL/HardWare/SmartShelf.cs
@@ -1,4 +1,5 @@
-using WCS.BLL.Config;
+using System;
+using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.Manager;
using WCS.DAL.Db;
@@ -7,6 +8,7 @@ using WCS.Model;
using WCS.Model.ApiModel.InOutRecord;
using WCS.Model.ApiModel.OutStore;
using WCS.Model.WebSocketModel;
+using static WCS.BLL.HardWare.WarningLight;
namespace WCS.BLL.HardWare
{
@@ -21,7 +23,8 @@ namespace WCS.BLL.HardWare
ShelfCode = shelfInfo.ShelfCode;
RowCounts = shelfInfo.Rowcounts;
ColumnCounts = shelfInfo.Columncounts;
- CurrentMode = shelfInfo.CurrentMode;
+ //CurrentMode = shelfInfo.CurrentMode;
+ SetCurrentMode(Mode.待机模式);
ClientIp = shelfInfo.ClientIp;
LightId = shelfInfo.LightId;
WarningLight = new WarningLight() { LightId = shelfInfo.LightId };
@@ -53,12 +56,15 @@ namespace WCS.BLL.HardWare
public int RowCounts { get; set; }
public int ColumnCounts { get; set; }
public Mode CurrentMode { get; set; }
+ public DateTime SetCurrentModeTime { get; set; }
public string ModulesStr { get; set; }//当前货架所有模组的Str
public string GroupName { get; set; }
public List Modules { get; set; } = new List();
public TCPClient TcpCleint { get { return TCPClientManager.GetTCPClientByIPHost(ClientIp); } }
public int LightId { get; set; }
+
+ public LightColorEnum LightColor { get; set; }
public bool IsWarning { get; set; } = false;
public WarningLight WarningLight { get; set; }
public void ClearWarning()
@@ -104,6 +110,9 @@ namespace WCS.BLL.HardWare
public List ModuleIds { get; set; }
public string ClientIp { get; set; }
+ //websocket通知的前端的IP地址
+ public string WebSocketIpAddress { get; set; } = "127.0.0.2";
+
#region 协议处理
public void GoInInstore(string? IPAddress)
{
@@ -121,7 +130,8 @@ namespace WCS.BLL.HardWare
}
else
{
- this.CurrentMode = Mode.入库模式;
+ //this.CurrentMode = Mode.入库模式;
+ SetCurrentMode(Mode.入库模式);
}
//清空错误
ExceptionMessages.Clear();
@@ -186,7 +196,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
};
WarningManager.SendWarning(warningModel);
@@ -218,7 +228,8 @@ namespace WCS.BLL.HardWare
}
else
{
- this.CurrentMode = Mode.待机模式;
+ //this.CurrentMode = Mode.待机模式;
+ SetCurrentMode(Mode.待机模式);
}
//清空错误
@@ -255,7 +266,8 @@ namespace WCS.BLL.HardWare
.ToList();
if (list.Count > 0)
{
- CurrentMode = Mode.待机模式;
+ //CurrentMode = Mode.待机模式;
+ SetCurrentMode(Mode.待机模式);
foreach (var item in list)
{
ExceptionMessages.Add($"模组{item.ModuleCode}未成功退出入库模式!");
@@ -267,20 +279,208 @@ namespace WCS.BLL.HardWare
var warningModel = new WebSocketMessageModel()
{
IsWarning = true,
- WarningType = WarningTypeEnum.进入入库未响应,
+ WarningType = WarningTypeEnum.退出入库未响应,
StoreId = 0,
StoreCode = "",
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
};
WarningManager.SendWarning(warningModel);
}
//报警灯熄灭
WarningLight.CloseLight(TcpCleint);
+ //通知前台货架已结束入库
+ Task.Run(() =>
+ {
+ var warningModel = new WebSocketMessageModel()
+ {
+ IsWarning = false,
+ WarningType = WarningTypeEnum.通知前台结束入库,
+ StoreId = 0,
+ StoreCode = "",
+ ShelfCode = ShelfCode,
+ ShelfId = ShelfId,
+ ClientIp = WebSocketIpAddress,
+ };
+ WarningManager.SendWarning(warningModel);
+ });
}
+ ///
+ /// 由自检异常等错误导致的 手动操作处理后重新进入出库模式
+ ///
+ ///
+ public void GoInOutstoreByWebSocket(int moduleId)
+ {
+ try
+ {
+ //找到对应的模组
+ var module = Modules.Where(t => t.ModuleId == moduleId).First();
+ if (module == null)
+ {
+ Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,未找到MouduleId为{moduleId}的模组", LogsType.Outstore);
+ return;
+ }
+ //判断删除后是否还有继续需要亮灯的情况
+ if (module.CurrentOutSns == null || module.CurrentOutSns.Count == 0)
+ {
+ Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,模组【{module.ModuleCode}】,不存在需要继续出的物料,给其复位。", LogsType.Outstore);
+ //不需要这个模组继续亮灯了
+ module.Reset(TcpCleint);
+
+ //判断此货架是否还有出库模式的模块
+ var isExistOuting = Modules.Where(t => t.CurrentMode == Mode.出库模式).Any();
+ if (isExistOuting)
+ {
+ //还有继续出的就不管
+ }
+ //这里的处理逻辑应与出库出了最后一盘料相同
+ else
+ {
+ #region 继续出库进程
+ Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,丢失删除的料刚好为货架需要出库的最后一盘料", LogsType.Outstore);
+ CurrentOutOrder = null;
+
+ //退出出库模式
+ var taskGoOut = Task.Run(() =>
+ {
+ GoOutOutstore();
+ });
+
+ //看是否是分批次出库的情况 分批次亮灯
+ Task.Run(async () =>
+ {
+ await Task.WhenAll(taskGoOut);
+ if (LocalFile.Config.IsSameMatCodeOut)
+ {
+ #region 触发下一批次的物料发料
+ //查一下是否是当前发料单最后一个货架(在出库模式 同一个发料单下)
+ var isLastShelf = ShelfManager.Shelves
+ .Where(t => t.OrderNumber == OrderNumber)
+ .Where(t => t.CurrentMode == Mode.出库模式)
+ .Any();
+ if (!isLastShelf)
+ {
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料", LogsType.Outstore);
+ var outOrder = DbHelp.db.Queryable()
+ .Where(t => t.OrderNumber == OrderNumber)
+ .First();
+ if (outOrder != null)
+ {
+ var outOrderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .Where(t => t.IsSended == false)
+ .Includes(t => t.StoreInfo)
+ .ToList();
+
+ if (outOrderMatDetails != null && outOrderMatDetails.Count > 0)
+ {
+ //相邻物料亮不同颜色 这里绿色和蓝色互相切换
+ LocalStatic.CurrentOutStoreColor = LocalStatic.CurrentOutStoreColor == (byte)0x02 ? (byte)0x04 : (byte)0x02;
+
+ //存在待出库 然后之前又没亮灯的情况 => 继续分批次亮灯
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},还有物料未出!", LogsType.Outstore);
+ var outOrderDetailCount = outOrderMatDetails.GroupBy(t => t.MatCode)
+ .Select(o => new { count = o.Count(), bb = o })
+ .Where(o => o.count >= 2)
+ .OrderByDescending(o => o.count)
+ .ToList();
+ //相同物料存在盘数超过2的情况,亮下一个盘数多的物料
+ if (outOrderDetailCount.Count > 0)
+ {
+ var matCode = outOrderDetailCount.First().bb.Key;
+ outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode)
+ .ToList();
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},本次亮灯物料{matCode}!", LogsType.Outstore);
+ }
+ //相同物料不存在盘数超过n的情况,剩余物料全部亮灯
+ else
+ {
+ //剩余物料全出
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},剩余物料灯全亮!", LogsType.Outstore);
+ }
+
+ var shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId)
+ .Distinct()
+ .ToList();
+ var shelfs = ShelfManager.Shelves.Where(t => shelfIds.Contains(t.ShelfId)).ToList();
+
+ var otherModeShelfs = shelfs.Where(t => t.CurrentMode != HardWare.Mode.待机模式).ToList();
+ if (otherModeShelfs != null && otherModeShelfs.Count > 0)
+ {
+ otherModeShelfs.ForEach(t =>
+ {
+ t.Reset();
+ });
+ Thread.Sleep(1000);
+ }
+ //对应的货架对应位置 进入出库模式 亮灯
+ shelfs.ForEach(shelf =>
+ {
+ var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode)
+
+ .Distinct()
+ .ToList();
+ shelf.GoInOutstore(matDetails, outOrder);
+ shelf.OrderNumber = outOrder.OrderNumber;
+ });
+ }
+ else
+ {
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},当前物料已发完!", LogsType.Outstore);
+ }
+ }
+ else
+ {
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},OutOrder为null,肯定是有问题", LogsType.Outstore);
+ }
+ }
+ else
+ {
+ Logs.Write($"GoInOutstoreByModule发料单{OrderNumber},非最后一个出库货架!", LogsType.Outstore);
+ var otherShelfs = ShelfManager.Shelves
+ .Where(t => t.OrderNumber == OrderNumber)
+ .Where(t => t.CurrentMode == Mode.出库模式)
+ .ToList();
+
+ otherShelfs.ForEach(shelf =>
+ {
+ try
+ {
+ if (shelf is SmartShelf)
+ {
+ var smartShelf = (SmartShelf)shelf;
+ Logs.Write($"GoInOutstoreByModule货架【{smartShelf.ShelfCode}】待取物料{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore);
+ }
+ }
+ catch
+ { }
+ });
+ }
+ #endregion
+ }
+ });
+ #endregion
+ }
+ }
+
+ else
+ {
+ //继续亮灯
+ Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】,模组【{module.ModuleCode}】,存在需要继续出的物料,继续亮灯。", LogsType.Outstore);
+ module.GoInOutStoreMode(TcpCleint, module.CurrentOutSns);
+ WarningLight.GreenLight(TcpCleint);
+ }
+ }
+ catch (Exception e)
+ {
+ Logs.Write($"GoInOutstoreByModule货架【{ShelfCode}】进入出库模式发生异常!", LogsType.Outstore);
+ GoOutOutstore();
+ throw e;
+ }
+ }
public void GoInOutstore(List MatDetails, OutOrder outOrder)
{
try
@@ -292,13 +492,15 @@ namespace WCS.BLL.HardWare
//复位需要点时间间隔才能响应指令
Thread.Sleep(1500);
}
- CurrentMode = Mode.出库模式;
+ //CurrentMode = Mode.出库模式;
+ SetCurrentMode(Mode.出库模式);
//第二步:货架添加需要出的SN 出库的领料单号
//移除货架所有现有待出库的MatSN
CurrentOutStoreMatSNs.Clear();
////添加属于当前货架的物料
CurrentOutStoreMatSNs.AddRange(MatDetails.Select(t => t.MatSN).ToList());
+ Logs.Write($"货架【{ShelfCode}】本次发料物料为{string.Join(",", CurrentOutStoreMatSNs)}!", LogsType.Outstore);
////记录当前出库的发料单
CurrentOutOrder = outOrder;
@@ -354,7 +556,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
};
WarningManager.SendWarning(warningModel);
}
@@ -362,63 +564,91 @@ namespace WCS.BLL.HardWare
}
catch (Exception e)
{
+ Logs.Write($"货架【{ShelfCode}】进入出库模式发生异常!", LogsType.Outstore);
GoOutOutstore();
throw e;
}
}
public void GoOutOutstore()
{
- //找到在出库中的模组
- var outingModules = Modules.Where(t => t.CurrentMode == Mode.出库模式)
- .ToList();
- foreach (var module in outingModules)
+ try
{
- module.GoOutOutStoreMode(TcpCleint);
- }
- //Task.Run(() =>
- //{
- //通信校验
- var timeOut = 3000;
- var timeSpan = TimeSpan.FromMilliseconds(0);
- var beginTime = DateTime.Now;
- while (timeSpan <= TimeSpan.FromMilliseconds(timeOut))
- {
- timeSpan = DateTime.Now - beginTime;
-
- //所有板子成功退出出库模式 表示退出出库模式成功,跳出循环
- var isExistsOutstore = outingModules.Where(t => t.CurrentMode == Mode.出库模式)
- .Where(t => t.IsEnable)
- .Any();
- if (!isExistsOutstore)
+ Logs.Write($"货架【{ShelfCode}】,开始退出出库", LogsType.Outstore);
+ //找到在出库中的模组
+ var outingModules = Modules.Where(t => t.CurrentMode == Mode.出库模式)
+ .ToList();
+ foreach (var module in outingModules)
{
- break;
+ module.GoOutOutStoreMode(TcpCleint);
}
- //循环延时处理
- Thread.Sleep(50);
- }
- var list = outingModules.Where(t => t.IsEnable && t.CurrentMode == Mode.出库模式).ToList();
- if (list != null && list.Count > 0)
- {
- var messages = list.Select(t => $"模组{t.ModuleCode}未退出出库模式!").ToList();
- messages.Add("请及时联系技术人员处理!");
- var exceptionMessage = string.Join("\r\n", messages);
- var warningModel = new WebSocketMessageModel()
+ //通信校验
+ var timeOut = 3000;
+ var timeSpan = TimeSpan.FromMilliseconds(0);
+ var beginTime = DateTime.Now;
+ while (timeSpan <= TimeSpan.FromMilliseconds(timeOut))
{
- IsWarning = true,
- WarningType = WarningTypeEnum.退出入库未响应,
- StoreId = 0,
- StoreCode = "",
- ShelfCode = ShelfCode,
- ShelfId = ShelfId,
- WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
- };
- WarningManager.SendWarning(warningModel);
+ timeSpan = DateTime.Now - beginTime;
+
+ //所有板子成功退出出库模式 表示退出出库模式成功,跳出循环
+ var isExistsOutstore = outingModules.Where(t => t.CurrentMode == Mode.出库模式)
+ .Where(t => t.IsEnable)
+ .Any();
+ if (!isExistsOutstore)
+ {
+ break;
+ }
+ //循环延时处理
+ Thread.Sleep(50);
+ }
+ var list = outingModules.Where(t => t.IsEnable && t.CurrentMode == Mode.出库模式).ToList();
+ if (list != null && list.Count > 0)
+ {
+ var messages = list.Select(t => $"模组{t.ModuleCode}未退出出库模式!").ToList();
+ messages.Add("请及时联系技术人员处理!");
+ var exceptionMessage = string.Join("\r\n", messages);
+ var warningModel = new WebSocketMessageModel()
+ {
+ IsWarning = true,
+ WarningType = WarningTypeEnum.退出出库未响应,
+ StoreId = 0,
+ StoreCode = "",
+ ShelfCode = ShelfCode,
+ ShelfId = ShelfId,
+ WarningMessage = exceptionMessage,
+ ClientIp = WebSocketIpAddress,
+ };
+ WarningManager.SendWarning(warningModel);
+ }
+
+ CurrentOutStoreMatSNs.Clear();
+ WarningLight.CloseLight(TcpCleint);
+ SetCurrentMode(Mode.待机模式);
+ Logs.Write($"货架【{ShelfCode}】,结束退出出库", LogsType.Outstore);
+
+ Task.Run(() =>
+ {
+ //判断是否是当前订单最后一个出库货架
+ var isOuting = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber)
+ .Any();
+ //WebSocket通知前台以更新左侧出库单列表的状态
+ if (!isOuting)
+ {
+ #region WebSocket
+ var messageMode = new WebSocketMessageModel()
+ {
+ IsWarning = false,
+ ClientIp = WebSocketIpAddress,
+ WarningType = WarningTypeEnum.通知刷新出库单列表,
+ };
+ WarningManager.SendWarning(messageMode);
+ #endregion
+ }
+ });
+ }
+ catch (Exception ex)
+ {
+ Logs.Write($"货架【{ShelfCode}】,退出出库时发生异常{ex.Message}", LogsType.Outstore);
}
- //});
- CurrentOutStoreMatSNs.Clear();
- WarningLight.CloseLight(TcpCleint);
- this.CurrentMode = Mode.待机模式;
}
public void GoInStocktaking(List MatDetails, StockTakingOrder stockTakingOrder)
@@ -437,7 +667,8 @@ namespace WCS.BLL.HardWare
Thread.Sleep(1500);
}
- CurrentMode = Mode.盘点模式;
+ //CurrentMode = Mode.盘点模式;
+ SetCurrentMode(Mode.盘点模式);
//第二步:货架添加 盘点单号 记录当前盘点的发料单
CurrentStockTakingOrder = stockTakingOrder;
@@ -503,7 +734,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
};
WarningManager.SendWarning(warningModel);
}
@@ -536,7 +767,7 @@ namespace WCS.BLL.HardWare
var messageMode = new WebSocketMessageModel()
{
IsWarning = false,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
WarningType = WarningTypeEnum.通知刷新盘点
};
WarningManager.SendWarning(messageMode);
@@ -590,24 +821,55 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
};
WarningManager.SendWarning(warningModel);
}
});
CurrentOutStoreMatSNs.Clear();
WarningLight.CloseLight(TcpCleint);
- this.CurrentMode = Mode.待机模式;
+ //this.CurrentMode = Mode.待机模式;
+ SetCurrentMode(Mode.待机模式);
}
- void IShelfBase.Reset()
+ public void Reset()
{
- throw new NotImplementedException();
+ var modules = Modules.Where(t => t.IsEnable).ToList();
+ if (modules != null && modules.Count > 0)
+ {
+ modules.ForEach(t =>
+ {
+ t.Reset(TcpCleint);
+ });
+ }
+ WarningLight.CloseLight(TcpCleint);
+ //this.CurrentMode = Mode.待机模式;
+ SetCurrentMode(Mode.待机模式);
}
- void IShelfBase.SetCurrentMode()
+ public void QueryVoltage(int moduleId)
{
- throw new NotImplementedException();
+ var moudle = Modules.Where(t => t.ModuleId == moduleId).First();
+ if (moudle != null)
+ {
+ moudle.QueryVoltage(TcpCleint);
+ }
+ }
+
+ public void SetCurrentMode(Mode mode)
+ {
+ this.CurrentMode = mode;
+ this.SetCurrentModeTime = DateTime.Now;
+ Task.Run(() =>
+ {
+ var shelf = DbHelp.db.Queryable().Where(t => t.Id == ShelfId).First();
+ if (shelf != null)
+ {
+ shelf.CurrentMode = mode;
+ shelf.SetCurrentModeTime = SetCurrentModeTime;
+ DbHelp.db.Updateable(shelf).ExecuteCommand();
+ }
+ });
}
void IShelfBase.Warning()
@@ -617,9 +879,54 @@ namespace WCS.BLL.HardWare
public void ShelfCheck()
{
- foreach (var module in Modules.Where(t => t.IsEnable).ToList())
+ try
{
- module.ShelfCheck(TcpCleint);
+ OrderNumber = "自检中...";
+ foreach (var module in Modules.Where(t => t.IsEnable).ToList())
+ {
+ module.ShelfCheck(TcpCleint);
+ }
+ }
+ catch (Exception ex)
+ {
+ Logs.Write("自检发现异常:" + ex);
+ }
+ finally
+ {
+ OrderNumber = string.Empty;
+ }
+ }
+ #endregion
+
+ #region 报警灯协议返回处理
+ public void WarningLightProcess(byte[] data, int boardId, int lightNumber)
+ {
+ if (data[TcpCleint.PreFixLength + 2] == 0x20 && data[TcpCleint.PreFixLength + 3] == 0x01)
+ {
+ //常亮或关闭 0x00常亮 0x01关闭
+ if (data[TcpCleint.PreFixLength + 5] == 0x00)
+ {
+ LightColor = LightColorEnum.关闭;
+ Logs.Write($"货架[{ShelfCode}],灯状态更新为:{LightColor}");
+ }
+ else if (data[TcpCleint.PreFixLength + 5] == 0x01)
+ {
+ switch (data[7])
+ {
+ case 0x01:
+ LightColor = LightColorEnum.红色;
+ break;
+ case 0x02:
+ LightColor = LightColorEnum.绿色;
+ break;
+ case 0x03:
+ LightColor = LightColorEnum.蓝色;
+ break;
+ default:
+ break;
+ }
+ Logs.Write($"货架[{ShelfCode}],灯状态更新为:{LightColor}");
+ }
}
}
#endregion
@@ -627,7 +934,6 @@ namespace WCS.BLL.HardWare
#region 协议返回处理
public void ProtocolProcess(byte[] data, int boardId, int lightNumber)
{
- Logs.Write("协议处理4");
//协议处理 判断功能位
switch (data[TcpCleint.PreFixLength + 2])
{
@@ -664,12 +970,23 @@ namespace WCS.BLL.HardWare
case 0x13://复位的返回信号
ResetReturnProcess(data, boardId, lightNumber);
break;
+ case 0x17://电压值1
+ QueryVoltageProcess(data, boardId, lightNumber);
+ break;
+ case 0x18://电压值2
+ QueryVoltageProcess(data, boardId, lightNumber);
+ break;
+ case 0x19://电压值3
+ QueryVoltageProcess(data, boardId, lightNumber);
+ break;
+ case 0x0B://自检结果反馈
+ SelfCheckProcess(data, boardId, lightNumber);
+ break;
default:
;
break;
}
- Logs.Write("协议处理5");
}
///
/// 进入入库模式返回信号处理
@@ -797,7 +1114,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
#endregion
@@ -831,7 +1148,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
#endregion
@@ -916,7 +1233,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!",
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
@@ -946,6 +1263,12 @@ namespace WCS.BLL.HardWare
StoreCode = storeInfo.StoreCode,
StoreId = storeInfo.Id,
+ R = storeInfo.R,
+ C = storeInfo.C,
+ Wei = storeInfo.Wei,
+ BigShelfCode = storeInfo.BigShelfCode,
+ GroupName = storeInfo.GroupName,
+
MatSN = this.InStoreData.materialBar,
MatCode = this.InStoreData.materialCode,
MatName = this.InStoreData.materialName,
@@ -966,6 +1289,12 @@ namespace WCS.BLL.HardWare
StoreId = storeInfo.Id,
StoreInfo = storeInfo,
+ R = storeInfo.R,
+ C = storeInfo.C,
+ Wei = storeInfo.Wei,
+ BigShelfCode = storeInfo.BigShelfCode,
+ GroupName = storeInfo.GroupName,
+
MatSN = this.InStoreData.materialBar,
MatCode = this.InStoreData.materialCode,
MatName = this.InStoreData.materialName,
@@ -1019,19 +1348,16 @@ namespace WCS.BLL.HardWare
///
public void InStoreExceptionReturnProcess(byte[] data, int boardId, int lightNumber)
{
- Logs.Write("协议处理5.1");
lightNumber = (int)data[TcpCleint.PreFixLength + 4];
var storeInfo = DbHelp.db.Queryable()
.Where(t => t.ShelfId == ShelfId)
.Where(t => t.BoardId == boardId && t.LightNumber == lightNumber)
.First();
- Logs.Write("协议处理5.2");
if (storeInfo == null)
{
//TO DO 库位未找到
return;
}
- Logs.Write("协议处理5.3");
//已放物料丢失了 物料多放了 储位恢复正常
switch (data[TcpCleint.PreFixLength + 3])
{
@@ -1051,7 +1377,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
SolvedGuids = warnings.Select(t => t.Guid).ToList(),
};
WarningManager.SendWarning(warningModel);
@@ -1062,12 +1388,10 @@ namespace WCS.BLL.HardWare
});
ProcessingExceptions.RemoveAll(t => t.BoardId == boardId);
- Logs.Write("协议处理5.5");
}
break;
case 0x01:
{
- Logs.Write("协议处理5.4");
var exceptionMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!";
var warningModel = new WebSocketMessageModel()
{
@@ -1079,7 +1403,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
@@ -1089,14 +1413,11 @@ namespace WCS.BLL.HardWare
LightNumber = lightNumber,
ExceptionMessage = storeInfo.StoreCode + "入库过程中存在物料未扫描上架!"
});
- Logs.Write("协议处理5.5");
}
break;
case 0x02:
{
- Logs.Write("协议处理5.4");
var exceptionMessage = storeInfo.StoreCode + "物料被取出!";
- //WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage);
var warningModel = new WebSocketMessageModel()
{
WarningType = WarningTypeEnum.入库中异常取出,
@@ -1107,7 +1428,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
@@ -1117,7 +1438,6 @@ namespace WCS.BLL.HardWare
LightNumber = lightNumber,
ExceptionMessage = storeInfo.StoreCode + "入库过程中物料丢失!"
});
- Logs.Write("协议处理5.5");
}
break;
default:
@@ -1213,7 +1533,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
#endregion
@@ -1247,7 +1567,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
#endregion
@@ -1267,7 +1587,7 @@ namespace WCS.BLL.HardWare
{
if (CurrentMode != Mode.出库模式)
{
- Logs.Write($"出库错误:{ShelfCode}该货架模式不是出库模式或盘点模式!");
+ Logs.Write($"出库错误:{ShelfCode}该货架模式不是出库模式或盘点模式!", LogsType.Outstore);
return;
}
lightNumber = Convert.ToInt32(data[TcpCleint.PreFixLength + 3]);
@@ -1289,7 +1609,7 @@ namespace WCS.BLL.HardWare
if (string.IsNullOrEmpty(storeInfo.CurrentMatSn))
{
//该库位是需要出库的库位,物料被多次取出or给了多个正常出库信号
- Logs.Write($"该库位是需要出库的库位,物料被反复取出or给了多个正常出库信号,库位{storeInfo.StoreCode}");
+ Logs.Write($"该库位是需要出库的库位,物料被反复取出or给了多个正常出库信号,库位{storeInfo.StoreCode}", LogsType.Outstore);
//暂不进行处理
return;
}
@@ -1297,7 +1617,7 @@ namespace WCS.BLL.HardWare
//不是本次出库需要出的物料
if (!CurrentOutStoreMatSNs.Contains(storeInfo.CurrentMatSn))
{
- Logs.Write($"{storeInfo.CurrentMatSn}不是本次需要出库的物料");
+ Logs.Write($"{storeInfo.CurrentMatSn}不是本次需要出库的物料", LogsType.Outstore);
//报警灯报警
WarningLight.WaringLightAlwaysRed(TcpCleint);
return;
@@ -1307,7 +1627,7 @@ namespace WCS.BLL.HardWare
var inventoryDetail = DbHelp.db.Queryable().Where(t => t.MatSN == storeInfo.CurrentMatSn).First();
if (inventoryDetail == null)
{
- Logs.Write($"{storeInfo.CurrentMatSn}库存信息不存在");
+ Logs.Write($"{storeInfo.CurrentMatSn}库存信息不存在", LogsType.Outstore);
//报警灯报警
WarningLight.WaringLightAlwaysRed(TcpCleint);
return;
@@ -1321,7 +1641,7 @@ namespace WCS.BLL.HardWare
if (orderMatDetails == null)
{
- Logs.Write($"{storeInfo.CurrentMatSn},OrderDetail出库明细信息不存在");
+ Logs.Write($"{storeInfo.CurrentMatSn},OrderDetail出库明细信息不存在", LogsType.Outstore);
//报警灯报警
WarningLight.WaringLightAlwaysRed(TcpCleint);
return;
@@ -1342,6 +1662,12 @@ namespace WCS.BLL.HardWare
StoreId = storeInfo.Id,
StoreInfo = storeInfo,
+ R = storeInfo.R,
+ C = storeInfo.C,
+ Wei = storeInfo.Wei,
+ BigShelfCode = storeInfo.BigShelfCode,
+ GroupName = storeInfo.GroupName,
+
MatSN = inventoryDetail.MatSN,
MatCode = inventoryDetail.MatCode,
MatName = inventoryDetail.MatName,
@@ -1350,8 +1676,9 @@ namespace WCS.BLL.HardWare
MatSpec = inventoryDetail.MatSpec,
MatCustomer = inventoryDetail.MatCustomer,
MatSupplier = inventoryDetail.MatSupplier,
+ OrderNumber = orderMatDetails.OrderNumber,
- Direction = DirectionEnum.出库,
+ Direction = orderMatDetails.IsMXPD == false ? DirectionEnum.出库 : DirectionEnum.盘点下架,
};
//库位表 修改
storeInfo.CurrentMatSn = string.Empty;
@@ -1385,14 +1712,26 @@ namespace WCS.BLL.HardWare
//确认本次出库
module.ComfirmOutstore(TcpCleint, data[TcpCleint.PreFixLength + 3]);
-
+ //更新时间 避免被自动退出
+ Task.Run(() =>
+ {
+ var shelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.OrderNumber == OrderNumber).ToList();
+ foreach (var shelf in shelves)
+ {
+ shelf.SetCurrentModeTime = DateTime.Now;
+ }
+ });
//当前柜子是否还存在未出库的
+ Logs.Write($"货架【{ShelfCode}】,用户取出物料{matSN}", LogsType.Outstore);
CurrentOutStoreMatSNs.RemoveAll(t => t == matSN);//删除本次已出的物料SN
+ Logs.Write($"货架【{ShelfCode}】,当前货架剩余物料{string.Join(",", CurrentOutStoreMatSNs)}", LogsType.Outstore);
+
var isExsistOut = CurrentOutStoreMatSNs.Any();
var tempOrder = CurrentOutOrder;
+ var isMXPD = orderMatDetails.IsMXPD == true;
//通知前台刷新
Task.Run(() =>
{
@@ -1402,8 +1741,8 @@ namespace WCS.BLL.HardWare
var messageMode = new WebSocketMessageModel()
{
IsWarning = false,
- ClientIp = "127.0.0.1",
- WarningType = WarningTypeEnum.通知刷新出库
+ ClientIp = WebSocketIpAddress,
+ WarningType = isMXPD ? WarningTypeEnum.通知刷新盟讯盘点 : WarningTypeEnum.通知刷新出库
};
WarningManager.SendWarning(messageMode);
});
@@ -1411,6 +1750,7 @@ namespace WCS.BLL.HardWare
//本次亮灯的物料已全部取出
if (!isExsistOut)
{
+ Logs.Write($"货架【{ShelfCode}】,本次亮灯的物料已全部取出", LogsType.Outstore);
CurrentOutOrder = null;
//退出出库模式
@@ -1418,6 +1758,7 @@ namespace WCS.BLL.HardWare
{
GoOutOutstore();
});
+
//看是否是分批次出库的情况 分批次亮灯
Task.Run(async () =>
{
@@ -1432,7 +1773,7 @@ namespace WCS.BLL.HardWare
.Any();
if (!isLastShelf)
{
- Logs.Write($"发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料");
+ Logs.Write($"发料单{OrderNumber},最后一个出库货架,触发精准发料机制!查询是否还存在待出库物料", LogsType.Outstore);
var outOrder = DbHelp.db.Queryable()
.Where(t => t.OrderNumber == OrderNumber)
.First();
@@ -1446,8 +1787,11 @@ namespace WCS.BLL.HardWare
if (outOrderMatDetails != null && outOrderMatDetails.Count > 0)
{
+ //相邻物料亮不同颜色 这里绿色和蓝色互相切换
+ LocalStatic.CurrentOutStoreColor = LocalStatic.CurrentOutStoreColor == (byte)0x02 ? (byte)0x04 : (byte)0x02;
+
//存在待出库 然后之前又没亮灯的情况 => 继续分批次亮灯
- Logs.Write($"发料单{OrderNumber},还有物料未出!");
+ Logs.Write($"发料单{OrderNumber},还有物料未出!", LogsType.Outstore);
var outOrderDetailCount = outOrderMatDetails.GroupBy(t => t.MatCode)
.Select(o => new { count = o.Count(), bb = o })
.Where(o => o.count >= 2)
@@ -1459,13 +1803,13 @@ namespace WCS.BLL.HardWare
var matCode = outOrderDetailCount.First().bb.Key;
outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode)
.ToList();
- Logs.Write($"发料单{OrderNumber},本次亮灯物料{matCode}!");
+ Logs.Write($"发料单{OrderNumber},本次亮灯物料{matCode}!", LogsType.Outstore);
}
//相同物料不存在盘数超过n的情况,剩余物料全部亮灯
else
{
//剩余物料全出
- Logs.Write($"发料单{OrderNumber},剩余物料灯全亮!");
+ Logs.Write($"发料单{OrderNumber},剩余物料灯全亮!", LogsType.Outstore);
}
var shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId)
@@ -1492,18 +1836,38 @@ namespace WCS.BLL.HardWare
shelf.GoInOutstore(matDetails, outOrder);
shelf.OrderNumber = outOrder.OrderNumber;
});
-
}
else
{
- Logs.Write($"发料单{OrderNumber},当前物料已发完!");
+ Logs.Write($"发料单{OrderNumber},当前物料已发完!", LogsType.Outstore);
}
}
else
{
- Logs.Write($"发料单{OrderNumber},OutOrder为null,肯定是有问题");
+ Logs.Write($"发料单{OrderNumber},OutOrder为null,肯定是有问题", LogsType.Outstore);
}
+ }
+ else
+ {
+ Logs.Write($"发料单{OrderNumber},非最后一个出库货架!", LogsType.Outstore);
+ var otherShelfs = ShelfManager.Shelves
+ .Where(t => t.OrderNumber == OrderNumber)
+ .Where(t => t.CurrentMode == Mode.出库模式)
+ .ToList();
+ otherShelfs.ForEach(shelf =>
+ {
+ try
+ {
+ if (shelf is SmartShelf)
+ {
+ var smartShelf = (SmartShelf)shelf;
+ Logs.Write($"货架【{smartShelf.ShelfCode}】待取物料{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore);
+ }
+ }
+ catch
+ { }
+ });
}
#endregion
}
@@ -1625,7 +1989,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1",
+ ClientIp = WebSocketIpAddress,
SolvedGuids = warnings.Select(t => t.Guid).ToList(),
};
WarningManager.SendWarning(warningModel);
@@ -1640,7 +2004,6 @@ namespace WCS.BLL.HardWare
case 0x01:
{
var exceptionMessage = storeInfo.StoreCode + "出库过程中存在物料上架!";
- //WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage);
var warningModel = new WebSocketMessageModel()
{
WarningType = WarningTypeEnum.出库中未扫描上架,
@@ -1651,7 +2014,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress,
};
WarningManager.SendWarning(warningModel);
@@ -1666,7 +2029,6 @@ namespace WCS.BLL.HardWare
case 0x02:
{
var exceptionMessage = storeInfo.StoreCode + "物料被取出!";
- //WebSoceketManager.TrySendMessage("127.0.0.1", exceptionMessage);
var warningModel = new WebSocketMessageModel()
{
WarningType = WarningTypeEnum.出库中丢失,
@@ -1677,7 +2039,7 @@ namespace WCS.BLL.HardWare
ShelfCode = ShelfCode,
ShelfId = ShelfId,
WarningMessage = exceptionMessage,
- ClientIp = "127.0.0.1"
+ ClientIp = WebSocketIpAddress
};
WarningManager.SendWarning(warningModel);
@@ -1738,6 +2100,229 @@ namespace WCS.BLL.HardWare
module.CurrentMode = Mode.待机模式;
}
}
+
+ public void QueryVoltageProcess(byte[] data, int boardId, int lightNumber)
+ {
+ //第n帧
+ var n = (int)data[TcpCleint.PreFixLength + 3];
+
+ var voltage1 = (data[TcpCleint.PreFixLength + 4] << 8) + data[TcpCleint.PreFixLength + 5];
+ var voltage2 = (data[TcpCleint.PreFixLength + 6] << 8) + data[TcpCleint.PreFixLength + 7];
+ var voltage3 = (data[TcpCleint.PreFixLength + 8] << 8) + data[TcpCleint.PreFixLength + 9];
+
+ var number1 = (n - 1) * 3 + 1;
+ var number2 = (n - 1) * 3 + 2;
+ var number3 = (n - 1) * 3 + 3;
+
+ if (number1 <= 16)
+ {
+ var storeInfo1 = DbHelp.db.Queryable()
+ .Where(t => t.BoardId == boardId && t.LightNumber == number1 && t.ShelfId == ShelfId)
+ .First();
+ if (storeInfo1 != null)
+ {
+ if (data[TcpCleint.PreFixLength + 2] == 0x17)
+ storeInfo1.CurrentVoltage = voltage1;
+ else if (data[TcpCleint.PreFixLength + 2] == 0x18)
+ storeInfo1.OffsetVoltage = voltage1;
+ else
+ storeInfo1.StandardVoltage = voltage1;
+ DbHelp.db.Updateable(storeInfo1).ExecuteCommand();
+ }
+ }
+
+ if (number2 <= 16)
+ {
+ var storeInfo2 = DbHelp.db.Queryable()
+ .Where(t => t.BoardId == boardId && t.LightNumber == number2 && t.ShelfId == ShelfId)
+ .First();
+ if (storeInfo2 != null)
+ {
+ if (data[TcpCleint.PreFixLength + 2] == 0x17)
+ storeInfo2.CurrentVoltage = voltage2;
+ else if (data[TcpCleint.PreFixLength + 2] == 0x18)
+ storeInfo2.OffsetVoltage = voltage2;
+ else
+ storeInfo2.StandardVoltage = voltage2;
+ DbHelp.db.Updateable(storeInfo2).ExecuteCommand();
+ }
+ }
+
+ if (number1 <= 16)
+ {
+ var storeInfo3 = DbHelp.db.Queryable()
+ .Where(t => t.BoardId == boardId && t.LightNumber == number3 && t.ShelfId == ShelfId)
+ .First();
+ if (storeInfo3 != null)
+ {
+ if (data[TcpCleint.PreFixLength + 2] == 0x17)
+ storeInfo3.CurrentVoltage = voltage3;
+ else if (data[TcpCleint.PreFixLength + 2] == 0x18)
+ storeInfo3.OffsetVoltage = voltage3;
+ else
+ storeInfo3.StandardVoltage = voltage3;
+ DbHelp.db.Updateable(storeInfo3).ExecuteCommand();
+ }
+ }
+ }
+
+ public void SelfCheckProcess(byte[] data, int boardId, int lightNumber)
+ {
+ if (data[TcpCleint.PreFixLength + 3] == 0x01)
+ {
+ //比对结果相同
+ }
+ //比对结果不同
+ else if (data[TcpCleint.PreFixLength + 3] == 0x00)
+ {
+ //获取当前板所有库位
+ var storeInfos = DbHelp.db.Queryable()
+ .Where(t => t.BoardId == boardId)
+ .ToList();
+ //当前设置的板库位数
+ var boardStoreNumber = storeInfos.Count();
+
+ List dataTemp = new List();
+ int index11 = 0;
+ while (boardStoreNumber > 0)
+ {
+ if (boardStoreNumber >= 4)
+ {
+ dataTemp.AddRange(Convert.ToString(data[TcpCleint.PreFixLength + 4 + index11], 2).PadLeft(8, '0').Reverse().ToList());
+ boardStoreNumber = boardStoreNumber - 4;
+ }
+ else
+ {
+ dataTemp.AddRange(Convert.ToString(data[TcpCleint.PreFixLength + 4 + index11], 2).PadLeft(2 * boardStoreNumber, '0').Reverse().ToList());
+ boardStoreNumber = 0;
+ }
+ index11++;
+ }
+
+ boardStoreNumber = storeInfos.Count();
+ for (int index = 0; index <= boardStoreNumber - 1; index++)
+ {
+ //当前库位异常
+ if (dataTemp[2 * index + 1] == '1')
+ {
+ if (dataTemp[2 * index] == '1')
+ {
+ var storeInfo = storeInfos.Where(t => t.LightNumber == index + 1).First();
+ if (storeInfo != null)
+ {
+
+ #region 不处理、WebSocket通知前台
+ var exceptionMessage = storeInfo.StoreCode + $"自检发现物料{storeInfo.CurrentMatSn}丢失,请确认是否删除?";
+ var warningModel = new WebSocketMessageModel()
+ {
+ WarningType = WarningTypeEnum.自检丢失,
+ StoreId = storeInfo.Id,
+ StoreCode = storeInfo.StoreCode,
+ ModuleId = storeInfo.ModuleId,
+ ModuleCode = storeInfo.ModuleCode,
+ ShelfCode = ShelfCode,
+ ShelfId = ShelfId,
+ WarningMessage = exceptionMessage,
+ ClientIp = WebSocketIpAddress
+ };
+ WarningManager.SendWarning(warningModel);
+ #endregion
+
+ //#region 【后台】丢失的数据处理
+ //Task.Run(() =>
+ //{
+ // try
+ // {
+ // DbHelp.db.BeginTran();
+ // //库位表字段清空
+ // storeInfo.CurrentMatSN = string.Empty;
+ // DbHelp.db.Updateable(storeInfo).ExecuteCommand();
+ // //库存表记录删除、插入出入记录
+ // var inventoryDetail = DbHelp.db.Queryable().Where(t => t.StoreCode == storeInfo.StoreCode).First();
+ // if (inventoryDetail != null)
+ // {
+ // var inOutRecord = new InOutRecord()
+ // {
+ // StoreCode = storeInfo.StoreCode,
+ // StoreId = storeInfo.Id,
+ // StoreInfo = storeInfo,
+
+ // R = storeInfo.R,
+ // C = storeInfo.C,
+ // Wei = storeInfo.Wei,
+ // WarehouseCode = inventoryDetail.WarehouseCode,
+
+ // MatSN = inventoryDetail.MatSN,
+ // MatCode = inventoryDetail.MatCode,
+ // MatName = inventoryDetail.MatName,
+ // MatBatch = inventoryDetail.MatBatch,
+ // MatQty = inventoryDetail.MatQty,
+ // MatSpec = inventoryDetail.MatSpec,
+
+ // OrderNumber = inventoryDetail.OrderNumber,
+ // OrderProdNumber = inventoryDetail.OrderProdNumber,
+ // OrderMaterialCode = inventoryDetail.OrderMaterialCode,
+ // OrderMaterialName = inventoryDetail.OrderMaterialName,
+ // OrderMaterialSpec = inventoryDetail.OrderMaterialSpec,
+
+ // GroupName = LocalFile.Config.GroupName,
+
+ // Direction = DirectionEnum.丢失,
+ // };
+ // DbHelp.db.Insertable(inOutRecord).ExecuteCommand();
+ // DbHelp.db.Deleteable(inventoryDetail).ExecuteCommand();
+ // }
+ // DbHelp.db.CommitTran();
+ // }
+ // catch (Exception e)
+ // {
+ // DbHelp.db.RollbackTran();
+ // }
+ //});
+ //#endregion
+ }
+ //库位未配置、返回数据异常
+ else
+ {
+ Logs.Write($"[进入入库模式异常]板Id{boardId},库位号{index + 1}找不到对应库位!");
+ }
+ }
+ else if (dataTemp[2 * index] == '0')
+ {
+ var storeInfo = storeInfos.Where(t => t.LightNumber == index + 1).First();
+ if (storeInfo != null)
+ {
+ #region 不处理、WebSocket通知前台
+ var exceptionMessage = $"自检发现库位{storeInfo.StoreCode}存在物料未扫描上架,请拿下后点击【确认】消除报警";
+ var warningModel = new WebSocketMessageModel()
+ {
+ WarningType = WarningTypeEnum.自检未扫描上架,
+ StoreId = storeInfo.Id,
+ StoreCode = storeInfo.StoreCode,
+ ModuleId = storeInfo.ModuleId,
+ ModuleCode = storeInfo.ModuleCode,
+ ShelfCode = ShelfCode,
+ ShelfId = ShelfId,
+ WarningMessage = exceptionMessage,
+ ClientIp = WebSocketIpAddress
+ };
+ WarningManager.SendWarning(warningModel);
+ #endregion
+ //#region 【记录缓存异常信息】
+ //var shelfStatus = LocalStatic.ShelfStatuses.Where(t => t.ShelfCode == storeInfo.ShelfCode).First();
+ //LocalStatic.CheckErr.Add($"库位{storeInfo.StoreCode}:存在物料未扫描上架,请取出后重新扫描上架!");
+ //#endregion
+ //WaringLightAlwaysRed(shelfStatus.ClientIp, shelfStatus.LightId);
+ }
+ else
+ {
+ Logs.Write($"[进入入库模式异常]板Id{boardId},库位号{index + 1}找不到对应库位!");
+ }
+ }
+ }
+ }
+ }
+ }
#endregion
}
diff --git a/WCS.BLL/HardWare/SmartShelfModule.cs b/WCS.BLL/HardWare/SmartShelfModule.cs
index ab59ceb..8f2e73d 100644
--- a/WCS.BLL/HardWare/SmartShelfModule.cs
+++ b/WCS.BLL/HardWare/SmartShelfModule.cs
@@ -5,6 +5,7 @@ using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
+using WCS.BLL.Config;
using WCS.DAL.Db;
using WCS.DAL.DbModels;
@@ -65,11 +66,22 @@ namespace WCS.BLL.HardWare
///
public byte[] GoOutStockTakingModeData = { 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
///
/// 复位命令
///
public byte[] ResetData = { 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ ///
+ /// 查询当前电压值
+ ///
+ public byte[] VoltageSingleData = { 0x17, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ ///
+ /// 电压偏移值
+ ///
+ public byte[] OffsetSingleData = { 0x18, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+ ///
+ /// 电压标准值
+ ///
+ public byte[] StandardSingleData = { 0x19, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
#endregion
public int ModuleId { get; set; }
public string ModuleCode { get; set; }
@@ -185,6 +197,7 @@ namespace WCS.BLL.HardWare
///
public void GoInOutStoreMode(TCPClient tcpClient, List outSns)
{
+ Logs.Write($"模组{ModuleCode},本次亮灯物料{string.Join(",",outSns)}", LogsType.Outstore);
CurrentOutSns = outSns;
var storeInfos = DbHelp.db.Queryable().Where(t => t.ModuleId == ModuleId)
.Where(t => t.BoardId == BoardId)
@@ -224,6 +237,15 @@ namespace WCS.BLL.HardWare
var data4 = outDataStr.Substring(0, 8);
GoInOutstoreModeData[3] = Convert.ToByte(data3, 2);
GoInOutstoreModeData[4] = Convert.ToByte(data4, 2);
+
+ if (LocalFile.Config.IsSameMatCodeOut)
+ {
+ GoInOutstoreModeData[5] = LocalStatic.CurrentOutStoreColor;
+ }
+ else
+ {
+ GoInOutstoreModeData[5] = 0x02;
+ }
}
tcpClient.Send(tcpClient.GenerateMessage(BoardId, GoInOutstoreModeData));
}
@@ -370,5 +392,21 @@ namespace WCS.BLL.HardWare
tcpClient.Send(tcpClient.GenerateMessage(BoardId, ComfirmOutstoreData));
}
+ ///
+ /// 查询电压值
+ ///
+ ///
+ public void QueryVoltage(TCPClient tcpClient)
+ {
+ Thread.Sleep(10);
+ Task.Run(() =>
+ {
+ tcpClient.Send(tcpClient.GenerateMessage(BoardId, VoltageSingleData));
+ Thread.Sleep(50);
+ tcpClient.Send(tcpClient.GenerateMessage(BoardId, StandardSingleData));
+ Thread.Sleep(50);
+ tcpClient.Send(tcpClient.GenerateMessage(BoardId, OffsetSingleData));
+ });
+ }
}
}
diff --git a/WCS.BLL/Manager/DbInit.cs b/WCS.BLL/Manager/DbInit.cs
index a790d46..69b92e8 100644
--- a/WCS.BLL/Manager/DbInit.cs
+++ b/WCS.BLL/Manager/DbInit.cs
@@ -1,9 +1,13 @@
-using System;
+using SqlSugar;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using WCS.BLL.Config;
using WCS.BLL.DbModels;
+using WCS.BLL.HardWare;
+using WCS.DAL;
using WCS.DAL.Db;
using WCS.DAL.Db.AuthDb;
using WCS.DAL.DbModels;
@@ -14,35 +18,113 @@ namespace WCS.BLL.Manager
{
public static void InitDb()
{
- DbHelp.db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo)
- , typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail)
- , typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo)
- , typeof(StockTakingOrder), typeof(StockTakingOrderMatDetail), typeof(InOutRecord)
- , typeof(DocumentSerialNumber)
- );
-
- DbHelp.dbLog.CodeFirst.InitTables(typeof(SystemApiLogRecord));
-
- //初始化单据序列号数据
- if (!DbHelp.db.Queryable().Any())
+ Logs.Write("【初始化数据库】开始", LogsType.StartBoot);
+ //初始化数据库对象
+ if (LocalFile.Config.IsMx)
{
- var outDocumentSerialNumber = new DocumentSerialNumber()
+ DbHelp.db = new SqlSugarScope(new ConnectionConfig()
{
- DocumentType = DocumentTypeEnum.出库单据,
- UpdateDate = DateTime.Now,
- CurrentSerialNumber = 0
- };
-
- var stockTakingDocumentSerialNumber = new DocumentSerialNumber()
+ ConnectionString = LocalFile.Config.DataDbPath,
+ DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite];
+ IsAutoCloseConnection = true
+ }, db =>
{
- DocumentType = DocumentTypeEnum.盘点单据,
- UpdateDate = DateTime.Now,
- CurrentSerialNumber = 0
- };
+ db.Aop.OnError = ex =>
+ {
+ };
+ });
- DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand();
- DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand();
+ //sqlserver保存接口日志时因为每个字段要限制长度,当接口返回内容长度过长会报错
+ //DbHelp.dbLog = new SqlSugarScope(new ConnectionConfig()
+ //{
+ // ConnectionString = LocalFile.Config.LogDbPath,
+ // DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite];
+ // IsAutoCloseConnection = true
+ //}, db =>
+ //{
+ // db.Aop.OnError = ex =>
+ // {
+ // };
+ //});
+
+ AuthDbHelp.db = new SqlSugarScope(new ConnectionConfig()
+ {
+ ConnectionString = LocalFile.Config.AuthDbPath,
+ DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite];
+ IsAutoCloseConnection = true
+ }, db =>
+ {
+ db.Aop.OnError = ex =>
+ {
+ };
+ });
+ Logs.Write("【初始化数据库】MX", LogsType.StartBoot);
}
+ //手动修改后台配置后再进行CodeFirst 数据库的生成、表的生成
+ if (LocalFile.Config.IsResetDBOrTable)
+ {
+ #region 建库建表 只在表有变动时运行
+ DbHelp.db.DbMaintenance.CreateDatabase();
+ DbHelp.dbLog.DbMaintenance.CreateDatabase();
+ Logs.Write("【初始化数据库】创建数据库", LogsType.StartBoot);
+
+ DbHelp.db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo)
+ , typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail)
+ , typeof(ShelfTypeInfo), typeof(MatBaseInfo), typeof(MatInfo)
+ , typeof(StockTakingOrder), typeof(StockTakingOrderMatDetail), typeof(InOutRecord)
+ , typeof(DocumentSerialNumber),typeof(OrderLight)
+ );
+ Logs.Write("【初始化数据库】db建表", LogsType.StartBoot);
+
+ DbHelp.dbLog.CodeFirst.InitTables(typeof(SystemApiLogRecord));
+ Logs.Write("【初始化数据库】logdb建表", LogsType.StartBoot);
+
+ //初始化单据序列号数据
+ if (!DbHelp.db.Queryable().Any())
+ {
+ var outDocumentSerialNumber = new DocumentSerialNumber()
+ {
+ DocumentType = DocumentTypeEnum.出库单据,
+ UpdateDate = DateTime.Now,
+ CurrentSerialNumber = 0
+ };
+
+ var stockTakingDocumentSerialNumber = new DocumentSerialNumber()
+ {
+ DocumentType = DocumentTypeEnum.盘点单据,
+ UpdateDate = DateTime.Now,
+ CurrentSerialNumber = 0
+ };
+
+ DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand();
+ DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand();
+ }
+ Logs.Write("【初始化数据库】DocumentSerialNumber", LogsType.StartBoot);
+
+ //初始化货架类型
+ if (!DbHelp.db.Queryable().Any())
+ {
+ var smartShelf = new ShelfTypeInfo()
+ {
+ ShelfTypeName = "智能货架"
+ };
+ var singleLight = new ShelfTypeInfo()
+ {
+ ShelfTypeName = "信息化货架"
+ };
+ DbHelp.db.Insertable(smartShelf).ExecuteCommand();
+ DbHelp.db.Insertable(singleLight).ExecuteCommand();
+ }
+ Logs.Write("【初始化数据库】初始化货架类型", LogsType.StartBoot);
+
+ //初始化权限数据库
+ AuthDbHelp.InitDb();
+ #endregion
+
+ LocalFile.Config.IsResetDBOrTable = false;
+ LocalFile.SaveConfig();
+ }
+ Logs.Write("【初始化数据库】结束", LogsType.StartBoot);
}
}
}
diff --git a/WCS.BLL/Manager/MXBackgroundThread.cs b/WCS.BLL/Manager/MXBackgroundThread.cs
new file mode 100644
index 0000000..bab8644
--- /dev/null
+++ b/WCS.BLL/Manager/MXBackgroundThread.cs
@@ -0,0 +1,361 @@
+using SqlSugar;
+using WCS.BLL.Config;
+using WCS.BLL.DbModels;
+using WCS.BLL.HardWare;
+using WCS.BLL.Tool;
+using WCS.DAL;
+using WCS.DAL.Db;
+using WCS.DAL.Db.AuthDb;
+using WCS.DAL.DbModels;
+using WCS.Model;
+using WCS.Model.ApiModel.InOutRecord;
+using WCS.Model.ApiModel.MXBackgroundThread;
+
+namespace WCS.BLL.Manager
+{
+ //盟讯公司后台方法
+ public static class MXBackgroundThread
+ {
+ public static void InitBackgroundThread()
+ {
+ #region 定时任务:回传Mes入库出库
+ Task.Run(() =>
+ {
+ while (true)
+ {
+ //每5秒同步一次
+ Thread.Sleep(5000);
+ try
+ {
+ var records = DbHelp.db.Queryable()
+ .Where(t => t.OperateTime > DateTime.Now.AddDays(-3)) //只查询回传三天内数据
+ .Where(t => t.IsUpload == false)
+ .Includes(t => t.StoreInfo)
+ .OrderBy(t => t.Id)
+ .ToList();
+ //入库记录上传
+ var inventoryDetails = records.Where(t => t.Direction == DirectionEnum.入库)
+ .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName)
+ .ToList();
+ if (inventoryDetails != null && inventoryDetails.Count > 0)
+ {
+ for (int i = 0; i < inventoryDetails.Count; i++)
+ {
+ try
+ {
+ //请求WMS上传入库记录
+ var data = new InputStockInRequest
+ {
+ materialBar = inventoryDetails[i].MatSN,
+ shelfCode = inventoryDetails[i].BigShelfCode,
+ shelfX = "R" + inventoryDetails[i].R,
+ shelfY = "C" + inventoryDetails[i].C,
+ shelfZ = inventoryDetails[i].Wei,
+ inUser = inventoryDetails[i].OperateUser,
+ inTime = inventoryDetails[i].OperateTime.ToString("yyyy-MM-dd HH:mm:ss"),
+ };
+ Guid guid = Guid.NewGuid();
+ var result = ApiHelp.GetDataFromHttp(LocalFile.Config.InputStockInStr, data, "POST", true);
+ if (result != null && (result.Code == 200))
+ {
+ //上传成功 更改上传状态
+ inventoryDetails[i].IsUpload = true;
+ DbHelp.db.Updateable(inventoryDetails[i]).ExecuteCommand();
+ }
+
+ }
+ catch (Exception ex)
+ {
+
+ }
+ Thread.Sleep(200);
+ }
+ }
+
+ //出库记录上传
+ var outRecord = records.Where(t => t.Direction == DirectionEnum.出库)
+ .Where(t => !string.IsNullOrEmpty(t.OrderNumber))
+ .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName)
+ .ToList();
+ if (outRecord != null && outRecord.Count > 0)
+ {
+ for (int i = 0; i < outRecord.Count; i++)
+ {
+ try
+ {
+ var retString = string.Empty;
+
+ var data = new BunkerOutRequest()
+ {
+ materialBar = outRecord[i].MatSN,
+ outType = 0,
+ pickBillNumber = outRecord[i].OrderNumber,
+ qty = outRecord[i].MatQty,
+ };
+ var result = ApiHelp.GetDataFromHttp(LocalFile.Config.BunkerOutStr, data, "POST", true);
+ //请求成功
+ if (result != null && result.Code == 200)
+ {
+ //上传成功 更改上传状态
+ outRecord[i].IsUpload = true;
+ DbHelp.db.Updateable(outRecord[i]).ExecuteCommand();
+ }
+
+ }
+ catch (Exception ex)
+ {
+
+ }
+ Thread.Sleep(200);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Logs.Write("【定时任务】上传异常:" + ex.Message);
+ }
+ }
+ });
+ #endregion
+
+ #region 定时任务:超时退出 出库、入库、盘点模式
+ Task.Run(() =>
+ {
+ while (true)
+ {
+ //每10s一次
+ Thread.Sleep(10000);
+ try
+ {
+ #region 入库模式
+ var inStoreShelf = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.入库模式)
+ .Where(t => DateTime.Now - t.SetCurrentModeTime >= TimeSpan.FromMinutes(3))
+ .ToList();
+ foreach (var shelf in inStoreShelf)
+ {
+ shelf.GoOutInstore();
+ Logs.Write($"【定时任务:定时退出模式】货架【{shelf.ShelfCode}】超时(3min)未退出入库模式,系统后台自动退出!");
+ }
+ #endregion
+
+ #region 出库模式
+ //出库超过n分钟自动进入待机模式
+ var outStoreShelf = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式)
+ .Where(t => DateTime.Now - t.SetCurrentModeTime >= TimeSpan.FromMinutes(5))
+ .ToList();
+ foreach (var shelf in outStoreShelf)
+ {
+ Logs.Write($"【定时任务:定时退出模式】货架【{shelf.ShelfCode}】超时(5min)未退出出库模式,系统后台自动退出!出库单[{shelf.OrderNumber}]");
+ shelf.GoOutOutstore();
+ }
+ #endregion
+
+ #region 盘点模式
+ var stockTakingShelf = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.盘点模式)
+ .Where(t => DateTime.Now - t.SetCurrentModeTime >= TimeSpan.FromMinutes(5))
+ .ToList();
+ foreach (var shelf in stockTakingShelf)
+ {
+ Logs.Write($"【定时任务:定时退出模式】货架【{shelf.ShelfCode}】超时(5min)未退出盘点模式,系统后台自动退出!盘点单[{shelf.OrderNumber}]");
+ shelf.GoOutStocktaking();
+ }
+ #endregion
+ }
+ catch (Exception e)
+ {
+ Logs.Write("【定时任务:定时退出模式】" + e.Message, LogsType.Info);
+ }
+ }
+ });
+ #endregion
+
+ #region 定时任务:海康未扫物料码的物料更新数据
+ Task.Run(() =>
+ {
+ while (true)
+ {
+ //间隔20秒同步一次
+ Thread.Sleep(20000);
+ try
+ {
+ var inventoryDetails = DbHelp.db.Queryable()
+ .Where(t => t.MatName == "暂时未知")
+ .Where(t => t.InstoreTime > DateTime.Now.AddDays(-3))
+ .ToList();
+ if (inventoryDetails != null && inventoryDetails.Count > 0)
+ {
+ for (int i = 0; i < inventoryDetails.Count; i++)
+ {
+ try
+ {
+ //请求WMS获取物料的信息
+ var request = new QueryBybarRequest()
+ {
+ materialBar = inventoryDetails[i].MatSN
+ };
+ var result = ApiHelp.GetDataFromHttp(LocalFile.Config.QueryBybar, request, "POST", true);
+ if (result != null && (result.code == 200) && result.data != null && result.data.Count() > 0)
+ {
+ //查询成功 更改数值
+ var instoreDto = result.data.FirstOrDefault();
+ inventoryDetails[i].MatCode = instoreDto.materialCode;
+ inventoryDetails[i].MatName = instoreDto.materialName;
+ inventoryDetails[i].MatBatch = instoreDto.batchNo;
+ inventoryDetails[i].MatSpec = instoreDto.materialSpec;
+ inventoryDetails[i].MatQty = (int)instoreDto.materialQty;
+ DbHelp.db.Updateable(inventoryDetails[i]).ExecuteCommand();
+ }
+
+ }
+ catch (Exception ex)
+ {
+
+ }
+ Thread.Sleep(500);
+ }
+ }
+
+
+
+ }
+ catch (Exception ex)
+ {
+ Logs.Write("【定时任务】更新海康物料信息异常:" + ex.Message);
+ }
+
+ Thread.Sleep(3000);
+ try
+ {
+ var inventoryDetails = DbHelp.db.Queryable()
+ .Where(t => t.WarehouseCode == null)
+ .Where(t => t.InstoreTime > DateTime.Now.AddDays(-30))
+ .ToList();
+ if (inventoryDetails != null && inventoryDetails.Count > 0)
+ {
+ for (int i = 0; i < inventoryDetails.Count; i++)
+ {
+ try
+ {
+ var url = $"http://192.168.2.23:9213/integrate/hkwsInventoryDetail/selectMaterialBar?materialBar={inventoryDetails[i].MatSN}";
+ var result = ApiHelp.GetDataFromHttp(url, null, "POST", false);
+ if (result != null && result.code == 200 && result.data != null && !string.IsNullOrEmpty(result.data.warehouseCode))
+ {
+ //查询成功 更改数值
+ inventoryDetails[i].WarehouseCode = result.data.warehouseCode;
+ DbHelp.db.Updateable(inventoryDetails[i]).ExecuteCommand();
+ }
+
+ }
+ catch (Exception ex)
+ {
+ Logs.Write("【定时任务】更新仓库代码异常:" + ex.Message);
+ }
+ Thread.Sleep(500);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+ });
+ #endregion
+
+ #region 定时任务:监测警示灯关灯机制
+ //判断灯颜色和模式是否对应
+ Task.Run(() =>
+ {
+ while (true)
+ {
+ //间隔5秒查询一次
+ Thread.Sleep(5000);
+ try
+ {
+ //待机模式未关灯
+ var shelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.待机模式 && t.LightColor != WarningLight.LightColorEnum.关闭)
+ .Where(t => t.SetCurrentModeTime < DateTime.Now.AddSeconds(-5))
+ .ToList();
+ foreach (var shelf in shelves)
+ {
+ try
+ {
+ if (shelf is SmartShelf)
+ {
+ var smartShelf = (SmartShelf)shelf;
+ smartShelf?.WarningLight.CloseLight(smartShelf.TcpCleint);
+ Logs.Write($"【定时任务】:监测警示灯关灯机制,关【{shelf.ShelfCode}】灯发送指令成功!");
+ }
+ }
+ catch (Exception ex)
+ {
+ Logs.Write($"【定时任务】:监测警示灯关灯机制,关【{shelf.ShelfCode}】灯发生异常" + ex.Message);
+ }
+ }
+
+ //出库模式未亮灯
+ var outShelves = ShelfManager.Shelves.Where(t => t.CurrentMode == Mode.出库模式 && t.LightColor == WarningLight.LightColorEnum.关闭)
+ .Where(t => t.SetCurrentModeTime < DateTime.Now.AddSeconds(-5))
+ .ToList();
+ foreach (var shelf in outShelves)
+ {
+ try
+ {
+ if (shelf is SmartShelf)
+ {
+ var smartShelf = (SmartShelf)shelf;
+ smartShelf?.WarningLight.GreenLight(smartShelf.TcpCleint);
+ Logs.Write($"【定时任务】:监测警示灯关灯机制,出库开灯【{shelf.ShelfCode}】发送指令成功!");
+ }
+ }
+ catch (Exception ex)
+ {
+ Logs.Write($"【定时任务】:监测警示灯关灯机制,出库开灯【{shelf.ShelfCode}】发生异常" + ex.Message);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Logs.Write("【定时任务】:监测警示灯关灯机制发生异常" + ex.Message);
+ }
+ }
+ });
+ #endregion
+ }
+
+ ///
+ /// 发送钉钉消息
+ ///
+ /// 发送的消息内容
+ /// 错误信息
+ /// 工号列表
+ ///
+ public static bool SendDingDingMsg(string msg, List idList, ref string errMsg)
+ {
+ try
+ {
+ #region 获取所有工程研发人员
+ var list = AuthDbHelp.db.Queryable().Where(t => t.IsGCYF)
+ .Select(t => t.LoginName)
+ .ToList();
+ #endregion
+ string ids = string.Join(",", list);
+ string url = "http://192.168.2.23:9213/integrate/cmccMonitor/rateAlertByCMCC?" + $"context={msg}&messageType=软件管理平台&username={ids}";
+ #region 调用接口请求发送钉钉消息
+ var Result = ApiHelp.GetDataFromHttp(url, null, "GET");
+ if (Result != null && Result.code != 200)
+ {
+ errMsg = Result.msg;
+ return false;
+ }
+ return true;
+ #endregion
+
+ }
+ catch (Exception ex)
+ {
+ errMsg = "接口调用失败";
+ return false;
+ }
+ }
+ }
+}
diff --git a/WCS.BLL/Manager/ShelfManager.cs b/WCS.BLL/Manager/ShelfManager.cs
index 1126322..347222e 100644
--- a/WCS.BLL/Manager/ShelfManager.cs
+++ b/WCS.BLL/Manager/ShelfManager.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.HardWare;
using WCS.DAL.Db;
@@ -20,11 +21,18 @@ namespace WCS.BLL.Manager
public static void InitShelves()
{
- var shelvesInDb = DbHelp.db.Queryable().ToList();
+ Logs.Write("【InitShelves】开始", LogsType.StartBoot);
+
+ var shelvesInDbQueryable = DbHelp.db.Queryable();
+ if (LocalFile.Config.IsMx)
+ shelvesInDbQueryable = shelvesInDbQueryable.Where(t => t.GroupName == LocalFile.Config.GroupName);
+ var shelvesInDb = shelvesInDbQueryable.ToList();
foreach (var shelfInDb in shelvesInDb)
{
Shelves.Add(InitShelf(shelfInDb));
}
+
+ Logs.Write("【InitShelves】结束", LogsType.StartBoot);
}
public static IShelfBase InitShelf(ShelfInfo shelfInDb)
diff --git a/WCS.BLL/Manager/TCPClientManager.cs b/WCS.BLL/Manager/TCPClientManager.cs
index cc66223..91ceedc 100644
--- a/WCS.BLL/Manager/TCPClientManager.cs
+++ b/WCS.BLL/Manager/TCPClientManager.cs
@@ -8,6 +8,7 @@ using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Sockets;
+using WCS.BLL.Config;
using WCS.BLL.HardWare;
using WCS.DAL.Db;
using WCS.DAL.DbModels;
@@ -22,107 +23,95 @@ namespace WCS.BLL.Manager
public static List TCPClients = new List();
public static void InitTcpClient()
{
+ Logs.Write("【InitTcpClient】开始", LogsType.StartBoot);
+
var ips = DbHelp.db.Queryable()
- //.Where(t => t.ShelfCode.Contains("C"))
+ .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName),t => t.GroupName == LocalFile.Config.GroupName)
.Select(t => t.ClientIp)
.Distinct()
.ToList();
foreach (var ip in ips)
{
- var tcpCleint = new TCPClient(ip, "");
- //配置断线重连
- tcpCleint.tcpClient.Received += (client, e) =>
+ Task.Run(() =>
{
- var clientIpHost = client.IP + ":" + client.Port;
- var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
- if (TcpCleint == null)
+ var tcpCleint = new TCPClient(ip, "");
+ tcpCleint.tcpClient.Received += (client, e) =>
{
- //TO DO
- return EasyTask.CompletedTask;
- }
-
- var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray();
- e.ByteBlock.Clear();
- var len = data.Length;
- for (int index = 0; index < data.Length - TcpCleint.PreFixLength; index++)
- {
- //协议拆包 通过前缀校验是否为完整数据包
- var prefixInData = data.Skip(index).Take(TcpCleint.PreFixLength);
- var isEqual = prefixInData.SequenceEqual(TcpCleint.Prefix);
- if (isEqual)
+ var clientIpHost = client.IP + ":" + client.Port;
+ var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
+ if (TcpCleint == null)
{
- Logs.Write("协议处理1!");
- var dataTemp = data.Skip(index).Take(TcpCleint.PreFixLength + TcpCleint.DataLength).ToArray();
- if (dataTemp.Length < TcpCleint.PreFixLength + TcpCleint.DataLength)//拆包后不满足一条指令的长度
- {
- continue;
- }
- index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1
- //获取板子ID
- var boardId = (dataTemp[TcpCleint.PreFixLength + 0] << 8) + dataTemp[TcpCleint.PreFixLength + 1];
- var lightNumber = Convert.ToInt32(dataTemp[TcpCleint.PreFixLength + 3]);
-
- Logs.Write("协议处理2!");
- //报警灯
- if (dataTemp[TcpCleint.PreFixLength + 2] == 0x20)
- {
- var shelf = ShelfManager.Shelves.Where(t => t.ClientIp == clientIpHost)
- .Where(t => t.LightId == boardId)
- .FirstOrDefault();
- var smartShelf = shelf as SmartShelf;
- smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
- }
- //!= 0x20 货架类型协议返回
- else
- {
- Logs.Write("协议处理3!");
- var shelf = ShelfManager.Shelves
- .Where(t => t.ClientIp == clientIpHost)
- .Where(t => t.ModuleIds.Contains(boardId))
- .FirstOrDefault();
- var smartShelf = shelf as SmartShelf;
- smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
-
- }
-
- //协议处理 判断功能位
- //switch (dataTemp[TcpCleint.PreFixLength + 2])
- //{
- // case 0x20://进入入库模式信号
- // //GoInInstoreProcess(dataTemp, boardId, lightNumber);
- // break;
- // case 0x03://正常入库信号
- // //InStoreReturnProcess(dataTemp);
- // break;
- // default:
- // ;
- // break;
- //}
+ return EasyTask.CompletedTask;
}
- }
- Logs.Write("协议处理完毕!");
- return EasyTask.CompletedTask;
- };
- //配置首次连接后复位操作
- tcpCleint.tcpClient.Connected += (client, e) =>
- {
- var clientIpHost = client.IP + ":" + client.Port;
- var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
- if (TcpCleint == null)
- {
- return EasyTask.CompletedTask;
- }
- //首次连接
- if (TcpCleint.IsFirstConnected == false)
- {
- InitStatus(TcpCleint);
- TcpCleint.IsFirstConnected = true;
- }
- return EasyTask.CompletedTask;
- };
- TCPClients.Add(tcpCleint);
- tcpCleint.Connect();
+ var data = e.ByteBlock.Buffer.Take((int)e.ByteBlock.Length).ToArray();
+ Logs.Write($"【接收】{BitConverter.ToString(data)}", LogsType.Instructions);
+ e.ByteBlock.Clear();
+ var len = data.Length;
+ for (int index = 0; index < data.Length - TcpCleint.PreFixLength; index++)
+ {
+ //协议拆包 通过前缀校验是否为完整数据包
+ var prefixInData = data.Skip(index).Take(TcpCleint.PreFixLength);
+ var isEqual = prefixInData.SequenceEqual(TcpCleint.Prefix);
+ if (isEqual)
+ {
+ var dataTemp = data.Skip(index).Take(TcpCleint.PreFixLength + TcpCleint.DataLength).ToArray();
+ if (dataTemp.Length < TcpCleint.PreFixLength + TcpCleint.DataLength)//拆包后不满足一条指令的长度
+ {
+ continue;
+ }
+ Logs.Write($"【处理单条指令 开始】{BitConverter.ToString(dataTemp)}", LogsType.Instructions);
+ index += (TcpCleint.PreFixLength + TcpCleint.DataLength - 1);//每次循环index会+1 所以这里-1
+ //获取板子ID
+ var boardId = (dataTemp[TcpCleint.PreFixLength + 0] << 8) + dataTemp[TcpCleint.PreFixLength + 1];
+ var lightNumber = Convert.ToInt32(dataTemp[TcpCleint.PreFixLength + 3]);
+ //报警灯 返回来就修改对应的灯的颜色
+ if (dataTemp[TcpCleint.PreFixLength + 2] == 0x20)
+ {
+ var shelf = ShelfManager.Shelves.Where(t => t.ClientIp == clientIpHost)
+ .Where(t => t.LightId == boardId)
+ .FirstOrDefault();
+ var smartShelf = shelf as SmartShelf;
+ smartShelf?.WarningLightProcess(dataTemp, boardId, lightNumber);
+ }
+ //!= 0x20 货架类型协议返回
+ else
+ {
+ var shelf = ShelfManager.Shelves
+ .Where(t => t.ClientIp == clientIpHost)
+ .Where(t => t.ModuleIds != null && t.ModuleIds.Contains(boardId))
+ .FirstOrDefault();
+ var smartShelf = shelf as SmartShelf;
+ smartShelf?.ProtocolProcess(dataTemp, boardId, lightNumber);
+ }
+ Logs.Write($"【处理单条指令 结束】{BitConverter.ToString(dataTemp)}", LogsType.Instructions);
+ }
+ }
+ return EasyTask.CompletedTask;
+ };
+ //配置首次连接后复位操作
+ tcpCleint.tcpClient.Connected += (client, e) =>
+ {
+ var clientIpHost = client.IP + ":" + client.Port;
+ var TcpCleint = TCPClientManager.GetTCPClientByIPHost(clientIpHost);
+ if (TcpCleint == null)
+ {
+ return EasyTask.CompletedTask;
+ }
+ //首次连接
+ if (TcpCleint.IsFirstConnected == false)
+ {
+ Logs.Write($"【InitTcpClient】{clientIpHost}完成首次连接", LogsType.StartBoot);
+ Console.WriteLine($"【InitTcpClient】{clientIpHost}完成首次连接");
+ InitStatus(TcpCleint);
+ TcpCleint.IsFirstConnected = true;
+ }
+ return EasyTask.CompletedTask;
+ };
+
+ TCPClients.Add(tcpCleint);
+ tcpCleint.Connect();
+ });
}
//启动线程监听所有TCP是否已经完成首次连接
@@ -130,22 +119,31 @@ namespace WCS.BLL.Manager
{
while (true)
{
- Thread.Sleep(1000);
- var noFirstConnectedClients = TCPClientManager.TCPClients.Where(t => t.IsFirstConnected == false)
- .ToList();
- if (noFirstConnectedClients.Count == 0)
+ try
{
- break;
- }
- else
- {
- noFirstConnectedClients.ForEach(t =>
+ Thread.Sleep(1000);
+ var noFirstConnectedClients = TCPClientManager.TCPClients.Where(t => t.IsFirstConnected == false)
+ .ToList();
+ if (noFirstConnectedClients.Count == 0)
{
- t.ReConnectAsync();
- });
+ break;
+ }
+ else
+ {
+ Console.WriteLine($"存在tcp未完成首次连接,继续重连!");
+ noFirstConnectedClients.ForEach(t =>
+ {
+ t.ReConnectAsync();
+ });
+ }
+ }
+ catch (Exception ex)
+ {
+
}
}
});
+ Logs.Write("【InitTcpClient】完成 后台继续连接", LogsType.StartBoot);
}
//后台启动时给所有板子、警示灯发送复位操作 保持状态一致
diff --git a/WCS.BLL/Manager/WarningManager.cs b/WCS.BLL/Manager/WarningManager.cs
index ab69ca2..44d1d06 100644
--- a/WCS.BLL/Manager/WarningManager.cs
+++ b/WCS.BLL/Manager/WarningManager.cs
@@ -75,8 +75,15 @@ namespace WCS.BLL.Manager
case WarningTypeEnum.出库自检丢失:
SolveLoss(warningInManager);
break;
+ case WarningTypeEnum.自检丢失:
+ SolveLoss(warningInManager);
+ break;
}
}
+ else if (solveType == SolveTypeEnum.忽略)
+ {
+ //不发指令了
+ }
//消除报警缓存信息
lock (flag)
@@ -88,7 +95,6 @@ namespace WCS.BLL.Manager
//货架是否还存在报警信息
shelfIsWarning = Warnings.Where(t => t.ShelfId == warning.ShelfId)
.Any();
-
//对应货架如果不存在报警信息了 指示灯回到对应的状态
if (!shelfIsWarning)
{
@@ -139,7 +145,6 @@ namespace WCS.BLL.Manager
public static void SolveLoss(WebSocketMessageModel warning)
{
#region 【后台】丢失的数据处理
-
try
{
//获取库位
@@ -164,6 +169,12 @@ namespace WCS.BLL.Manager
StoreId = storeInfo.Id,
StoreInfo = storeInfo,
+ R = storeInfo.R,
+ C = storeInfo.C,
+ Wei = storeInfo.Wei,
+ BigShelfCode = storeInfo.BigShelfCode,
+ GroupName = storeInfo.GroupName,
+
MatSN = inventoryDetail.MatSN,
MatCode = inventoryDetail.MatCode,
MatName = inventoryDetail.MatName,
@@ -174,9 +185,45 @@ namespace WCS.BLL.Manager
MatSupplier = inventoryDetail.MatSupplier,
Direction = DirectionEnum.丢失,
+ OperateUser = warning.SolvedUser,
};
DbHelp.db.Insertable(inOutRecord).ExecuteCommand();
DbHelp.db.Deleteable(inventoryDetail).ExecuteCommand();
+
+ #region 如果是出库 删除正在出库缓存的数据
+ if (warning.WarningType == WarningTypeEnum.出库自检丢失)
+ {
+ Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,用户点击【处理】,删除数据",LogsType.Outstore);
+ //清掉需要出库的缓存
+ var shelf = ShelfManager.Shelves
+ .Where(t => t.ShelfId == warning.ShelfId)
+ .FirstOrDefault();
+ if (shelf != null)
+ {
+ var smartShelf = shelf as SmartShelf;
+ if (smartShelf != null)
+ {
+ //删除货架上缓存的那一条数据
+ smartShelf.CurrentOutStoreMatSNs.RemoveAll(t => t == inventoryDetail.MatSN);
+ Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,已删除货架缓存,剩余物料为{string.Join(",", smartShelf.CurrentOutStoreMatSNs)}", LogsType.Outstore);
+
+ //删除模组上缓存的那一条数据
+ var module = smartShelf.Modules.Where(t => t.ModuleId == warning.ModuleId).FirstOrDefault();
+ if (module != null) {
+ module.CurrentOutSns.RemoveAll(t => t == inventoryDetail.MatSN);
+ Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,已删除模组缓存,剩余物料为{string.Join(",", module.CurrentOutSns)}", LogsType.Outstore);
+ }
+ //删除已丢失的出库明细数据
+ var outOrderMatDetail = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == smartShelf.CurrentOutOrder.Id)
+ .Where(t => t.MatSN == inventoryDetail.MatSN && t.IsSended == false)
+ .ToList();
+ Logs.Write($"【出库自检】发现物料{inventoryDetail.MatSN}丢失,删除出库物料明细数据{outOrderMatDetail.Count}条!");
+ DbHelp.db.Deleteable(outOrderMatDetail).ExecuteCommand();
+ }
+ }
+ }
+ #endregion
}
DbHelp.db.CommitTran();
}
@@ -217,8 +264,9 @@ namespace WCS.BLL.Manager
smartShelf.WarningLight.BlueLight(smartShelf.TcpCleint);
break;
case Mode.出库模式:
- module.GoInOutStoreMode(smartShelf.TcpCleint, module.CurrentOutSns);
- smartShelf.WarningLight.GreenLight(smartShelf.TcpCleint);
+ //module.GoInOutStoreMode(smartShelf.TcpCleint, module.CurrentOutSns);
+ //smartShelf.WarningLight.GreenLight(smartShelf.TcpCleint);
+ smartShelf.GoInOutstoreByWebSocket(module.ModuleId);
break;
case Mode.待机模式:
module.Reset(smartShelf.TcpCleint);
diff --git a/WCS.BLL/Manager/WebSoceketManager.cs b/WCS.BLL/Manager/WebSoceketManager.cs
index 2256bd8..540bcee 100644
--- a/WCS.BLL/Manager/WebSoceketManager.cs
+++ b/WCS.BLL/Manager/WebSoceketManager.cs
@@ -16,6 +16,8 @@ namespace WCS.BLL.Manager
public static object flag = new object();
public static void InitWebSocket()
{
+ Console.WriteLine("【启动WebSocket】开始");
+ Logs.Write("【启动WebSocket】开始", LogsType.StartBoot);
service = new HttpService();
service.Setup(new TouchSocketConfig()//加载配置
.SetListenIPHosts(7789)
@@ -30,11 +32,19 @@ namespace WCS.BLL.Manager
.UseAutoPong();//当收到ping报文时自动回应pong
a.Add();//自定义插件。
}));
-
+ //客户端成功连接
+ service.Connected = (client, e) =>
+ {
+ Logs.Write("[WebSocket]" + client.GetIPPort() + "成功连接!", LogsType.StartBoot);
+ Console.WriteLine("[WebSocket]" + client.GetIPPort() +"成功连接!");
+ return EasyTask.CompletedTask;
+ };
service.Start();
- service.Logger.Info("服务器已启动");
+ Console.WriteLine("【启动WebSocket】结束");
+ Logs.Write("【启动WebSocket】结束", LogsType.StartBoot);
}
- //尝试发送报警信息给前端
+
+ //发送报警信息给前端
public static void TrySendMessage(string IpAddress, string Message)
{
try
diff --git a/WCS.BLL/Services/IService/IGenerateService.cs b/WCS.BLL/Services/IService/IGenerateService.cs
index e9051a1..c7d1ac3 100644
--- a/WCS.BLL/Services/IService/IGenerateService.cs
+++ b/WCS.BLL/Services/IService/IGenerateService.cs
@@ -15,5 +15,7 @@ namespace WCS.BLL.Services.IService
public Task generateStockTakingNumber();
public Task generateOutOrderNumber();
+
+ public Task generateMXPDOutOrderNumber();
}
}
diff --git a/WCS.BLL/Services/IService/IHomerService.cs b/WCS.BLL/Services/IService/IHomerService.cs
index 95ade5b..3e254b8 100644
--- a/WCS.BLL/Services/IService/IHomerService.cs
+++ b/WCS.BLL/Services/IService/IHomerService.cs
@@ -3,6 +3,6 @@ namespace WCS.BLL.Services.IService
{
public interface IHomerService
{
-
+
}
}
diff --git a/WCS.BLL/Services/IService/IMatInventoryDetailService.cs b/WCS.BLL/Services/IService/IMatInventoryDetailService.cs
index 87024f8..55e6e55 100644
--- a/WCS.BLL/Services/IService/IMatInventoryDetailService.cs
+++ b/WCS.BLL/Services/IService/IMatInventoryDetailService.cs
@@ -15,5 +15,7 @@ namespace WCS.BLL.Services.IService
public Task> exportMatInventoryDetail(GetMatInventoryDetailRequest request);
public Task>> getMatInventorySummary(GetMatInventorySummaryRequest request);
+
+ public Task> compareMatInventoryDetail(CompareMatInventoryDetailRequest request);
}
}
diff --git a/WCS.BLL/Services/IService/IOutstoreService.cs b/WCS.BLL/Services/IService/IOutstoreService.cs
index 8726265..a80d3ff 100644
--- a/WCS.BLL/Services/IService/IOutstoreService.cs
+++ b/WCS.BLL/Services/IService/IOutstoreService.cs
@@ -4,12 +4,14 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WCS.Model;
+using WCS.Model.ApiModel.MatInventoryDetail;
using WCS.Model.ApiModel.OutStore;
namespace WCS.BLL.Services.IService
{
public interface IOutstoreService
{
+ public Task>> importMat(List list);
public Task SysOutOrderByMatCode(SysOutOrderByMatCodeRequest request);
public Task SysOutOrderByMatSn(SysOutOrderByMatSnRequest request);
@@ -19,10 +21,11 @@ namespace WCS.BLL.Services.IService
public Task GetOutOrderListByStatus(GetOutOrderListByStatusRequest request);
public Task GetOutOrderDetail(GetOutOrderDetailRequest request);
+ public Task GetOutOrderDetailSingleLight(GetOutOrderDetailRequest request);
public Task GetOutOrderMatDetail(GetOutOrderDetailRequest request);
- public Task GoInOutstore(GetOutOrderDetailRequest request);
+ public Task GoInOutstore(GetOutOrderDetailRequest request);
public Task GoOutOutstore(GetOutOrderDetailRequest request);
diff --git a/WCS.BLL/Services/IService/ISelfCheckService.cs b/WCS.BLL/Services/IService/ISelfCheckService.cs
index 141f61a..12793a6 100644
--- a/WCS.BLL/Services/IService/ISelfCheckService.cs
+++ b/WCS.BLL/Services/IService/ISelfCheckService.cs
@@ -12,5 +12,7 @@ namespace WCS.BLL.Services.IService
public interface ISelfCheckService
{
public Task StartSelfCheckByShelfCode(StartSelfCheckByShelfCodeRequest request);
+
+ public Task StartSelfCheckByGroupName(List GroupNames);
}
}
diff --git a/WCS.BLL/Services/IService/IStoreInfoService.cs b/WCS.BLL/Services/IService/IStoreInfoService.cs
index 49bff75..73e869b 100644
--- a/WCS.BLL/Services/IService/IStoreInfoService.cs
+++ b/WCS.BLL/Services/IService/IStoreInfoService.cs
@@ -32,19 +32,40 @@ namespace WCS.BLL.Services.IService
///
- /// 查询货架列表
+ /// 查询模组列表
///
///
///
public Task> GetModules(GetModulesRequest request);
+ ///
+ /// 禁用或启用模组
+ ///
+ ///
+ ///
+ public Task disableOrEnableModule(DisableOrEnableModuleRequest request);
///
- /// 查询货架列表
+ /// 查询模组电压值
+ ///
+ ///
+ ///
+ public Task queryModuleVoltage(QueryModuleVoltageRequest request);
+
+
+ ///
+ /// 查询库位列表
///
///
///
public Task> GetStores(GetStoresRequest request);
+ ///
+ /// 禁用或启用库位
+ ///
+ ///
+ ///
+ public Task disableOrEnableStore(DisableOrEnableStoreRequest request);
+
}
}
diff --git a/WCS.BLL/Services/Service/GenerateService.cs b/WCS.BLL/Services/Service/GenerateService.cs
index f89c77f..fb2ee2e 100644
--- a/WCS.BLL/Services/Service/GenerateService.cs
+++ b/WCS.BLL/Services/Service/GenerateService.cs
@@ -134,6 +134,15 @@ namespace WCS.BLL.Services.Service
}
}
+ public async Task generateMXPDOutOrderNumber()
+ {
+ lock (stockTakingFlag)
+ {
+ var serialNumber = GetSerialNumber(DocumentTypeEnum.出库单据);
+ return "PDOUT" + DateTime.Now.ToString("yyyyMMdd") + serialNumber.ToString().PadLeft(4, '0');
+ }
+ }
+
public int GetSerialNumber(DocumentTypeEnum documentType)
{
var documentSerialNumber = DbHelp.db.Queryable()
diff --git a/WCS.BLL/Services/Service/InstoreService.cs b/WCS.BLL/Services/Service/InstoreService.cs
index da9625a..4937048 100644
--- a/WCS.BLL/Services/Service/InstoreService.cs
+++ b/WCS.BLL/Services/Service/InstoreService.cs
@@ -13,6 +13,7 @@ using WCS.DAL.Db;
using WCS.DAL.DbModels;
using WCS.Model;
using WCS.Model.ApiModel.InOutRecord;
+using WCS.Model.ApiModel.MXBackgroundThread;
namespace WCS.BLL.Services.Service
{
@@ -130,7 +131,7 @@ namespace WCS.BLL.Services.Service
}
IShelfBase shelf = null;
- if (!request.IsSingleLightIn)
+ if (!request.SingleLightIn)
{
//获取货架
shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
@@ -151,6 +152,8 @@ namespace WCS.BLL.Services.Service
Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}",
};
}
+ //物料在入库模式,更新时间 避免被后台线程关闭
+ shelf.SetCurrentModeTime = DateTime.Now;
}
#region 获取物料数据 //调用接口或者直接查询数据库
@@ -164,13 +167,13 @@ namespace WCS.BLL.Services.Service
{
materialBar = request.MatSn
};
- var Result = ApiHelp.GetDataFromHttp>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST");
+ var Result = ApiHelp.GetDataFromHttp>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST", true);
//查询到物料信息
if (Result != null && Result.Code == 200 && Result.Data != null && Result.Data.Count > 0)
{
var data = Result.Data.First();
- if (!request.IsSingleLightIn && shelf != null)
+ if (!request.SingleLightIn && shelf != null)
shelf.InStoreData = new MatInfoResponse()
{
materialBar = data.materialBar,
@@ -180,7 +183,7 @@ namespace WCS.BLL.Services.Service
materialSpec = data.materialSpec,
batchNo = data.batchNo,
supplier = "",
- customer = data.materialBar,
+ customer = "",
InstoreUser = request.UserName
};
@@ -207,6 +210,47 @@ namespace WCS.BLL.Services.Service
else if (Result != null && Result.Code == 200 && Result.Data == null)
{
//Mes系统中未获取到物料信息
+
+ //简单校验看是否满足海康物料
+ //海康物料 只扫了外箱码 未扫条码
+ if ((request.MatSn.Length == 54 || request.MatSn.Length == 56) && !request.MatSn.Contains("\\") && !request.MatSn.Contains("/"))
+ {
+
+ if (!request.SingleLightIn && shelf != null)
+ shelf.InStoreData = new MatInfoResponse()
+ {
+ materialBar = request.MatSn,
+ materialCode = "暂时未知",
+ materialName = "暂时未知",
+ materialQty = 0,
+ materialSpec = "暂时未知",
+ batchNo = "暂时未知",
+ supplier = "",
+ customer = "",
+
+ InstoreUser = request.UserName
+ };
+
+ var matInfo = new MatInfo()
+ {
+ MatSn = request.MatSn,
+ MatCode = "暂时未知",
+ MatName = "暂时未知",
+ MatBatch = "暂时未知",
+ MatQty = 0,
+ MatSpec = "暂时未知",
+ MatSupplier = "",
+ MatCustomer = "",
+ };
+
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Data = matInfo,
+ Message = "success"
+ };
+ }
+
return new ResponseCommon()
{
Code = 201,
@@ -239,7 +283,7 @@ namespace WCS.BLL.Services.Service
if (matInfo != null)
{
//TODO 改成wcs的实体
- if (!request.IsSingleLightIn && shelf != null)
+ if (!request.SingleLightIn && shelf != null)
shelf.InStoreData = new MatInfoResponse()
{
materialBar = matInfo.MatSn,
@@ -468,7 +512,7 @@ namespace WCS.BLL.Services.Service
//data1[5] = 0x03;
//data1[6] = 0x02;
//data1[7] = 0x02;
- //byte[] senddata1 = Tool.Helper.Crc16(data1, data1.Length, true);
+ //byte[] senddata1 = Tool.Helper.Crc16(data1, data1.Length, false);
byte[] senddata1 = Tool.Helper.InstoreWarnLight(warnLightID);
tCPClient.Send(senddata1); //报警灯短亮一次
@@ -491,7 +535,7 @@ namespace WCS.BLL.Services.Service
Message = $"入库成功!",
Data = rcs.Data,
};
-
+
}
}
}
diff --git a/WCS.BLL/Services/Service/InstoreService.cs.orig b/WCS.BLL/Services/Service/InstoreService.cs.orig
new file mode 100644
index 0000000..b0977c8
--- /dev/null
+++ b/WCS.BLL/Services/Service/InstoreService.cs.orig
@@ -0,0 +1,552 @@
+using OracleInternal.SqlAndPlsqlParser.LocalParsing;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
+using WCS.BLL.Config;
+using WCS.BLL.DbModels;
+using WCS.BLL.HardWare;
+using WCS.BLL.Manager;
+using WCS.BLL.Services.IService;
+using WCS.BLL.Tool;
+using WCS.BLL.Tool.Api.ApiModel;
+using WCS.DAL.Db;
+using WCS.DAL.DbModels;
+using WCS.Model;
+using WCS.Model.ApiModel.InOutRecord;
+using WCS.Model.ApiModel.MXBackgroundThread;
+
+namespace WCS.BLL.Services.Service
+{
+ public class InstoreService : IInstoreService
+ {
+ public InstoreService() { }
+
+ public ResponseBase shelfGoInInStore(ShelfGoInInstoreRequest request)
+ {
+ //校验货架编码规则
+ //取配置文件中得货架编码规则
+ bool isValid = false;
+ var patterns = LocalFile.Config.ModuleCodePatterns;
+ if (patterns != null && patterns.Count > 0)
+ {
+ foreach (var pattern in patterns)
+ {
+ isValid = Regex.IsMatch(request.ModuleCode, pattern);
+ //匹配到第一个符合条件的货架码 就直接退出循环 认为匹配成功
+ if (isValid)
+ break;
+ }
+ }
+ //如果配置文件缺失 使用默认正则进行匹配
+ else
+ {
+ isValid = Regex.IsMatch(request.ModuleCode, LocalFile.DefaultModuleCodePattern);
+ }
+
+ if (!isValid)
+ {
+ return new ResponseBase()
+ {
+ Code = 202,
+ Message = $"模组编码{request.ModuleCode}不满足模组编码规则!",
+ };
+ }
+ //找到模组对应的货架
+ var shelf = ShelfManager.Shelves.Where(t => t.ModulesStr.Contains(request.ModuleCode)).FirstOrDefault();
+ if (shelf == null)//未找到
+ {
+ return new ResponseBase()
+ {
+ Code = 201,
+ Message = "未找到模组对应的货架",
+ };
+ }
+ //已找到模组对应货架
+ shelf.GoInInstore(request.IpAdress);
+
+ if (shelf.CurrentMode == Mode.入库模式)
+ //成功进入入库模式
+ return new ShelfGoInInstoreResponse()
+ {
+ Code = 200,
+ Message = $"货架进入入库模式成功!{string.Join(",", shelf.ExceptionMessages)}",
+ Data = new ShelfGoInInstoreDto()
+ {
+ ShelfCode = shelf.ShelfCode,
+ ModulesStr = shelf.ModulesStr,
+ }
+ };
+ else
+ return new ShelfGoInInstoreResponse()
+ {
+ Code = 201,
+ Message = $"货架进入入库模式失败:{string.Join(",", shelf.ExceptionMessages)}",
+ Data = null
+ };
+
+ }
+
+ public ResponseBase shelfGoOutInStore(ShelfGoOutInStoreRequest request)
+ {
+ //获取货架
+ var shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
+ if (shelf == null)//货架不存在
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"退出入库模式失败:货架[{request.ShelfCode}]不存在!",
+ };
+ }
+
+ //判断扫码枪 是否被其他扫码枪所占用 如果占用 直接退出入库模式 不发指令
+ shelf.GoOutInstore();
+
+ if (shelf.ExceptionMessages == null || shelf.ExceptionMessages.Count == 0)
+ //已退出
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"货架[{request.ShelfCode}]已退出入库模式!",
+ };
+ else
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"货架[{request.ShelfCode}]已退出入库模式!{string.Join(",", shelf.ExceptionMessages)}",
+ };
+ }
+
+ public async Task queryByMatSn(QueryByMatSnRequest request)
+ {
+ //判断物料是否已入库
+ var inventory = await DbHelp.db.Queryable().Where(t => t.MatSN == request.MatSn).FirstAsync();
+ if (inventory != null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"操作失败:物料{inventory.MatSN}已入库!库位为{inventory.StoreCode}",
+ };
+ }
+
+ IShelfBase shelf = null;
+ if (!request.SingleLightIn)
+ {
+ //获取货架
+ shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
+ if (shelf == null)//货架不存在
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"操作失败:货架[{request.ShelfCode}]不存在!",
+ };
+ }
+ //判断当前是否是入库模式
+ if (shelf.CurrentMode != Mode.入库模式)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"操作失败:货架[{request.ShelfCode}]不在入库模式!\r\n当前为{shelf.CurrentMode}",
+ };
+ }
+ }
+
+ #region 获取物料数据 //调用接口或者直接查询数据库
+ // 调用接口
+ if (LocalFile.Config.IsAccessWMS)
+ {
+ #region 调用WMS接口获取物料信息
+ try
+ {
+ var body = new
+ {
+ materialBar = request.MatSn
+ };
+ var Result = ApiHelp.GetDataFromHttp>>("http://192.168.2.23:9213/integrate/instock/queryBybar", body, "POST", true);
+
+ //查询到物料信息
+ if (Result != null && Result.Code == 200 && Result.Data != null && Result.Data.Count > 0)
+ {
+ var data = Result.Data.First();
+ if (!request.SingleLightIn && shelf != null)
+ shelf.InStoreData = new MatInfoResponse()
+ {
+ materialBar = data.materialBar,
+ materialCode = data.materialCode,
+ materialName = data.materialName,
+ materialQty = data.materialQty,
+ materialSpec = data.materialSpec,
+ batchNo = data.batchNo,
+ supplier = "",
+ customer = "",
+
+ InstoreUser = request.UserName
+ };
+
+ var matInfo = new MatInfo()
+ {
+ MatSn = data.materialBar,
+ MatCode = data.materialCode,
+ MatName = data.materialName,
+ MatBatch = data.batchNo,
+ MatQty = (int)data.materialQty,
+ MatSpec = data.materialSpec,
+ MatSupplier = "",
+ MatCustomer = "",
+ };
+
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Data = matInfo,
+ Message = "success"
+ };
+ }
+ else if (Result != null && Result.Code == 200 && Result.Data == null)
+ {
+ //Mes系统中未获取到物料信息
+
+ //简单校验看是否满足海康物料
+ //海康物料 只扫了外箱码 未扫条码
+ if ((request.MatSn.Length == 54 || request.MatSn.Length == 56) && !request.MatSn.Contains("\\") && !request.MatSn.Contains("/"))
+ {
+
+ if (!request.SingleLightIn && shelf != null)
+ shelf.InStoreData = new MatInfoResponse()
+ {
+ materialBar = request.MatSn,
+ materialCode = "暂时未知",
+ materialName = "暂时未知",
+ materialQty = 0,
+ materialSpec = "暂时未知",
+ batchNo = "暂时未知",
+ supplier = "",
+ customer = "",
+
+ InstoreUser = request.UserName
+ };
+
+ var matInfo = new MatInfo()
+ {
+ MatSn = request.MatSn,
+ MatCode = "暂时未知",
+ MatName = "暂时未知",
+ MatBatch = "暂时未知",
+ MatQty = 0,
+ MatSpec = "暂时未知",
+ MatSupplier = "",
+ MatCustomer = "",
+ };
+
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Data = matInfo,
+ Message = "success"
+ };
+ }
+
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"操作失败:调用Mes接口未获取到物料信息!",
+ };
+ }
+ else
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"操作失败:调用Mes接口失败!",
+ };
+ }
+ }
+ catch (Exception e)
+ {
+ return new ResponseCommon()
+ {
+ Code = 300,
+ Message = $"操作失败:调用Mes接口发生异常{e.Message}",
+ };
+ }
+ #endregion
+ }
+ //查询数据库是否存在这个物料
+ else
+ {
+ var matInfo = await DbHelp.db.Queryable().Where(t => t.MatSn == request.MatSn).FirstAsync();
+ if (matInfo != null)
+ {
+ //TODO 改成wcs的实体
+ if (!request.SingleLightIn && shelf != null)
+ shelf.InStoreData = new MatInfoResponse()
+ {
+ materialBar = matInfo.MatSn,
+ materialCode = matInfo.MatCode,
+ materialName = matInfo.MatName,
+ materialQty = matInfo.MatQty,
+ materialSpec = matInfo.MatSpec,
+ batchNo = matInfo.MatBatch,
+ supplier = matInfo.MatSupplier,
+ customer = matInfo.MatCustomer,
+
+ InstoreUser = request.UserName
+ };
+
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Data = matInfo,
+ Message = "success"
+ };
+ }
+ else
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Data = null,
+ Message = $"不存在物料{request.MatSn}"
+ };
+ }
+ #endregion
+ }
+
+ ///
+ /// 单灯出库时查询物料信息 这里返回库存的数据
+ ///
+ ///
+ ///
+ public async Task queryByMatSnOut(QueryByMatSnRequest request)
+ {
+ //判断物料是否已入库
+ var inventory = await DbHelp.db.Queryable().Where(t => t.MatSN == request.MatSn).FirstAsync();
+ if (inventory == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"操作失败:物料不在库存内,无法进行出库!",
+ };
+ }
+ else
+ {
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"Success",
+ Data = new MatInfo()
+ {
+ MatSn = inventory.MatSN,
+ MatCode = inventory.MatCode,
+ MatName = inventory.MatName,
+ MatBatch = inventory.MatBatch,
+ MatQty = inventory.MatQty,
+ MatSpec = inventory.MatSpec,
+ MatSupplier = inventory.MatSupplier,
+ MatCustomer = inventory.MatCustomer,
+ }
+ };
+ }
+ }
+
+ public async Task queryInstoreStatus(QueryByMatSnRequest request)
+ {
+ //获取货架
+ var shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
+ if (shelf == null)//货架不存在
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"货架[{request.ShelfCode}]不存在!",
+ };
+ }
+
+ //判断当前是否是入库模式
+ if (shelf.CurrentMode != Mode.入库模式)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"货架[{request.ShelfCode}]已退出入库模式!\r\n当前为{shelf.CurrentMode}",
+ };
+ }
+
+ //TODO 配置这个时间相当于需要入库扫码后需要等待的时间
+ var timeOut = 5000;
+ var timeSpan = TimeSpan.FromMilliseconds(0);
+ var beginTime = DateTime.Now;
+ while (timeSpan <= TimeSpan.FromMilliseconds(timeOut))
+ {
+ timeSpan = DateTime.Now - beginTime;
+ //已入库当前扫码的物料时 查询数据库
+ if (shelf.InStoreData == null || (shelf.InStoreData as object) == null)
+ {
+ await Task.Delay(50);
+ var inventoryDetail = DbHelp.db.Queryable()
+ .Where(t => t.MatSN == request.MatSn)
+ .First();
+ if (inventoryDetail != null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"入库成功!物料已放入库位{inventoryDetail.StoreCode}",
+ Data = new
+ {
+ StoreCode = inventoryDetail.StoreCode,
+ }
+ };
+ }
+ else
+ break;
+ }
+ //延时处理
+ Thread.Sleep(50);
+ }
+ //超时未成功入库
+ shelf.InStoreData = null;
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"超时未入库!请重新扫码后入库!",
+ Data = new
+ {
+ StoreCode = string.Empty,
+ }
+ };
+ }
+
+ public async Task queryInstoreStatusSingle(QueryByMatSnRequestSingle request)
+ {
+ //获取货架
+ //var shelf = ShelfManager.Shelves.Where(t => t.ShelfCode == request.ShelfCode).FirstOrDefault();
+ //if (shelf == null)//货架不存在
+ //{
+ // return new ResponseCommon()
+ // {
+ // Code = 201,
+ // Message = $"货架[{request.ShelfCode}]不存在!",
+ // };
+ //}
+ List MI = DbHelp.db.Queryable().Where(it => it.ModuleCode == request.ShelfCode).ToList();
+ if (MI.Count == 0)
+ {
+ return new ResponseCommonSingle()
+ {
+ Code = 201,
+ Message = $"货架[{request.ShelfCode}]不存在!",
+ };
+ }
+ ResponseCommonSingle rcs = new ResponseCommonSingle();
+ rcs.Data = new List();
+
+ string sendIP = MI[0].CleintIp; //单灯IP
+ int PCBId = MI[0].BoardId; //单灯PCB板ID
+
+ List SI = DbHelp.db.Queryable().Where(it => it.ModuleCode == request.ShelfCode).ToList();
+
+ List si = DbHelp.db.Queryable().Where(it => it.ShelfCode == MI[0].ShelfCode).ToList();
+ int warnLightID = si[0].LightId;
+
+ foreach (QueryByMatSnRequestSingle.MatSnListDetail matSnListDetail in request.MatSnList)
+ {
+ Detail detail = new Detail();
+ try
+ {
+ InventoryDetail inventoryDetail = new InventoryDetail();
+ inventoryDetail.MatSN = matSnListDetail.MatSn;
+ inventoryDetail.MatCode = matSnListDetail.MatCode;
+ inventoryDetail.MatName = matSnListDetail.MatName;
+ inventoryDetail.MatSpec = matSnListDetail.MatSpec;
+ inventoryDetail.MatBatch = matSnListDetail.MatBatch;
+ inventoryDetail.MatQty = matSnListDetail.MatQty;
+ inventoryDetail.MatCustomer = matSnListDetail.MatCustomer;
+ inventoryDetail.MatSupplier = matSnListDetail.MatSupplier;
+ inventoryDetail.StoreCode = request.ShelfCode;
+ inventoryDetail.StoreId = SI[0].Id;
+
+ int count = DbHelp.db.Insertable(inventoryDetail).ExecuteCommand();
+
+ InOutRecord ior = new InOutRecord();
+ ior.MatSN = matSnListDetail.MatSn;
+ ior.MatCode = matSnListDetail.MatCode;
+ ior.MatName = matSnListDetail.MatName;
+ ior.MatSpec = matSnListDetail.MatSpec;
+ ior.MatBatch = matSnListDetail.MatBatch;
+ ior.MatQty = matSnListDetail.MatQty;
+ ior.MatCustomer = matSnListDetail.MatCustomer;
+ ior.MatSupplier = matSnListDetail.MatSupplier;
+ ior.StoreCode = request.ShelfCode;
+ ior.StoreId = SI[0].Id;
+ ior.Direction = DirectionEnum.入库;
+ ior.OperateTime = DateTime.Now;
+ ior.OperateUser = request.UserName;
+ int count1 = DbHelp.db.Insertable(ior).ExecuteCommand();
+
+ detail.matsn = matSnListDetail.MatSn;
+ detail.result = "入库成功";
+ rcs.Data.Add(detail);
+ }
+ catch (Exception ee)
+ {
+ detail.matsn = matSnListDetail.MatSn;
+ detail.result = "入库失败";
+ detail.reason = ee.Message;
+ rcs.Data.Add(detail);
+ }
+ }
+ //亮灯
+ TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(sendIP);
+<<<<<<< HEAD
+ //byte[] data1 = new byte[8];
+ //data1[0] = 0xff;
+ //data1[1] = 0x02;
+ //data1[2] = 0x00;
+ //data1[3] = 0x0a;
+ //data1[4] = (byte)warnLightID;
+ //data1[5] = 0x03;
+ //data1[6] = 0x02;
+ //data1[7] = 0x02;
+ //byte[] senddata1 = Tool.Helper.Crc16(data1, data1.Length, true);
+ byte[] senddata1 = Tool.Helper.InstoreWarnLight(warnLightID);
+=======
+ byte[] data1 = new byte[8];
+ data1[0] = 0xff;
+ data1[1] = 0x02;
+ data1[2] = 0x00;
+ data1[3] = 0x0a;
+ data1[4] = (byte)warnLightID;
+ data1[5] = 0x03;
+ data1[6] = 0x02;
+ data1[7] = 0x02;
+ byte[] senddata1 = Tool.Helper.Crc16(data1, data1.Length, false);
+>>>>>>> 11
+ tCPClient.Send(senddata1); //报警灯短亮一次
+
+ //byte[] data2 = new byte[8];
+ //data2[0] = 0xff;
+ //data2[1] = 0x01;
+ //data2[2] = 0x00;
+ //data2[3] = 0x0a;
+ //data2[4] = 0x01;
+ //data2[5] = (byte)PCBId;
+ //data2[6] = 0x03;
+ //data2[7] = 0x02;
+ //byte[] senddata2 = Tool.Helper.Crc16(data2, data2.Length, true);
+ byte[] senddata2 = Tool.Helper.InstoreLight(PCBId);
+ tCPClient.Send(senddata2); //库位灯短亮一次
+
+ return new ResponseCommonSingle()
+ {
+ Code = 200,
+ Message = $"入库成功!",
+ Data = rcs.Data,
+ };
+
+ }
+ }
+}
diff --git a/WCS.BLL/Services/Service/MatInventoryDetailService.cs b/WCS.BLL/Services/Service/MatInventoryDetailService.cs
index b9881c5..5896341 100644
--- a/WCS.BLL/Services/Service/MatInventoryDetailService.cs
+++ b/WCS.BLL/Services/Service/MatInventoryDetailService.cs
@@ -6,6 +6,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TouchSocket.Core;
+using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.Services.IService;
using WCS.DAL.Db;
@@ -128,16 +129,16 @@ namespace WCS.BLL.Services.Service
var inventortyDetails = await DbHelp.db.Queryable()
.WhereIF(!string.IsNullOrEmpty(request.MatName), t => t.MatName.Contains(request.MatName))
.WhereIF(!string.IsNullOrEmpty(request.MatCode), t => t.MatCode.Contains(request.MatCode))
+ .WhereIF(!string.IsNullOrEmpty(request.MatBatch), t => t.MatBatch.Contains(request.MatBatch))
+ .Where(t => t.StoreInfo.ShelfTypeId == request.ShelfTypeId)
.GroupBy(t => t.MatCode)
.GroupBy(t => t.MatBatch)
.Select(t => new MatInventorySummaryModel
{
MatCode = t.MatCode,
MatName = t.MatName,
- MatBatch = t.MatBatch,
MatSpec = t.MatSpec,
- MatCustomer = t.MatCustomer,
- MatSupplier = t.MatSupplier,
+ MatBatch = t.MatBatch,
TotalQty = SqlFunc.AggregateSum(t.MatQty)
})
.ToListAsync();
@@ -149,5 +150,48 @@ namespace WCS.BLL.Services.Service
Data = inventortyDetails
};
}
+
+ public async Task> compareMatInventoryDetail(CompareMatInventoryDetailRequest request)
+ {
+ try
+ {
+ //查询 本分组中 是否含有所传SN的物料
+ var recordsQueryable = DbHelp.db.Queryable()
+ .Where(t => request.MatSns.Contains(t.MatSN))
+ .OrderBy(t => t.MatCode)
+ .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.StoreInfo.GroupName == LocalFile.Config.GroupName);
+ var totalCount = await recordsQueryable.CountAsync();
+ var records = await recordsQueryable.ToListAsync();
+ //生成序号 选中
+ for (int i = 0; i < records.Count; i++)
+ {
+ records[i].RowNumber = i + 1;
+ records[i].IsSelected = true;
+ }
+ return new PageQueryResponse()
+ {
+ Code = 200,
+ Message = $"success",
+ Data = new PageQueryResponseData()
+ {
+ TotalCount = totalCount,
+ Count = records.Count,
+ Lists = records.ToList()
+ }
+ };
+ }
+ catch
+ {
+ return new PageQueryResponse()
+ {
+ Code = 200,
+ Message = $"success",
+ Data = new PageQueryResponseData()
+ {
+ Lists = new List()
+ }
+ };
+ }
+ }
}
}
diff --git a/WCS.BLL/Services/Service/OutstoreService.cs b/WCS.BLL/Services/Service/OutstoreService.cs
index 1498139..cea40ba 100644
--- a/WCS.BLL/Services/Service/OutstoreService.cs
+++ b/WCS.BLL/Services/Service/OutstoreService.cs
@@ -1,11 +1,5 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading.Tasks;
-using TouchSocket.Sockets;
+using Microsoft.Data.SqlClient;
+using SqlSugar;
using WCS.BLL.Config;
using WCS.BLL.DbModels;
using WCS.BLL.Manager;
@@ -15,6 +9,7 @@ using WCS.DAL.Db;
using WCS.DAL.DbModels;
using WCS.Model;
using WCS.Model.ApiModel.InOutRecord;
+using WCS.Model.ApiModel.MatInventoryDetail;
using WCS.Model.ApiModel.OutStore;
namespace WCS.BLL.Services.Service
@@ -24,6 +19,53 @@ namespace WCS.BLL.Services.Service
public OutstoreService()
{
+ }
+ public async Task>> importMat(List list)
+ {
+ //数据校验
+ if (list == null || list.Count == 0)
+ {
+ return new ResponseCommon>()
+ {
+ Code = 201,
+ Message = "导入失败:导入文件中没有内容!"
+ };
+ }
+ //需求数量
+ var errorCount = list.Where(t => t.需求数量 <= 0).ToList();
+ if (errorCount != null && errorCount.Count > 0)
+ {
+ return new ResponseCommon>()
+ {
+ Code = 201,
+ Message = "导入失败:需求数量需要大于0!"
+ };
+ }
+ //每一个物料进行搜索库存
+ var returnList = new List();
+ foreach (var item in list)
+ {
+ var inventoryCount = await DbHelp.db.Queryable()
+ .Where(t => t.MatCode == item.物料编码)
+ .Where(t => t.MatBatch == item.物料批次)
+ .Where(t => t.IsLocked == false)
+ .SumAsync(t => t.MatQty);
+ var info = inventoryCount < item.需求数量 ? "库存数量小于需求数量" : string.Empty;
+ returnList.Add(new MatInventorySummaryModel()
+ {
+ MatCode = item.物料编码,
+ MatName = item.物料名称,
+ MatBatch = item.物料批次,
+ NeedQty = item.需求数量,
+ TotalQty = inventoryCount,
+ Info = info
+ });
+ }
+ return new ResponseCommon>()
+ {
+ Code = 200,
+ Data = returnList
+ };
}
public async Task SysOutOrderByMatCode(SysOutOrderByMatCodeRequest request)
{
@@ -36,6 +78,24 @@ namespace WCS.BLL.Services.Service
Message = "出库单据同步失败:缺少需要出库的物料类型!"
};
}
+ //补齐货架类型名称
+ if (string.IsNullOrEmpty(request.ShelfTypeName))
+ {
+ var shelfType = await DbHelp.db.Queryable()
+ .Where(t => t.Id == request.ShelfTypeId)
+ .FirstAsync();
+ if (shelfType == null)
+ {
+ return new ResponseBase()
+ {
+ Code = 201,
+ Message = $"出库单据同步失败:缺少必要参数!ShelfTypeId"
+ };
+ }
+ else
+ request.ShelfTypeName = shelfType.ShelfTypeName;
+ }
+
//保存数据
await DbHelp.db.BeginTranAsync();
try
@@ -45,6 +105,8 @@ namespace WCS.BLL.Services.Service
OrderNumber = request.OrderNumber,
OrderSource = request.OrderSource,
OrderType = request.OrderType,
+ ShelfTypeId = request.ShelfTypeId,
+ ShelfTypeName = request.ShelfTypeName,
SyncType = SyncTypeEnum.ByMatCode,
CreateUser = request.UserName,
};
@@ -69,6 +131,7 @@ namespace WCS.BLL.Services.Service
{
Code = 200,
Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
+ Data = request.OrderNumber
}; ;
}
catch (Exception ex)
@@ -95,103 +158,266 @@ namespace WCS.BLL.Services.Service
Message = "出库单据同步失败:缺少物料明细!"
};
}
- //库存有无校验 & 库存已锁校验
- try
+ //标准版逻辑-库存有无校验 & 库存已锁校验
+ if (!LocalFile.Config.IsMx)
{
- await DbHelp.db.BeginTranAsync();
- var inventoryDetails = await DbHelp.db.Queryable()
- .Where(t => request.SnList.Contains(t.MatSN))
- .TranLock(DbLockType.Wait)
- .ToListAsync();
- if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量
+ try
{
- var existsSns = inventoryDetails.Select(t => t.MatSN).ToList();
- request.SnList.RemoveAll(t => existsSns.Contains(t));
- await DbHelp.db.RollbackTranAsync();
- //返回提示哪些物料库存不存在
+ await DbHelp.db.BeginTranAsync();
+ var inventoryDetails = await DbHelp.db.Queryable()
+ .Where(t => request.SnList.Contains(t.MatSN))
+ .TranLock(DbLockType.Wait)
+ .ToListAsync();
+ if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量
+ {
+ var existsSns = inventoryDetails.Select(t => t.MatSN).ToList();
+ request.SnList.RemoveAll(t => existsSns.Contains(t));
+ await DbHelp.db.RollbackTranAsync();
+ //返回提示哪些物料库存不存在
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "出库单据同步失败:存在物料不在库存中!",
+ Data = request.SnList
+
+ };
+ }
+ else if (inventoryDetails.Where(t => t.IsLocked).Any())
+ {
+ await DbHelp.db.RollbackTranAsync();
+ //返回提示哪些物料库存已被锁定
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "出库单据同步失败:存在物料被锁定!",
+ Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList()
+ };
+ }
+
+ #region 保存数据
+
+ //锁库存
+ inventoryDetails.ForEach(t =>
+ {
+ t.IsLocked = true;
+ });
+ var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync();
+
+ //保存数据
+ var order = new OutOrder()
+ {
+ OrderNumber = request.OrderNumber,
+ OrderSource = request.OrderSource,
+ OrderType = request.OrderType,
+ SyncType = SyncTypeEnum.ByMatSn,
+ CreateUser = request.UserName,
+ };
+ order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync();
+
+ //通过库存数据保存出库物料明细表
+ var matDetailTasks = inventoryDetails.Select(async t =>
+ {
+ var orderMatDetail = new OutOrderMatDetail()
+ {
+ OrderId = order.Id,
+ OrderNumber = order.OrderNumber,
+ InventoryDetailId = t.Id,
+ StoreId = t.StoreId,
+ StoreCode = t.StoreCode,
+ MatSN = t.MatSN,
+ MatCode = t.MatCode,
+ MatName = t.MatName,
+ MatSpec = t.MatSpec,
+ MatBatch = t.MatBatch,
+ MatQty = t.MatQty,
+ MatSupplier = t.MatSupplier,
+ MatCustomer = t.MatCustomer,
+ CreateUser = request.UserName,
+ };
+ await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
+ }).ToList();
+
+ await lockTask;
+ await Task.WhenAll(matDetailTasks);
+
+ await DbHelp.db.CommitTranAsync();
return new ResponseCommon()
{
- Code = 201,
- Message = "出库单据同步失败:存在物料不在库存中!",
- Data = request.SnList
-
+ Code = 200,
+ Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
+ Data = order.Id
};
+ #endregion
}
- else if (inventoryDetails.Where(t => t.IsLocked).Any())
+ catch (Exception ex)
{
await DbHelp.db.RollbackTranAsync();
- //返回提示哪些物料库存已被锁定
- return new ResponseCommon()
+ return new ResponseBase()
{
Code = 201,
- Message = "出库单据同步失败:存在物料被锁定!",
- Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList()
+ Message = $"出库单据同步失败:{ex.Message}"
};
}
-
- #region 保存数据
-
- //锁库存
- inventoryDetails.ForEach(t =>
- {
- t.IsLocked = true;
- });
- var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync();
-
- //保存数据
- var order = new OutOrder()
- {
- OrderNumber = request.OrderNumber,
- OrderSource = request.OrderSource,
- OrderType = request.OrderType,
- SyncType = SyncTypeEnum.ByMatSn,
- CreateUser = request.UserName,
- };
- order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync();
-
- //通过库存数据保存出库物料明细表
- var matDetailTasks = inventoryDetails.Select(async t =>
- {
- var orderMatDetail = new OutOrderMatDetail()
- {
- OrderId = order.Id,
- OrderNumber = order.OrderNumber,
- InventoryDetailId = t.Id,
- StoreId = t.StoreId,
- StoreCode = t.StoreCode,
- MatSN = t.MatSN,
- MatCode = t.MatCode,
- MatName = t.MatName,
- MatSpec = t.MatSpec,
- MatBatch = t.MatBatch,
- MatQty = t.MatQty,
- MatSupplier = t.MatSupplier,
- MatCustomer = t.MatCustomer,
- CreateUser = request.UserName
- };
- await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
- }).ToList();
-
- await lockTask;
- await Task.WhenAll(matDetailTasks);
-
- await DbHelp.db.CommitTranAsync();
- return new ResponseCommon()
- {
- Code = 200,
- Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
- Data = order.Id
- };
- #endregion
}
- catch (Exception ex)
+ //盟讯公司逻辑 不锁库存 直接保存数据/清除未发送的
+ else
{
- await DbHelp.db.RollbackTranAsync();
- return new ResponseBase()
+ try
{
- Code = 201,
- Message = $"出库单据同步失败:{ex.Message}"
- };
+ DbHelp.db.BeginTran();
+ //1. 获取库存物料明细
+ var inventoryDetails = await DbHelp.db.Queryable()
+ .Where(t => request.SnList.Contains(t.MatSN))
+ .ToListAsync();
+ if (inventoryDetails == null || inventoryDetails.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "保存出库单失败!请重试!",
+ Data = request.SnList
+ };
+ }
+ //2. 先获取对应单号是否已经保存
+ var outOrder = DbHelp.db.Queryable()
+ .Where(t => t.OrderNumber == request.OrderNumber)
+ .Where(t => t.GroupName == LocalFile.Config.GroupName)
+ .First();
+ //数据库中没有才添加
+ if (outOrder == null)
+ {
+ //OutOrder
+ outOrder = new OutOrder()
+ {
+ OrderNumber = request.OrderNumber,
+ OrderType = request.OrderType,
+ OutOrderExeStatus = OutOrderExeStatus.开始发料,
+ OrderSource = "WCS前端",
+ SyncType = SyncTypeEnum.ByMatSn,
+ ShelfTypeName = "智能货架",
+ ShelfTypeId = 0,
+ GroupName = LocalFile.Config.GroupName,
+ IsMXPD = request.IsMXPD,
+ };
+ outOrder.Id = await DbHelp.db.Insertable(outOrder).ExecuteReturnIdentityAsync();
+ outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber)
+ .Where(t => t.Id == outOrder.Id)
+ .FirstAsync();
+ //保存单据失败了
+ if (outOrder == null)
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "保存出库单失败!保存Order失败!",
+ Data = request.SnList
+ };
+
+ //出库物料明细
+ foreach (var item in inventoryDetails)
+ {
+ var orderMatDetail = new OutOrderMatDetail()
+ {
+ OrderId = outOrder.Id,
+ OrderNumber = outOrder.OrderNumber,
+ InventoryDetailId = item.Id,
+ StoreId = item.StoreId,
+ StoreCode = item.StoreCode,
+ MatSN = item.MatSN,
+ MatCode = item.MatCode,
+ MatName = item.MatName,
+ MatSpec = item.MatSpec,
+ MatBatch = item.MatBatch,
+ MatQty = item.MatQty,
+ MatSupplier = item.MatSupplier,
+ MatCustomer = item.MatCustomer,
+ CreateUser = request.UserName,
+ IsMXPD = request.IsMXPD,
+ };
+ await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
+ }
+ DbHelp.db.CommitTran();
+ }
+ //数据库已有该Order
+ else
+ {
+ outOrder.CreateTime = DateTime.Now;
+ DbHelp.db.Updateable(outOrder).ExecuteCommand();
+ //删除未出库的
+ var outOrderDetails = DbHelp.db.Deleteable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .Where(t => t.IsSended == false)
+ .ExecuteCommand();
+ //当前已出库的 //已出库的也不在库存中了 应该查询不到了
+ //避免影响效率 就不查重了
+ foreach (var item in inventoryDetails)
+ {
+ var orderMatDetail = new OutOrderMatDetail()
+ {
+ OrderId = outOrder.Id,
+ OrderNumber = outOrder.OrderNumber,
+ InventoryDetailId = item.Id,
+ StoreId = item.StoreId,
+ StoreCode = item.StoreCode,
+ MatSN = item.MatSN,
+ MatCode = item.MatCode,
+ MatName = item.MatName,
+ MatSpec = item.MatSpec,
+ MatBatch = item.MatBatch,
+ MatQty = item.MatQty,
+ MatSupplier = item.MatSupplier,
+ MatCustomer = item.MatCustomer,
+ CreateUser = request.UserName,
+ IsMXPD = request.IsMXPD,
+ };
+ await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
+ }
+ DbHelp.db.CommitTran();
+
+ //更新订单状态
+ Task.Run(() =>
+ {
+ if (outOrder != null)
+ {
+ #region 物料明细表是否已发完
+ var orderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .ToList();
+ var isExistNoSendMat = orderMatDetails.Where(t => t.IsSended == false)
+ .Any();
+ if (isExistNoSendMat)
+ {
+ outOrder.OrderStatus = OutOrderStatus.部分发料;
+ }
+ else
+ {
+ outOrder.OrderStatus = OutOrderStatus.全部发料;
+ outOrder.OutOrderExeStatus = OutOrderExeStatus.发料完成;
+ }
+ #endregion
+ DbHelp.db.Updateable(outOrder).ExecuteCommand();
+ }
+ });
+ }
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = outOrder.OrderNumber,
+ Data = request.SnList
+ };
+
+ }
+ catch (Exception ex)
+ {
+ DbHelp.db.RollbackTran();
+ Logs.Write($"同步出库单据发生异常{ex.Message}", LogsType.Info);
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"保存出库单失败!{ex.Message}!",
+ Data = request.SnList
+ };
+ }
+
}
}
@@ -202,7 +428,8 @@ namespace WCS.BLL.Services.Service
var recordsQueryable = DbHelp.db.Queryable()
.WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber.Contains(request.OrderNumber))
.WhereIF(!string.IsNullOrEmpty(request.OrderSource), t => t.OrderSource.Contains(request.OrderSource))
- .WhereIF(!string.IsNullOrEmpty(request.OrderType), t => t.OrderType.Contains(request.OrderType));
+ .WhereIF(!string.IsNullOrEmpty(request.OrderType), t => t.OrderType.Contains(request.OrderType))
+ .WhereIF(request.ShelfTypeId != 0, t => t.ShelfTypeId == request.ShelfTypeId);
var totalCount = await recordsQueryable.CountAsync();
var records = await recordsQueryable
@@ -244,23 +471,33 @@ namespace WCS.BLL.Services.Service
};
}
//直接查询
- var recordsQueryable = DbHelp.db.Queryable().Where(t => request.OrderExeStatus.Contains(t.OutOrderExeStatus));
+ var recordsQueryable = DbHelp.db.Queryable()
+ .Where(t => request.OrderExeStatus.Contains(t.OutOrderExeStatus))
+ .WhereIF(request.IsMXPD != null, t => t.IsMXPD == request.IsMXPD)
+ .WhereIF(LocalFile.Config.IsMx, t => t.CreateTime > DateTime.Now.AddDays(-3))
+ .WhereIF(!string.IsNullOrEmpty(LocalFile.Config.GroupName), t => t.GroupName == LocalFile.Config.GroupName);
var totalCount = await recordsQueryable.CountAsync();
var records = await recordsQueryable
.OrderByDescending(t => t.CreateTime)
- //.Take(request.PageSize)
.ToListAsync();
+ //获取后台当前正在进行出库的订单 将出库状态反馈给前端
+ var outingOrderNumbers = ShelfManager.Shelves
+ .Where(t => t.CurrentMode == HardWare.Mode.出库模式).Select(t => t.OrderNumber)
+ .ToList();
+ foreach (var record in records)
+ {
+ if (outingOrderNumbers.Contains(record.OrderNumber))
+ record.IsOuting = true;
+ }
+
return new PageQueryResponse()
{
Code = 200,
Message = $"success",
Data = new PageQueryResponseData()
{
- //TotalCount = totalCount,
- //MaxPage = request.PageSize == 0 ? 0 : (int)Math.Ceiling((decimal)totalCount / request.PageSize),
- //Count = records.Count,
Lists = records.ToList()
}
};
@@ -325,6 +562,74 @@ namespace WCS.BLL.Services.Service
};
}
+ ///
+ /// 单灯查询物料明细 PDA要求返回数据种data需要增加一层details
+ ///
+ ///
+ ///
+ public async Task GetOutOrderDetailSingleLight(GetOutOrderDetailRequest request)
+ {
+ OutOrder outOrder = null;
+
+ #region 查询出库单
+ if (request.OrderId != 0)
+ {
+ outOrder = await DbHelp.db.Queryable().Where(t => t.Id == request.OrderId).FirstAsync();
+ if (outOrder == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:不存在Id为{request.OrderId}的出库单!",
+ };
+ }
+ }
+ else if (!string.IsNullOrEmpty(request.OrderNumber))
+ {
+ outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (outOrder == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:不存在出库单据号为{request.OrderNumber}的出库单!",
+ };
+ }
+ }
+ else
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:缺少必要参数!",
+ };
+ }
+ #endregion
+
+ #region 查询出库单明细
+ var orderDetailTask = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .ToListAsync();
+ var orderDetail = await orderDetailTask;
+ //生成序号
+ for (int i = 0; i < orderDetail.Count; i++)
+ {
+ orderDetail[i].RowNumber = i + 1;
+ }
+ #endregion
+
+ return new ResponseCommonModify()
+ {
+ Code = 200,
+ Message = "Success",
+ Data = new ResponseCommonDataDetail
+ {
+ Details = orderDetail
+ }
+ };
+ }
+
public async Task GetOutOrderMatDetail(GetOutOrderDetailRequest request)
{
OutOrder outOrder = null;
@@ -432,7 +737,7 @@ namespace WCS.BLL.Services.Service
};
}
- if (request.IsStart)//&& order.OutOrderExeStatus != OutOrderExeStatus.发料完成
+ if (request.IsStart)
{
order.OutOrderExeStatus = OutOrderExeStatus.开始发料;
DbHelp.db.Updateable(order).ExecuteCommand();
@@ -457,6 +762,9 @@ namespace WCS.BLL.Services.Service
//看是否是分批次出库的情况 分批次亮灯
if (LocalFile.Config.IsSameMatCodeOut)
{
+ //最先亮的颜色为绿色
+ LocalStatic.CurrentOutStoreColor = 0x02;
+
var outOrderDetailCount = outOrderMatDetails.GroupBy(t => t.MatCode)
.Select(o => new { count = o.Count(), bb = o })
.Where(o => o.count >= 2)
@@ -468,14 +776,22 @@ namespace WCS.BLL.Services.Service
var matCode = outOrderDetailCount.First().bb.Key;
outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode)
.ToList();
- Logs.Write($"出库单{order.OrderNumber},本次亮灯物料{matCode}!");
+ Logs.Write($"出库单{order.OrderNumber},本次亮灯物料{matCode}!", LogsType.Outstore);
+
+ //分批次亮灯再计算一次出哪些货架 以免亮大灯不亮小灯
+ shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId)
+ .Distinct()
+ .ToList();
+ shelfs = ShelfManager.Shelves.Where(t => shelfIds.Contains(t.ShelfId)).ToList();
}
//相同物料不存在盘数超过n的情况,剩余物料全部亮灯
else
{
//剩余物料全出
- Logs.Write($"出库单{order.OrderNumber},剩余物料灯全亮!");
+ Logs.Write($"出库单{order.OrderNumber},剩余物料灯全亮!", LogsType.Outstore);
}
+
+
}
//对应的货架对应位置 进入出库模式 亮灯
@@ -486,6 +802,7 @@ namespace WCS.BLL.Services.Service
.ToList();
shelf.GoInOutstore(matDetails, order);
shelf.OrderNumber = order.OrderNumber;
+ Logs.Write($"出库单{order.OrderNumber},货架{shelf.ShelfCode}进入入库模式!", LogsType.Outstore);
});
//返回
@@ -498,6 +815,7 @@ namespace WCS.BLL.Services.Service
}
catch (Exception ex)
{
+ Logs.Write($"本次发料发生异常!{ex.Message}", LogsType.Outstore);
await GoOutOutstore(request);
throw ex;
}
@@ -608,7 +926,7 @@ namespace WCS.BLL.Services.Service
Dictionary> dict = new Dictionary>();
foreach (OutOrderMatDetail oomd in outOrderMatDetails)
{
- List mi= DbHelp.db.Queryable().Where(it => it.ModuleCode == oomd.StoreCode).ToList();
+ List mi = DbHelp.db.Queryable().Where(it => it.ModuleCode == oomd.StoreCode).ToList();
if (mi.Count != 0)
{
if (!StoreCode.Contains(oomd.StoreCode))
@@ -640,7 +958,7 @@ namespace WCS.BLL.Services.Service
{
string sendIP = v.Key;
TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(sendIP);
- byte[] lightOn = Helper.OutstoreLight(v.Value, LightColor,1);
+ byte[] lightOn = Helper.OutstoreLight(v.Value, LightColor, 1);
tCPClient.Send(lightOn);
Thread.Sleep(100);
}
@@ -660,12 +978,12 @@ namespace WCS.BLL.Services.Service
foreach (string shelfcode in WarnLightShelfCode)
{
List si = DbHelp.db.Queryable().Where(it => it.ShelfCode == shelfcode).ToList();
- if (si.Count != 0)
+ if (si.Count != 0)
{
for (int i = 0; i < si.Count; i++)
{
TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(si[i].ClientIp);
- byte[] warnlightOn = Helper.OutstoreWarnLight(si[i].LightId,LightColor,1,0);
+ byte[] warnlightOn = Helper.OutstoreWarnLight(si[i].LightId, LightColor, 1, 0);
tCPClient.Send(warnlightOn);
Thread.Sleep(100);
}
@@ -675,7 +993,7 @@ namespace WCS.BLL.Services.Service
return new OutResponseCommonSingle()
{
Code = 200,
- Message = "Success",
+ Message = LightColor,
Data = orcs.Data
};
}
@@ -713,7 +1031,8 @@ namespace WCS.BLL.Services.Service
.Where(t => t.MatCode == outOrderDetail.MatCode)
.WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch)
.Where(t => t.IsLocked == false)//未锁定的物料
- .OrderBy(t => t.MatBatch)//先进先出
+ .Where(t => t.StoreInfo.ShelfTypeId == order.ShelfTypeId)
+ .OrderBy(t => t.MatBatch)//按批次先进先出
//(t => t.MatQty)//零散料先出
.ToList();
@@ -866,6 +1185,10 @@ namespace WCS.BLL.Services.Service
DbHelp.db.Updateable(order).ExecuteCommand();
}
+ //解锁物料 删除物料明细
+ if (order.SyncType == SyncTypeEnum.ByMatCode)
+ CancelOutOrderMatDetails(order);
+
//找到正在出对应出库单的货架
var shelves = ShelfManager.Shelves.Where(t => t.OrderNumber == request.OrderNumber)
.Where(t => t.CurrentMode == HardWare.Mode.出库模式)
@@ -887,10 +1210,6 @@ namespace WCS.BLL.Services.Service
t.GoOutOutstore();
});
- //解锁物料 删除物料明细
- if (order.SyncType == SyncTypeEnum.ByMatCode)
- CancelOutOrderMatDetails(order);
-
return new ResponseCommon()
{
Code = 200,
@@ -963,7 +1282,7 @@ namespace WCS.BLL.Services.Service
}
catch (Exception ee)
{
- Logs.Write("查询出库单据:"+request.OrderNumber+"对应库位灯颜色失败,"+ ee.Message);
+ Logs.Write("查询出库单据:" + request.OrderNumber + "对应库位灯颜色失败," + ee.Message);
}
Dictionary> dict = new Dictionary>();
foreach (OutOrderMatDetail oomd in outOrderMatDetails)
@@ -1000,7 +1319,7 @@ namespace WCS.BLL.Services.Service
{
string sendIP = v.Key;
TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(sendIP);
- byte[] lightOn = Helper.OutstoreLight(v.Value, LightColor,0);
+ byte[] lightOn = Helper.OutstoreLight(v.Value, LightColor, 0);
tCPClient.Send(lightOn);
Thread.Sleep(100);
}
@@ -1045,46 +1364,92 @@ namespace WCS.BLL.Services.Service
public async Task SingleLightConfirmOutstore(OutOrderMatDetailModelSingle request)
{
- InOutRecord ior = new InOutRecord();
- List id = DbHelp.db.Queryable().Where(it => it.MatSN == request.MatSn).ToList();
- if (id.Count == 0)
+ try
{
+ //单据校验
+ var order = await DbHelp.db.Queryable()
+ .Where(it => it.Id == request.OrderId)
+ .Where(it => it.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (order == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"系统不存在单据[{request.OrderNumber}]!",
+ Data = null
+ };
+ }
+ //物料校验
+ var invetoryDetail = await DbHelp.db.Queryable()
+ .Where(it => it.Id == request.MatId)
+ .Where(it => it.MatSN == request.MatSn)
+ .FirstAsync();
+
+ if (invetoryDetail == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"库存中不存在物料[{request.MatSn}]!",
+ Data = null
+ };
+ }
+
+ //物料需求明细校验
+ var outOrderDetail = await DbHelp.db.Queryable().Where(it => it.OrderNumber == request.OrderNumber)
+ .Where(it => it.MatCode == invetoryDetail.MatCode)
+ .FirstAsync();
+ if (outOrderDetail == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"单据[{request.OrderNumber}]需求不包含物料[{invetoryDetail.MatCode}]!",
+ Data = null
+ };
+ }
+
+ var inOutRecord = new InOutRecord();
+ inOutRecord.StoreId = invetoryDetail.StoreId;
+ inOutRecord.StoreCode = invetoryDetail.StoreCode;
+ inOutRecord.MatSN = invetoryDetail.MatSN;
+ inOutRecord.MatCode = invetoryDetail.MatCode;
+ inOutRecord.MatName = invetoryDetail.MatName;
+ inOutRecord.MatSpec = invetoryDetail.MatSpec;
+ inOutRecord.MatBatch = invetoryDetail.MatBatch;
+ inOutRecord.MatQty = invetoryDetail.MatQty;
+ inOutRecord.MatSupplier = invetoryDetail.MatSupplier;
+ inOutRecord.MatCustomer = invetoryDetail.MatCustomer;
+ inOutRecord.OrderNumber = order.OrderNumber;
+ inOutRecord.Direction = DirectionEnum.出库;
+ inOutRecord.OperateUser = request.UserName;
+ inOutRecord.OperateTime = DateTime.Now;
+ //保存出库记录
+ int count = DbHelp.db.Insertable(inOutRecord).ExecuteCommand();
+ //删除库存
+ DbHelp.db.Deleteable().Where(it => it.MatSN == request.MatSn).ExecuteCommand();
+ //更新需求表
+ outOrderDetail.OutQty += invetoryDetail.MatQty;
+ DbHelp.db.Updateable(outOrderDetail).ExecuteCommand();
+
return new ResponseCommon()
{
- Code = 201,
- Message = $"此SN不在库存中{request.MatSn}!",
+ Code = 200,
+ Message = $"出库成功",
Data = null
};
}
- ior.StoreId = id[0].StoreId;
- ior.StoreCode = id[0].StoreCode;
- ior.MatSN = request.MatSn;
- ior.MatCode = request.MatCode;
- ior.MatName = request.MatName;
- ior.MatSpec = request.MatSpec;
- ior.MatBatch = request.MatBatch;
- ior.MatQty = request.Qty;
- ior.MatSupplier = request.MatSupplier;
- ior.MatCustomer = request.MatCustomer;
- ior.OrderNumber = request.orderNumber;
- ior.Direction = DirectionEnum.出库;
- ior.OperateUser = request.userName;
- ior.OperateTime = DateTime.Now;
- //保存出库记录
- int count= DbHelp.db.Insertable(ior).ExecuteCommand();
- //删除库存
- DbHelp.db.Deleteable().Where(it => it.MatSN == request.MatSn).ExecuteCommand();
- //更新需求表
- List odd = DbHelp.db.Queryable().Where(it => it.OrderNumber == request.orderNumber).Where(it=>it.MatCode==request.MatCode).ToList();
- odd[0].OutQty += request.Qty;
- DbHelp.db.Updateable(odd[0]).ExecuteCommand();
-
- return new ResponseCommon()
+ catch (Exception ex)
{
- Code = 200,
- Message = $"出库成功",
- Data = null
- };
+ return new ResponseCommon()
+ {
+ Code = 300,
+ Message = $"出库发生异常!",
+ Data = null
+ };
+ }
}
+
}
}
diff --git a/WCS.BLL/Services/Service/OutstoreService.cs.orig b/WCS.BLL/Services/Service/OutstoreService.cs.orig
new file mode 100644
index 0000000..3ec8826
--- /dev/null
+++ b/WCS.BLL/Services/Service/OutstoreService.cs.orig
@@ -0,0 +1,1311 @@
+using Microsoft.Data.SqlClient;
+using SqlSugar;
+using WCS.BLL.Config;
+using WCS.BLL.DbModels;
+using WCS.BLL.Manager;
+using WCS.BLL.Services.IService;
+using WCS.BLL.Tool;
+using WCS.DAL.Db;
+using WCS.Model;
+using WCS.Model.ApiModel.InOutRecord;
+using WCS.Model.ApiModel.MatInventoryDetail;
+using WCS.Model.ApiModel.OutStore;
+
+namespace WCS.BLL.Services.Service
+{
+ public class OutstoreService : IOutstoreService
+ {
+ public OutstoreService()
+ {
+
+ }
+ public async Task>> importMat(List list)
+ {
+ //数据校验
+ if (list == null || list.Count == 0)
+ {
+ return new ResponseCommon>()
+ {
+ Code = 201,
+ Message = "导入失败:导入文件中没有内容!"
+ };
+ }
+ //需求数量
+ var errorCount = list.Where(t => t.需求数量 <= 0).ToList();
+ if (errorCount != null && errorCount.Count > 0)
+ {
+ return new ResponseCommon>()
+ {
+ Code = 201,
+ Message = "导入失败:需求数量需要大于0!"
+ };
+ }
+ //每一个物料进行搜索库存
+ var returnList = new List();
+ foreach (var item in list)
+ {
+ var inventoryCount = await DbHelp.db.Queryable()
+ .Where(t => t.MatCode == item.物料编码)
+ .Where(t => t.MatBatch == item.物料批次)
+ .Where(t => t.IsLocked == false)
+ .SumAsync(t => t.MatQty);
+ var info = inventoryCount < item.需求数量 ? "库存数量小于需求数量" : string.Empty;
+ returnList.Add(new MatInventorySummaryModel()
+ {
+ MatCode = item.物料编码,
+ MatName = item.物料名称,
+ MatBatch = item.物料批次,
+ NeedQty = item.需求数量,
+ TotalQty = inventoryCount,
+ Info = info
+ });
+ }
+ return new ResponseCommon>()
+ {
+ Code = 200,
+ Data = returnList
+ };
+ }
+ public async Task SysOutOrderByMatCode(SysOutOrderByMatCodeRequest request)
+ {
+ //参数合法性校验
+ if (request.ItemList == null || request.ItemList.Count == 0)
+ {
+ return new ResponseBase()
+ {
+ Code = 201,
+ Message = "出库单据同步失败:缺少需要出库的物料类型!"
+ };
+ }
+ //补齐货架类型名称
+ if (string.IsNullOrEmpty(request.ShelfTypeName))
+ {
+ var shelfType = await DbHelp.db.Queryable()
+ .Where(t => t.Id == request.ShelfTypeId)
+ .FirstAsync();
+ if (shelfType == null)
+ {
+ return new ResponseBase()
+ {
+ Code = 201,
+ Message = $"出库单据同步失败:缺少必要参数!ShelfTypeId"
+ };
+ }
+ else
+ request.ShelfTypeName = shelfType.ShelfTypeName;
+ }
+
+ //保存数据
+ await DbHelp.db.BeginTranAsync();
+ try
+ {
+ var order = new OutOrder()
+ {
+ OrderNumber = request.OrderNumber,
+ OrderSource = request.OrderSource,
+ OrderType = request.OrderType,
+ ShelfTypeId = request.ShelfTypeId,
+ ShelfTypeName = request.ShelfTypeName,
+ SyncType = SyncTypeEnum.ByMatCode,
+ CreateUser = request.UserName,
+ };
+ order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync();
+ request.ItemList.ForEach(async item =>
+ {
+ var orderDetail = new OutOrderDetail()
+ {
+ OrderId = order.Id,
+ OrderNumber = order.OrderNumber,
+ MatCode = item.MatCode,
+ MatName = item.MatName,
+ MatBatch = item.MatBatch,
+ ReqQty = item.ReqQty,
+ OutQty = 0,
+ CreateUser = request.UserName
+ };
+ await DbHelp.db.Insertable(orderDetail).ExecuteCommandAsync();
+ });
+ await DbHelp.db.CommitTranAsync();
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
+ }; ;
+ }
+ catch (Exception ex)
+ {
+ await DbHelp.db.RollbackTranAsync();
+ Console.WriteLine(ex.Message);
+ return new ResponseBase()
+ {
+ Code = 200,
+ Message = $"出库单据同步失败:{ex.Message}"
+ };
+ }
+ }
+
+ public async Task SysOutOrderByMatSn(SysOutOrderByMatSnRequest request)
+ {
+
+ //参数合法性校验
+ if (request.SnList == null || request.SnList.Count == 0)
+ {
+ return new ResponseBase()
+ {
+ Code = 201,
+ Message = "出库单据同步失败:缺少物料明细!"
+ };
+ }
+ //标准版逻辑-库存有无校验 & 库存已锁校验
+ if (!LocalFile.Config.IsMx)
+ {
+ try
+ {
+ await DbHelp.db.BeginTranAsync();
+ var inventoryDetails = await DbHelp.db.Queryable()
+ .Where(t => request.SnList.Contains(t.MatSN))
+ .TranLock(DbLockType.Wait)
+ .ToListAsync();
+ if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量
+ {
+ var existsSns = inventoryDetails.Select(t => t.MatSN).ToList();
+ request.SnList.RemoveAll(t => existsSns.Contains(t));
+ await DbHelp.db.RollbackTranAsync();
+ //返回提示哪些物料库存不存在
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "出库单据同步失败:存在物料不在库存中!",
+ Data = request.SnList
+
+ };
+ }
+ else if (inventoryDetails.Where(t => t.IsLocked).Any())
+ {
+ await DbHelp.db.RollbackTranAsync();
+ //返回提示哪些物料库存已被锁定
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "出库单据同步失败:存在物料被锁定!",
+ Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList()
+ };
+ }
+
+ #region 保存数据
+
+ //锁库存
+ inventoryDetails.ForEach(t =>
+ {
+ t.IsLocked = true;
+ });
+ var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync();
+
+ //保存数据
+ var order = new OutOrder()
+ {
+ OrderNumber = request.OrderNumber,
+ OrderSource = request.OrderSource,
+ OrderType = request.OrderType,
+ SyncType = SyncTypeEnum.ByMatSn,
+ CreateUser = request.UserName,
+ };
+ order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync();
+
+ //通过库存数据保存出库物料明细表
+ var matDetailTasks = inventoryDetails.Select(async t =>
+ {
+ var orderMatDetail = new OutOrderMatDetail()
+ {
+ OrderId = order.Id,
+ OrderNumber = order.OrderNumber,
+ InventoryDetailId = t.Id,
+ StoreId = t.StoreId,
+ StoreCode = t.StoreCode,
+ MatSN = t.MatSN,
+ MatCode = t.MatCode,
+ MatName = t.MatName,
+ MatSpec = t.MatSpec,
+ MatBatch = t.MatBatch,
+ MatQty = t.MatQty,
+ MatSupplier = t.MatSupplier,
+ MatCustomer = t.MatCustomer,
+ CreateUser = request.UserName
+ };
+ await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
+ }).ToList();
+
+ await lockTask;
+ await Task.WhenAll(matDetailTasks);
+
+ await DbHelp.db.CommitTranAsync();
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"出库单据同步成功!\r\n出库单据号为{request.OrderNumber}",
+ Data = order.Id
+ };
+ #endregion
+ }
+ catch (Exception ex)
+ {
+ await DbHelp.db.RollbackTranAsync();
+ return new ResponseBase()
+ {
+ Code = 201,
+ Message = $"出库单据同步失败:{ex.Message}"
+ };
+ }
+ }
+ //盟讯公司逻辑 不锁库存 直接保存数据/清除未发送的
+ else
+ {
+ try
+ {
+ DbHelp.db.BeginTran();
+ //1. 获取库存物料明细
+ var inventoryDetails = await DbHelp.db.Queryable()
+ .Where(t => request.SnList.Contains(t.MatSN))
+ .ToListAsync();
+ if (inventoryDetails == null || inventoryDetails.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "保存出库单失败!请重试!",
+ Data = request.SnList
+ };
+ }
+ //2. 先获取对应单号是否已经保存
+ var outOrder = DbHelp.db.Queryable()
+ .Where(t => t.OrderNumber == request.OrderNumber)
+ .Where(t => t.GroupName == LocalFile.Config.GroupName)
+ .First();
+ //数据库中没有才添加
+ if (outOrder == null)
+ {
+ //OutOrder
+ outOrder = new OutOrder()
+ {
+ OrderNumber = request.OrderNumber,
+ OutOrderExeStatus = OutOrderExeStatus.开始发料,
+ OrderSource = "WCS前端",
+ SyncType = SyncTypeEnum.ByMatSn,
+ ShelfTypeName = "智能货架",
+ ShelfTypeId = 0,
+ GroupName = LocalFile.Config.GroupName,
+ };
+ outOrder.Id = await DbHelp.db.Insertable(outOrder).ExecuteReturnIdentityAsync();
+ outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber)
+ .Where(t => t.Id == outOrder.Id)
+ .FirstAsync();
+ //保存单据失败了
+ if (outOrder == null)
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = "保存出库单失败!保存Order失败!",
+ Data = request.SnList
+ };
+
+ //出库物料明细
+ foreach (var item in inventoryDetails)
+ {
+ var orderMatDetail = new OutOrderMatDetail()
+ {
+ OrderId = outOrder.Id,
+ OrderNumber = outOrder.OrderNumber,
+ InventoryDetailId = item.Id,
+ StoreId = item.StoreId,
+ StoreCode = item.StoreCode,
+ MatSN = item.MatSN,
+ MatCode = item.MatCode,
+ MatName = item.MatName,
+ MatSpec = item.MatSpec,
+ MatBatch = item.MatBatch,
+ MatQty = item.MatQty,
+ MatSupplier = item.MatSupplier,
+ MatCustomer = item.MatCustomer,
+ CreateUser = request.UserName
+ };
+ await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
+ }
+ DbHelp.db.CommitTran();
+ }
+ //数据库已有该Order
+ else
+ {
+ outOrder.CreateTime = DateTime.Now;
+ DbHelp.db.Updateable(outOrder).ExecuteCommand();
+ //删除未出库的
+ var outOrderDetails = DbHelp.db.Deleteable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .Where(t => t.IsSended == false)
+ .ExecuteCommand();
+ //当前已出库的 //已出库的也不在库存中了 应该查询不到了
+ //避免影响效率 就不查重了
+ foreach (var item in inventoryDetails)
+ {
+ var orderMatDetail = new OutOrderMatDetail()
+ {
+ OrderId = outOrder.Id,
+ OrderNumber = outOrder.OrderNumber,
+ InventoryDetailId = item.Id,
+ StoreId = item.StoreId,
+ StoreCode = item.StoreCode,
+ MatSN = item.MatSN,
+ MatCode = item.MatCode,
+ MatName = item.MatName,
+ MatSpec = item.MatSpec,
+ MatBatch = item.MatBatch,
+ MatQty = item.MatQty,
+ MatSupplier = item.MatSupplier,
+ MatCustomer = item.MatCustomer,
+ CreateUser = request.UserName
+ };
+ await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync();
+ }
+ DbHelp.db.CommitTran();
+
+ //更新订单状态
+ Task.Run(() =>
+ {
+ if (outOrder != null)
+ {
+ #region 物料明细表是否已发完
+ var orderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .ToList();
+ var isExistNoSendMat = orderMatDetails.Where(t => t.IsSended == false)
+ .Any();
+ if (isExistNoSendMat)
+ {
+ outOrder.OrderStatus = OutOrderStatus.部分发料;
+ }
+ else
+ {
+ outOrder.OrderStatus = OutOrderStatus.全部发料;
+ outOrder.OutOrderExeStatus = OutOrderExeStatus.发料完成;
+ }
+ #endregion
+ DbHelp.db.Updateable(outOrder).ExecuteCommand();
+ }
+ });
+ }
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"Success",
+ Data = request.SnList
+ };
+
+ }
+ catch (Exception ex)
+ {
+ DbHelp.db.RollbackTran();
+ Logs.Write($"同步出库单据发生异常{ex.Message}", LogsType.Info);
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"保存出库单失败!{ex.Message}!",
+ Data = request.SnList
+ };
+ }
+
+ }
+
+ }
+
+ public async Task GetOutOrderList(GetOutOrderListRequest request)
+ {
+ //直接查询
+ var recordsQueryable = DbHelp.db.Queryable()
+ .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber.Contains(request.OrderNumber))
+ .WhereIF(!string.IsNullOrEmpty(request.OrderSource), t => t.OrderSource.Contains(request.OrderSource))
+ .WhereIF(!string.IsNullOrEmpty(request.OrderType), t => t.OrderType.Contains(request.OrderType))
+ .WhereIF(request.ShelfTypeId != 0, t => t.ShelfTypeId == request.ShelfTypeId);
+
+ var totalCount = await recordsQueryable.CountAsync();
+ var records = await recordsQueryable
+ .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize)
+ .ToListAsync();
+ //生成序号
+ for (int i = 0; i < records.Count; i++)
+ {
+ records[i].RowNumber = (request.PageNumber - 1) * request.PageSize + i + 1;
+ }
+
+ return new PageQueryResponse()
+ {
+ Code = 200,
+ Message = $"success",
+ Data = new PageQueryResponseData()
+ {
+ TotalCount = totalCount,
+ MaxPage = request.PageSize == 0 ? 0 : (int)Math.Ceiling((decimal)totalCount / request.PageSize),
+ Count = records.Count,
+ Lists = records.ToList()
+ }
+ };
+ }
+
+ public async Task GetOutOrderListByStatus(GetOutOrderListByStatusRequest request)
+ {
+ if (request.OrderExeStatus == null || request.OrderExeStatus.Count == 0)
+ {
+ //不传入状态不显示
+ return new PageQueryResponse()
+ {
+ Code = 200,
+ Message = $"success",
+ Data = new PageQueryResponseData()
+ {
+ Lists = new List()
+ }
+ };
+ }
+ //直接查询
+ var recordsQueryable = DbHelp.db.Queryable().Where(t => request.OrderExeStatus.Contains(t.OutOrderExeStatus));
+
+ var totalCount = await recordsQueryable.CountAsync();
+ var records = await recordsQueryable
+ .OrderByDescending(t => t.CreateTime)
+ //.Take(request.PageSize)
+ .ToListAsync();
+
+ return new PageQueryResponse()
+ {
+ Code = 200,
+ Message = $"success",
+ Data = new PageQueryResponseData()
+ {
+ //TotalCount = totalCount,
+ //MaxPage = request.PageSize == 0 ? 0 : (int)Math.Ceiling((decimal)totalCount / request.PageSize),
+ //Count = records.Count,
+ Lists = records.ToList()
+ }
+ };
+ }
+ public async Task GetOutOrderDetail(GetOutOrderDetailRequest request)
+ {
+ OutOrder outOrder = null;
+
+ #region 查询出库单
+ if (request.OrderId != 0)
+ {
+ outOrder = await DbHelp.db.Queryable().Where(t => t.Id == request.OrderId).FirstAsync();
+ if (outOrder == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:不存在Id为{request.OrderId}的出库单!",
+ };
+ }
+ }
+ else if (!string.IsNullOrEmpty(request.OrderNumber))
+ {
+ outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (outOrder == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:不存在出库单据号为{request.OrderNumber}的出库单!",
+ };
+ }
+ }
+ else
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:缺少必要参数!",
+ };
+ }
+ #endregion
+
+ #region 查询出库单明细
+ var orderDetailTask = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .ToListAsync();
+ var orderDetail = await orderDetailTask;
+ //生成序号
+ for (int i = 0; i < orderDetail.Count; i++)
+ {
+ orderDetail[i].RowNumber = i + 1;
+ }
+ #endregion
+
+ return new ResponseCommon>()
+ {
+ Code = 200,
+ Message = "Success",
+ Data = orderDetail
+ };
+ }
+
+ public async Task GetOutOrderMatDetail(GetOutOrderDetailRequest request)
+ {
+ OutOrder outOrder = null;
+
+ #region 查询出库单
+ if (request.OrderId != 0)
+ {
+ outOrder = await DbHelp.db.Queryable().Where(t => t.Id == request.OrderId).FirstAsync();
+ if (outOrder == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:不存在Id为{request.OrderId}的出库单!",
+ };
+ }
+ }
+ else if (!string.IsNullOrEmpty(request.OrderNumber))
+ {
+ outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (outOrder == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:不存在出库单据号为{request.OrderNumber}的出库单!",
+ };
+ }
+ }
+ else
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"查询失败:缺少必要参数!",
+ };
+ }
+ #endregion
+
+ #region 出库物料明细
+ var orderMatDetailTask = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == outOrder.Id)
+ .ToListAsync();
+ var orderMatDetail = await orderMatDetailTask;
+ //生成序号
+ for (int i = 0; i < orderMatDetail.Count; i++)
+ {
+ orderMatDetail[i].RowNumber = i + 1;
+ }
+ #endregion
+
+
+ return new ResponseCommon>
+ {
+ Code = 200,
+ Message = outOrder.OrderStatus.ToString(),
+ Data = orderMatDetail
+ };
+ }
+
+ public async Task GoInOutstore(GetOutOrderDetailRequest request)
+ {
+ try
+ {
+ //获取出库单
+ var order = await DbHelp.db.Queryable()
+ .WhereIF(request.OrderId != 0, t => t.Id == request.OrderId)
+ .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (order == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"不存在对应的出库单据{request.OrderNumber}!",
+ Data = null
+ };
+ }
+
+
+ //如果是按物料编码出库 需要计算物料明细、并进行物料锁定
+ if (order.SyncType == SyncTypeEnum.ByMatCode)
+ {
+ var result = CaculateOutOrderMatDetails(order, request.UserName);
+ if (result.Code != 200)
+ {
+ return result;
+ }
+ }
+
+ //获取需要出库的物料明细
+ var outOrderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == order.Id)
+ .Where(t => t.IsSended == false)
+ .Includes(t => t.StoreInfo)
+ .ToList();
+ if (outOrderMatDetails == null || outOrderMatDetails.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"出库单据{request.OrderNumber}物料已全部完成出库!",
+ Data = null
+ };
+ }
+
+ if (request.IsStart)//&& order.OutOrderExeStatus != OutOrderExeStatus.发料完成
+ {
+ order.OutOrderExeStatus = OutOrderExeStatus.开始发料;
+ DbHelp.db.Updateable(order).ExecuteCommand();
+ }
+
+ //按货架分组 按物料找到对应的货架
+ var shelfIds = outOrderMatDetails.Select(t => t.StoreInfo.ShelfId)
+ .Distinct()
+ .ToList();
+ var shelfs = ShelfManager.Shelves.Where(t => shelfIds.Contains(t.ShelfId)).ToList(); ;
+
+ var outherModeShelfs = shelfs.Where(t => t.CurrentMode != HardWare.Mode.待机模式).Select(t => t.ShelfCode).ToList();
+ if (outherModeShelfs != null && outherModeShelfs.Count > 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"进入出库模式失败:货架{string.Join("", outherModeShelfs)}不在待机模式",
+ Data = null
+ };
+ }
+ //看是否是分批次出库的情况 分批次亮灯
+ if (LocalFile.Config.IsSameMatCodeOut)
+ {
+ var outOrderDetailCount = outOrderMatDetails.GroupBy(t => t.MatCode)
+ .Select(o => new { count = o.Count(), bb = o })
+ .Where(o => o.count >= 2)
+ .OrderByDescending(o => o.count)
+ .ToList();
+ //相同物料存在盘数超过2的情况,亮下一个盘数多的物料
+ if (outOrderDetailCount.Count > 0)
+ {
+ var matCode = outOrderDetailCount.First().bb.Key;
+ outOrderMatDetails = outOrderMatDetails.Where(t => t.MatCode == matCode)
+ .ToList();
+ Logs.Write($"出库单{order.OrderNumber},本次亮灯物料{matCode}!");
+ }
+ //相同物料不存在盘数超过n的情况,剩余物料全部亮灯
+ else
+ {
+ //剩余物料全出
+ Logs.Write($"出库单{order.OrderNumber},剩余物料灯全亮!");
+ }
+ }
+
+ //对应的货架对应位置 进入出库模式 亮灯
+ shelfs.ForEach(shelf =>
+ {
+ var matDetails = outOrderMatDetails.Where(t => t.StoreInfo.ShelfCode == shelf.ShelfCode)
+ .Distinct()
+ .ToList();
+ shelf.GoInOutstore(matDetails, order);
+ shelf.OrderNumber = order.OrderNumber;
+ });
+
+ //返回
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = "Success",
+ Data = null
+ };
+ }
+ catch (Exception ex)
+ {
+ await GoOutOutstore(request);
+ throw ex;
+ }
+ }
+
+ public async Task GoInOutstoreSingle(GetOutOrderDetailRequest request)
+ {
+ try
+ {
+ //获取出库单
+ var order = await DbHelp.db.Queryable()
+ .WhereIF(request.OrderId != 0, t => t.Id == request.OrderId)
+ .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (order == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"不存在对应的出库单据{request.OrderNumber}!",
+ Data = null
+ };
+ }
+
+
+ //如果是按物料编码出库 需要计算物料明细、并进行物料锁定
+ if (order.SyncType == SyncTypeEnum.ByMatCode)
+ {
+ var result = CaculateOutOrderMatDetails(order, request.UserName);
+ if (result.Code != 200)
+ {
+ return result;
+ }
+ }
+
+ //获取需要出库的物料明细
+ var outOrderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == order.Id)
+ .Where(t => t.IsSended == false)
+ .Includes(t => t.StoreInfo)
+ .ToList();
+ if (outOrderMatDetails == null || outOrderMatDetails.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"出库单据{request.OrderNumber}物料已全部完成出库!",
+ Data = null
+ };
+ }
+
+ if (request.IsStart)//&& order.OutOrderExeStatus != OutOrderExeStatus.发料完成
+ {
+ order.OutOrderExeStatus = OutOrderExeStatus.开始发料;
+ DbHelp.db.Updateable(order).ExecuteCommand();
+ }
+ //获取亮灯颜色
+ List UsedColor = new List();
+ string LightColor = "";
+ List ol = DbHelp.db.Queryable().OrderBy(it => it.Id, OrderByType.Asc).ToList();
+ foreach (OrderLight orderLight in ol)
+ {
+ UsedColor.Add(orderLight.LightColor);
+ if (orderLight.OrderNumber == request.OrderNumber)
+ {
+ LightColor = orderLight.LightColor;
+ break;
+ }
+ }
+ if (LightColor == "")
+ {
+ foreach (OrderLight orderLight in ol)
+ {
+ if (orderLight.OrderNumber == null)
+ {
+ LightColor = orderLight.LightColor;
+ DbHelp.db.Updateable().SetColumns(it => it.OrderNumber, request.OrderNumber).Where(it => it.LightColor == LightColor).ExecuteCommand();
+ break;
+ }
+ }
+ }
+ //获取出库需求
+ List outorderdetal = DbHelp.db.Queryable()
+ .WhereIF(request.OrderId != 0, t => t.OrderId == request.OrderId)
+ .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber == request.OrderNumber)
+ .ToList();
+
+ OutResponseCommonSingle orcs = new OutResponseCommonSingle();
+ orcs.Data = new List();
+ foreach (OutOrderDetail outdetail in outorderdetal)
+ {
+ OutDetail od = new OutDetail();
+ od.OrderId = outdetail.OrderId;
+ od.OrderNumber = outdetail.OrderNumber;
+ od.MatCode = outdetail.MatCode;
+ od.MatBatch = outdetail.MatBatch;
+ od.ReqQty = outdetail.ReqQty;
+ od.CreateTime = outdetail.CreateTime;
+ od.CreateUser = outdetail.CreateUser;
+ od.MatName = outdetail.MatName;
+ od.OutQty = outdetail.OutQty;
+ od.LightColor = LightColor;
+ orcs.Data.Add(od);
+ }
+ //需要出库的货架名
+ List StoreCode = new List();
+ //库位灯亮灯
+ Dictionary> dict = new Dictionary>();
+ foreach (OutOrderMatDetail oomd in outOrderMatDetails)
+ {
+ List mi= DbHelp.db.Queryable().Where(it => it.ModuleCode == oomd.StoreCode).ToList();
+ if (mi.Count != 0)
+ {
+ if (!StoreCode.Contains(oomd.StoreCode))
+ {
+ StoreCode.Add(oomd.StoreCode);
+ }
+ if (!dict.Keys.Contains(mi[0].CleintIp))
+ {
+ List board_id = new List();
+ board_id.Add(mi[0].BoardId);
+ dict.Add(mi[0].CleintIp, board_id);
+ }
+ else
+ {
+ foreach (var v in dict)
+ {
+ if (v.Key == mi[0].CleintIp)
+ {
+ if (!v.Value.Contains(mi[0].BoardId))
+ {
+ v.Value.Add(mi[0].BoardId);
+ }
+ }
+ }
+ }
+ }
+ }
+ foreach (var v in dict)
+ {
+ string sendIP = v.Key;
+ TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(sendIP);
+ byte[] lightOn = Helper.OutstoreLight(v.Value, LightColor,1);
+ tCPClient.Send(lightOn);
+ Thread.Sleep(100);
+ }
+ //报警灯亮
+ List WarnLightShelfCode = new List();
+ foreach (string storecode in StoreCode)
+ {
+ List mi = DbHelp.db.Queryable().Where(it => it.ModuleCode == storecode).ToList();
+ if (mi.Count != 0)
+ {
+ if (!WarnLightShelfCode.Contains(mi[0].ShelfCode))
+ {
+ WarnLightShelfCode.Add(mi[0].ShelfCode);
+ }
+ }
+ }
+ foreach (string shelfcode in WarnLightShelfCode)
+ {
+ List si = DbHelp.db.Queryable().Where(it => it.ShelfCode == shelfcode).ToList();
+ if (si.Count != 0)
+ {
+ for (int i = 0; i < si.Count; i++)
+ {
+ TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(si[i].ClientIp);
+ byte[] warnlightOn = Helper.OutstoreWarnLight(si[i].LightId,"无",1,0);
+ tCPClient.Send(warnlightOn);
+ Thread.Sleep(100);
+ }
+ }
+ }
+ //返回
+ return new OutResponseCommonSingle()
+ {
+ Code = 200,
+ Message = "Success",
+ Data = orcs.Data
+ };
+ }
+ catch (Exception ex)
+ {
+ await GoOutOutstore(request);
+ throw ex;
+ }
+ }
+
+ //计算、加锁
+ private ResponseBase CaculateOutOrderMatDetails(OutOrder order, string createUser = "")
+ {
+ try
+ {
+ DbHelp.db.BeginTran();
+ //第一步 物料需求表
+ var outOrderDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == order.Id)
+ .ToList();
+ if (outOrderDetails == null || outOrderDetails.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"计算物料失败,{order.OrderNumber}没有出库单据明细!"
+ };
+ }
+ //第二步 开始计算物料
+ List outOrderMatDetails = new List();
+ foreach (var outOrderDetail in outOrderDetails)
+ {
+ //2.1筛选 满足 物料编码、批次的库存
+ var matInventoryDetails = DbHelp.db.Queryable()
+ .Where(t => t.MatCode == outOrderDetail.MatCode)
+ .WhereIF(!string.IsNullOrEmpty(outOrderDetail.MatBatch), t => t.MatBatch == outOrderDetail.MatBatch)
+ .Where(t => t.IsLocked == false)//未锁定的物料
+ .Where(t => t.StoreInfo.ShelfTypeId == order.ShelfTypeId)
+ .OrderBy(t => t.MatBatch)//按批次先进先出
+ //(t => t.MatQty)//零散料先出
+ .ToList();
+
+ //2.2按照搜索出来的库存和当前未出的数量 计算需要出的SN
+ for (int i = 0; i < matInventoryDetails.Count && outOrderDetail.ReqQty - outOrderDetail.OutQty > 0; i++)
+ {
+ if (outOrderDetail.ReqQty - outOrderDetail.OutQty <= matInventoryDetails[i].MatQty)
+ {
+ outOrderMatDetails.Add(new OutOrderMatDetail()
+ {
+ OrderId = order.Id,
+ OrderNumber = order.OrderNumber,
+ OutOrderDetailId = outOrderDetail.Id,
+ InventoryDetailId = matInventoryDetails[i].Id,
+ StoreId = matInventoryDetails[i].StoreId,
+ StoreCode = matInventoryDetails[i].StoreCode,
+ MatSN = matInventoryDetails[i].MatSN,
+ MatCode = matInventoryDetails[i].MatCode,
+ MatName = matInventoryDetails[i].MatName,
+ MatSpec = matInventoryDetails[i].MatSpec,
+ MatBatch = matInventoryDetails[i].MatBatch,
+ MatQty = matInventoryDetails[i].MatQty,
+ MatSupplier = matInventoryDetails[i].MatSupplier,
+ MatCustomer = matInventoryDetails[i].MatCustomer,
+ IsSended = false,
+ CreateUser = createUser,
+ });
+ outOrderDetail.ReqQty = 0;
+
+ matInventoryDetails[i].IsLocked = true;
+ DbHelp.db.Updateable(matInventoryDetails[i]).ExecuteCommand();
+ }
+ else
+ {
+ outOrderDetail.ReqQty = outOrderDetail.ReqQty - matInventoryDetails[i].MatQty;
+
+ outOrderMatDetails.Add(new OutOrderMatDetail()
+ {
+ OrderId = order.Id,
+ OrderNumber = order.OrderNumber,
+ OutOrderDetailId = outOrderDetail.Id,
+ InventoryDetailId = matInventoryDetails[i].Id,
+ StoreId = matInventoryDetails[i].StoreId,
+ StoreCode = matInventoryDetails[i].StoreCode,
+ MatSN = matInventoryDetails[i].MatSN,
+ MatCode = matInventoryDetails[i].MatCode,
+ MatName = matInventoryDetails[i].MatName,
+ MatSpec = matInventoryDetails[i].MatSpec,
+ MatBatch = matInventoryDetails[i].MatBatch,
+ MatQty = matInventoryDetails[i].MatQty,
+ MatSupplier = matInventoryDetails[i].MatSupplier,
+ MatCustomer = matInventoryDetails[i].MatCustomer,
+ IsSended = false,
+ CreateUser = createUser,
+ });
+
+ matInventoryDetails[i].IsLocked = true;
+ DbHelp.db.Updateable(matInventoryDetails[i]).ExecuteCommand();
+ }
+ }
+ }
+ DbHelp.db.Insertable(outOrderMatDetails).ExecuteCommand();
+ DbHelp.db.CommitTran();
+ if (outOrderMatDetails.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"计算物料失败,没有满足条件的物料进行出库!(请检查对应物料是否已被锁定)"
+ };
+ }
+ else
+
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"Success"
+ };
+ }
+ catch (Exception ex)
+ {
+ DbHelp.db.RollbackTran();
+ return new ResponseCommon()
+ {
+ Code = 300,
+ Message = $"发生异常:{ex.Message}"
+ };
+ }
+ }
+
+ //删除 解锁
+ private ResponseBase CancelOutOrderMatDetails(OutOrder order)
+ {
+ try
+ {
+ DbHelp.db.BeginTran();
+ var outOrderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderId == order.Id)
+ .Where(t => t.IsSended == false)
+ .ToList();
+
+ var inventoryIds = outOrderMatDetails.Select(t => t.InventoryDetailId).ToList();
+ var inventoryDetails = DbHelp.db.Queryable()
+ .Where(t => inventoryIds.Contains(t.Id))
+ .ToList();
+ inventoryDetails.ForEach(t => { t.IsLocked = false; });
+ DbHelp.db.Deleteable(outOrderMatDetails).ExecuteCommand();
+ DbHelp.db.Updateable(inventoryDetails).ExecuteCommand();
+
+ DbHelp.db.CommitTran();
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = $"Success"
+ };
+ }
+ catch (Exception ex)
+ {
+ DbHelp.db.RollbackTran();
+ return new ResponseCommon()
+ {
+ Code = 300,
+ Message = $"解锁物料时发生异常:{ex.Message}"
+ };
+ }
+ }
+
+ public async Task GoOutOutstore(GetOutOrderDetailRequest request)
+ {
+
+ //获取出库单
+ var order = await DbHelp.db.Queryable()
+ .WhereIF(request.OrderId != 0, t => t.Id == request.OrderId)
+ .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (order == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"不存在对应的出库单据{request.OrderNumber}!",
+ Data = null
+ };
+ }
+
+ //执行状态改为暂停
+ if (request.IsPause && order.OutOrderExeStatus != OutOrderExeStatus.发料完成)
+ {
+ order.OutOrderExeStatus = OutOrderExeStatus.暂停发料;
+ DbHelp.db.Updateable(order).ExecuteCommand();
+ }
+
+ //解锁物料 删除物料明细
+ if (order.SyncType == SyncTypeEnum.ByMatCode)
+ CancelOutOrderMatDetails(order);
+
+ //找到正在出对应出库单的货架
+ var shelves = ShelfManager.Shelves.Where(t => t.OrderNumber == request.OrderNumber)
+ .Where(t => t.CurrentMode == HardWare.Mode.出库模式)
+ .ToList();
+
+ if (shelves == null || shelves.Count == 0)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"出库单据【{request.OrderNumber}】不在出库中!",
+ Data = null
+ };
+ }
+
+
+
+ //退出出库模式
+ shelves.ForEach(t =>
+ {
+ t.GoOutOutstore();
+ });
+
+
+
+ return new ResponseCommon()
+ {
+ Code = 200,
+ Message = "Success",
+ Data = null
+ };
+
+ }
+
+ public async Task GoOutOutstoreSingle(GetOutOrderDetailRequest request)
+ {
+
+ //获取出库单
+ var order = await DbHelp.db.Queryable()
+ .WhereIF(request.OrderId != 0, t => t.Id == request.OrderId)
+ .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber == request.OrderNumber)
+ .FirstAsync();
+ if (order == null)
+ {
+ return new ResponseCommon()
+ {
+ Code = 201,
+ Message = $"不存在对应的出库单据{request.OrderNumber}!",
+ Data = null
+ };
+ }
+
+ //判断出库状态
+ bool isComplete = true;
+ List ood = DbHelp.db.Queryable().Where(it => it.OrderNumber == request.OrderNumber).ToList();
+ foreach (OutOrderDetail detail in ood)
+ {
+ if (detail.ReqQty > detail.OutQty)
+ {
+ isComplete = false;
+ break;
+ }
+ }
+ if (isComplete == false)
+ {
+ order.OutOrderExeStatus = OutOrderExeStatus.暂停发料;
+ DbHelp.db.Updateable(order).ExecuteCommand();
+ }
+ else
+ {
+ order.OutOrderExeStatus = OutOrderExeStatus.发料完成;
+ DbHelp.db.Updateable(order).ExecuteCommand();
+ }
+ //解锁物料
+ List List = DbHelp.db.Queryable().Where(it => it.OrderNumber == request.OrderNumber).ToList();
+ foreach (OutOrderMatDetail listdetail in List)
+ {
+ DbHelp.db.Updateable().SetColumns(it => it.IsLocked == false).Where(it => it.MatSN == listdetail.MatSN).ExecuteCommand();
+ }
+
+ DbHelp.db.Updateable().SetColumns(it => it.OrderNumber == null).Where(it => it.OrderNumber == request.OrderNumber).ExecuteCommand();
+ //灭灯
+<<<<<<< HEAD
+ //获取需要出库的物料明细
+ var outOrderMatDetails = DbHelp.db.Queryable()
+ .Where(t => t.OrderNumber == request.OrderNumber)
+ .ToList();
+ //需要出库的货架名
+ List StoreCode = new List();
+ //库位灯灭灯
+ Dictionary> dict = new Dictionary>();
+ foreach (OutOrderMatDetail oomd in outOrderMatDetails)
+ {
+ List mi = DbHelp.db.Queryable().Where(it => it.ModuleCode == oomd.StoreCode).ToList();
+ if (mi.Count != 0)
+ {
+ if (!StoreCode.Contains(oomd.StoreCode))
+ {
+ StoreCode.Add(oomd.StoreCode);
+ }
+ if (!dict.Keys.Contains(mi[0].CleintIp))
+ {
+ List board_id = new List();
+ board_id.Add(mi[0].BoardId);
+ dict.Add(mi[0].CleintIp, board_id);
+ }
+ else
+ {
+ foreach (var v in dict)
+ {
+ if (v.Key == mi[0].CleintIp)
+ {
+ if (!v.Value.Contains(mi[0].BoardId))
+ {
+ v.Value.Add(mi[0].BoardId);
+ }
+ }
+ }
+ }
+ }
+ }
+ foreach (var v in dict)
+ {
+ string sendIP = v.Key;
+ TCPClient tCPClient = TCPClientManager.GetTCPClientByIPHost(sendIP);
+ byte[] lightOn = Helper.OutstoreLight(v.Value, "无",0);
+ tCPClient.Send(lightOn);
+ Thread.Sleep(100);
+ }
+ //报警灯灭
+ List WarnLightShelfCode = new List();
+ foreach (string storecode in StoreCode)
+ {
+ List mi = DbHelp.db.Queryable