1.增加盟讯公司业务逻辑相关适配 前后端增加配置参数“ISMX”进行控制
2.前端websocket取消心跳机制(原有心跳和断线重连当服务端网线断开后需要等tcp保活期到期后才能发现重连),自己实现心跳和重连 3.前端关闭后任占用后台线程问题修复
This commit is contained in:
@ -18,6 +18,18 @@ namespace WCS.BLL.Config
|
||||
/// </summary>
|
||||
public bool IsSameMatCodeOut { get; set; }
|
||||
/// <summary>
|
||||
/// 数据-数据库路径
|
||||
/// </summary>
|
||||
public string DataDbPath { get; set; }
|
||||
/// <summary>
|
||||
/// 日志-数据库路径
|
||||
/// </summary>
|
||||
public string LogDbPath { get; set; }
|
||||
/// <summary>
|
||||
/// 权限-数据库路径
|
||||
/// </summary>
|
||||
public string AuthDbPath { get; set; }
|
||||
/// <summary>
|
||||
/// 是否接入WMS系统
|
||||
/// </summary>
|
||||
public bool IsAccessWMS { get; set; }
|
||||
@ -25,5 +37,25 @@ namespace WCS.BLL.Config
|
||||
/// WMS系统
|
||||
/// </summary>
|
||||
public string? WMSUrl { get; set; }
|
||||
|
||||
#region 盟讯公司后台配置
|
||||
public bool IsMx { get; set; }
|
||||
/// <summary>
|
||||
/// 回传Mes入库/移库
|
||||
/// </summary>
|
||||
public string InputStockInStr { get; set; }
|
||||
/// <summary>
|
||||
/// 回传Mes出库
|
||||
/// </summary>
|
||||
public string BunkerOutStr { get; set; }
|
||||
/// <summary>
|
||||
/// 通过条码查询物料信息接口
|
||||
/// </summary>
|
||||
public string QueryBybar { get; set; }
|
||||
/// <summary>
|
||||
/// 后台配置的组别
|
||||
/// </summary>
|
||||
public string GroupName { get; set; }
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
19
WCS.BLL/DbModels/DingDingSendUser.cs
Normal file
19
WCS.BLL/DbModels/DingDingSendUser.cs
Normal file
@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// 工号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "user_name", Length = 50, IsNullable = true, ColumnDescription = "创建人")]
|
||||
public string UserName { get; set; }
|
||||
}
|
||||
}
|
@ -12,7 +12,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 用于记录单据生成到哪个序号了
|
||||
/// </summary>
|
||||
[SugarTable("document_serial_number")]
|
||||
[SugarTable("wcs_document_serial_number")]
|
||||
public class DocumentSerialNumber
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -12,7 +12,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 出入库记录
|
||||
/// </summary>
|
||||
[SugarTable("in_out_record")]
|
||||
[SugarTable("wcs_in_out_record")]
|
||||
public class InOutRecord
|
||||
{
|
||||
/// <summary>
|
||||
@ -115,6 +115,33 @@ namespace WCS.BLL.DbModels
|
||||
[SugarColumn(ColumnName = "operate_user", Length = 100, IsNullable = true, ColumnDescription = "创建人")]
|
||||
public string OperateUser { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 串联绑定后的大货架编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
|
||||
public string? BigShelfCode { get; set; } = string.Empty;
|
||||
/// <summary>
|
||||
/// Row 行
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")]
|
||||
public string R { get; set; }
|
||||
/// <summary>
|
||||
/// Column 列
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")]
|
||||
public string C { get; set; }
|
||||
/// <summary>
|
||||
/// Column 位
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")]
|
||||
public string Wei { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
|
||||
public string GroupName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 序号
|
||||
/// </summary>
|
||||
|
@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 库存明细表
|
||||
/// </summary>
|
||||
[SugarTable("inventory_detail")]
|
||||
[SugarTable("wcs_inventory_detail")]
|
||||
public class InventoryDetail
|
||||
{
|
||||
/// <summary>
|
||||
@ -102,7 +102,38 @@ namespace WCS.BLL.DbModels
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "is_locked", IsNullable = false, ColumnDescription = "物料是否已被锁定")]
|
||||
public bool IsLocked { get; set; } = false;
|
||||
/// <summary>
|
||||
/// 串联绑定后的大货架编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "big_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
|
||||
public string? BigShelfCode { get; set; } = string.Empty;
|
||||
/// <summary>
|
||||
/// Row 行
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")]
|
||||
public string R { get; set; }
|
||||
/// <summary>
|
||||
/// Column 列
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")]
|
||||
public string C { get; set; }
|
||||
/// <summary>
|
||||
/// Column 位
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")]
|
||||
public string Wei { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// WarehouseCode 仓库代码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "WarehouseCode", Length = 10, IsNullable = true, ColumnDescription = "仓库代码")]
|
||||
public string WarehouseCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
|
||||
public string GroupName { get; set; }
|
||||
/// <summary>
|
||||
/// 序号
|
||||
/// </summary>
|
||||
|
@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
|
||||
///<summary>
|
||||
///物料基础信息
|
||||
///</summary>
|
||||
[SugarTable("mat_base_info")]
|
||||
[SugarTable("wcs_mat_base_info")]
|
||||
public partial class MatBaseInfo
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
|
||||
///<summary>
|
||||
///物料信息表
|
||||
///</summary>
|
||||
[SugarTable("mat_info")]
|
||||
[SugarTable("wcs_mat_info")]
|
||||
public class MatInfo
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -11,7 +11,7 @@ namespace WCS.DAL.DbModels
|
||||
///<summary>
|
||||
///模组信息表
|
||||
///</summary>
|
||||
[SugarTable("module_info")]
|
||||
[SugarTable("wcs_module_info")]
|
||||
public class ModuleInfo
|
||||
{
|
||||
|
||||
@ -62,7 +62,11 @@ namespace WCS.DAL.DbModels
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "client_ip", Length = 50, IsNullable = false, ColumnDescription = "货架对应Can模块的Ip")]
|
||||
public string CleintIp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
|
||||
public string GroupName { get; set; }
|
||||
/// <summary>
|
||||
/// R 行
|
||||
/// </summary>
|
||||
|
@ -6,7 +6,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 出库单据
|
||||
/// </summary>
|
||||
[SugarTable("out_order")]
|
||||
[SugarTable("wcs_out_order")]
|
||||
public class OutOrder
|
||||
{
|
||||
/// <summary>
|
||||
@ -63,6 +63,12 @@ namespace WCS.BLL.DbModels
|
||||
[SugarColumn(ColumnName = "shelf_type_id", IsNullable = false, DefaultValue = "0", ColumnDescription = "货架类型Id")]
|
||||
public int ShelfTypeId { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
|
||||
public string GroupName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
|
@ -6,7 +6,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 出库单据明细表
|
||||
/// </summary>
|
||||
[SugarTable("out_order_detail")]
|
||||
[SugarTable("wcs_out_order_detail")]
|
||||
public class OutOrderDetail
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 出库物料明细(库存数据加锁后缓存对应的数据并记录状态)
|
||||
/// </summary>
|
||||
[SugarTable("out_order_mat_detail")]
|
||||
[SugarTable("wcs_out_order_mat_detail")]
|
||||
public class OutOrderMatDetail
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -8,7 +8,7 @@ using WCS.BLL.HardWare;
|
||||
|
||||
namespace WCS.DAL.DbModels
|
||||
{
|
||||
[SugarTable("shelf_info")]
|
||||
[SugarTable("wcs_shelf_info")]
|
||||
public class ShelfInfo
|
||||
{
|
||||
|
||||
@ -83,7 +83,7 @@ namespace WCS.DAL.DbModels
|
||||
/// 串联绑定后的大货架编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
|
||||
public string? BindShelfCode { get; set; } = string.Empty;
|
||||
public string? BigShelfCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 序号
|
||||
|
@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 货架类型
|
||||
/// </summary>
|
||||
[SugarTable("shelf_type")]
|
||||
[SugarTable("wcs_shelf_type")]
|
||||
public class ShelfTypeInfo
|
||||
{
|
||||
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsNullable = false, IsIdentity = true)]
|
||||
|
@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 盘点单据
|
||||
/// </summary>
|
||||
[SugarTable("stock_taking_order")]
|
||||
[SugarTable("wcs_stock_taking_order")]
|
||||
public class StockTakingOrder
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -11,7 +11,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 盘点单据物料明细
|
||||
/// </summary>
|
||||
[SugarTable("stock_taking_order_matdetail")]
|
||||
[SugarTable("wcs_stock_taking_order_matdetail")]
|
||||
public class StockTakingOrderMatDetail
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -7,7 +7,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace WCS.DAL.DbModels
|
||||
{
|
||||
[SugarTable("store_info")]
|
||||
[SugarTable("wcs_store_info")]
|
||||
public partial class StoreInfo
|
||||
{
|
||||
/// <summary>
|
||||
@ -25,7 +25,7 @@ namespace WCS.DAL.DbModels
|
||||
/// 货架类型Id
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "shelf_type_id", IsNullable = false, DefaultValue = "0", ColumnDescription = "货架类型Id")]
|
||||
public int ShelfTypeId { get; set; }
|
||||
public int ShelfTypeId { get; set; }
|
||||
/// <summary>
|
||||
/// 模组Id
|
||||
/// </summary>
|
||||
@ -92,6 +92,33 @@ namespace WCS.DAL.DbModels
|
||||
[SugarColumn(ColumnName = "offset_voltage", IsNullable = true, ColumnDescription = "电压偏移值")]
|
||||
public decimal OffsetVoltage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 串联绑定后的大货架编码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Bind_shelf_code", IsNullable = true, ColumnDescription = "串联绑定后的大货架编码")]
|
||||
public string? BigShelfCode { get; set; } = string.Empty;
|
||||
/// <summary>
|
||||
/// Row 行
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "R", Length = 10, IsNullable = true, ColumnDescription = "库位 行")]
|
||||
public string R { get; set; }
|
||||
/// <summary>
|
||||
/// Column 列
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "C", Length = 10, IsNullable = true, ColumnDescription = "库位 列")]
|
||||
public string C { get; set; }
|
||||
/// <summary>
|
||||
/// Column 位
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Wei", Length = 10, IsNullable = true, ColumnDescription = "库位 位 第几个库位灯")]
|
||||
public string Wei { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "group_name", Length = 50, IsNullable = false, DefaultValue = "0", ColumnDescription = "货架的组别、区域(区分单个软件管哪些货架的,前端的配置文件配置一个组别,查询时只显示当前组别的货架)")]
|
||||
public string GroupName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 序号
|
||||
/// </summary>
|
||||
|
@ -10,7 +10,7 @@ namespace WCS.BLL.DbModels
|
||||
/// <summary>
|
||||
/// 系统接口日志记录
|
||||
/// </summary>
|
||||
[SugarTable("system_api_log_record")]
|
||||
[SugarTable("wcs_system_api_log_record")]
|
||||
public class SystemApiLogRecord
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -949,6 +949,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,
|
||||
@ -969,6 +975,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,
|
||||
@ -1344,6 +1356,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,
|
||||
|
@ -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;
|
||||
@ -15,7 +19,49 @@ namespace WCS.BLL.Manager
|
||||
public static void InitDb()
|
||||
{
|
||||
Logs.Write("【初始化数据库】开始", LogsType.StartBoot);
|
||||
//初始化数据库对象
|
||||
if (LocalFile.Config.IsMx)
|
||||
{
|
||||
DbHelp.db = new SqlSugarScope(new ConnectionConfig()
|
||||
{
|
||||
ConnectionString = LocalFile.Config.DataDbPath,
|
||||
DbType = DbType.SqlServer,//[Sqlite]安装[System.Data.SQLite];
|
||||
IsAutoCloseConnection = true
|
||||
}, db =>
|
||||
{
|
||||
db.Aop.OnError = ex =>
|
||||
{
|
||||
};
|
||||
});
|
||||
|
||||
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 =>
|
||||
{
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
DbHelp.db.DbMaintenance.CreateDatabase();
|
||||
DbHelp.dbLog.DbMaintenance.CreateDatabase();
|
||||
|
||||
DbHelp.db.CodeFirst.InitTables(typeof(ModuleInfo), typeof(ShelfInfo), typeof(StoreInfo)
|
||||
, typeof(InventoryDetail), typeof(OutOrder), typeof(OutOrderDetail), typeof(OutOrderMatDetail)
|
||||
@ -46,8 +92,25 @@ namespace WCS.BLL.Manager
|
||||
DbHelp.db.Insertable(outDocumentSerialNumber).ExecuteCommand();
|
||||
DbHelp.db.Insertable(stockTakingDocumentSerialNumber).ExecuteCommand();
|
||||
}
|
||||
//初始化货架类型
|
||||
if (!DbHelp.db.Queryable<ShelfTypeInfo>().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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
255
WCS.BLL/Manager/MXBackgroundThread.cs
Normal file
255
WCS.BLL/Manager/MXBackgroundThread.cs
Normal file
@ -0,0 +1,255 @@
|
||||
using SqlSugar;
|
||||
using WCS.BLL.Config;
|
||||
using WCS.BLL.DbModels;
|
||||
using WCS.BLL.Tool;
|
||||
using WCS.DAL;
|
||||
using WCS.DAL.Db;
|
||||
using WCS.DAL.Db.AuthDb;
|
||||
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<InOutRecord>()
|
||||
.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<ResponseCommon>(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<ResponseCommon>(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 定时任务:超时退出 出库、入库、盘点模式
|
||||
|
||||
#endregion
|
||||
|
||||
#region 定时任务:海康未扫物料码的物料更新数据
|
||||
Task.Run(() =>
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
//间隔20秒同步一次
|
||||
Thread.Sleep(20000);
|
||||
try
|
||||
{
|
||||
var inventoryDetails = DbHelp.db.Queryable<InventoryDetail>()
|
||||
.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<QueryBybarResponse>(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<InventoryDetail>()
|
||||
.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<SelectMaterialBarResponse>(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 定时任务:紧机复原和监测警示灯关灯机制
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送钉钉消息
|
||||
/// </summary>
|
||||
/// <param name="msg">发送的消息内容</param>
|
||||
/// <param name="errMsg">错误信息</param>
|
||||
/// <param name="idList">工号列表</param>
|
||||
/// <returns></returns>
|
||||
public static bool SendDingDingMsg(string msg, List<string> idList, ref string errMsg)
|
||||
{
|
||||
try
|
||||
{
|
||||
#region 获取所有工程研发人员
|
||||
var list = AuthDbHelp.db.Queryable<UserBase>().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<MXMesResponseCommon>(url, null, "GET");
|
||||
if (Result != null && Result.code != 200)
|
||||
{
|
||||
errMsg = Result.msg;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#endregion
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errMsg = "接口调用失败";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
@ -22,7 +23,10 @@ namespace WCS.BLL.Manager
|
||||
{
|
||||
Logs.Write("【InitShelves】开始", LogsType.StartBoot);
|
||||
|
||||
var shelvesInDb = DbHelp.db.Queryable<ShelfInfo>().ToList();
|
||||
var shelvesInDbQueryable = DbHelp.db.Queryable<ShelfInfo>();
|
||||
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));
|
||||
|
@ -139,7 +139,6 @@ namespace WCS.BLL.Manager
|
||||
public static void SolveLoss(WebSocketMessageModel warning)
|
||||
{
|
||||
#region 【后台】丢失的数据处理
|
||||
|
||||
try
|
||||
{
|
||||
//获取库位
|
||||
@ -164,6 +163,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 +179,29 @@ 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.出库自检丢失)
|
||||
{
|
||||
//清掉需要出库的缓存
|
||||
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);
|
||||
//TODO 如何保证丢失的继续进行
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
DbHelp.db.CommitTran();
|
||||
}
|
||||
|
@ -32,7 +32,13 @@ namespace WCS.BLL.Manager
|
||||
.UseAutoPong();//当收到ping报文时自动回应pong
|
||||
a.Add<WebSocketServicePlugin>();//自定义插件。
|
||||
}));
|
||||
|
||||
//客户端成功连接
|
||||
service.Connected = (client, e) =>
|
||||
{
|
||||
Logs.Write("[WebSocket]" + client.GetIPPort() + "成功连接!", LogsType.StartBoot);
|
||||
Console.WriteLine("[WebSocket]" + client.GetIPPort() +"成功连接!");
|
||||
return EasyTask.CompletedTask;
|
||||
};
|
||||
service.Start();
|
||||
Console.WriteLine("【启动WebSocket】结束");
|
||||
Logs.Write("【启动WebSocket】结束", LogsType.StartBoot);
|
||||
|
@ -15,5 +15,7 @@ namespace WCS.BLL.Services.IService
|
||||
public Task<PageQueryResponse<InventoryDetail>> exportMatInventoryDetail(GetMatInventoryDetailRequest request);
|
||||
|
||||
public Task<ResponseCommon<List<MatInventorySummaryModel>>> getMatInventorySummary(GetMatInventorySummaryRequest request);
|
||||
|
||||
public Task<PageQueryResponse<InventoryDetail>> compareMatInventoryDetail(CompareMatInventoryDetailRequest request);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
@ -180,7 +181,7 @@ namespace WCS.BLL.Services.Service
|
||||
materialSpec = data.materialSpec,
|
||||
batchNo = data.batchNo,
|
||||
supplier = "",
|
||||
customer = data.materialBar,
|
||||
customer = "",
|
||||
|
||||
InstoreUser = request.UserName
|
||||
};
|
||||
@ -207,6 +208,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<MatInfo>()
|
||||
{
|
||||
Code = 200,
|
||||
Data = matInfo,
|
||||
Message = "success"
|
||||
};
|
||||
}
|
||||
|
||||
return new ResponseCommon<MatInfo>()
|
||||
{
|
||||
Code = 201,
|
||||
|
@ -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;
|
||||
@ -149,5 +150,48 @@ namespace WCS.BLL.Services.Service
|
||||
Data = inventortyDetails
|
||||
};
|
||||
}
|
||||
|
||||
public async Task<PageQueryResponse<InventoryDetail>> compareMatInventoryDetail(CompareMatInventoryDetailRequest request)
|
||||
{
|
||||
try
|
||||
{
|
||||
//查询 本分组中 是否含有所传SN的物料
|
||||
var recordsQueryable = DbHelp.db.Queryable<InventoryDetail>()
|
||||
.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<InventoryDetail>()
|
||||
{
|
||||
Code = 200,
|
||||
Message = $"success",
|
||||
Data = new PageQueryResponseData<InventoryDetail>()
|
||||
{
|
||||
TotalCount = totalCount,
|
||||
Count = records.Count,
|
||||
Lists = records.ToList()
|
||||
}
|
||||
};
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new PageQueryResponse<InventoryDetail>()
|
||||
{
|
||||
Code = 200,
|
||||
Message = $"success",
|
||||
Data = new PageQueryResponseData<InventoryDetail>()
|
||||
{
|
||||
Lists = new List<InventoryDetail>()
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using SqlSugar;
|
||||
using Microsoft.Data.SqlClient;
|
||||
using SqlSugar;
|
||||
using WCS.BLL.Config;
|
||||
using WCS.BLL.DbModels;
|
||||
using WCS.BLL.Manager;
|
||||
@ -154,103 +155,262 @@ namespace WCS.BLL.Services.Service
|
||||
Message = "出库单据同步失败:缺少物料明细!"
|
||||
};
|
||||
}
|
||||
//库存有无校验 & 库存已锁校验
|
||||
try
|
||||
//标准版逻辑-库存有无校验 & 库存已锁校验
|
||||
if (!LocalFile.Config.IsMx)
|
||||
{
|
||||
await DbHelp.db.BeginTranAsync();
|
||||
var inventoryDetails = await DbHelp.db.Queryable<InventoryDetail>()
|
||||
.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<InventoryDetail>()
|
||||
.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<InventoryDetail>()
|
||||
.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<OutOrder>()
|
||||
.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<OutOrder>().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<OutOrderMatDetail>()
|
||||
.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<OutOrderMatDetail>()
|
||||
.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
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -887,7 +1047,7 @@ namespace WCS.BLL.Services.Service
|
||||
t.GoOutOutstore();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
return new ResponseCommon()
|
||||
{
|
||||
|
@ -941,6 +941,12 @@ namespace WCS.BLL.Services.Service
|
||||
StoreCode = inventoryDetail.StoreCode,
|
||||
StoreId = inventoryDetail.StoreId,
|
||||
|
||||
R = inventoryDetail.R,
|
||||
C = inventoryDetail.C,
|
||||
Wei = inventoryDetail.Wei,
|
||||
BigShelfCode = inventoryDetail.BigShelfCode,
|
||||
GroupName = inventoryDetail.GroupName,
|
||||
|
||||
MatSN = inventoryDetail.MatSN,
|
||||
MatCode = inventoryDetail.MatCode,
|
||||
MatName = inventoryDetail.MatName,
|
||||
|
@ -5,7 +5,9 @@ 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.Manager;
|
||||
using WCS.BLL.Services.IService;
|
||||
using WCS.DAL;
|
||||
using WCS.DAL.Db;
|
||||
@ -107,7 +109,7 @@ namespace WCS.BLL.Services.Service
|
||||
shelfnfo.ClientIp = request.ShelfInfo.ClientIp;
|
||||
shelfnfo.GroupName = request.ShelfInfo.GroupName;
|
||||
shelfnfo.IsBind = request.ShelfInfo.IsBind;
|
||||
shelfnfo.BindShelfCode = request.ShelfInfo.BindShelfCode;
|
||||
shelfnfo.BigShelfCode = request.ShelfInfo.BigShelfCode;
|
||||
|
||||
var rowNum = await DbHelp.db.Updateable(shelfnfo).ExecuteCommandAsync();
|
||||
if (rowNum == 0)
|
||||
@ -154,7 +156,7 @@ namespace WCS.BLL.Services.Service
|
||||
ClientIp = request.ShelfInfo.ClientIp,
|
||||
GroupName = request.ShelfInfo.GroupName,
|
||||
IsBind = request.ShelfInfo.IsBind,
|
||||
BindShelfCode = request.ShelfInfo.BindShelfCode,
|
||||
BigShelfCode = request.ShelfInfo.BigShelfCode,
|
||||
};
|
||||
var rowNum = await DbHelp.db.Insertable(newShelfInfo).ExecuteCommandAsync();
|
||||
if (rowNum == 0)
|
||||
@ -243,29 +245,36 @@ namespace WCS.BLL.Services.Service
|
||||
/// <returns></returns>
|
||||
public async Task<ResponseCommon<object>> GenerateStoreInfo()
|
||||
{
|
||||
var shelfInfo = await DbHelp.db.Queryable<ShelfInfo>().Where(t => t.ShelfCode == "C04-1").FirstAsync();
|
||||
var ModuleInfos = await DbHelp.db.Queryable<ModuleInfo>().Where(t => t.ShelfId == shelfInfo.Id).ToListAsync();
|
||||
ModuleInfos.ForEach(moduleInfo =>
|
||||
var shelfInfos = DbHelp.db.Queryable<ShelfInfo>().ToList();
|
||||
foreach (var shelfInfo in shelfInfos)
|
||||
{
|
||||
for (int i = 1; i <= moduleInfo.LightCount; i++)
|
||||
var ModuleInfos = await DbHelp.db.Queryable<ModuleInfo>().Where(t => t.ShelfId == shelfInfo.Id).ToListAsync();
|
||||
ModuleInfos.ForEach(moduleInfo =>
|
||||
{
|
||||
var storeInfo = new StoreInfo()
|
||||
for (int i = 1; i <= moduleInfo.LightCount; i++)
|
||||
{
|
||||
StoreCode = moduleInfo.ModuleCode + "-" + i.ToString(),
|
||||
ModuleId = moduleInfo.Id,
|
||||
ModuleCode = moduleInfo.ModuleCode,
|
||||
ShelfId = shelfInfo.Id,
|
||||
ShelfCode = shelfInfo.ShelfCode,
|
||||
BoardId = moduleInfo.BoardId,
|
||||
LightNumber = i,
|
||||
Priority = 1,
|
||||
CurrentMatSn = string.Empty,
|
||||
};
|
||||
DbHelp.db.Insertable(storeInfo).ExecuteCommand();
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
var storeInfo = new StoreInfo()
|
||||
{
|
||||
StoreCode = moduleInfo.ModuleCode + "-" + i.ToString(),
|
||||
ShelfTypeId = 1,
|
||||
ModuleId = moduleInfo.Id,
|
||||
ModuleCode = moduleInfo.ModuleCode,
|
||||
ShelfId = shelfInfo.Id,
|
||||
ShelfCode = shelfInfo.ShelfCode,
|
||||
BoardId = moduleInfo.BoardId,
|
||||
LightNumber = i,
|
||||
Priority = 1,
|
||||
CurrentMatSn = string.Empty,
|
||||
BigShelfCode = moduleInfo.Bigshelfcode,
|
||||
R = moduleInfo.R,
|
||||
C = moduleInfo.C,
|
||||
Wei = i.ToString(),
|
||||
GroupName = moduleInfo.GroupName,
|
||||
};
|
||||
DbHelp.db.Insertable(storeInfo).ExecuteCommand();
|
||||
}
|
||||
});
|
||||
}
|
||||
return new ResponseCommon<object>() { Message = "111" };
|
||||
}
|
||||
|
||||
@ -333,11 +342,16 @@ namespace WCS.BLL.Services.Service
|
||||
try
|
||||
{
|
||||
DbHelp.db.BeginTran();
|
||||
//禁用需要删除当前库存数据
|
||||
//禁用
|
||||
if (request.DisableOrEnable == DisableOrEnableEnum.Disable)
|
||||
{
|
||||
moduleInfo.IsEnable = false;
|
||||
|
||||
//盟讯公司发送钉钉消息
|
||||
if (LocalFile.Config.IsMx)
|
||||
{
|
||||
var DingDing = string.Empty;
|
||||
MXBackgroundThread.SendDingDingMsg($"【智能货架】模组{moduleInfo.ModuleCode}被屏蔽", new List<string> { "104379", "103595" }, ref DingDing);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -444,6 +458,12 @@ namespace WCS.BLL.Services.Service
|
||||
StoreId = storeInfo.Id,
|
||||
StoreInfo = storeInfo,
|
||||
|
||||
R = storeInfo.R,
|
||||
C = storeInfo.C,
|
||||
Wei = storeInfo.Wei,
|
||||
BigShelfCode = storeInfo.BigShelfCode,
|
||||
GroupName = storeInfo.GroupName,
|
||||
|
||||
MatSN = inventory.MatSN,
|
||||
MatCode = inventory.MatCode,
|
||||
MatName = inventory.MatName,
|
||||
|
@ -26,6 +26,7 @@ namespace WCS.BLL.Services.Service
|
||||
.FirstOrDefault();
|
||||
if (warning != null)
|
||||
{
|
||||
warning.SolvedUser = request.UserName;
|
||||
WarningManager.ClearWarning(warning, request.SolveType);
|
||||
}
|
||||
//判断一下是否还存在对应报警
|
||||
|
@ -274,7 +274,7 @@ namespace WCS.BLL.Tool
|
||||
public static T GetDataFromHttp<T>(string url, object dataObj, string httpMethod, bool isSaveLog = false)
|
||||
{
|
||||
Guid guid = Guid.NewGuid();
|
||||
var data = JsonConvert.SerializeObject(dataObj);
|
||||
var data = dataObj == null ? string.Empty : JsonConvert.SerializeObject(dataObj);
|
||||
try
|
||||
{
|
||||
if (isSaveLog)
|
||||
|
Reference in New Issue
Block a user