worker-machine-shift:完整改造(DB+采集+后端+前端)

main
haoliang 1 month ago
parent 55a2a5a9fe
commit 4390338c9b

@ -0,0 +1,83 @@
-- ============================================================
-- 清空运行时数据脚本(保留基础配置数据)
-- 适用于:生产环境部署前清空测试/历史运行数据
-- 执行方式mysql -u root -proot < clean-runtime-data.sql
-- ============================================================
-- ========== 业务库 (cnc_business) ==========
USE cnc_business;
-- 1. 告警记录
DELETE FROM cnc_alert WHERE 1=1;
ALTER TABLE cnc_alert AUTO_INCREMENT = 1;
-- 2. 采集记录
DELETE FROM cnc_collect_record WHERE 1=1;
ALTER TABLE cnc_collect_record AUTO_INCREMENT = 1;
-- 3. 日产量汇总
DELETE FROM cnc_daily_production WHERE 1=1;
ALTER TABLE cnc_daily_production AUTO_INCREMENT = 1;
-- 4. 机床日状态
DELETE FROM cnc_machine_daily_status WHERE 1=1;
ALTER TABLE cnc_machine_daily_status AUTO_INCREMENT = 1;
-- 5. 产量调整记录
DELETE FROM cnc_production_adjustment WHERE 1=1;
ALTER TABLE cnc_production_adjustment AUTO_INCREMENT = 1;
-- 6. 产量分段记录
DELETE FROM cnc_production_segment WHERE 1=1;
ALTER TABLE cnc_production_segment AUTO_INCREMENT = 1;
-- 7. 员工日汇总
DELETE FROM cnc_worker_daily_summary WHERE 1=1;
ALTER TABLE cnc_worker_daily_summary AUTO_INCREMENT = 1;
-- 8. 重置机床实时状态字段
UPDATE cnc_machine SET
last_collect_time = NULL,
last_device_status = NULL,
last_run_status = NULL,
last_program_name = NULL,
last_part_count = NULL,
last_operate_mode = NULL,
last_machining_status = NULL,
last_ping_time = NULL,
last_ping_latency = NULL;
-- 9. 重置采集地址状态
UPDATE cnc_collect_address SET
last_collect_time = NULL,
last_collect_status = NULL,
fail_count = 0;
-- ========== 日志库 (cnc_log) ==========
USE cnc_log;
-- 10. 采集器心跳
DELETE FROM log_collector_heartbeat WHERE 1=1;
ALTER TABLE log_collector_heartbeat AUTO_INCREMENT = 1;
-- 11. 采集分析记录
DELETE FROM log_collect_analysis WHERE 1=1;
ALTER TABLE log_collect_analysis AUTO_INCREMENT = 1;
-- 12. 采集周期
DELETE FROM log_collect_cycle WHERE 1=1;
ALTER TABLE log_collect_cycle AUTO_INCREMENT = 1;
-- 13. 原始JSON日志
DELETE FROM log_collect_raw WHERE 1=1;
ALTER TABLE log_collect_raw AUTO_INCREMENT = 1;
-- 14. 分区追踪
DELETE FROM log_partition_tracker WHERE 1=1;
ALTER TABLE log_partition_tracker AUTO_INCREMENT = 1;
-- 15. 系统日志
DELETE FROM log_system WHERE 1=1;
ALTER TABLE log_system AUTO_INCREMENT = 1;

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -0,0 +1,424 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>CncRepository</name>
</assembly>
<members>
<member name="T:CncRepository.Base.BaseRepository">
<summary>
仓储基类,提供数据库连接管理
每个仓储方法应 using(CreateConnection()) 自动释放连接
</summary>
</member>
<member name="M:CncRepository.Base.BaseRepository.#ctor(System.String)">
<summary>
初始化仓储基类
</summary>
<param name="connectionString">数据库连接字符串</param>
</member>
<member name="M:CncRepository.Base.BaseRepository.CreateConnection">
<summary>
创建新的数据库连接
调用方需使用 using 语句确保连接释放
</summary>
<example>
using (var conn = CreateConnection())
{
return conn.QueryFirstOrDefault&lt;Machine&gt;("SELECT * FROM cnc_machine WHERE id = @Id", new { Id = id });
}
</example>
</member>
<member name="T:CncRepository.Base.BusinessRepository">
<summary>
业务库仓储基类cnc_business
所有操作业务库的仓储继承此类
</summary>
</member>
<member name="M:CncRepository.Base.BusinessRepository.#ctor(System.String)">
<summary>
初始化业务库仓储
</summary>
<param name="connectionString">cnc_business 数据库连接字符串</param>
</member>
<member name="T:CncRepository.Base.LogRepository">
<summary>
日志库仓储基类cnc_log
所有操作日志库的仓储继承此类
</summary>
</member>
<member name="M:CncRepository.Base.LogRepository.#ctor(System.String)">
<summary>
初始化日志库仓储
</summary>
<param name="connectionString">cnc_log 数据库连接字符串</param>
</member>
<member name="F:CncRepository.Impl.AlertRepository.SelectColumns">
<summary>Alert SELECT列映射模板snake_case列名 → PascalCase属性名</summary>
</member>
<member name="T:CncRepository.Impl.AlertRepository.AlertTypeCount">
<summary>
告警类型计数内部类用于Dapper映射
</summary>
</member>
<member name="T:CncRepository.Impl.BrandFieldMappingRepository">
<summary>
品牌字段映射实现
</summary>
</member>
<member name="T:CncRepository.Impl.BrandRepository">
<summary>
品牌实现
</summary>
</member>
<member name="T:CncRepository.Impl.CollectAddressRepository">
<summary>
采集地址实现
</summary>
</member>
<member name="F:CncRepository.Impl.CollectAddressRepository.SelectColumns">
<summary>采集地址SELECT列映射模板</summary>
</member>
<member name="T:CncRepository.Impl.DailyProductionRepository">
<summary>
cnc_daily_production 产量仓储实现(业务库)
</summary>
</member>
<member name="T:CncRepository.Impl.Dashboard.DashboardRepository">
<summary>
仪表盘跨表统计查询实现
</summary>
</member>
<member name="F:CncRepository.Impl.Dashboard.DashboardRepository.DailyQuantityUnionSql">
<summary>
通用产量计算SQL片段已汇总日期用cnc_daily_production未汇总日期用cnc_production_segment实时计算。
与machine表JOIN时需在外层提供 machine_id 列。
参数:@StartDate, @EndDate
返回列machine_id, production_date, day_quantity
</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetSummary">
<summary>汇总卡片数据</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetWorkshopProduction(System.DateTime,System.DateTime)">
<summary>按车间时间区间统计生产量(平均单机产量)</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetMachineRank(System.DateTime,System.DateTime,System.Int32,System.String)">
<summary>机床排行</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetWorkerRank(System.DateTime,System.DateTime,System.Int32,System.String)">
<summary>工人排行</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetProductionTrend(System.Int32)">
<summary>产量趋势(最近 days 天)</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetMachineStatusDistribution">
<summary>机床状态分布</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetProgramRank(System.DateTime,System.DateTime,System.Int32,System.String)">
<summary>NC程序产量排行</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetProgramDistribution(System.DateTime,System.DateTime,System.Int32)">
<summary>NC程序产量分布</summary>
</member>
<member name="M:CncRepository.Impl.Dashboard.DashboardRepository.GetRecentAlerts(System.Int32)">
<summary>最近告警</summary>
</member>
<member name="T:CncRepository.Impl.Log.CollectAnalysisRepository">
<summary>
采集分析仓储实现(日志库 - log_collect_analysis
</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectAnalysisRepository.GetRecordsByMachineAndDate(System.Int32,System.DateTime)">
<summary>按机床ID和日期查询采集分析记录</summary>
</member>
<member name="T:CncRepository.Impl.Log.CollectCycleRepository">
<summary>
采集周期仓储实现(日志库 - log_collect_cycle
</summary>
</member>
<member name="T:CncRepository.Impl.Log.CollectorHeartbeatRepository">
<summary>
日志库log_collector_heartbeat 心跳仓储实现
</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectorHeartbeatRepository.Create(CncModels.Entity.CollectorHeartbeat)">
<summary>写入心跳</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectorHeartbeatRepository.GetLatest(System.String)">
<summary>获取最新心跳</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectorHeartbeatRepository.DeleteBeforeDate(System.DateTime)">
<summary>清理过去的心跳记录(按日期)</summary>
</member>
<member name="T:CncRepository.Impl.Log.CollectRawRepository">
<summary>
日志库log_collect_raw 原始采集记录仓储实现
</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectRawRepository.GetById(System.Int64)">
<summary>通过 Id 获取原始记录</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectRawRepository.GetByAddressId(System.Int32,System.Int32,System.Int32)">
<summary>按地址分页获取原始记录</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectRawRepository.GetLatestByAddressId(System.Int32)">
<summary>获取某地址最新的一条原始采集记录</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectRawRepository.GetAll(System.Int32,System.Int32)">
<summary>分页获取所有原始记录</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectRawRepository.Create(CncModels.Entity.CollectRaw)">
<summary>写入原始采集记录</summary>
</member>
<member name="M:CncRepository.Impl.Log.CollectRawRepository.DeleteBeforeDate(System.DateTime)">
<summary>清理过期数据(按日期)</summary>
</member>
<member name="T:CncRepository.Impl.MachineLatestTagRepository">
<summary>
设备最新Tag数据仓储查询日志库 raw_json按 Tag ID 提取指标)
</summary>
</member>
<member name="M:CncRepository.Impl.MachineLatestTagRepository.#ctor(System.String,System.String)">
<summary>
初始化,同时持有日志库和业务库连接字符串
</summary>
<param name="logConn">cnc_log 连接字符串</param>
<param name="businessConn">cnc_business 连接字符串</param>
</member>
<member name="M:CncRepository.Impl.MachineLatestTagRepository.GetLatestTags(System.Int32)">
<summary>
获取指定设备的最新6个Tag及其采集时间
</summary>
<param name="machineId">设备ID</param>
<returns>6个Tag数据列表找不到时返回空列表</returns>
</member>
<member name="T:CncRepository.Impl.MachineRepository">
<summary>
机床实现
</summary>
</member>
<member name="F:CncRepository.Impl.MachineRepository.OnlineExpr">
<summary>机床SELECT列映射模板snake_case列名 → PascalCase属性名</summary>
<summary>在线判断SQL片段last_ping_time在20秒内视为在线</summary>
</member>
<member name="M:CncRepository.Impl.MachineRepository.GetLatestCollectRecord(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.MachineRepository.GetTodayProduction(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.MachineRepository.GetProductionTrend(System.Int32,System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.MachineRepository.GetRecentCollectRecords(System.Int32,System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.ProductionAdjustmentRepository.GetByTargetId(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.ProductionSegmentRepository.GetTotalByDateRange(System.DateTime,System.DateTime,System.Nullable{System.Int32})">
<summary>
实时统计指定日期范围的产量(从分段表计算)
</summary>
</member>
<member name="M:CncRepository.Impl.ProductionSegmentRepository.GetActiveMachineCount(System.DateTime,System.Nullable{System.Int32})">
<summary>
获取有产量记录的机床数量
</summary>
</member>
<member name="M:CncRepository.Impl.ProductionSegmentRepository.GetTotalCuttingTimeByDate(System.DateTime)">
<summary>
获取今日切削总时间(小时),取每台机床最新-最早的cutting_time差值之和
</summary>
</member>
<member name="T:CncRepository.Impl.SysConfigRepository">
<summary>
系统配置实现
</summary>
</member>
<member name="M:CncRepository.Impl.SysConfigRepository.GetByKey(System.String)">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.SysConfigRepository.GetAll">
<inheritdoc/>
</member>
<member name="M:CncRepository.Impl.SysConfigRepository.UpdateValue(System.Int32,System.String)">
<inheritdoc/>
</member>
<member name="T:CncRepository.Impl.WorkerMachineRepository">
<summary>
工人-机床绑定实现
</summary>
</member>
<member name="T:CncRepository.Impl.WorkerRepository">
<summary>
工人实现
</summary>
</member>
<member name="F:CncRepository.Impl.WorkerRepository.SelectColumns">
<summary>工人SELECT列映射模板</summary>
</member>
<member name="T:CncRepository.Impl.WorkshopRepository">
<summary>
车间仓储实现
</summary>
</member>
<member name="T:CncRepository.Interface.IAlertRepository">
<summary>
cnc_alert 告警表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IBrandFieldMappingRepository">
<summary>
品牌字段映射仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IBrandRepository">
<summary>
品牌仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.ICollectAddressRepository">
<summary>
采集地址仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.ICollectAnalysisRepository">
<summary>
采集分析仓储接口
</summary>
</member>
<member name="M:CncRepository.Interface.ICollectAnalysisRepository.GetRecordsByMachineAndDate(System.Int32,System.DateTime)">
<summary>按机床ID和日期查询采集分析记录</summary>
</member>
<member name="T:CncRepository.Interface.ICollectCycleRepository">
<summary>
采集周期仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.ICollectorHeartbeatRepository">
<summary>
日志库:心跳仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.ICollectRawRepository">
<summary>
日志库:原始采集记录仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IDailyProductionRepository">
<summary>
cnc_daily_production 产量仓储接口(业务库)
</summary>
</member>
<member name="T:CncRepository.Interface.IDashboardRepository">
<summary>
仪表盘统计查询仓储接口(跨表聚合)
</summary>
</member>
<member name="M:CncRepository.Interface.IDashboardRepository.GetProgramRank(System.DateTime,System.DateTime,System.Int32,System.String)">
<summary>NC程序产量排行TOP N</summary>
</member>
<member name="M:CncRepository.Interface.IDashboardRepository.GetProgramDistribution(System.DateTime,System.DateTime,System.Int32)">
<summary>NC程序产量分布饼图数据</summary>
</member>
<member name="T:CncRepository.Interface.IMachineDailyStatusRepository">
<summary>
cnc_machine_daily_status 机床日状态表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IMachineLatestTagRepository">
<summary>
设备最新Tag数据仓储接口查询日志库
</summary>
</member>
<member name="M:CncRepository.Interface.IMachineLatestTagRepository.GetLatestTags(System.Int32)">
<summary>
获取指定设备的最新6个Tag及其采集时间
</summary>
<param name="machineId">设备ID</param>
<returns>6个Tag数据列表</returns>
</member>
<member name="T:CncRepository.Interface.IMachineRepository">
<summary>
机床仓储接口
</summary>
</member>
<member name="M:CncRepository.Interface.IMachineRepository.SetCollectAddress(System.Int32,System.Nullable{System.Int32})">
<summary>设置机床所属的采集地址</summary>
</member>
<member name="M:CncRepository.Interface.IMachineRepository.GetLatestCollectRecord(System.Int32)">
<summary>获取机床最新一条采集记录(实时状态)</summary>
</member>
<member name="M:CncRepository.Interface.IMachineRepository.GetTodayProduction(System.Int32)">
<summary>获取机床今日产量按程序名分组</summary>
</member>
<member name="M:CncRepository.Interface.IMachineRepository.GetProductionTrend(System.Int32,System.Int32)">
<summary>获取机床近N天产量趋势</summary>
</member>
<member name="M:CncRepository.Interface.IMachineRepository.GetRecentCollectRecords(System.Int32,System.Int32)">
<summary>获取机床最近N条采集记录</summary>
</member>
<member name="T:CncRepository.Interface.IProductionAdjustmentRepository">
<summary>
cnc_production_adjustment 产量修正审计表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IProductionSegmentRepository">
<summary>
cnc_production_segment 产量分段记录表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IScreenConfigRepository">
<summary>
cnc_screen_config 大屏卡片配置表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IScreenFilterRepository">
<summary>
cnc_screen_filter 大屏筛选配置表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.ISysConfigRepository">
<summary>
系统配置仓储接口
</summary>
</member>
<member name="M:CncRepository.Interface.ISysConfigRepository.GetByKey(System.String)">
<summary>按配置Key获取配置</summary>
</member>
<member name="M:CncRepository.Interface.ISysConfigRepository.GetAll">
<summary>获取全部配置</summary>
</member>
<member name="M:CncRepository.Interface.ISysConfigRepository.UpdateValue(System.Int32,System.String)">
<summary>更新配置值</summary>
<param name="id">配置项ID</param>
<param name="configValue">新值</param>
</member>
<member name="T:CncRepository.Interface.ISystemLogRepository">
<summary>
log_system 系统日志 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IWorkerDailySummaryRepository">
<summary>
cnc_worker_daily_summary 工人日汇总表 仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IWorkerMachineRepository">
<summary>
工人-机床绑定仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IWorkerRepository">
<summary>
工人仓储接口
</summary>
</member>
<member name="T:CncRepository.Interface.IWorkshopRepository">
<summary>
车间仓储接口
</summary>
</member>
</members>
</doc>

Binary file not shown.

@ -0,0 +1,642 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>CncService</name>
</assembly>
<members>
<member name="T:CncService.BusinessException">
<summary>
业务异常
Service层抛出此异常由全局异常过滤器统一捕获并转换为ApiResponse
</summary>
</member>
<member name="P:CncService.BusinessException.Code">
<summary>业务错误码非0</summary>
</member>
<member name="M:CncService.BusinessException.#ctor(System.Int32,System.String)">
<summary>
创建业务异常
</summary>
<param name="code">错误码,参见 CncModels.Constants.ErrorCode</param>
<param name="message">错误信息,会返回给前端展示</param>
</member>
<member name="T:CncService.Impl.AlertService">
<summary>
告警管理实现
</summary>
</member>
<member name="M:CncService.Impl.AlertService.GetList(CncModels.Dto.Alert.AlertQuery)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.AlertService.Resolve(System.Int64)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.AlertService.BatchResolve(System.Collections.Generic.List{System.Int64})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.AlertService.GetStatistics">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.AuthService">
<summary>
登录认证实现
</summary>
</member>
<member name="M:CncService.Impl.AuthService.Login(CncModels.Dto.Login.LoginRequest)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.BrandService">
<summary>
品牌模板实现
</summary>
</member>
<member name="T:CncService.Impl.CollectAddressService">
<summary>
采集地址实现
</summary>
</member>
<member name="M:CncService.Impl.CollectAddressService.GetOnlineTimeout">
<summary>从sys_config读取在线超时阈值</summary>
</member>
<member name="M:CncService.Impl.CollectAddressService.GetMachines(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.CollectAddressService.GetCollectRecords(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.CollectAddressService.GetRawJson(System.Int32,System.String)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.CollectDataService">
<summary>
采集数据查询实现
</summary>
</member>
<member name="M:CncService.Impl.CollectDataService.GetRawByAddress(System.Int32,System.Int32,System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.CollectDataService.GetLatestRaw(System.Int32)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.CollectLogService">
<summary>
采集日志相关的业务实现
</summary>
</member>
<member name="T:CncService.Impl.DashboardService">
<summary>
仪表盘实现
</summary>
</member>
<member name="M:CncService.Impl.DashboardService.GetSummary">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetWorkshopProduction(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetMachineRank(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Int32,System.String)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetWorkerRank(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Int32,System.String)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetProductionTrend(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetMachineStatusDistribution">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetProgramRank(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Int32,System.String)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetProgramDistribution(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetRecentAlerts(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.DashboardService.GetHeartbeatTimeout">
<summary>从sys_config读取heartbeat_interval计算心跳超时阈值间隔×3</summary>
</member>
<member name="M:CncService.Impl.DashboardService.GetCollectorStatus">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.MachineService">
<summary>
机床管理实现
</summary>
</member>
<member name="M:CncService.Impl.MachineService.GetList(CncModels.Dto.Machine.MachineQuery)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.GetById(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.Create(CncModels.Dto.Machine.CreateMachineRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.Update(System.Int32,CncModels.Dto.Machine.UpdateMachineRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.Delete(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.BatchDelete(System.Collections.Generic.List{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.ToggleEnabled(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.GetStatus(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.GetTodayProduction(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.GetProductionTrend(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.GetCollectRecords(System.Int32,System.Nullable{System.DateTime})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.MachineService.GetLatestTags(System.Int32)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.ProductionService">
<summary>
产量管理实现
</summary>
</member>
<member name="M:CncService.Impl.ProductionService.GetList(CncModels.Dto.Production.ProductionQuery)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32},System.Nullable{System.Int32},System.Nullable{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetTotalByDateRange(System.DateTime,System.DateTime,System.Nullable{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.Adjust(CncModels.Dto.Production.ProductionAdjustRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetAdjustmentHistory(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetMachineSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetMachineList(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32},System.Nullable{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetWorkerSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetWorkerList(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetProgramSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ProductionService.GetProgramList(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.String)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.ReplayService">
<summary>
回放服务实现
通过日志库日活日志与业务库表实现回放能力
注意:此实现尽量复用现有 SQL避免引入额外依赖
</summary>
</member>
<member name="M:CncService.Impl.ReplayService.PreviewReplay(System.DateTime)">
<summary>预览回放影响范围(不做写操作)</summary>
</member>
<member name="M:CncService.Impl.ReplayService.ExecuteReplay(System.DateTime)">
<summary>执行回放:清空当天数据并重新写入(简化实现)</summary>
</member>
<member name="T:CncService.Impl.ScreenService">
<summary>
大屏配置实现
</summary>
</member>
<member name="M:CncService.Impl.ScreenService.GetSummary">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ScreenService.GetConfigs">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ScreenService.UpdateConfig(CncModels.Entity.ScreenConfig)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ScreenService.GetFilters(System.String)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ScreenService.CreateFilter(CncModels.Entity.ScreenFilter)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ScreenService.UpdateFilter(CncModels.Entity.ScreenFilter)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.ScreenService.DeleteFilter(System.Int32)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.SystemLogService">
<summary>
系统日志实现
</summary>
</member>
<member name="M:CncService.Impl.SystemLogService.GetList(CncModels.Dto.Log.SystemLogQuery)">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.WindowsServiceChecker">
<summary>
Windows 服务检测实现(基于 ServiceController
</summary>
</member>
<member name="T:CncService.Impl.WorkerService">
<summary>
员工管理实现
</summary>
</member>
<member name="M:CncService.Impl.WorkerService.GetOnlineTimeout">
<summary>从sys_config读取在线超时阈值</summary>
</member>
<member name="M:CncService.Impl.WorkerService.GetList(CncModels.Dto.Worker.WorkerQuery)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.GetById(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.Create(CncModels.Dto.Worker.CreateWorkerRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.Update(System.Int32,CncModels.Dto.Worker.UpdateWorkerRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.Delete(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.BatchDelete(System.Collections.Generic.List{System.Int32})">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.ToggleEnabled(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.BindMachine(System.Int32,System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.UnbindMachine(System.Int32,System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.GetMachines(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.GetTodayProduction(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.GetProductionTrend(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkerService.GetAvailableMachines">
<inheritdoc/>
</member>
<member name="T:CncService.Impl.WorkshopService">
<summary>
车间管理实现
</summary>
</member>
<member name="M:CncService.Impl.WorkshopService.GetList(System.String)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkshopService.GetById(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkshopService.Create(CncModels.Dto.Settings.CreateWorkshopRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkshopService.Update(System.Int32,CncModels.Dto.Settings.UpdateWorkshopRequest)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkshopService.Delete(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkshopService.ToggleEnabled(System.Int32)">
<inheritdoc/>
</member>
<member name="M:CncService.Impl.WorkshopService.GetMachineCount(System.Int32)">
<inheritdoc/>
</member>
<member name="T:CncService.Interface.IAuthService">
<summary>
登录认证服务接口
</summary>
</member>
<member name="M:CncService.Interface.IAuthService.Login(CncModels.Dto.Login.LoginRequest)">
<summary>
管理员登录
</summary>
<param name="request">登录请求参数</param>
<returns>登录响应(包含 JWT Token 及有效期)</returns>
</member>
<member name="T:CncService.Interface.IBrandService">
<summary>
品牌模板服务接口
</summary>
</member>
<member name="T:CncService.Interface.ICollectAddressService">
<summary>
采集地址服务接口
</summary>
</member>
<member name="M:CncService.Interface.ICollectAddressService.GetMachines(System.Int32)">
<summary>
获取采集地址下关联机床列表
</summary>
</member>
<member name="M:CncService.Interface.ICollectAddressService.GetCollectRecords(System.Int32)">
<summary>
获取采集地址近期采集记录
</summary>
</member>
<member name="M:CncService.Interface.ICollectAddressService.GetRawJson(System.Int32,System.String)">
<summary>
获取最新原始采集JSON
</summary>
</member>
<member name="T:CncService.Interface.ICollectDataService">
<summary>
采集数据查询服务接口
</summary>
</member>
<member name="M:CncService.Interface.ICollectDataService.GetRawByAddress(System.Int32,System.Int32,System.Int32)">
<summary>按地址ID分页查询原始采集记录</summary>
</member>
<member name="M:CncService.Interface.ICollectDataService.GetLatestRaw(System.Int32)">
<summary>获取最新采集记录</summary>
</member>
<member name="M:CncService.Interface.ICollectLogService.GetAnalysisList(CncModels.Dto.CollectLog.CollectAnalysisQuery)">
<summary>分页查询采集分析日志</summary>
</member>
<member name="M:CncService.Interface.ICollectLogService.GetAnalysisDetail(System.Int64)">
<summary>获取单条采集分析日志的详情</summary>
</member>
<member name="M:CncService.Interface.ICollectLogService.GetAnalysisByRawLogId(System.Int64)">
<summary>根据原始日志ID查找相关联的分析记录</summary>
</member>
<member name="M:CncService.Interface.ICollectLogService.GetCycleList(CncModels.Dto.CollectLog.CollectCycleQuery)">
<summary>分页查询采集周期信息</summary>
</member>
<member name="T:CncService.Interface.IDashboardService">
<summary>
仪表盘服务接口
</summary>
</member>
<member name="M:CncService.Interface.IDashboardService.GetProgramRank(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Int32,System.String)">
<summary>NC程序产量排行TOP N</summary>
</member>
<member name="M:CncService.Interface.IDashboardService.GetProgramDistribution(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Int32)">
<summary>NC程序产量分布饼图数据</summary>
</member>
<member name="T:CncService.Interface.IMachineService">
<summary>
机床管理服务接口
</summary>
</member>
<member name="M:CncService.Interface.IMachineService.GetList(CncModels.Dto.Machine.MachineQuery)">
<summary>
分页查询机床列表
</summary>
<param name="query">查询条件</param>
<returns>分页结果</returns>
</member>
<member name="M:CncService.Interface.IMachineService.GetById(System.Int32)">
<summary>
根据ID获取机床详情
</summary>
<param name="id">机床ID</param>
<returns>机床详情</returns>
</member>
<member name="M:CncService.Interface.IMachineService.Create(CncModels.Dto.Machine.CreateMachineRequest)">
<summary>
新增机床
</summary>
<param name="request">创建参数</param>
<returns>新建机床的ID</returns>
</member>
<member name="M:CncService.Interface.IMachineService.Update(System.Int32,CncModels.Dto.Machine.UpdateMachineRequest)">
<summary>
编辑机床信息
</summary>
<param name="id">机床ID</param>
<param name="request">修改参数</param>
<returns>是否更新成功</returns>
</member>
<member name="M:CncService.Interface.IMachineService.Delete(System.Int32)">
<summary>
删除机床并解绑相关工人
</summary>
<param name="id">机床ID</param>
<returns>是否删除成功</returns>
</member>
<member name="M:CncService.Interface.IMachineService.BatchDelete(System.Collections.Generic.List{System.Int32})">
<summary>
批量删除机床并解绑相关工人
</summary>
<param name="ids">机床ID列表</param>
<returns>删除的记录数</returns>
</member>
<member name="M:CncService.Interface.IMachineService.ToggleEnabled(System.Int32)">
<summary>
启用或禁用机床
</summary>
<param name="id">机床ID</param>
<returns>是否切换成功</returns>
</member>
<member name="M:CncService.Interface.IMachineService.GetStatus(System.Int32)">
<summary>
获取机床实时采集状态
</summary>
<param name="id">机床ID</param>
<returns>实时状态信息</returns>
</member>
<member name="M:CncService.Interface.IMachineService.GetTodayProduction(System.Int32)">
<summary>
获取机床今日产量明细
</summary>
<param name="id">机床ID</param>
<returns>今日产量列表</returns>
</member>
<member name="M:CncService.Interface.IMachineService.GetProductionTrend(System.Int32)">
<summary>
获取机床7天产量趋势
</summary>
<param name="id">机床ID</param>
<returns>趋势数据列表</returns>
</member>
<member name="M:CncService.Interface.IMachineService.GetCollectRecords(System.Int32,System.Nullable{System.DateTime})">
<summary>
获取机床采集记录从日志库log_collect_analysis查询支持日期筛选
</summary>
<param name="id">机床ID</param>
<param name="date">筛选日期,默认今天</param>
<returns>采集记录列表</returns>
</member>
<member name="M:CncService.Interface.IMachineService.GetLatestTags(System.Int32)">
<summary>
获取设备最新Tag数据6个指标各带独立采集时间
</summary>
<param name="machineId">设备ID</param>
<returns>6个Tag数据列表</returns>
</member>
<member name="T:CncService.Interface.IProductionService">
<summary>
产量管理服务接口
</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetList(CncModels.Dto.Production.ProductionQuery)">
<summary>分页查询产量记录</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32},System.Nullable{System.Int32},System.Nullable{System.Int32})">
<summary>获取日汇总统计</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetTotalByDateRange(System.DateTime,System.DateTime,System.Nullable{System.Int32})">
<summary>获取日期范围总产量</summary>
</member>
<member name="M:CncService.Interface.IProductionService.Adjust(CncModels.Dto.Production.ProductionAdjustRequest)">
<summary>产量修正</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetAdjustmentHistory(System.Int32)">
<summary>
获取某条产量记录的修正历史
</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetMachineSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32})">
<summary>获取设备产量汇总(按日期范围)</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetMachineList(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32},System.Nullable{System.Int32})">
<summary>获取设备产量明细列表(按日期范围)</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetWorkerSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
<summary>获取员工产量汇总(按日期范围)</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetWorkerList(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32})">
<summary>获取员工产量明细列表(按日期范围)</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetProgramSummary(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.Nullable{System.Int32})">
<summary>获取程序产量汇总(按日期范围)</summary>
</member>
<member name="M:CncService.Interface.IProductionService.GetProgramList(System.Nullable{System.DateTime},System.Nullable{System.DateTime},System.String)">
<summary>获取程序产量明细列表(按日期范围)</summary>
</member>
<member name="T:CncService.Interface.IReplayService">
<summary>
回放服务接口D1-D2 数据回放)
</summary>
</member>
<member name="M:CncService.Interface.IReplayService.PreviewReplay(System.DateTime)">
<summary>预览回放影响范围</summary>
</member>
<member name="M:CncService.Interface.IReplayService.ExecuteReplay(System.DateTime)">
<summary>执行回放,含清空与重建并重新汇总</summary>
</member>
<member name="T:CncService.Interface.IScreenService">
<summary>
大屏配置服务接口
</summary>
</member>
<member name="M:CncService.Interface.IScreenService.GetSummary">
<summary>获取大屏汇总数据</summary>
</member>
<member name="M:CncService.Interface.IScreenService.GetConfigs">
<summary>获取所有卡片配置</summary>
</member>
<member name="M:CncService.Interface.IScreenService.UpdateConfig(CncModels.Entity.ScreenConfig)">
<summary>更新卡片配置</summary>
</member>
<member name="M:CncService.Interface.IScreenService.GetFilters(System.String)">
<summary>获取筛选项列表</summary>
</member>
<member name="M:CncService.Interface.IScreenService.CreateFilter(CncModels.Entity.ScreenFilter)">
<summary>创建筛选项</summary>
</member>
<member name="M:CncService.Interface.IScreenService.UpdateFilter(CncModels.Entity.ScreenFilter)">
<summary>更新筛选项</summary>
</member>
<member name="M:CncService.Interface.IScreenService.DeleteFilter(System.Int32)">
<summary>删除筛选项</summary>
</member>
<member name="T:CncService.Interface.IWindowsServiceChecker">
<summary>
Windows 服务检测接口(用于管理后台对采集服务的状态检测与控制)
</summary>
</member>
<member name="M:CncService.Interface.IWindowsServiceChecker.GetServiceStatus(System.String)">
<summary>
获取指定服务的当前状态
</summary>
<param name="serviceName">服务名</param>
<returns>服务状态枚举</returns>
</member>
<member name="M:CncService.Interface.IWindowsServiceChecker.TryStartService(System.String,System.Int32)">
<summary>
尝试启动指定服务,并在给定超时内等待就绪
</summary>
<param name="serviceName">服务名</param>
<param name="timeoutSeconds">超时(秒)</param>
<returns>(是否成功, 详细信息)</returns>
</member>
<member name="M:CncService.Interface.IWindowsServiceChecker.TryStopService(System.String,System.Int32)">
<summary>
尝试停止指定服务,并在给定超时内等待停止
</summary>
<param name="serviceName">服务名</param>
<param name="timeoutSeconds">超时(秒)</param>
<returns>(是否成功, 详细信息)</returns>
</member>
<member name="M:CncService.Interface.IWorkerService.GetMachines(System.Int32)">
<summary>
获取工人绑定机床列表
</summary>
</member>
<member name="M:CncService.Interface.IWorkerService.GetTodayProduction(System.Int32)">
<summary>
获取工人今日产量明细
</summary>
</member>
<member name="M:CncService.Interface.IWorkerService.GetProductionTrend(System.Int32)">
<summary>
获取工人7天产量趋势
</summary>
</member>
<member name="M:CncService.Interface.IWorkerService.GetAvailableMachines">
<summary>
获取可绑定机床列表(未绑定其他工人的)
</summary>
</member>
<member name="T:CncService.Interface.IWorkshopService">
<summary>
车间管理服务接口
</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.GetList(System.String)">
<summary>获取车间列表</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.GetById(System.Int32)">
<summary>按ID获取车间</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.Create(CncModels.Dto.Settings.CreateWorkshopRequest)">
<summary>新增车间</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.Update(System.Int32,CncModels.Dto.Settings.UpdateWorkshopRequest)">
<summary>编辑车间</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.Delete(System.Int32)">
<summary>删除车间</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.ToggleEnabled(System.Int32)">
<summary>启停车间</summary>
</member>
<member name="M:CncService.Interface.IWorkshopService.GetMachineCount(System.Int32)">
<summary>获取车间下机床数量</summary>
</member>
</members>
</doc>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -0,0 +1 @@
<%@ Application Codebehind="Global.asax.cs" Inherits="CncWebApi.WebApiApplication" Language="C#" %>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Web API 应用配置文件
部署到 IIS 时,需要将此文件复制到站点根目录
-->
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="App_Data\logs\error.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<threshold value="ERROR" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception%newline" />
</layout>
</appender>
<appender name="AllFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="App_Data\logs\webapi.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline%exception%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="AllFileAppender" />
<appender-ref ref="ErrorFileAppender" />
</root>
</log4net>
<connectionStrings>
<!-- 业务库连接串 -->
<add name="BusinessConnection"
connectionString="Server=localhost;Database=cnc_business;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=None;" />
<!-- 日志库连接串 -->
<add name="LogConnection"
connectionString="Server=localhost;Database=cnc_log;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=None;" />
</connectionStrings>
<appSettings>
<!-- 禁用 OWIN 自动发现(本项目使用 Global.asax + WebApiConfig -->
<add key="owin:AutomaticAppStartup" value="false" />
<!-- JWT认证密钥生产环境请更换 -->
<add key="JwtSecret" value="CncDataSystem_2026_SecretKey_For_Jwt_Token_Generation_Min32Chars" />
<!-- Token过期时间小时 -->
<add key="TokenExpirationHours" value="24" />
<!-- 模拟器网关地址(默认 http://localhost:9000 -->
<add key="SimulatorGatewayUrl" value="http://localhost:9000" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.7.2" />
<httpRuntime targetFramework="4.7.2" />
<!-- 临时开启详细错误用于联调 -->
<customErrors mode="Off" />
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
<!-- MySqlConnector 依赖的程序集绑定重定向 -->
<dependentAssembly>
<assemblyIdentity name="System.Memory" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

@ -0,0 +1 @@
.admin-layout[data-v-f326dc0f]{flex-direction:column;height:100vh;display:flex}.admin-header[data-v-f326dc0f]{color:#fff;background-color:#409eff;flex-shrink:0;justify-content:space-between;align-items:center;height:48px;padding:0 20px;display:flex}.admin-header .header-left .system-title[data-v-f326dc0f]{font-size:16px;font-weight:700}.admin-header .header-right .admin-dropdown[data-v-f326dc0f]{color:#fff;cursor:pointer;align-items:center;gap:4px;display:flex}.admin-body[data-v-f326dc0f]{flex:1;display:flex;overflow:hidden}.admin-sidebar[data-v-f326dc0f]{background-color:#304156;flex-direction:column;flex-shrink:0;width:200px;transition:width .3s;display:flex}.admin-sidebar.collapsed[data-v-f326dc0f]{width:64px}.admin-sidebar .el-menu[data-v-f326dc0f]{border-right:none;flex:1;overflow-y:auto}.admin-sidebar .sidebar-toggle[data-v-f326dc0f]{color:#bfcbd9;cursor:pointer;border-top:1px solid #263445;justify-content:center;align-items:center;height:40px;display:flex}.admin-sidebar .sidebar-toggle[data-v-f326dc0f]:hover{color:#409eff}.admin-content[data-v-f326dc0f]{background-color:#f0f2f5;flex-direction:column;flex:1;display:flex;overflow:hidden}.admin-content .breadcrumb-area[data-v-f326dc0f]{flex-shrink:0;padding:12px 20px 0}.admin-content .content-area[data-v-f326dc0f]{flex:1;padding:20px;overflow-y:auto}.sidebar-submenu-popper .el-menu{background-color:#304156!important}.sidebar-submenu-popper .el-menu-item{color:#bfcbd9}.sidebar-submenu-popper .el-menu-item:hover{background-color:#263445!important}.sidebar-submenu-popper .el-menu-item.is-active{color:#409eff}

@ -0,0 +1 @@
import{E as e,F as t,I as n,L as r,M as i,_ as a,a as o,b as s,g as c,h as l,i as u,k as d,l as f,m as p,n as m,o as h,p as g,r as _,s as v,x as y,y as b,z as x}from"./index-yNQwsZKK.js";import{t as S}from"./useMockMode-CGiTg8lx.js";var C={class:`admin-layout`},w={class:`admin-header`},T={class:`header-right`},E={class:`admin-dropdown`},D={class:`admin-body`},O={class:`admin-content`},k={class:`breadcrumb-area`},A={class:`content-area`},j=u(y({__name:`AdminLayout`,setup(u){let y=m(),j=_(),{isMock:M}=S(),N=t(!1);function P(e){return M.value?`/mock${e}`:e}let F=g(()=>y.path);function I(e){e===`password`?j.push(M.value?`/mock/settings`:`/settings`):e===`logout`&&o.confirm(`确定退出登录?`,`提示`,{confirmButtonText:`确定`,cancelButtonText:`取消`,type:`warning`}).then(()=>{localStorage.removeItem(`token`),j.push(M.value?`/mock/login`:`/login`),h.success(`已退出登录`)}).catch(()=>{})}return(t,o)=>{let u=d(`el-icon`),m=d(`el-dropdown-item`),h=d(`el-dropdown-menu`),g=d(`el-dropdown`),_=d(`Odometer`),S=d(`el-menu-item`),j=d(`Monitor`),L=d(`PriceTag`),R=d(`Link`),z=d(`User`),B=d(`DataAnalysis`),V=d(`el-sub-menu`),H=d(`Bell`),U=d(`Setting`),W=d(`Document`),G=d(`VideoPlay`),K=d(`FullScreen`),q=d(`el-menu`),J=d(`Expand`),Y=d(`Fold`),X=d(`el-breadcrumb-item`),Z=d(`el-breadcrumb`),Q=d(`router-view`);return e(),a(`div`,C,[p(`header`,w,[o[4]||=p(`div`,{class:`header-left`},[p(`span`,{class:`system-title`},`CNC机床数据采集系统`)],-1),p(`div`,T,[s(g,{trigger:`click`,onCommand:I},{dropdown:i(()=>[s(h,null,{default:i(()=>[s(m,{command:`password`},{default:i(()=>[...o[2]||=[b(`修改密码`,-1)]]),_:1}),s(m,{command:`logout`,divided:``},{default:i(()=>[...o[3]||=[b(`退出登录`,-1)]]),_:1})]),_:1})]),default:i(()=>[p(`span`,E,[o[1]||=b(` 管理员 `,-1),s(u,null,{default:i(()=>[s(n(v))]),_:1})])]),_:1})])]),p(`div`,D,[p(`aside`,{class:r([`admin-sidebar`,{collapsed:N.value}])},[s(q,{"default-active":F.value,collapse:N.value,"background-color":`#304156`,"text-color":`#bfcbd9`,"active-text-color":`#409EFF`,router:``},{default:i(()=>[s(S,{index:P(`/dashboard`)},{title:i(()=>[...o[5]||=[b(`仪表盘`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(_)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/machine`)},{title:i(()=>[...o[6]||=[b(`设备管理`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(j)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/brand`)},{title:i(()=>[...o[7]||=[b(`品牌模板`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(L)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/collect-address`)},{title:i(()=>[...o[8]||=[b(`采集地址`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(R)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/collect-log`)},{title:i(()=>[...o[9]||=[b(`采集日志`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(n(f))]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/worker`)},{title:i(()=>[...o[10]||=[b(`员工管理`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(z)]),_:1})]),_:1},8,[`index`]),s(V,{index:P(`/production`),"popper-class":`sidebar-submenu-popper`},{title:i(()=>[s(u,null,{default:i(()=>[s(B)]),_:1}),o[11]||=p(`span`,null,`产量报表`,-1)]),default:i(()=>[s(S,{index:P(`/production/machine`)},{title:i(()=>[...o[12]||=[b(`机床产量`,-1)]]),_:1},8,[`index`]),s(S,{index:P(`/production/worker`)},{title:i(()=>[...o[13]||=[b(`员工产量`,-1)]]),_:1},8,[`index`]),s(S,{index:P(`/production/program`)},{title:i(()=>[...o[14]||=[b(`程序产量`,-1)]]),_:1},8,[`index`])]),_:1},8,[`index`]),s(S,{index:P(`/alert`)},{title:i(()=>[...o[15]||=[b(`告警中心`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(H)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/settings`)},{title:i(()=>[...o[16]||=[b(`系统设置`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(U)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/log`)},{title:i(()=>[...o[17]||=[b(`操作日志`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(W)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/simulator`)},{title:i(()=>[...o[18]||=[b(`模拟采集`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(G)]),_:1})]),_:1},8,[`index`]),s(S,{index:P(`/screen-config`)},{title:i(()=>[...o[19]||=[b(`大屏配置`,-1)]]),default:i(()=>[s(u,null,{default:i(()=>[s(K)]),_:1})]),_:1},8,[`index`])]),_:1},8,[`default-active`,`collapse`]),p(`div`,{class:`sidebar-toggle`,onClick:o[0]||=e=>N.value=!N.value},[N.value?(e(),l(u,{key:0},{default:i(()=>[s(J)]),_:1})):(e(),l(u,{key:1},{default:i(()=>[s(Y)]),_:1}))])],2),p(`main`,O,[p(`div`,k,[s(Z,{separator:`/`},{default:i(()=>[s(X,{to:{path:n(M)?`/mock/dashboard`:`/dashboard`}},{default:i(()=>[...o[20]||=[b(`首页`,-1)]]),_:1},8,[`to`]),n(y).meta.title&&n(y).name!==`Dashboard`&&n(y).name!==`MockDashboard`?(e(),l(X,{key:0},{default:i(()=>[b(x(n(y).meta.title),1)]),_:1})):c(``,!0)]),_:1})]),p(`div`,A,[s(Q)])])])])}}}),[[`__scopeId`,`data-v-f326dc0f`]]);export{j as default};

@ -0,0 +1 @@
.alert-detail-text[data-v-4734cdf8]{white-space:pre-wrap;word-break:break-all;color:#303133;max-height:200px;padding:4px 0;font-size:13px;line-height:1.6;overflow-y:auto}.alert-detail-desc[data-v-4734cdf8] .el-descriptions__label{width:80px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
import{A as e,E as t,F as n,M as r,N as i,_ as a,a as o,b as s,h as c,k as l,m as u,o as d,r as f,w as p,x as m,y as h,z as g}from"./index-yNQwsZKK.js";import{t as _}from"./useMockMode-CGiTg8lx.js";import{t as v}from"./request-CbM-LIzp.js";var y={class:`mb-16`},b={style:{"white-space":`nowrap`}},x=m({__name:`BrandListPage`,setup(m){let x=f(),{isMock:S}=_(),C=n(!1),w=n([]);function T(){x.push(S.value?`/mock/brand/create`:`/brand/create`)}function E(e){x.push((S.value?`/mock/brand/`:`/brand/`)+e+`/edit`)}async function D(){C.value=!0;try{w.value=(await v.get(`/admin/brand`)).data?.items??[]}finally{C.value=!1}}async function O(e){await o.confirm(`确定`+(e.isEnabled?`禁用`:`启用`)+``,`提示`,{type:`warning`}),await v.put(`/admin/brand/${e.id}/toggle`),d.success(`操作成功`),D()}async function k(e){await o.confirm(`确定删除【`+e.brandName+`】?此操作不可恢复。`,`提示`,{type:`warning`}),await v.delete(`/admin/brand/${e.id}`),d.success(`已删除`),D()}async function A(e){try{await o.confirm(`确定复制品牌【${e.brandName}】?`,`提示`,{type:`warning`}),await v.post(`/admin/brand/${e.id}/copy`),d.success(`复制成功`),D()}catch{}}return p(D),(n,o)=>{let d=l(`el-button`),f=l(`el-table-column`),p=l(`el-tag`),m=l(`el-table`),_=e(`loading`);return t(),a(`div`,null,[u(`div`,y,[s(d,{type:`primary`,onClick:T},{default:r(()=>[...o[0]||=[h(`+ 新增品牌`,-1)]]),_:1})]),i((t(),c(m,{data:w.value,border:``,stripe:``},{default:r(()=>[s(f,{prop:`brandName`,label:`品牌名称`}),s(f,{prop:`deviceField`,label:`device字段`}),s(f,{prop:`tagsPath`,label:`tags路径`}),s(f,{label:`状态`,align:`center`},{default:r(({row:e})=>[s(p,{type:e.isEnabled?`success`:`danger`,size:`small`},{default:r(()=>[h(g(e.isEnabled?`启用`:`停用`),1)]),_:2},1032,[`type`])]),_:1}),s(f,{prop:`fieldCount`,label:`字段数`,align:`center`}),s(f,{label:`操作`,width:`180`,align:`center`},{default:r(({row:e})=>[u(`div`,b,[s(d,{link:``,type:`primary`,onClick:t=>E(e.id)},{default:r(()=>[...o[1]||=[h(`编辑`,-1)]]),_:1},8,[`onClick`]),s(d,{link:``,type:`primary`,onClick:t=>A(e)},{default:r(()=>[...o[2]||=[h(`复制`,-1)]]),_:1},8,[`onClick`]),s(d,{link:``,type:`primary`,onClick:t=>O(e)},{default:r(()=>[h(g(e.isEnabled?`禁用`:`启用`),1)]),_:2},1032,[`onClick`]),s(d,{link:``,type:`danger`,onClick:t=>k(e)},{default:r(()=>[...o[3]||=[h(`删除`,-1)]]),_:1},8,[`onClick`])])]),_:1})]),_:1},8,[`data`])),[[_,C.value]])])}}});export{x as default};

@ -0,0 +1 @@
import{E as e,F as t,I as n,M as r,_ as i,b as a,k as o,m as s,n as c,w as l,x as u,y as d,z as f}from"./index-yNQwsZKK.js";import{t as p}from"./request-CbM-LIzp.js";import{t as m}from"./PageHeader-yD9tr7GF.js";import{t as h}from"./useMockPath-CT2FRUTb.js";var g=u({__name:`CollectAddressDetailPage`,setup(u){let{isMock:g}=h(),_=g?`/mock/dashboard`:`/dashboard`,v=g?`/mock/collect-address`:`/collect-address`,y=c(),b=t({}),x=t([]),S=t([]),C=t(!1),w=t(``),T=t(`原始采集数据`);async function E(e){let t=y.params.id,n=(await p.get(`/admin/collect-address/${t}/raw-json`,{params:{recordId:e.requestTime}})).data?.rawJson??`[]`,r;try{r=JSON.parse(n)}catch{r=n}w.value=JSON.stringify(r,null,2),T.value=`原始采集数据 - ${e.machineName??``}`,C.value=!0}async function D(){let e=y.params.id,[t,n,r]=await Promise.all([p.get(`/admin/collect-address/${e}`),p.get(`/admin/collect-address/${e}/machines`),p.get(`/admin/collect-address/${e}/collect-records`)]);b.value=t.data??{},x.value=n.data?.items??[],S.value=r.data?.items??[]}return l(D),(t,c)=>{let l=o(`router-link`),u=o(`el-breadcrumb-item`),p=o(`el-breadcrumb`),h=o(`el-descriptions-item`),g=o(`el-tag`),y=o(`el-descriptions`),D=o(`el-card`),O=o(`el-table-column`),k=o(`el-table`),A=o(`el-button`),j=o(`el-input`),M=o(`el-dialog`);return e(),i(`div`,null,[a(m,{title:`采集地址详情:${b.value.name}`,showBack:!0},{breadcrumb:r(()=>[a(p,{separator:`/`,style:{margin:`0 0 12px 0`}},{default:r(()=>[a(u,null,{default:r(()=>[a(l,{to:n(_)},{default:r(()=>[...c[3]||=[d(`首页`,-1)]]),_:1},8,[`to`])]),_:1}),a(u,null,{default:r(()=>[a(l,{to:n(v)},{default:r(()=>[...c[4]||=[d(`采集地址`,-1)]]),_:1},8,[`to`])]),_:1}),a(u,null,{default:r(()=>[d(f(b.value.name||`采集地址详情`),1)]),_:1})]),_:1})]),_:1},8,[`title`]),a(D,{shadow:`hover`,style:{"margin-bottom":`20px`}},{header:r(()=>[...c[5]||=[s(`span`,null,`基本信息`,-1)]]),default:r(()=>[a(y,{column:2,border:``,size:`small`},{default:r(()=>[a(h,{label:`名称`},{default:r(()=>[d(f(b.value.name),1)]),_:1}),a(h,{label:`URL`},{default:r(()=>[d(f(b.value.url),1)]),_:1}),a(h,{label:`品牌`},{default:r(()=>[d(f(b.value.brandName),1)]),_:1}),a(h,{label:`采集间隔`},{default:r(()=>[d(f(b.value.collectInterval??b.value.interval)+``,1)]),_:1}),a(h,{label:`状态`},{default:r(()=>[a(g,{type:b.value.isEnabled?`success`:`danger`,size:`small`},{default:r(()=>[d(f(b.value.isEnabled?`启用`:`停用`),1)]),_:1},8,[`type`])]),_:1}),a(h,{label:`最后采集`},{default:r(()=>[d(f(b.value.lastCollectTime||`-`),1)]),_:1})]),_:1})]),_:1}),a(D,{shadow:`hover`,style:{"margin-bottom":`20px`}},{header:r(()=>[...c[6]||=[s(`span`,null,`关联机床`,-1)]]),default:r(()=>[a(k,{data:x.value,border:``,stripe:``,size:`small`},{default:r(()=>[a(O,{prop:`machineName`,label:`机床名称`}),a(O,{prop:`deviceCode`,label:`device_code`}),a(O,{prop:`workshopName`,label:`车间`}),a(O,{label:`在线`,align:`center`},{default:r(({row:e})=>[a(g,{type:e.isOnline?`success`:`danger`,size:`small`},{default:r(()=>[d(f(e.isOnline?`在线`:`离线`),1)]),_:2},1032,[`type`])]),_:1}),a(O,{prop:`programName`,label:`当前程序`})]),_:1},8,[`data`])]),_:1}),a(D,{shadow:`hover`},{header:r(()=>[...c[7]||=[s(`span`,null,`最近采集记录`,-1)]]),default:r(()=>[a(k,{data:S.value,border:``,stripe:``,size:`small`},{default:r(()=>[a(O,{prop:`requestTime`,label:`请求时间`}),a(O,{prop:`duration`,label:`耗时(ms)`,align:`center`}),a(O,{label:`状态`,align:`center`},{default:r(({row:e})=>[a(g,{type:e.isSuccess?`success`:`danger`,size:`small`},{default:r(()=>[d(f(e.isSuccess?`成功`:`失败`),1)]),_:2},1032,[`type`])]),_:1}),a(O,{prop:`machineCount`,label:`机床数`,align:`center`}),a(O,{label:`操作`,width:`120`,align:`center`},{default:r(({row:e})=>[a(A,{size:`small`,link:``,type:`primary`,onClick:t=>E(e)},{default:r(()=>[...c[8]||=[d(`查看JSON`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1}),a(M,{visible:C.value,"onUpdate:visible":c[2]||=e=>C.value=e,title:T.value,width:`700px`},{footer:r(()=>[a(A,{onClick:c[1]||=e=>C.value=!1},{default:r(()=>[...c[9]||=[d(`关闭`,-1)]]),_:1})]),default:r(()=>[a(j,{type:`textarea`,modelValue:w.value,"onUpdate:modelValue":c[0]||=e=>w.value=e,rows:`15`,readonly:!0},null,8,[`modelValue`])]),_:1},8,[`visible`,`title`])])}}});export{g as default};

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.status-dot[data-v-9bb25ab8]{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:6px;display:inline-block}.status-dot.online[data-v-9bb25ab8]{background-color:#67c23a}.status-dot.offline[data-v-9bb25ab8]{background-color:#c0c4cc}.status-dot.disabled-dot[data-v-9bb25ab8]{background-color:#f56c6c}.transfer-legend[data-v-9bb25ab8]{color:#909399;align-items:center;gap:16px;margin-top:8px;font-size:12px;display:flex}.transfer-legend .status-dot[data-v-9bb25ab8]{margin-right:4px}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.collect-log-page .mb-4[data-v-12ee2499]{margin-bottom:12px}

@ -0,0 +1 @@
.dashboard-page .stat-row[data-v-d17a88a7]{margin-bottom:16px}.dashboard-page .stat-row .el-card[data-v-d17a88a7]{height:100%}.dashboard-page .stat-row .stat-card[data-v-d17a88a7]{text-align:center;padding:10px 0}.dashboard-page .stat-row .stat-card .stat-label[data-v-d17a88a7]{color:#909399;margin-bottom:8px;font-size:14px}.dashboard-page .stat-row .stat-card .stat-label .info-icon[data-v-d17a88a7]{color:#c0c4cc;cursor:help;vertical-align:middle;margin-left:2px;font-size:13px}.dashboard-page .stat-row .stat-card .stat-label .info-icon[data-v-d17a88a7]:hover{color:#409eff}.dashboard-page .stat-row .stat-card .stat-value[data-v-d17a88a7]{color:#303133;font-size:28px;font-weight:700}.dashboard-page .stat-row .stat-card .stat-value .stat-unit[data-v-d17a88a7]{color:#909399;font-size:14px;font-weight:400}.dashboard-page .stat-row .stat-card .stat-sub[data-v-d17a88a7]{color:#909399;margin-top:4px;font-size:12px}.dashboard-page .stat-row .collector-actions[data-v-d17a88a7]{flex-wrap:wrap;justify-content:flex-start;gap:8px;margin-top:12px;display:flex}.dashboard-page .chart-row[data-v-d17a88a7],.dashboard-page .rank-row[data-v-d17a88a7]{margin-bottom:16px}.dashboard-page .card-title[data-v-d17a88a7]{font-size:15px;font-weight:500}.dashboard-page .card-title .info-icon[data-v-d17a88a7]{color:#b0b5bd;cursor:help;margin-left:4px;font-size:14px}.dashboard-page .card-title .info-icon[data-v-d17a88a7]:hover{color:#409eff}.dashboard-page .card-header[data-v-d17a88a7]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;display:flex}.dashboard-page .card-header .card-sub[data-v-d17a88a7]{color:#909399;font-size:12px}.dashboard-page .card-header .date-filter[data-v-d17a88a7]{flex-wrap:wrap;align-items:center;display:flex}.dashboard-page .machine-link[data-v-d17a88a7]{color:var(--el-color-primary);cursor:pointer;text-decoration:none}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
import{E as e,F as t,M as n,P as r,_ as i,b as a,d as o,i as s,k as c,m as l,n as u,o as d,r as f,x as p,y as m}from"./index-yNQwsZKK.js";import{t as h}from"./request-CbM-LIzp.js";var g={class:`login-page`},_={class:`login-card`},v=s(p({__name:`LoginPage`,setup(s){let p=f(),v=u(),y=t(),b=t(!1),x=r({username:``,password:``,rememberMe:!1}),S={username:[{required:!0,message:`请输入用户名`,trigger:`blur`}],password:[{required:!0,message:`请输入密码`,trigger:`blur`}]},C=async()=>{if(await y.value?.validate().catch(()=>!1)){b.value=!0;try{let e=await h.post(`/admin/login`,{username:x.username,password:x.password,rememberMe:x.rememberMe});localStorage.setItem(`token`,e.data.token),d.success(`登录成功`);let t=v.query.redirect||(v.path.startsWith(`/mock`)?`/mock/dashboard`:`/dashboard`);p.push(t)}catch{}finally{b.value=!1}}};return(t,r)=>{let s=c(`el-input`),u=c(`el-form-item`),d=c(`el-checkbox`),f=c(`el-button`),p=c(`el-form`);return e(),i(`div`,g,[l(`div`,_,[r[5]||=l(`h2`,{class:`login-title`},`CNC机床数据采集系统`,-1),a(p,{ref_key:`formRef`,ref:y,model:x,rules:S,"label-width":`0`,onSubmit:o(C,[`prevent`])},{default:n(()=>[a(u,{prop:`username`},{default:n(()=>[a(s,{modelValue:x.username,"onUpdate:modelValue":r[0]||=e=>x.username=e,placeholder:`用户名`,"prefix-icon":`User`,size:`large`,clearable:``,maxlength:`50`},null,8,[`modelValue`])]),_:1}),a(u,{prop:`password`},{default:n(()=>[a(s,{modelValue:x.password,"onUpdate:modelValue":r[1]||=e=>x.password=e,type:`password`,placeholder:`密码`,"prefix-icon":`Lock`,size:`large`,"show-password":``,clearable:``,maxlength:`50`},null,8,[`modelValue`])]),_:1}),a(u,null,{default:n(()=>[a(d,{modelValue:x.rememberMe,"onUpdate:modelValue":r[2]||=e=>x.rememberMe=e},{default:n(()=>[...r[3]||=[m(`记住我`,-1)]]),_:1},8,[`modelValue`])]),_:1}),a(u,null,{default:n(()=>[a(f,{type:`primary`,size:`large`,loading:b.value,style:{width:`100%`},"native-type":`submit`},{default:n(()=>[...r[4]||=[m(` 登录 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1},8,[`model`])])])}}}),[[`__scopeId`,`data-v-3188805c`]]);export{v as default};

@ -0,0 +1 @@
.login-page[data-v-3188805c]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);justify-content:center;align-items:center;height:100vh;display:flex}.login-page .login-card[data-v-3188805c]{background:#fff;border-radius:8px;width:400px;padding:40px;box-shadow:0 4px 20px #00000026}.login-page .login-card .login-title[data-v-3188805c]{text-align:center;color:#303133;margin-bottom:30px;font-size:22px}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.relative-time[data-v-675474c7]{color:#909399;cursor:default;font-size:13px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.machine-production[data-v-d625bb61]{padding:0}.machine-production .filter-bar[data-v-d625bb61],.machine-production .stat-row[data-v-d625bb61]{margin-bottom:16px}.machine-production .stat-row .el-card[data-v-d625bb61]{height:100%}.machine-production .stat-row .stat-card[data-v-d625bb61]{text-align:center;padding:10px 0}.machine-production .stat-row .stat-card .stat-label[data-v-d625bb61]{color:#909399;margin-bottom:8px;font-size:14px}.machine-production .stat-row .stat-card .stat-label .info-icon[data-v-d625bb61]{color:#c0c4cc;cursor:help;vertical-align:middle;margin-left:2px;font-size:13px}.machine-production .stat-row .stat-card .stat-label .info-icon[data-v-d625bb61]:hover{color:#409eff}.machine-production .stat-row .stat-card .stat-value[data-v-d625bb61]{color:#303133;font-size:28px;font-weight:700}.machine-production .stat-row .stat-card .top-machine-name[data-v-d625bb61]{font-size:20px}.machine-production .chart-row[data-v-d625bb61]{margin-bottom:16px}.machine-production .card-title[data-v-d625bb61]{font-size:15px;font-weight:500}.machine-production .table-card[data-v-d625bb61] .el-card__body{padding:0}

@ -0,0 +1 @@
import{E as e,I as t,M as n,O as r,_ as i,b as a,c as o,g as s,h as c,i as l,k as u,m as d,n as f,p,x as m,y as h,z as g}from"./index-yNQwsZKK.js";var _={class:`page-header`,style:{"margin-bottom":`12px`}},v={style:{display:`flex`,"align-items":`center`,gap:`12px`}},y={style:{"font-size":`16px`,"font-weight":`600`}},b=l(m({__name:`PageHeader`,props:{title:{},showBack:{type:Boolean}},setup(l){let m=l.showBack??!0,b=f(),x=typeof window<`u`&&window.location.pathname.startsWith(`/mock`),S=x?`/mock/dashboard`:`/dashboard`,C=p(()=>{let e=b.path;return e.startsWith(`/machine`)?`设备管理`:e.startsWith(`/worker`)?`工人管理`:e.startsWith(`/collect-address`)?`采集地址`:`管理中心`}),w=p(()=>(x?`/mock`:``)+b.path.split(`?`)[0]),T=p(()=>C.value);return(f,p)=>{let b=u(`router-link`),x=u(`el-breadcrumb-item`),C=u(`el-breadcrumb`),E=u(`el-icon`),D=u(`el-button`);return e(),i(`div`,_,[r(f.$slots,`breadcrumb`,{},()=>[a(C,{separator:`/`,style:{margin:`0 0 12px 0`}},{default:n(()=>[a(x,null,{default:n(()=>[a(b,{to:t(S)},{default:n(()=>[...p[1]||=[h(`首页`,-1)]]),_:1},8,[`to`])]),_:1}),a(x,null,{default:n(()=>[a(b,{to:w.value},{default:n(()=>[h(g(T.value),1)]),_:1},8,[`to`])]),_:1}),a(x,null,{default:n(()=>[h(g(l.title),1)]),_:1})]),_:1})],!0),d(`div`,v,[t(m)?(e(),c(D,{key:0,onClick:p[0]||=e=>f.$router.back()},{default:n(()=>[a(E,null,{default:n(()=>[a(t(o))]),_:1}),p[2]||=h(` 返回`,-1)]),_:1})):s(``,!0),d(`span`,y,g(l.title),1)])])}}}),[[`__scopeId`,`data-v-59b2f881`]]);export{b as t};

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.program-production[data-v-37993a12]{padding:20px}.program-production .filter-bar[data-v-37993a12],.program-production .stat-row[data-v-37993a12]{margin-bottom:16px}.program-production .stat-row .el-card[data-v-37993a12]{height:100%}.program-production .stat-row .stat-card[data-v-37993a12]{text-align:center;padding:10px 0}.program-production .stat-row .stat-card .stat-label[data-v-37993a12]{color:#909399;margin-bottom:8px;font-size:14px}.program-production .stat-row .stat-card .stat-label .info-icon[data-v-37993a12]{color:#c0c4cc;cursor:help;vertical-align:middle;margin-left:2px;font-size:13px}.program-production .stat-row .stat-card .stat-label .info-icon[data-v-37993a12]:hover{color:#409eff}.program-production .stat-row .stat-card .stat-value[data-v-37993a12]{color:#303133;font-size:28px;font-weight:700}.program-production .stat-row .stat-card .stat-value.top-program[data-v-37993a12]{color:#e6a23c;font-size:20px}.program-production .chart-row[data-v-37993a12],.program-production .table-card[data-v-37993a12]{margin-bottom:16px}.program-production .card-title[data-v-37993a12]{font-size:15px;font-weight:500}.program-production .card-title .info-icon[data-v-37993a12]{color:#b0b5bd;cursor:help;margin-left:4px;font-size:14px}.program-production .card-title .info-icon[data-v-37993a12]:hover{color:#409eff}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.drag-over[data-v-831f1a52]{background-color:#4cc3f714;outline:2px dashed #4fc3f7}

@ -0,0 +1 @@
.screen-layout[data-v-c8305c56]{color:#e0e0e0;background-color:#0f0f1a;height:100vh;overflow:hidden}

@ -0,0 +1 @@
import{E as e,_ as t,b as n,i as r,k as i}from"./index-yNQwsZKK.js";var a={},o={class:`screen-layout`};function s(r,a){let s=i(`router-view`);return e(),t(`div`,o,[n(s)])}var c=r(a,[[`render`,s],[`__scopeId`,`data-v-c8305c56`]]);export{c as default};

@ -0,0 +1 @@
.screen-page[data-v-bcd92283]{color:#e0e0e0;background:#0f0f1a;flex-direction:column;min-height:100vh;font-family:Microsoft YaHei,sans-serif;display:flex;overflow:hidden}.screen-header[data-v-bcd92283]{background:#1a1a2e;border-bottom:1px solid #2a2a3e;flex-shrink:0;justify-content:space-between;align-items:center;height:50px;padding:0 24px;display:flex}.header-left[data-v-bcd92283]{color:#00e5ff;letter-spacing:2px;font-size:20px;font-weight:700}.header-right[data-v-bcd92283]{align-items:center;display:flex}.header-time[data-v-bcd92283]{color:#aaa;font-family:Consolas,monospace;font-size:14px}.stat-row[data-v-bcd92283]{flex-shrink:0;gap:16px;padding:16px 24px;display:flex}.stat-card[data-v-bcd92283]{text-align:center;background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;flex:1;padding:12px 16px;transition:box-shadow .3s}.stat-card[data-v-bcd92283]:hover{box-shadow:0 0 12px #00e5ff26}.stat-label[data-v-bcd92283]{color:#909399;margin-bottom:4px;font-size:13px}.stat-value[data-v-bcd92283]{letter-spacing:1px;font-size:28px;font-weight:700}.stat-sub[data-v-bcd92283]{color:#606266;margin-top:2px;font-size:12px}.chart-row[data-v-bcd92283]{flex-shrink:0;gap:16px;padding:0 24px 16px;display:flex}.chart-card[data-v-bcd92283]{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;flex:1;height:300px;padding:12px}.chart-title[data-v-bcd92283]{color:#bbb;margin-bottom:8px;font-size:14px}.chart-container[data-v-bcd92283]{width:100%;height:calc(100% - 30px)}.bottom-row[data-v-bcd92283]{flex:1;gap:16px;min-height:0;padding:0 24px 16px;display:flex}.rank-card[data-v-bcd92283]{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;flex-direction:column;flex:1;padding:12px;display:flex}.rank-list[data-v-bcd92283]{flex:1;overflow-y:auto}.rank-item[data-v-bcd92283]{border-bottom:1px solid #2a2a3e;align-items:center;padding:6px 0;display:flex}.rank-item[data-v-bcd92283]:last-child{border-bottom:none}.rank-num[data-v-bcd92283]{color:#909399;background:#2a2a3e;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:24px;height:24px;margin-right:10px;font-size:12px;display:inline-flex}.rank-num.rank-top[data-v-bcd92283]{color:#0f0f1a;background:#00e5ff;font-weight:700}.rank-name[data-v-bcd92283]{flex:1;font-size:13px}.rank-value[data-v-bcd92283]{color:#76ff03;font-size:14px;font-weight:700}.status-card[data-v-bcd92283]{background:#1a1a2e;border:1px solid #2a2a3e;border-radius:8px;flex-direction:column;flex:1;padding:12px;display:flex}.status-grid[data-v-bcd92283]{flex-wrap:wrap;flex:1;align-content:flex-start;gap:6px;display:flex;overflow-y:auto}.status-block[data-v-bcd92283]{cursor:default;border-radius:3px;width:18px;height:18px}.status-block.online[data-v-bcd92283]{background:#4caf50;box-shadow:0 0 4px #4caf5080}.status-block.offline[data-v-bcd92283]{background:#555}.status-legend[data-v-bcd92283]{color:#999;gap:16px;margin-top:8px;font-size:12px;display:flex}.legend-item[data-v-bcd92283]{align-items:center;gap:4px;display:flex}.legend-block[data-v-bcd92283]{border-radius:2px;width:12px;height:12px;display:inline-block}.legend-block.online[data-v-bcd92283]{background:#4caf50}.legend-block.offline[data-v-bcd92283]{background:#555}.no-data[data-v-bcd92283]{color:#666;text-align:center;padding:20px;font-size:13px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
import{C as e,E as t,F as n,I as r,M as i,S as a,_ as o,b as s,k as c,m as l,n as u,w as d,x as f,y as p,z as m}from"./index-yNQwsZKK.js";import{t as h}from"./request-CbM-LIzp.js";import{t as g}from"./PageHeader-yD9tr7GF.js";import{t as _}from"./useMockPath-CT2FRUTb.js";import{t as v}from"./echarts-W_05fbm-.js";var y=f({__name:`WorkerDetailPage`,setup(f){let y=u(),{isMock:b}=_(),x=n({}),S=n([]),C=n([]),w=n(),T=null;async function E(){let e=y.params.id,[t,n,r]=await Promise.all([h.get(`/admin/worker/${e}`),h.get(`/admin/worker/${e}/machines`),h.get(`/admin/worker/${e}/production/today`)]);x.value=t.data||{},S.value=n.data?.items||[],C.value=r.data?.items||[];let i=await h.get(`/admin/worker/${e}/production/trend`);if(await a(),w.value){T=v.init(w.value);let e=i.data?.items||[];T.setOption({xAxis:{type:`category`,data:e.map(e=>e.date.slice(5))},yAxis:{type:`value`},series:[{type:`line`,data:e.map(e=>e.quantity),smooth:!0,areaStyle:{opacity:.1}}],tooltip:{trigger:`axis`},grid:{left:40,right:20,top:10,bottom:30}})}}d(E),e(()=>{T?.dispose()});function D(e){return(window.location.pathname.startsWith(`/mock`)?`/mock/machine/`:`/machine/`)+(e.machineId??e.id)}return(e,n)=>{let a=c(`router-link`),u=c(`el-breadcrumb-item`),d=c(`el-breadcrumb`),f=c(`el-descriptions-item`),h=c(`el-tag`),_=c(`el-descriptions`),v=c(`el-card`),y=c(`el-col`),T=c(`el-row`),E=c(`el-table-column`),O=c(`el-table`);return t(),o(`div`,null,[s(g,{title:`工人详情:${x.value.name}`,showBack:!0},{breadcrumb:i(()=>[s(d,{separator:`/`,style:{margin:`0 0 12px 0`}},{default:i(()=>[s(u,null,{default:i(()=>[s(a,{to:r(b)?`/mock/dashboard`:`/dashboard`},{default:i(()=>[...n[0]||=[p(`首页`,-1)]]),_:1},8,[`to`])]),_:1}),s(u,null,{default:i(()=>[s(a,{to:r(b)?`/mock/worker`:`/worker`},{default:i(()=>[...n[1]||=[p(`工人管理`,-1)]]),_:1},8,[`to`])]),_:1}),s(u,null,{default:i(()=>[p(m(x.value.name||`工人详情`),1)]),_:1})]),_:1})]),_:1},8,[`title`]),s(T,{gutter:20},{default:i(()=>[s(y,{span:12},{default:i(()=>[s(v,{shadow:`hover`},{header:i(()=>[...n[2]||=[l(`span`,null,`基本信息`,-1)]]),default:i(()=>[s(_,{column:2,border:``,size:`small`},{default:i(()=>[s(f,{label:`工号`},{default:i(()=>[p(m(x.value.code),1)]),_:1}),s(f,{label:`姓名`},{default:i(()=>[p(m(x.value.name),1)]),_:1}),s(f,{label:`状态`},{default:i(()=>[s(h,{type:x.value.isEnabled?`success`:`danger`,size:`small`},{default:i(()=>[p(m(x.value.isEnabled?`启用`:`停用`),1)]),_:1},8,[`type`])]),_:1}),s(f,{label:`绑定机床数`},{default:i(()=>[p(m(x.value.machineCount||0),1)]),_:1})]),_:1})]),_:1})]),_:1}),s(y,{span:12},{default:i(()=>[s(v,{shadow:`hover`},{header:i(()=>[...n[3]||=[l(`span`,null,`7天产量趋势`,-1)]]),default:i(()=>[l(`div`,{ref_key:`chartRef`,ref:w,style:{height:`200px`}},null,512)]),_:1})]),_:1})]),_:1}),s(v,{shadow:`hover`,class:`mt-20`},{header:i(()=>[...n[4]||=[l(`span`,null,`绑定机床`,-1)]]),default:i(()=>[s(O,{data:S.value,border:``,stripe:``,size:`small`},{default:i(()=>[s(E,{label:`机床名称`},{default:i(({row:e})=>[s(a,{to:D(e),style:{color:`var(--el-color-primary)`,cursor:`pointer`,"text-decoration":`none`}},{default:i(()=>[p(m(e.machineName),1)]),_:2},1032,[`to`])]),_:1}),s(E,{prop:`deviceCode`,label:`device_code`}),s(E,{prop:`workshopName`,label:`车间`}),s(E,{prop:`brandName`,label:`品牌`}),s(E,{label:`在线`,align:`center`},{default:i(({row:e})=>[s(h,{type:e.isOnline?`success`:`danger`,size:`small`},{default:i(()=>[p(m(e.isOnline?`在线`:`离线`),1)]),_:2},1032,[`type`])]),_:1}),s(E,{prop:`programName`,label:`当前程序`})]),_:1},8,[`data`])]),_:1}),s(v,{shadow:`hover`,class:`mt-20`},{header:i(()=>[...n[5]||=[l(`span`,null,`今日产量`,-1)]]),default:i(()=>[s(O,{data:C.value,border:``,stripe:``,size:`small`},{default:i(()=>[s(E,{prop:`machineName`,label:`机床名称`}),s(E,{prop:`programName`,label:`程序名`}),s(E,{prop:`quantity`,label:`产量`,align:`center`}),s(E,{prop:`runTime`,label:`运行时间`,align:`center`}),s(E,{prop:`cuttingTime`,label:`切削时间`,align:`center`})]),_:1},8,[`data`])]),_:1})])}}});export{y as default};

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.status-dot[data-v-65cf3a65]{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:6px;display:inline-block}.status-online .status-dot[data-v-65cf3a65]{background-color:#67c23a}.status-offline .status-dot[data-v-65cf3a65]{background-color:#c0c4cc}.status-disabled .status-dot[data-v-65cf3a65]{background-color:#f56c6c}.status-dot.online[data-v-65cf3a65]{background-color:#67c23a}.status-dot.offline[data-v-65cf3a65]{background-color:#c0c4cc}.status-dot.disabled[data-v-65cf3a65]{background-color:#f56c6c}.transfer-legend[data-v-65cf3a65]{color:#909399;align-items:center;gap:16px;margin-top:8px;font-size:12px;display:flex}.transfer-legend .status-dot[data-v-65cf3a65]{margin-right:4px}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
.worker-production .filter-bar[data-v-a68d2356],.worker-production .stat-row[data-v-a68d2356]{margin-bottom:16px}.worker-production .stat-row .el-card[data-v-a68d2356]{height:100%}.worker-production .stat-row .stat-card[data-v-a68d2356]{text-align:center;padding:10px 0}.worker-production .stat-row .stat-card .stat-label[data-v-a68d2356]{color:#909399;margin-bottom:8px;font-size:14px}.worker-production .stat-row .stat-card .stat-label .info-icon[data-v-a68d2356]{color:#c0c4cc;cursor:help;vertical-align:middle;margin-left:2px;font-size:13px}.worker-production .stat-row .stat-card .stat-label .info-icon[data-v-a68d2356]:hover{color:#409eff}.worker-production .stat-row .stat-card .stat-value[data-v-a68d2356]{color:#303133;font-size:28px;font-weight:700}.worker-production .stat-row .stat-card .stat-value.name-value[data-v-a68d2356]{font-size:22px}.worker-production .chart-row[data-v-a68d2356]{margin-bottom:16px}.worker-production .table-row .el-card[data-v-a68d2356]{width:100%}.worker-production .card-title[data-v-a68d2356]{font-size:15px;font-weight:500}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
import{t as e}from"./request-CbM-LIzp.js";function t(){return e.get(`/admin/simulator/ping`)}function n(){return e.get(`/admin/simulator/addresses`)}function r(t){return e.post(`/admin/simulator/start`,t)}function i(t){return e.post(`/admin/simulator/stop`,t)}function a(){return e.post(`/admin/simulator/start-all`)}function o(){return e.post(`/admin/simulator/stop-all`)}function s(){return e.post(`/admin/simulator/reload`)}function c(t){return e.get(`/admin/simulator/address/${t}/status`)}function l(t){return e.post(`/admin/simulator/address/${t}/start`)}function u(t){return e.post(`/admin/simulator/address/${t}/stop`)}function d(t,n){return e.post(`/admin/simulator/address/${t}/event`,n)}function f(t,n){return e.post(`/admin/simulator/address/${t}/interval`,n)}function p(t,n){return e.post(`/admin/simulator/address/${t}/network`,n)}function m(t,n){return e.post(`/admin/simulator/address/${t}/mode`,n)}function h(t){return e.get(`/admin/simulator/address/${t}/logs`)}function g(t){return e.get(`/admin/simulator/address/${t}/stats`)}export{t as a,p as c,a as d,r as f,d as g,i as h,n as i,m as l,o as m,g as n,s as o,u as p,c as r,f as s,h as t,l as u};

@ -0,0 +1 @@
import{n as e,p as t}from"./index-yNQwsZKK.js";function n(){let n=e();return{isMock:t(()=>n.path.startsWith(`/mock`))}}export{n as t};

@ -0,0 +1 @@
function e(){let e=typeof window<`u`&&window.location.pathname.startsWith(`/mock`);function t(t){return e?`/mock${t}`:t}return{isMock:e,mockPath:t}}export{e as t};

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.3 KiB

@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="bluesky-icon" viewBox="0 0 16 17">
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
</symbol>
<symbol id="discord-icon" viewBox="0 0 20 19">
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
</symbol>
<symbol id="documentation-icon" viewBox="0 0 21 20">
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
</symbol>
<symbol id="github-icon" viewBox="0 0 19 19">
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
</symbol>
<symbol id="social-icon" viewBox="0 0 20 20">
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
</symbol>
<symbol id="x-icon" viewBox="0 0 19 19">
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

@ -0,0 +1,14 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/admin/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CNC机床数据采集系统</title>
<script type="module" crossorigin src="/admin/assets/index-yNQwsZKK.js"></script>
<link rel="stylesheet" crossorigin href="/admin/assets/index--VTLsHYB.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save