修改一些BUG

This commit is contained in:
2026-03-11 14:23:30 +08:00
parent 0564b8c1f3
commit a499f24350
7 changed files with 5738 additions and 43 deletions

View File

@@ -13,6 +13,7 @@ using System.Linq;
using System.Text;
using WebUI.Model;
using System.Security.Cryptography;
using NLog;
namespace WebUI.Controllers
{
@@ -87,7 +88,7 @@ namespace WebUI.Controllers
/// <returns></returns>
[HttpPost]
[Route("OTApi/SyncData")]
public IActionResult SyncData(string Pwd, int stepid=0)
public IActionResult SyncData(string Pwd, int stepid = 0)
{
if (Pwd == "fs%sd")
{
@@ -110,7 +111,7 @@ namespace WebUI.Controllers
Status = false
});
}
}
else
return Json(new
@@ -281,10 +282,10 @@ namespace WebUI.Controllers
#region
[HttpPost]
[Route("OTApi/GainFiles")]
public IActionResult GainFile1s(int RoomTypeid,int DataType)
public IActionResult GainFile1s(int RoomTypeid, int DataType)
{
FTPOperation operation = new FTPOperation();
HexFile hexFile = new HexFile();
@@ -295,8 +296,8 @@ namespace WebUI.Controllers
//状态
bool Status = false;
//最后获取的文件
List<string> FileName = new List<string> ();
List<string> FileName = new List<string>();
//错误信息
string MrrMsg = null;
//机型
@@ -308,7 +309,7 @@ namespace WebUI.Controllers
//房型名称
string RoomTypeName = "";
//项目id
int hotelId=0;
int hotelId = 0;
//项目名称
string hotelName = "";
//文件数量
@@ -366,15 +367,17 @@ namespace WebUI.Controllers
if (selectdata.CONFIG_BIN != null)
{
//校验MD5
if (MD5Verify.getMD5Hash(operation.BytesToStream(operation.GetFile("Config/" + selectdata.HOTEL_GROUP_NAME + @"/" + selectdata.PROJECT_NUMBER + "-" + selectdata.HOTEL_NAME_CN + @"/" + selectdata.CONFIG_BIN))) == selectdata.CONFIG_BIN_MD5)
var NNN = "Config/" + selectdata.HOTEL_GROUP_NAME + @"/" + selectdata.PROJECT_NUMBER + "-" + selectdata.HOTEL_NAME_CN + @"/" + selectdata.CONFIG_BIN;
logger.Error("开始校验配置文件MD5文件路径" + NNN);
if (MD5Verify.getMD5Hash(operation.BytesToStream(operation.GetFile(NNN))) == selectdata.CONFIG_BIN_MD5)
{
var sety = operation.GetFile("Config/" + selectdata.HOTEL_GROUP_NAME + @"/" + selectdata.PROJECT_NUMBER + "-" + selectdata.HOTEL_NAME_CN + @"/" + selectdata.CONFIG_BIN);
var btys= operation.ByteArrayToHexStr(sety);
var ssety= HexFile.Crc16(sety,4, sety.Length);
byte[] suz= new byte[10000];
var ssety2 = HexFile.NetCRC16_Data(sety, sety.Length, 4);
var btys = operation.ByteArrayToHexStr(sety);
var ssety = HexFile.Crc16(sety, 4, sety.Length);
byte[] suz = new byte[10000];
var ssety2 = HexFile.NetCRC16_Data(sety, sety.Length, 4);
HexFile.StrToHex(suz ,sety, 100);
HexFile.StrToHex(suz, sety, 100);
//找到文件头
if ((sety[0] == 0xCC) && (sety[1] == 0xC0))
@@ -404,8 +407,8 @@ namespace WebUI.Controllers
var zunsons = vaslen.Skip(157).Take(64).ToArray();
var seyu = operation.ByteArrayToHexStr(zunsons);
var setysssy = operation.UnHexs(seyu);
setysssy = setysssy.Replace("\0",null);
setysssy = setysssy.Replace("_","-");
setysssy = setysssy.Replace("\0", null);
setysssy = setysssy.Replace("_", "-");
ModelName = setysssy;
data = Convert.ToBase64String(sety);
FileName.Add(selectdata.CONFIG_BIN);
@@ -728,7 +731,7 @@ namespace WebUI.Controllers
eqlog.Succeed = Status;
foreach (var item in FileName)
{
sum +=item+"/";
sum += item + "/";
}
eqlog.Content = "房间类型id是:" + RoomTypeid + ",升级类型是:" + DataType + ",luncher版本是:" + LuncherVer + ",升级文件名:" + sum + ",机型是:" + ModelName;
_db.TBL_EQUIPMENTISSUELOGs.AddRange(eqlog);
@@ -762,16 +765,17 @@ namespace WebUI.Controllers
//}
}
catch (Exception ex)
catch (Exception ex)
{
logger.Error(ex.Message);
logger.Error(ex.StackTrace);
return Json(new
{
RoomTypeid,
RoomTypeName,
hotelId,
hotelName,
Status =false,
Status = false,
ModelName,
//FileName,
FileCount,
@@ -795,6 +799,7 @@ namespace WebUI.Controllers
});
}
public static Logger logger = LogManager.GetCurrentClassLogger();
/// <summary>
/// 获取文件名
/// </summary>
@@ -803,7 +808,7 @@ namespace WebUI.Controllers
/// <returns></returns>
[HttpPost]
[Route("OTApi/GainFileName")]
public IActionResult GainFileName(int RoomTypeid,int DataType)
public IActionResult GainFileName(int RoomTypeid, int DataType)
{
FTPOperation operation = new FTPOperation();
HexFile hexFile = new HexFile();
@@ -814,8 +819,8 @@ namespace WebUI.Controllers
//状态
bool Status = false;
//最后获取的文件
List<string> FileName = new List<string> ();
List<string> FileName = new List<string>();
//错误信息
string MrrMsg = null;
//机型
@@ -827,7 +832,7 @@ namespace WebUI.Controllers
//房型名称
string RoomTypeName = "";
//项目id
int hotelId=0;
int hotelId = 0;
//项目名称
string hotelName = "";
//文件数量
@@ -888,12 +893,12 @@ namespace WebUI.Controllers
if (MD5Verify.getMD5Hash(operation.BytesToStream(operation.GetFile("Config/" + selectdata.HOTEL_GROUP_NAME + @"/" + selectdata.PROJECT_NUMBER + "-" + selectdata.HOTEL_NAME_CN + @"/" + selectdata.CONFIG_BIN))) == selectdata.CONFIG_BIN_MD5)
{
var sety = operation.GetFile("Config/" + selectdata.HOTEL_GROUP_NAME + @"/" + selectdata.PROJECT_NUMBER + "-" + selectdata.HOTEL_NAME_CN + @"/" + selectdata.CONFIG_BIN);
var btys= operation.ByteArrayToHexStr(sety);
var ssety= HexFile.Crc16(sety,4, sety.Length);
byte[] suz= new byte[10000];
var ssety2 = HexFile.NetCRC16_Data(sety, sety.Length, 4);
var btys = operation.ByteArrayToHexStr(sety);
var ssety = HexFile.Crc16(sety, 4, sety.Length);
byte[] suz = new byte[10000];
var ssety2 = HexFile.NetCRC16_Data(sety, sety.Length, 4);
HexFile.StrToHex(suz ,sety, 100);
HexFile.StrToHex(suz, sety, 100);
//找到文件头
if ((sety[0] == 0xCC) && (sety[1] == 0xC0))
@@ -923,8 +928,8 @@ namespace WebUI.Controllers
var zunsons = vaslen.Skip(157).Take(64).ToArray();
var seyu = operation.ByteArrayToHexStr(zunsons);
var setysssy = operation.UnHexs(seyu);
setysssy = setysssy.Replace("\0",null);
setysssy = setysssy.Replace("_","-");
setysssy = setysssy.Replace("\0", null);
setysssy = setysssy.Replace("_", "-");
ModelName = setysssy;
//data = Convert.ToBase64String(sety);
FileName.Add(selectdata.CONFIG_BIN);
@@ -1237,7 +1242,7 @@ namespace WebUI.Controllers
eqlog.Succeed = Status;
foreach (var item in FileName)
{
sum +=item+"/";
sum += item + "/";
}
eqlog.Content = "房间类型id是:" + RoomTypeid + ",升级类型是:" + DataType + ",luncher版本是:" + LuncherVer + ",升级文件名:" + sum + ",机型是:" + ModelName;
_db.TBL_EQUIPMENTISSUELOGs.AddRange(eqlog);
@@ -1261,16 +1266,16 @@ namespace WebUI.Controllers
}
}
catch (Exception ex)
catch (Exception ex)
{
return Json(new
{
RoomTypeid,
RoomTypeName,
hotelId,
hotelName,
Status =false,
Status = false,
ModelName,
FileCount,
datalist,
@@ -1307,7 +1312,7 @@ namespace WebUI.Controllers
var result = new StringBuilder(32);
for (int i = 0; i < lstHash.Length; i++)
{
result.Append(lstHash[i].ToString("x2").ToUpper());
result.Append(lstHash[i].ToString("x2").ToUpper());
}
return result.ToString();
}
@@ -1583,16 +1588,17 @@ namespace WebUI.Controllers
[HttpPost]
[Route("OTApi/RoomChange")]
public IActionResult RoomChange(string projectCode,string roomNumber,string roomLayout,string projectName)
public IActionResult RoomChange(string projectCode, string roomNumber, string roomLayout, string projectName)
{
var db = new DbHelperSQL(DbHelperSQL.DBSel.BLV_RCU_DB);
if (!string.IsNullOrEmpty(projectCode)&& !string.IsNullOrEmpty(roomNumber)&& !string.IsNullOrEmpty(roomLayout)&&!string.IsNullOrEmpty(projectName))
if (!string.IsNullOrEmpty(projectCode) && !string.IsNullOrEmpty(roomNumber) && !string.IsNullOrEmpty(roomLayout) && !string.IsNullOrEmpty(projectName))
{
var selectdata = (
from a in _db.TBL_HOTEL_BASIC_INFOS where a.HOTEL_NAME_CN == projectName
from a in _db.TBL_HOTEL_BASIC_INFOS
where a.HOTEL_NAME_CN == projectName
select new
{
a.HOTEL_ID
a.HOTEL_ID
}).FirstOrDefault();
var roomdata = (
from a in _db.TBL_ROOM_TYPE_LISTS
@@ -1615,8 +1621,8 @@ namespace WebUI.Controllers
{
return Json(new
{
retmsg="参数不可为空",
retcode="404"
retmsg = "参数不可为空",
retcode = "404"
});
}
return Json("");

5317
WebUI/NLog.xsd Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>D:\fb</_PublishTargetUrl>
<History>True|2025-06-21T09:52:05.3312975Z||;True|2025-06-21T16:43:56.1227037+08:00||;True|2023-09-22T14:50:21.6808369+08:00||;True|2023-09-22T14:49:24.8627239+08:00||;True|2023-09-22T14:34:33.4006499+08:00||;True|2023-09-22T12:00:40.3343199+08:00||;True|2023-09-22T11:41:16.0270994+08:00||;True|2023-09-21T16:17:57.6106908+08:00||;True|2022-11-09T13:38:52.2600692+08:00||;True|2022-11-04T18:08:15.3464350+08:00||;True|2022-09-02T11:52:51.6838354+08:00||;True|2022-08-26T15:14:03.1654649+08:00||;True|2022-08-25T15:27:04.1982767+08:00||;True|2022-08-24T17:50:37.3706175+08:00||;True|2022-08-24T17:16:24.7353563+08:00||;True|2022-08-22T14:12:08.9426677+08:00||;True|2022-08-19T10:29:29.4848915+08:00||;True|2022-08-19T10:24:37.3114106+08:00||;True|2022-08-19T09:55:19.1414504+08:00||;True|2022-08-19T09:40:59.9958103+08:00||;True|2022-08-19T09:33:37.6904208+08:00||;True|2022-08-19T09:28:36.3093517+08:00||;True|2022-08-19T09:22:06.8115880+08:00||;True|2022-08-19T09:13:37.9585905+08:00||;True|2022-08-17T15:10:05.3411660+08:00||;False|2022-08-17T15:08:06.4809616+08:00||;True|2022-06-01T19:33:05.4481344+08:00||;True|2022-05-25T14:24:10.1817614+08:00||;True|2022-05-25T09:23:06.2835677+08:00||;True|2022-05-25T09:02:15.3730215+08:00||;True|2022-05-24T21:19:00.5074933+08:00||;True|2022-05-13T17:54:16.9766250+08:00||;True|2022-05-12T17:59:35.6658572+08:00||;True|2022-05-12T17:45:56.8037279+08:00||;True|2022-05-11T18:02:44.6830705+08:00||;True|2022-05-11T15:11:44.2123306+08:00||;True|2022-05-10T10:14:03.1340627+08:00||;True|2022-05-09T18:11:38.7936836+08:00||;False|2022-05-09T18:09:23.9786371+08:00||;False|2022-05-09T18:09:11.8760404+08:00||;False|2022-05-09T18:07:17.4893920+08:00||;False|2022-05-09T18:06:24.0063875+08:00||;False|2022-05-09T18:05:19.0501822+08:00||;True|2022-05-09T10:32:23.0075871+08:00||;True|2022-05-06T17:57:46.6102126+08:00||;True|2022-05-05T19:26:02.1665879+08:00||;True|2022-05-05T18:35:49.6113434+08:00||;True|2022-05-05T18:23:09.7528455+08:00||;True|2022-05-03T18:16:55.2075231+08:00||;True|2022-05-03T17:38:58.8338071+08:00||;True|2022-04-26T13:55:48.6376957+08:00||;True|2022-04-26T09:08:43.8393049+08:00||;True|2022-04-23T10:24:41.7805502+08:00||;True|2022-04-23T09:59:02.7983739+08:00||;True|2022-04-23T09:46:47.0183590+08:00||;True|2022-04-23T09:21:57.0873811+08:00||;True|2022-04-21T20:01:57.5291853+08:00||;True|2022-04-21T19:17:57.1270857+08:00||;True|2022-04-21T19:15:38.6532410+08:00||;True|2022-04-21T19:13:59.1467307+08:00||;True|2022-04-21T19:08:19.2196334+08:00||;True|2022-04-21T18:21:58.1340503+08:00||;True|2022-04-21T18:01:33.3247434+08:00||;True|2022-04-21T17:52:25.1456343+08:00||;True|2022-04-21T10:05:58.9005370+08:00||;True|2022-04-20T20:00:05.8521460+08:00||;True|2022-04-11T16:08:04.2469358+08:00||;True|2022-04-07T15:22:53.5415688+08:00||;True|2022-04-06T09:41:40.8698606+08:00||;True|2022-04-02T10:36:16.9912313+08:00||;True|2022-03-29T16:13:23.9031232+08:00||;True|2022-03-29T16:08:28.6250221+08:00||;True|2022-03-29T14:58:43.5548350+08:00||;True|2022-03-29T14:46:07.0032400+08:00||;True|2022-03-29T10:45:41.4892896+08:00||;True|2022-03-28T18:04:53.4880071+08:00||;True|2022-03-16T17:45:58.4167087+08:00||;</History>
<History>True|2026-01-28T08:21:24.3919331Z||;True|2026-01-28T16:17:34.0814293+08:00||;True|2026-01-28T16:07:34.3703823+08:00||;True|2025-06-21T17:52:05.3312975+08:00||;True|2025-06-21T16:43:56.1227037+08:00||;True|2023-09-22T14:50:21.6808369+08:00||;True|2023-09-22T14:49:24.8627239+08:00||;True|2023-09-22T14:34:33.4006499+08:00||;True|2023-09-22T12:00:40.3343199+08:00||;True|2023-09-22T11:41:16.0270994+08:00||;True|2023-09-21T16:17:57.6106908+08:00||;True|2022-11-09T13:38:52.2600692+08:00||;True|2022-11-04T18:08:15.3464350+08:00||;True|2022-09-02T11:52:51.6838354+08:00||;True|2022-08-26T15:14:03.1654649+08:00||;True|2022-08-25T15:27:04.1982767+08:00||;True|2022-08-24T17:50:37.3706175+08:00||;True|2022-08-24T17:16:24.7353563+08:00||;True|2022-08-22T14:12:08.9426677+08:00||;True|2022-08-19T10:29:29.4848915+08:00||;True|2022-08-19T10:24:37.3114106+08:00||;True|2022-08-19T09:55:19.1414504+08:00||;True|2022-08-19T09:40:59.9958103+08:00||;True|2022-08-19T09:33:37.6904208+08:00||;True|2022-08-19T09:28:36.3093517+08:00||;True|2022-08-19T09:22:06.8115880+08:00||;True|2022-08-19T09:13:37.9585905+08:00||;True|2022-08-17T15:10:05.3411660+08:00||;False|2022-08-17T15:08:06.4809616+08:00||;True|2022-06-01T19:33:05.4481344+08:00||;True|2022-05-25T14:24:10.1817614+08:00||;True|2022-05-25T09:23:06.2835677+08:00||;True|2022-05-25T09:02:15.3730215+08:00||;True|2022-05-24T21:19:00.5074933+08:00||;True|2022-05-13T17:54:16.9766250+08:00||;True|2022-05-12T17:59:35.6658572+08:00||;True|2022-05-12T17:45:56.8037279+08:00||;True|2022-05-11T18:02:44.6830705+08:00||;True|2022-05-11T15:11:44.2123306+08:00||;True|2022-05-10T10:14:03.1340627+08:00||;True|2022-05-09T18:11:38.7936836+08:00||;False|2022-05-09T18:09:23.9786371+08:00||;False|2022-05-09T18:09:11.8760404+08:00||;False|2022-05-09T18:07:17.4893920+08:00||;False|2022-05-09T18:06:24.0063875+08:00||;False|2022-05-09T18:05:19.0501822+08:00||;True|2022-05-09T10:32:23.0075871+08:00||;True|2022-05-06T17:57:46.6102126+08:00||;True|2022-05-05T19:26:02.1665879+08:00||;True|2022-05-05T18:35:49.6113434+08:00||;True|2022-05-05T18:23:09.7528455+08:00||;True|2022-05-03T18:16:55.2075231+08:00||;True|2022-05-03T17:38:58.8338071+08:00||;True|2022-04-26T13:55:48.6376957+08:00||;True|2022-04-26T09:08:43.8393049+08:00||;True|2022-04-23T10:24:41.7805502+08:00||;True|2022-04-23T09:59:02.7983739+08:00||;True|2022-04-23T09:46:47.0183590+08:00||;True|2022-04-23T09:21:57.0873811+08:00||;True|2022-04-21T20:01:57.5291853+08:00||;True|2022-04-21T19:17:57.1270857+08:00||;True|2022-04-21T19:15:38.6532410+08:00||;True|2022-04-21T19:13:59.1467307+08:00||;True|2022-04-21T19:08:19.2196334+08:00||;True|2022-04-21T18:21:58.1340503+08:00||;True|2022-04-21T18:01:33.3247434+08:00||;True|2022-04-21T17:52:25.1456343+08:00||;True|2022-04-21T10:05:58.9005370+08:00||;True|2022-04-20T20:00:05.8521460+08:00||;True|2022-04-11T16:08:04.2469358+08:00||;True|2022-04-07T15:22:53.5415688+08:00||;True|2022-04-06T09:41:40.8698606+08:00||;True|2022-04-02T10:36:16.9912313+08:00||;True|2022-03-29T16:13:23.9031232+08:00||;True|2022-03-29T16:08:28.6250221+08:00||;True|2022-03-29T14:58:43.5548350+08:00||;True|2022-03-29T14:46:07.0032400+08:00||;True|2022-03-29T10:45:41.4892896+08:00||;True|2022-03-28T18:04:53.4880071+08:00||;True|2022-03-16T17:45:58.4167087+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@@ -43,6 +43,8 @@
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
<PackageReference Include="NLog" Version="6.0.7" />
<PackageReference Include="NLog.Schema" Version="6.0.7" />
<PackageReference Include="Quartz" Version="3.4.0" />
<PackageReference Include="UtilsSharp" Version="2.5.0" />
</ItemGroup>

View File

@@ -4,7 +4,7 @@
<View_SelectedScaffolderID>RazorViewEmptyScaffolder</View_SelectedScaffolderID>
<View_SelectedScaffolderCategoryPath>root/Common/MVC/View</View_SelectedScaffolderCategoryPath>
<ActiveDebugProfile>WebUI</ActiveDebugProfile>
<NameOfLastUsedPublishProfile>E:\Project\HotelServices\WebUI\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
<NameOfLastUsedPublishProfile>E:\tian\chongxin\NewGit\Web_HotelServices_Prod\WebUI\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
<Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
<WebStackScaffolding_ViewDialogWidth>650</WebStackScaffolding_ViewDialogWidth>

35
WebUI/nlog.config Normal file
View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- enable asp.net core layout renderers -->
<targets>
<!--项目日志保存文件路径说明fileName="${basedir}/保存目录,以年月日的格式创建/${shortdate}/${记录器名称}-${单级记录}-${shortdate}.txt"-->
<target name="info_file" xsi:type="File"
fileName="${basedir}/Logs/${shortdate}/info_${shortdate}.txt"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString} ${newline} ${stacktrace} ${newline}"
archiveFileName="${basedir}/archives/info_${shortdate}-{#####}.txt"
archiveAboveSize="102400"
archiveNumbering="Sequence"
concurrentWrites="true"
keepFileOpen="false" />
<target name="error_file" xsi:type="File"
fileName="${basedir}/Logs/${shortdate}/error_${shortdate}.txt"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString} ${newline} ${stacktrace} ${newline}"
archiveFileName="${basedir}/archives/error_${shortdate}-{#####}.txt"
archiveAboveSize="102400"
archiveNumbering="Sequence"
concurrentWrites="true"
keepFileOpen="false" />
</targets>
<!--规则配置,final - 最终规则匹配后不处理任何规则-->
<!--规则配置,final - 最终规则匹配后不处理任何规则-->
<!--定义使用哪个target输出-->
<rules>
<!-- 优先级从高到低依次为OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL -->
<!-- 将所有日志输出到文件 -->
<logger name="*" minlevel="FATAL" maxlevel="FATAL" writeTo="info_file" />
<logger name="*" minlevel="Error" writeTo="error_file" />
</rules>
</nlog>

335
项目分析报告.md Normal file
View File

@@ -0,0 +1,335 @@
# 酒店服务管理系统项目分析报告
## 1. 项目概览
### 1.1 项目简介
本项目是一个基于 .NET 5.0 开发的酒店服务管理系统主要用于酒店客房控制单元RCU的集中管理、监控和配置。系统提供了完整的酒店设备管理、数据监控、固件升级等功能支持多酒店集团的统一管理。
### 1.2 主要功能
- RCU设备管理和状态监控
- 酒店和房间信息管理
- 固件和配置文件下发
- 实时数据统计和图表分析
- UDP通信日志管理
- 系统状态监控和服务管理
### 1.3 技术栈
| 类别 | 技术/框架 | 版本 |
|------|----------|------|
| 后端 | .NET Core | 5.0 |
| 前端 | ASP.NET Core MVC | 5.0 |
| 前端 | jQuery, Bootstrap | - |
| 前端 | AdminLTE | - |
| 数据库 | SQL Server | - |
| 缓存 | Redis | - |
| 日志 | log4net | - |
| 日志 | Aliyun Api LogService | - |
| 任务调度 | Quartz | 3.4.0 |
| 认证 | JWT | 5.0.15 |
## 2. 项目结构
### 2.1 目录结构
```
Web_HotelServices_Prod/
├── Aliyun.Api.LogService/ # 阿里云日志服务SDK
├── COMMON/ # 通用工具类库
├── DB_Server/ # 数据库操作类库
├── Models/ # 数据模型
├── SERVER/ # 核心服务逻辑
├── ServerHelp/ # 服务辅助工具
├── TcpServer/ # TCP服务器
├── WebUI/ # Web前端和API
├── .gitignore
├── HotelServices.sln
├── README.md
└── 项目分析报告.md
```
### 2.2 核心模块说明
#### 2.2.1 SERVER模块
- **RCUServer.cs**RCU设备管理核心逻辑负责设备状态查询和管理
- **Send_Cmd.cs**命令下发模块用于向RCU设备发送控制命令
- **SYNC_DATA.cs**:数据同步模块
- **CacheData.cs**:缓存数据管理
- **ModelFile.cs**:模型文件管理
#### 2.2.2 WebUI模块
- **Controllers/**API控制器处理前端请求
- **Views/**MVC视图文件
- **wwwroot/**:静态资源文件
- **Startup.cs**:应用启动配置
#### 2.2.3 Models模块
- **Models/**:数据实体模型
- **Data/**:数据库初始化
#### 2.2.4 COMMON模块
- **XC_Redis.cs**Redis缓存操作
- **LogHelp.cs**:日志帮助类
- **ASLS.cs**:阿里云日志服务操作
## 3. 技术架构
### 3.1 系统架构
```mermaid
flowchart TD
subgraph 前端层
A[Web浏览器] -->|HTTP请求| B[ASP.NET Core MVC]
B -->|返回视图| A
end
subgraph 应用层
B -->|调用| C[API控制器]
C -->|业务逻辑| D[核心服务模块]
D -->|数据操作| E[数据访问层]
end
subgraph 数据层
E -->|读写| F[SQL Server]
E -->|缓存| G[Redis]
D -->|日志| H[阿里云日志服务]
end
subgraph 服务层
I[TCP服务器] -->|数据| D
J[定时任务] -->|触发| D
end
```
### 3.2 核心流程图
#### RCU设备状态查询流程
```mermaid
sequenceDiagram
participant Client as 前端
participant API as ApiController
participant RcuServer as RcuServer
participant DB as 数据库
participant Redis as Redis缓存
Client->>API: 请求RCU设备列表
API->>RcuServer: 调用SetRucServer方法
RcuServer->>DB: 查询在线RCU设备
RcuServer->>DB: 关联查询房间和酒店信息
RcuServer->>Redis: 获取缓存数据
RcuServer-->>API: 返回设备列表
API-->>Client: 响应JSON数据
```
#### 固件下发流程
```mermaid
sequenceDiagram
participant Client as 前端
participant API as ApiController
participant SendCmd as Send_Cmd
participant Redis as Redis缓存
participant RCU as RCU设备
Client->>API: 发送固件升级请求
API->>Redis: 清除旧的缓存状态
API->>SendCmd: 调用Send_File方法
SendCmd->>RCU: 下发固件文件
SendCmd->>Redis: 更新进度状态
Client->>API: 查询升级进度
API->>Redis: 获取进度数据
API-->>Client: 返回进度信息
```
## 4. 核心功能模块
### 4.1 RCU设备管理
- **设备状态监控**实时监控RCU设备的在线状态
- **设备信息管理**管理RCU设备的基本信息、配置和固件版本
- **设备分组**:支持按酒店、房间类型等维度分组管理
### 4.2 酒店和房间管理
- **酒店集团管理**:支持多酒店集团的层级管理
- **房间信息管理**:管理房间基本信息、类型和状态
- **房间与RCU关联**建立房间与RCU设备的对应关系
### 4.3 固件和配置管理
- **固件文件管理**:上传、删除和管理固件文件
- **配置文件管理**:管理设备配置文件
- **远程升级**支持远程下发固件和配置到RCU设备
- **升级进度监控**:实时监控升级进度
### 4.4 数据统计和分析
- **通信数据统计**统计UDP通信包数量和字节流量
- **设备状态分析**:分析设备在线率和运行状态
- **图表可视化**通过ECharts展示各类统计数据
- **历史数据分析**:分析历史数据趋势
### 4.5 系统监控和管理
- **服务状态监控**:监控系统各服务的运行状态
- **日志管理**:收集和管理系统日志
- **定时任务**通过Quartz实现定时任务调度
- **系统配置**:管理系统基本配置
## 5. API设计
### 5.1 主要API端点
#### 5.1.1 设备管理API
- **GetRCU**获取RCU设备列表支持分页和筛选
- **SendCmd**下发固件或配置到RCU设备
- **Send_Schedule**:查询固件下发进度
#### 5.1.2 酒店管理API
- **HOTELINFO**:获取酒店信息列表
- **ROOMINFO**:获取房间信息列表
- **Sel**:切换当前管理的酒店
#### 5.1.3 文件管理API
- **SelModelFile**:获取模型文件列表
- **AddModelFile**:上传模型文件
- **DelModelFile**:删除模型文件
#### 5.1.4 数据统计API
- **GetCHARTS**:获取通信数据统计图表
- **GetErrorSucess**:获取错误和成功统计
- **GetProt**:获取端口数据使用情况
- **GetPROCESSINGTIME**:获取处理耗时统计
#### 5.1.5 系统管理API
- **Token**:刷新令牌并返回服务状态
- **Changerserver**:更改服务状态
### 5.2 API设计特点
- **基于MVC控制器**使用ASP.NET Core MVC控制器处理请求
- **REST风格**采用RESTful API设计理念
- **JSON响应**统一返回JSON格式数据
- **错误处理**:完善的异常捕获和日志记录
- **Redis缓存**使用Redis缓存提升性能
## 6. 技术亮点
### 6.1 完整的RCU设备管理体系
- 建立了完整的RCU设备生命周期管理
- 支持设备状态实时监控和历史数据分析
- 提供了丰富的设备管理和配置功能
### 6.2 实时数据监控和统计分析
- 实时监控RCU设备状态和通信数据
- 提供多维度的数据统计和图表分析
- 支持自定义时间范围的数据查询
### 6.3 多酒店集团管理
- 支持多酒店集团的层级管理
- 实现了酒店和房间的树形结构管理
- 提供了灵活的权限控制机制
### 6.4 定时任务调度系统
- 使用Quartz实现定时任务调度
- 支持多种任务类型和调度策略
- 实现了系统状态检测和数据同步
### 6.5 完善的日志管理
- 集成了log4net和阿里云日志服务
- 实现了多级别、多目标的日志记录
- 提供了日志查询和分析功能
## 7. 优化空间
### 7.1 代码结构优化
- **模块化重构**:进一步优化代码结构,提高模块独立性
- **代码规范**:统一代码风格和命名规范
- **注释完善**:增加代码注释,提高可维护性
### 7.2 性能优化
- **数据库优化**:优化数据库查询,添加适当索引
- **缓存策略**优化Redis缓存策略减少数据库访问
- **并发处理**:优化并发处理逻辑,提高系统吞吐量
### 7.3 安全性增强
- **身份认证**:加强身份认证和授权机制
- **数据加密**:对敏感数据进行加密存储
- **输入验证**:加强输入验证,防止注入攻击
- **安全审计**:增加安全审计日志
### 7.4 前端技术栈更新
- **前端框架**考虑使用现代前端框架如Vue.js或React
- **响应式设计**:优化移动端适配
- **性能优化**:减少前端加载时间,优化用户体验
### 7.5 文档完善
- **技术文档**:完善系统架构和技术文档
- **API文档**生成API接口文档
- **使用手册**:编写用户使用手册
### 7.6 部署优化
- **容器化**考虑使用Docker容器化部署
- **CI/CD**:建立持续集成和持续部署流程
- **监控告警**:增加系统监控和告警机制
## 8. 总结
### 8.1 项目价值
- **提升管理效率**实现了RCU设备的集中管理提高了管理效率
- **降低运营成本**:通过远程管理和监控,减少了现场维护成本
- **提高服务质量**:实时监控设备状态,及时发现和解决问题
- **数据驱动决策**:通过数据分析,为管理决策提供依据
### 8.2 技术价值
- **完整的.NET生态**:展示了.NET Core在企业级应用中的完整实践
- **模块化设计**:体现了良好的模块化设计思想
- **多技术整合**:整合了多种技术栈,形成完整的解决方案
- **可扩展性**:系统设计具有良好的可扩展性和可维护性
### 8.3 未来展望
- **技术升级**:持续跟进.NET技术发展进行技术栈升级
- **功能扩展**:根据业务需求,不断扩展系统功能
- **智能化**:引入人工智能技术,实现设备故障预测和智能运维
- **云原生**:向云原生架构演进,提高系统弹性和可靠性
## 9. 附录
### 9.1 关键文件列表
| 文件路径 | 功能描述 |
|---------|---------|
| SERVER/RcuServer.cs | RCU设备管理核心逻辑 |
| SERVER/Send_Cmd.cs | 命令下发模块 |
| WebUI/Controllers/ApiController.cs | API控制器 |
| WebUI/Startup.cs | 应用启动配置 |
| COMMON/XC_Redis.cs | Redis缓存操作 |
| Models/Models/TBL_RCU_BASIC_INFO.cs | RCU设备基础信息模型 |
| Models/Models/TBL_HOTEL_BASIC_INFO.cs | 酒店基础信息模型 |
### 9.2 核心API列表
| API端点 | HTTP方法 | 功能描述 |
|---------|---------|---------|
| /Api/GetRCU | POST | 获取RCU设备列表 |
| /Api/SendCmd | POST | 下发固件或配置 |
| /Api/Send_Schedule | POST | 查询下发进度 |
| /Api/HOTELINFO | POST | 获取酒店信息 |
| /Api/ROOMINFO | POST | 获取房间信息 |
| /Api/SelModelFile | POST | 获取模型文件列表 |
| /Api/AddModelFile | POST | 上传模型文件 |
| /Api/DelModelFile | POST | 删除模型文件 |
| /Api/GetCHARTS | POST | 获取通信数据统计 |
| /Api/Token | POST | 刷新令牌和服务状态 |
### 9.3 技术依赖
| 依赖项 | 版本 | 用途 |
|-------|------|------|
| Microsoft.AspNetCore.Authentication.JwtBearer | 5.0.15 | JWT认证 |
| Microsoft.EntityFrameworkCore | 5.0.15 | 数据库访问 |
| Microsoft.EntityFrameworkCore.SqlServer | 5.0.15 | SQL Server驱动 |
| Quartz | 3.4.0 | 定时任务调度 |
| UtilsSharp | 2.5.0 | 工具类库 |
| log4net | - | 日志记录 |
| Redis | - | 缓存管理 |
| Aliyun.Api.LogService | - | 阿里云日志服务 |
---
**报告生成时间**2026-01-21
**项目版本**:基于当前代码库分析
**分析工具**:手动代码分析 + 项目结构扫描