This commit is contained in:
砂糖
2026-01-05 16:17:06 +08:00
11 changed files with 1550 additions and 389 deletions

View File

@@ -0,0 +1,9 @@
import request from '@/utils/request'
export function listDeviceEnumAll() {
return request({
url: '/api/deviceEnum/all',
method: 'get'
})
}

View File

@@ -0,0 +1,9 @@
import request from '@/utils/request'
export function getDeviceFieldMetaAll() {
return request({
url: '/api/deviceFieldMeta/all',
method: 'get'
})
}

View File

@@ -0,0 +1,20 @@
import request from '@/utils/request'
// 获取最新N条设备快照
export function listDeviceSnapshotLatest(params) {
return request({
url: '/api/deviceSnapshot/latest',
method: 'get',
params
})
}
// 按时间范围查询设备快照
export function listDeviceSnapshotRange(params) {
return request({
url: '/api/deviceSnapshot/range',
method: 'get',
params
})
}

File diff suppressed because it is too large Load Diff

View File

@@ -51,8 +51,9 @@
register: false,
globalConfig: getApp().globalData.config,
loginForm: {
username: "admin",
password: "admin123",
// 1. 修改默认值为空
username: "",
password: "",
code: "",
uuid: ""
}
@@ -67,8 +68,43 @@
this.$tab.reLaunch('/pages/easycode/easycode')
}
//#endif
// 2. 页面加载时读取本地存储的账号密码
this.loadLoginInfo()
},
methods: {
// 新增:读取本地存储的登录信息
loadLoginInfo() {
try {
// 从本地存储获取用户名
const savedUsername = uni.getStorageSync('login_username')
// 从本地存储获取密码
const savedPassword = uni.getStorageSync('login_password')
// 如果有保存的信息,填充到表单
if (savedUsername) {
this.loginForm.username = savedUsername
}
if (savedPassword) {
this.loginForm.password = savedPassword
}
} catch (e) {
console.error('读取本地登录信息失败:', e)
}
},
// 新增:保存登录信息到本地存储
saveLoginInfo() {
try {
// 保存用户名到本地
uni.setStorageSync('login_username', this.loginForm.username)
// 保存密码到本地
uni.setStorageSync('login_password', this.loginForm.password)
} catch (e) {
console.error('保存登录信息失败:', e)
}
},
// 用户注册
handleUserRegister() {
this.$tab.redirectTo(`/pages/register`)
@@ -120,6 +156,9 @@
},
// 登录成功后,处理函数
loginSuccess(result) {
// 3. 登录成功后保存账号密码到本地存储
this.saveLoginInfo()
// 设置用户信息
this.$store.dispatch('GetInfo').then(res => {
this.$tab.reLaunch('/pages/index')
@@ -177,7 +216,6 @@
text-align: left;
padding-left: 15px;
}
}
.login-btn {
@@ -207,5 +245,4 @@
}
}
}
</style>
</style>

View File

@@ -0,0 +1,448 @@
/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 8.0.43 : Database - klp_pocketfactory
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`klp_pocketfactory` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `klp_pocketfactory`;
/*Table structure for table `klptcm1_pdi_plan` */
DROP TABLE IF EXISTS `klptcm1_pdi_plan`;
CREATE TABLE `klptcm1_pdi_plan` (
`COILID` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`SEQID` decimal(10,0) DEFAULT NULL,
`SEQUENCENR` decimal(10,0) DEFAULT NULL,
`SCHEDULENR` decimal(10,0) DEFAULT NULL,
`ENTRY_WIDTH` decimal(10,4) DEFAULT NULL,
`ENTRY_THICK` decimal(10,4) DEFAULT NULL,
`ENTRY_LENGTH` decimal(10,4) DEFAULT NULL,
`ENTRY_WEIGHT` decimal(10,4) DEFAULT NULL,
`ENTRY_OUTER_DIAMETER` decimal(10,4) DEFAULT NULL,
`ENTRY_INNER_DIAMETER` decimal(10,4) DEFAULT '508.0000',
`STATUS` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`CUSTOMER` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`ORDERNR` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`STEEL_GRADE` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`SURFACE_CODE` decimal(10,0) DEFAULT NULL,
`YIELD_POINT` decimal(10,0) DEFAULT NULL,
`WELD_CODE` decimal(1,0) DEFAULT NULL,
`SCRAP_FLAG` decimal(10,0) DEFAULT NULL,
`THICK_TOLMAX` decimal(10,4) DEFAULT NULL,
`THICK_TOLMIN` decimal(10,4) DEFAULT NULL,
`HEADEND_GAUGE_LENGTH` decimal(10,4) DEFAULT NULL,
`TAILEND_GAUGE_LENGTH` decimal(10,4) DEFAULT NULL,
`HEAT_CYCLE` decimal(10,0) DEFAULT NULL,
`COATING_SELECTION` decimal(10,0) DEFAULT NULL,
`AIM_WEIGHT_TOP` decimal(10,4) DEFAULT NULL,
`MAXTOL_WEIGHT_TOP` decimal(10,4) DEFAULT NULL,
`AIM_WEIGHT_BOTTOM` decimal(10,4) DEFAULT NULL,
`MAXTOL_WEIGHT_BOTTOM` decimal(10,4) DEFAULT NULL,
`SPM_FLAG` decimal(10,0) DEFAULT NULL,
`SPM_ELONGATION` decimal(10,4) DEFAULT NULL,
`SPM_ROLLFORCE` decimal(10,4) DEFAULT NULL,
`SPM_PROCESS_TYPE` decimal(10,0) DEFAULT NULL,
`SPM_CONTROL_MODE` decimal(10,0) DEFAULT NULL,
`TLV_FLAG` decimal(10,0) DEFAULT NULL,
`TLV_ELONGATION` decimal(10,4) DEFAULT NULL,
`CHROMATING` decimal(10,0) DEFAULT NULL,
`COATING_CODE` decimal(10,0) DEFAULT NULL,
`OILING_FLAG` decimal(2,0) DEFAULT NULL,
`OILING_TOP` decimal(10,4) DEFAULT NULL,
`OILING_BOTTOM` decimal(10,4) DEFAULT NULL,
`SAMPLE_FLAG` decimal(10,0) DEFAULT NULL,
`SPLIT_FLAG` decimal(2,0) DEFAULT NULL,
`SPLIT_NUM` decimal(10,0) NOT NULL DEFAULT '1',
`EXIT_WEIGHT1` decimal(10,4) DEFAULT NULL,
`WINDING1` decimal(10,0) DEFAULT '1',
`CUT_MODE1` decimal(10,0) DEFAULT NULL,
`EXIT_WEIGHT2` decimal(10,4) DEFAULT NULL,
`WINDING2` decimal(10,0) DEFAULT '1',
`CUT_MODE2` decimal(10,0) DEFAULT NULL,
`EXIT_WEIGHT3` decimal(10,4) DEFAULT NULL,
`WINDING3` decimal(10,0) DEFAULT '1',
`CUT_MODE3` decimal(10,0) DEFAULT NULL,
`EXIT_WEIGHT4` decimal(10,4) DEFAULT NULL,
`WINDING4` decimal(10,0) DEFAULT '1',
`CUT_MODE4` decimal(10,0) DEFAULT NULL,
`EXIT_WEIGHT5` decimal(10,4) DEFAULT NULL,
`WINDING5` decimal(10,0) DEFAULT '1',
`CUT_MODE5` decimal(10,0) DEFAULT NULL,
`EXIT_WEIGHT6` decimal(10,4) DEFAULT NULL,
`WINDING6` decimal(10,0) DEFAULT '1',
`CUT_MODE6` decimal(10,0) DEFAULT NULL,
`EXIT_WEIGHT7` decimal(10,4) DEFAULT NULL,
`WINDING7` decimal(10,0) DEFAULT '1',
`CUT_MODE7` decimal(10,0) DEFAULT NULL,
`TIMESTAMP` datetime DEFAULT CURRENT_TIMESTAMP,
`ONLINE_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`START_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`END_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`COILID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_pdo_excoil` */
DROP TABLE IF EXISTS `klptcm1_pdo_excoil`;
CREATE TABLE `klptcm1_pdo_excoil` (
`ENCOILID` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`GRADE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`THICK_QUALITY` decimal(15,4) DEFAULT NULL,
`SHAPE_QUALITY` decimal(15,4) DEFAULT NULL,
`ENTRY_THICK` decimal(15,4) DEFAULT NULL,
`EXIT_THICK` decimal(15,4) DEFAULT NULL,
`ENTRY_WIDTH` decimal(15,4) DEFAULT NULL,
`EXIT_WIDTH` decimal(15,4) DEFAULT NULL,
`ENTRY_WEIGHT` decimal(15,4) DEFAULT NULL,
`EXIT_WEIGHT` decimal(15,4) DEFAULT NULL,
`ONLINE_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`START_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`END_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`INSDATE` datetime DEFAULT CURRENT_TIMESTAMP,
`SHIFT` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`CREW` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`EXCOILID` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_plan_trace` */
DROP TABLE IF EXISTS `klptcm1_plan_trace`;
CREATE TABLE `klptcm1_plan_trace` (
`POSITION_NAME` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`COILID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`GRADE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`ENTRY_THICK` decimal(15,4) DEFAULT NULL,
`EXIT_THICK` decimal(15,4) DEFAULT NULL,
`ENTRY_WIDTH` decimal(15,4) DEFAULT NULL,
`EXIT_WIDTH` decimal(15,4) DEFAULT NULL,
`ENTRY_WEIGHT` decimal(15,4) DEFAULT NULL,
`ENTRY_LENGTH` decimal(15,4) DEFAULT NULL,
`ENTRY_INNER_DIAMETER` decimal(10,0) DEFAULT '762',
`ENTRY_OUTER_DIAMETER` decimal(10,0) DEFAULT NULL,
`ROLL_MODE` decimal(1,0) DEFAULT NULL,
`NEXT_UNIT` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'C000',
`L1MAPIDX` decimal(3,0) NOT NULL,
`INSDATE` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`L1MAPIDX`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_pro_plant_state_current` */
DROP TABLE IF EXISTS `klptcm1_pro_plant_state_current`;
CREATE TABLE `klptcm1_pro_plant_state_current` (
`INSDATE` datetime DEFAULT CURRENT_TIMESTAMP,
`YEAR` decimal(10,0) DEFAULT NULL,
`MONTH` decimal(10,0) DEFAULT NULL,
`DAY` decimal(10,0) DEFAULT NULL,
`HOUR` decimal(10,0) DEFAULT NULL,
`MINUTE` decimal(10,0) DEFAULT NULL,
`TYPE` decimal(10,0) DEFAULT NULL,
`VALUE1` decimal(15,4) DEFAULT NULL,
`VALUE2` decimal(15,4) DEFAULT NULL,
`VALUE3` decimal(15,4) DEFAULT NULL,
`VALUE4` decimal(15,4) DEFAULT NULL,
`VALUE5` decimal(15,4) DEFAULT NULL,
`VALUE6` decimal(15,4) DEFAULT NULL,
`VALUE7` decimal(15,4) DEFAULT NULL,
`VALUE8` decimal(15,4) DEFAULT NULL,
`VALUE9` decimal(15,4) DEFAULT NULL,
`VALUE10` decimal(15,4) DEFAULT NULL,
`VALUE11` decimal(15,4) DEFAULT NULL,
`VALUE12` decimal(15,4) DEFAULT NULL,
`VALUE13` decimal(15,4) DEFAULT NULL,
`VALUE14` decimal(15,4) DEFAULT NULL,
`VALUE15` decimal(15,4) DEFAULT NULL,
`VALUE16` decimal(15,4) DEFAULT NULL,
`VALUE17` decimal(15,4) DEFAULT NULL,
`VALUE18` decimal(15,4) DEFAULT NULL,
`VALUE19` decimal(15,4) DEFAULT NULL,
`VALUE20` decimal(15,4) DEFAULT NULL,
`VALUE21` decimal(15,4) DEFAULT NULL,
`VALUE22` decimal(15,4) DEFAULT NULL,
`VALUE23` decimal(15,4) DEFAULT NULL,
`VALUE24` decimal(15,4) DEFAULT NULL,
`VALUE25` decimal(15,4) DEFAULT NULL,
`VALUE26` decimal(15,4) DEFAULT NULL,
`VALUE27` decimal(15,4) DEFAULT NULL,
`VALUE28` decimal(15,4) DEFAULT NULL,
`VALUE29` decimal(15,4) DEFAULT NULL,
`VALUE30` decimal(15,4) DEFAULT NULL,
`VALUE31` decimal(15,4) DEFAULT NULL,
`VALUE32` decimal(15,4) DEFAULT NULL,
`VALUE33` decimal(15,4) DEFAULT NULL,
`VALUE34` decimal(15,4) DEFAULT NULL,
`VALUE35` decimal(15,4) DEFAULT NULL,
`VALUE36` decimal(15,4) DEFAULT NULL,
`VALUE37` decimal(15,4) DEFAULT NULL,
`VALUE38` decimal(15,4) DEFAULT NULL,
`VALUE39` decimal(15,4) DEFAULT NULL,
`VALUE40` decimal(15,4) DEFAULT NULL,
`VALUE41` decimal(15,4) DEFAULT NULL,
`VALUE42` decimal(15,4) DEFAULT NULL,
`VALUE43` decimal(15,4) DEFAULT NULL,
`VALUE44` decimal(15,4) DEFAULT NULL,
`VALUE45` decimal(15,4) DEFAULT NULL,
`VALUE46` decimal(15,4) DEFAULT NULL,
`VALUE47` decimal(15,4) DEFAULT NULL,
`VALUE48` decimal(15,4) DEFAULT NULL,
`VALUE49` decimal(15,4) DEFAULT NULL,
`VALUE50` decimal(15,4) DEFAULT NULL,
`VALUE51` decimal(15,4) DEFAULT NULL,
`VALUE52` decimal(15,4) DEFAULT NULL,
`VALUE53` decimal(15,4) DEFAULT NULL,
`VALUE54` decimal(15,4) DEFAULT NULL,
`VALUE55` decimal(15,4) DEFAULT NULL,
`VALUE56` decimal(15,4) DEFAULT NULL,
`VALUE57` decimal(15,4) DEFAULT NULL,
`VALUE58` decimal(15,4) DEFAULT NULL,
`VALUE59` decimal(15,4) DEFAULT NULL,
`VALUE60` decimal(15,4) DEFAULT NULL,
`VALUE61` decimal(15,4) DEFAULT NULL,
`VALUE62` decimal(15,4) DEFAULT NULL,
`VALUE63` decimal(15,4) DEFAULT NULL,
`VALUE64` decimal(15,4) DEFAULT NULL,
`VALUE65` decimal(15,4) DEFAULT NULL,
`VALUE66` decimal(15,4) DEFAULT NULL,
`VALUE67` decimal(15,4) DEFAULT NULL,
`VALUE68` decimal(15,4) DEFAULT NULL,
`VALUE69` decimal(15,4) DEFAULT NULL,
`VALUE70` decimal(15,4) DEFAULT NULL,
`VALUE71` decimal(15,4) DEFAULT NULL,
`VALUE72` decimal(15,4) DEFAULT NULL,
`VALUE73` decimal(15,4) DEFAULT NULL,
`VALUE74` decimal(15,4) DEFAULT NULL,
`VALUE75` decimal(15,4) DEFAULT NULL,
`VALUE76` decimal(15,4) DEFAULT NULL,
`VALUE77` decimal(15,4) DEFAULT NULL,
`VALUE78` decimal(15,4) DEFAULT NULL,
`VALUE79` decimal(15,4) DEFAULT NULL,
`VALUE80` decimal(15,4) DEFAULT NULL,
`VALUE81` decimal(15,4) DEFAULT NULL,
`VALUE82` decimal(15,4) DEFAULT NULL,
`VALUE83` decimal(15,4) DEFAULT NULL,
`VALUE84` decimal(15,4) DEFAULT NULL,
`VALUE85` decimal(15,4) DEFAULT NULL,
`VALUE86` decimal(15,4) DEFAULT NULL,
`VALUE87` decimal(15,4) DEFAULT NULL,
`VALUE88` decimal(15,4) DEFAULT NULL,
`VALUE89` decimal(15,4) DEFAULT NULL,
`VALUE90` decimal(15,4) DEFAULT NULL,
`VALUE91` decimal(15,4) DEFAULT NULL,
`VALUE92` decimal(15,4) DEFAULT NULL,
`VALUE93` decimal(15,4) DEFAULT NULL,
`VALUE94` decimal(15,4) DEFAULT NULL,
`VALUE95` decimal(15,4) DEFAULT NULL,
`VALUE96` decimal(15,4) DEFAULT NULL,
`VALUE97` decimal(15,4) DEFAULT NULL,
`VALUE98` decimal(15,4) DEFAULT NULL,
`VALUE99` decimal(15,4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_pro_plant_state_define` */
DROP TABLE IF EXISTS `klptcm1_pro_plant_state_define`;
CREATE TABLE `klptcm1_pro_plant_state_define` (
`ID` decimal(10,0) DEFAULT NULL,
`NAME` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`UNITS` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`COMMENTS` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`INSDATE` datetime DEFAULT CURRENT_TIMESTAMP,
`MODELTYPE` decimal(10,0) DEFAULT '2'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_pro_plant_state_history` */
DROP TABLE IF EXISTS `klptcm1_pro_plant_state_history`;
CREATE TABLE `klptcm1_pro_plant_state_history` (
`INSDATE` datetime DEFAULT CURRENT_TIMESTAMP,
`YEAR` decimal(10,0) DEFAULT NULL,
`MONTH` decimal(10,0) DEFAULT NULL,
`DAY` decimal(10,0) DEFAULT NULL,
`HOUR` decimal(10,0) DEFAULT NULL,
`MINUTE` decimal(10,0) DEFAULT NULL,
`TYPE` decimal(10,0) DEFAULT NULL,
`VALUE1` decimal(15,4) DEFAULT NULL,
`VALUE2` decimal(15,4) DEFAULT NULL,
`VALUE3` decimal(15,4) DEFAULT NULL,
`VALUE4` decimal(15,4) DEFAULT NULL,
`VALUE5` decimal(15,4) DEFAULT NULL,
`VALUE6` decimal(15,4) DEFAULT NULL,
`VALUE7` decimal(15,4) DEFAULT NULL,
`VALUE8` decimal(15,4) DEFAULT NULL,
`VALUE9` decimal(15,4) DEFAULT NULL,
`VALUE10` decimal(15,4) DEFAULT NULL,
`VALUE11` decimal(15,4) DEFAULT NULL,
`VALUE12` decimal(15,4) DEFAULT NULL,
`VALUE13` decimal(15,4) DEFAULT NULL,
`VALUE14` decimal(15,4) DEFAULT NULL,
`VALUE15` decimal(15,4) DEFAULT NULL,
`VALUE16` decimal(15,4) DEFAULT NULL,
`VALUE17` decimal(15,4) DEFAULT NULL,
`VALUE18` decimal(15,4) DEFAULT NULL,
`VALUE19` decimal(15,4) DEFAULT NULL,
`VALUE20` decimal(15,4) DEFAULT NULL,
`VALUE21` decimal(15,4) DEFAULT NULL,
`VALUE22` decimal(15,4) DEFAULT NULL,
`VALUE23` decimal(15,4) DEFAULT NULL,
`VALUE24` decimal(15,4) DEFAULT NULL,
`VALUE25` decimal(15,4) DEFAULT NULL,
`VALUE26` decimal(15,4) DEFAULT NULL,
`VALUE27` decimal(15,4) DEFAULT NULL,
`VALUE28` decimal(15,4) DEFAULT NULL,
`VALUE29` decimal(15,4) DEFAULT NULL,
`VALUE30` decimal(15,4) DEFAULT NULL,
`VALUE31` decimal(15,4) DEFAULT NULL,
`VALUE32` decimal(15,4) DEFAULT NULL,
`VALUE33` decimal(15,4) DEFAULT NULL,
`VALUE34` decimal(15,4) DEFAULT NULL,
`VALUE35` decimal(15,4) DEFAULT NULL,
`VALUE36` decimal(15,4) DEFAULT NULL,
`VALUE37` decimal(15,4) DEFAULT NULL,
`VALUE38` decimal(15,4) DEFAULT NULL,
`VALUE39` decimal(15,4) DEFAULT NULL,
`VALUE40` decimal(15,4) DEFAULT NULL,
`VALUE41` decimal(15,4) DEFAULT NULL,
`VALUE42` decimal(15,4) DEFAULT NULL,
`VALUE43` decimal(15,4) DEFAULT NULL,
`VALUE44` decimal(15,4) DEFAULT NULL,
`VALUE45` decimal(15,4) DEFAULT NULL,
`VALUE46` decimal(15,4) DEFAULT NULL,
`VALUE47` decimal(15,4) DEFAULT NULL,
`VALUE48` decimal(15,4) DEFAULT NULL,
`VALUE49` decimal(15,4) DEFAULT NULL,
`VALUE50` decimal(15,4) DEFAULT NULL,
`VALUE51` decimal(15,4) DEFAULT NULL,
`VALUE52` decimal(15,4) DEFAULT NULL,
`VALUE53` decimal(15,4) DEFAULT NULL,
`VALUE54` decimal(15,4) DEFAULT NULL,
`VALUE55` decimal(15,4) DEFAULT NULL,
`VALUE56` decimal(15,4) DEFAULT NULL,
`VALUE57` decimal(15,4) DEFAULT NULL,
`VALUE58` decimal(15,4) DEFAULT NULL,
`VALUE59` decimal(15,4) DEFAULT NULL,
`VALUE60` decimal(15,4) DEFAULT NULL,
`VALUE61` decimal(15,4) DEFAULT NULL,
`VALUE62` decimal(15,4) DEFAULT NULL,
`VALUE63` decimal(15,4) DEFAULT NULL,
`VALUE64` decimal(15,4) DEFAULT NULL,
`VALUE65` decimal(15,4) DEFAULT NULL,
`VALUE66` decimal(15,4) DEFAULT NULL,
`VALUE67` decimal(15,4) DEFAULT NULL,
`VALUE68` decimal(15,4) DEFAULT NULL,
`VALUE69` decimal(15,4) DEFAULT NULL,
`VALUE70` decimal(15,4) DEFAULT NULL,
`VALUE71` decimal(15,4) DEFAULT NULL,
`VALUE72` decimal(15,4) DEFAULT NULL,
`VALUE73` decimal(15,4) DEFAULT NULL,
`VALUE74` decimal(15,4) DEFAULT NULL,
`VALUE75` decimal(15,4) DEFAULT NULL,
`VALUE76` decimal(15,4) DEFAULT NULL,
`VALUE77` decimal(15,4) DEFAULT NULL,
`VALUE78` decimal(15,4) DEFAULT NULL,
`VALUE79` decimal(15,4) DEFAULT NULL,
`VALUE80` decimal(15,4) DEFAULT NULL,
`VALUE81` decimal(15,4) DEFAULT NULL,
`VALUE82` decimal(15,4) DEFAULT NULL,
`VALUE83` decimal(15,4) DEFAULT NULL,
`VALUE84` decimal(15,4) DEFAULT NULL,
`VALUE85` decimal(15,4) DEFAULT NULL,
`VALUE86` decimal(15,4) DEFAULT NULL,
`VALUE87` decimal(15,4) DEFAULT NULL,
`VALUE88` decimal(15,4) DEFAULT NULL,
`VALUE89` decimal(15,4) DEFAULT NULL,
`VALUE90` decimal(15,4) DEFAULT NULL,
`VALUE91` decimal(15,4) DEFAULT NULL,
`VALUE92` decimal(15,4) DEFAULT NULL,
`VALUE93` decimal(15,4) DEFAULT NULL,
`VALUE94` decimal(15,4) DEFAULT NULL,
`VALUE95` decimal(15,4) DEFAULT NULL,
`VALUE96` decimal(15,4) DEFAULT NULL,
`VALUE97` decimal(15,4) DEFAULT NULL,
`VALUE98` decimal(15,4) DEFAULT NULL,
`VALUE99` decimal(15,4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_pro_stoppage` */
DROP TABLE IF EXISTS `klptcm1_pro_stoppage`;
CREATE TABLE `klptcm1_pro_stoppage` (
`STOPID` decimal(10,0) DEFAULT NULL,
`ENCOILID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`SHIFT` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`CREW` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`AREA` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`UNIT` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`SETON` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`REMARK` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '',
`START_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`END_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`DURATION` decimal(10,0) DEFAULT NULL,
`INS_DATE` datetime DEFAULT CURRENT_TIMESTAMP,
`STOP_TYPE` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_roll_history` */
DROP TABLE IF EXISTS `klptcm1_roll_history`;
CREATE TABLE `klptcm1_roll_history` (
`ROLLID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`CHANGEID` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`SETON` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`TYPE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`POSITION` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`STANDID` decimal(2,0) DEFAULT NULL,
`COMPOSITION` decimal(2,0) DEFAULT NULL,
`DIAMETER` decimal(20,6) DEFAULT NULL,
`ROUGH` decimal(20,6) DEFAULT NULL,
`CROWN` decimal(20,6) DEFAULT NULL,
`ROLLED_LENGTH` decimal(20,6) DEFAULT NULL,
`ROLLED_WEIGHT` decimal(20,6) DEFAULT NULL,
`ROLLED_COUNT` decimal(10,0) DEFAULT NULL,
`TOTAL_ROLLED_LENGTH` decimal(20,6) DEFAULT NULL,
`TOTAL_ROLLED_WEIGHT` decimal(20,6) DEFAULT NULL,
`TOTAL_ROLLED_COUNT` decimal(10,0) DEFAULT NULL,
`GRIND_COUNT` decimal(10,0) DEFAULT NULL,
`CHANGE_TYPE` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`INSTAL_TIME` datetime DEFAULT NULL,
`DEINSTAL_TIME` datetime DEFAULT NULL,
`CHANGE_TIME` datetime DEFAULT NULL,
`SEND` decimal(1,0) DEFAULT NULL,
`SHIFT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`CREW` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`SHAPE` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*Table structure for table `klptcm1_shift_current` */
DROP TABLE IF EXISTS `klptcm1_shift_current`;
CREATE TABLE `klptcm1_shift_current` (
`SHIFT` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
`CREW` decimal(10,0) DEFAULT NULL,
`SEQ_NUM` decimal(10,0) DEFAULT NULL,
`SYS_TIME` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

View File

@@ -0,0 +1,62 @@
import config from '@/config'
/**
* 测量数据 WebSocket与 l2/socket/index.vue 类似)
* 默认订阅 type=track_measure
*/
export function createMeasureSocket({
type = 'track_measure',
onOpen,
onClose,
onError,
onMessage
} = {}) {
let socket = null
let manualClose = false
const wsBase = (config.wsUrl || config.baseUrl || '').replace(/^http/, 'ws')
const url = `${wsBase}/websocket?type=${type}`
function connect() {
manualClose = false
socket = new WebSocket(url)
socket.onopen = () => {
onOpen && onOpen()
}
socket.onmessage = (evt) => {
onMessage && onMessage(evt.data)
}
socket.onerror = (err) => {
onError && onError(err)
}
socket.onclose = (evt) => {
onClose && onClose(evt)
if (!manualClose) {
setTimeout(connect, 3000)
}
}
}
function close() {
manualClose = true
if (socket) {
socket.close(1000, 'client close')
socket = null
}
}
function send(data) {
if (socket && socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify(data));
} else {
console.error('WebSocket is not open. Cannot send message.');
}
}
return { connect, close, send }
}

View File

@@ -68,4 +68,17 @@ export function deletePdo(excoilid, planId) {
})
}
/**
* PDO - 下载质保单(单卷)
* @param {string} excoilid 成品卷号
* @returns {Promise<Blob>}
*/
export function downloadWarranty(excoilid) {
return l2Request({
method: 'get',
url: `/api/pdo/warranty/download/${excoilid}`,
responseType: 'blob'
})
}

View File

@@ -79,7 +79,7 @@
<div>
<pdo-summary :table-data="tableData" />
</div>
<!-- 统计汇总和图表区域 -->
<div class="statistics-container">
@@ -535,4 +535,4 @@ export default {
height: 100%;
padding-left: 15px;
}
</style>
</style>

View File

@@ -17,6 +17,50 @@
</el-button>
</div>
<!-- 计划队列 -->
<div v-loading="planQueueLoading" class="plan-queue-section">
<div class="section-header">
<i class="el-icon-s-order"></i>
<span>生产队列</span>
<el-badge :value="sortedPlanQueue.length" class="tab-badge" style="margin-left: 10px;" />
</div>
<div class="plan-list">
<div
v-for="plan in sortedPlanQueue"
:key="plan.id"
class="plan-item"
:class="{
'plan-item-producing': plan.status === 'PRODUCING',
'plan-item-ready': plan.status === 'READY',
'plan-item-new': plan.status === 'NEW'
}"
>
<div class="plan-status">
<span class="status-dot" :class="{
'status-producing': plan.status === 'PRODUCING',
'status-ready': plan.status === 'READY',
'status-new': plan.status === 'NEW'
}"></span>
<el-tag
:type="plan.status === 'PRODUCING' ? 'success' :
plan.status === 'READY' ? 'primary' : 'info'"
size="mini"
>
{{ plan.status === 'PRODUCING' ? '生产中' :
plan.status === 'READY' ? '就绪' : '新建' }}
</el-tag>
</div>
<div class="plan-content">
<span class="plan-no">{{ plan.planid }}</span>
<span class="coil-no">{{ plan.coilid }}</span>
</div>
</div>
<div v-if="sortedPlanQueue.length === 0 && !planQueueLoading" class="empty-text">
暂无生产计划
</div>
</div>
</div>
<!-- 卡片列表 -->
<div v-loading="loading" class="card-grid-container">
<el-row :gutter="20">
@@ -60,10 +104,19 @@
type="primary"
size="mini"
icon="el-icon-s-promotion"
@click="handleSend(setup)"
@click="handleSendCurrent(setup)"
:loading="setup.sending"
>
下发
当前计划下发
</el-button>
<el-button
type="success"
size="mini"
icon="el-icon-right"
@click="handleSendNext(setup)"
:loading="setup.sendingNext"
>
下一计划下发
</el-button>
</div>
</div>
@@ -103,6 +156,7 @@
import { listSetup } from '@/api/business/setup'
import { createSendJob, executeSendJob } from '@/api/l2/sendJob'
import { getLastSuccess } from '@/api/l2/sendTemplate'
import { listPlan } from '@/api/l2/plan'
// 传动字段定义(中文界面,贴合工业场景)
const DRIVE_FIELDS = [
@@ -165,6 +219,8 @@ export default {
loading: false,
lastSuccess: null,
setups: [],
planQueueLoading: false,
planQueue: [],
driveFields: DRIVE_FIELDS,
driveAddress: { ...DRIVE_ADDRESS }
}
@@ -172,8 +228,53 @@ export default {
created() {
this.reload()
},
computed: {
// 生产队列(不含已完成),按优先级排序:生产中 > 就绪 > 新建
sortedPlanQueue() {
const statusPriority = { PRODUCING: 1, READY: 2, NEW: 3 }
return (this.planQueue || []).slice().sort((a, b) => {
const pa = statusPriority[a.status] || 999
const pb = statusPriority[b.status] || 999
return pa - pb
})
},
// 下一计划队列中第一个非生产中计划READY/NEW若没有则取队列第一个
nextPlan() {
const list = this.sortedPlanQueue
if (!list.length) return null
const next = list.find(p => p.status !== 'PRODUCING')
return next || list[0]
}
},
methods: {
// 获取生产计划队列
async getPlanQueue() {
this.planQueueLoading = true
try {
// 查询状态为 PRODUCING, READY, NEW 的计划
const res = await listPlan({
status: 'PRODUCING,READY,NEW',
pageSize: 100, // 获取足够多的计划
pageNum: 1
})
this.planQueue = res.data || []
} catch (e) {
console.error('获取计划队列失败:', e)
this.$message.error('获取计划队列失败')
} finally {
this.planQueueLoading = false
}
},
async reload() {
// 同时加载计划队列和设置
await Promise.all([
this.getPlanQueue(),
this.loadSetups()
])
},
async loadSetups() {
this.loading = true
try {
// 1. 获取传动模块上次成功下发数据
@@ -204,7 +305,8 @@ export default {
return {
...s,
params,
sending: false
sending: false,
sendingNext: false
}
})
} catch (e) {
@@ -242,7 +344,7 @@ export default {
return new Date(t).toLocaleString()
},
handleSend(setup) {
handleSendCurrent(setup) {
this.$confirm(
`确认要下发【${setup.coilid || '-'}】钢卷的传动参数吗?`,
'提示',
@@ -254,29 +356,53 @@ export default {
).then(() => this.doSend(setup)).catch(() => {})
},
async doSend(setup) {
setup.sending = true
handleSendNext(setup) {
if (!this.nextPlan) {
this.$message.warning('暂无下一计划')
return
}
const plan = this.nextPlan
this.$confirm(
`确认要按下一计划【${plan.coilid || '-'}】下发传动参数吗?`,
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => this.doSendNextPlan(setup, plan)).catch(() => {})
},
async doSend(setup, plan) {
const isNextPlan = !!plan
if (isNextPlan) {
setup.sendingNext = true
} else {
setup.sending = true
}
try {
const items = this.driveFields.map(f => ({
paramCode: f.key,
address: this.driveAddress[f.key],
valueRaw: String(setup.params[f.key] || ''),
setTime: new Date()
})).filter(it => !!it.address) // 过滤无OPC地址的项
})).filter(it => !!it.address)
if (!items.length) {
this.$message.warning('OPC地址未配置无可下发内容')
return
}
const bizKey = isNextPlan ? plan.coilid : setup.coilid
const dto = {
deviceName: 'CGL_LINE_1',
bizKey: setup.coilid,
bizKey: bizKey,
groups: [
{
groupNo: 1,
groupType: 'DRIVE',
groupName: `传动参数_${setup.coilid || ''}`,
groupName: `传动参数_${bizKey || ''}`,
items
}
]
@@ -294,8 +420,16 @@ export default {
console.error(e)
this.$message.error(e.message || '下发失败')
} finally {
setup.sending = false
if (isNextPlan) {
setup.sendingNext = false
} else {
setup.sending = false
}
}
},
doSendNextPlan(setup, plan) {
this.doSend(setup, plan)
}
}
}
@@ -303,6 +437,60 @@ export default {
<style scoped>
.toolbar { margin-bottom: 20px; display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.plan-queue-section {
margin-bottom: 20px;
background: #ffffff;
border: 1px solid #dcdfe6;
border-radius: 4px;
}
.section-header {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 15px;
background: #f5f7fa;
border-bottom: 1px solid #e4e7ed;
font-weight: 600;
color: #303133;
}
.plan-list {
padding: 10px;
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.plan-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
background: #ffffff;
border: 1px solid #e4e7ed;
border-left: 3px solid #409eff;
border-radius: 4px;
min-width: 220px;
}
.plan-item-producing { border-left-color: #67c23a; }
.plan-item-ready { border-left-color: #409eff; }
.plan-item-new { border-left-color: #909399; }
.plan-status { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.plan-content { display: flex; flex-direction: column; gap: 2px; }
.plan-no { font-weight: 600; color: #409eff; }
.coil-no { font-size: 12px; color: #606266; }
.status-dot { width: 10px; height: 10px; border-radius: 50%; }
.status-producing { background: #67c23a; box-shadow: 0 0 6px rgba(103, 194, 58, 0.6); }
.status-ready { background: #409eff; box-shadow: 0 0 6px rgba(64, 158, 255, 0.5); }
.status-new { background: #909399; box-shadow: 0 0 6px rgba(144, 147, 153, 0.4); }
.empty-text { padding: 10px; color: #909399; }
.card-grid-container { min-height: 300px; }
.card-col { margin-bottom: 20px; }
.parameter-card .card-header { display:flex; justify-content:space-between; align-items:center; }
@@ -310,7 +498,7 @@ export default {
.card-title-row { margin-bottom: 4px; }
.card-title { font-weight: 600; font-size: 16px; }
.card-subtitle { font-size: 12px; color: #909399; display: flex; gap: 12px; }
.header-right { flex-shrink: 0; margin-left: 16px; }
.header-right { flex-shrink: 0; margin-left: 16px; display: flex; gap: 8px; align-items: center; }
.last-send-time { font-size: 12px; color:#909399; margin-right:16px; }
.empty-data { margin-top: 20px; }
</style>

166
package-lock.json generated Normal file
View File

@@ -0,0 +1,166 @@
{
"name": "my-turborepo",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "my-turborepo",
"devDependencies": {
"turbo": "^2.5.8"
}
},
"node_modules/turbo": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo/-/turbo-2.6.3.tgz",
"integrity": "sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==",
"dev": true,
"bin": {
"turbo": "bin/turbo"
},
"optionalDependencies": {
"turbo-darwin-64": "2.6.3",
"turbo-darwin-arm64": "2.6.3",
"turbo-linux-64": "2.6.3",
"turbo-linux-arm64": "2.6.3",
"turbo-windows-64": "2.6.3",
"turbo-windows-arm64": "2.6.3"
}
},
"node_modules/turbo-darwin-64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.6.3.tgz",
"integrity": "sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
]
},
"node_modules/turbo-darwin-arm64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.6.3.tgz",
"integrity": "sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
]
},
"node_modules/turbo-linux-64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.6.3.tgz",
"integrity": "sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
]
},
"node_modules/turbo-linux-arm64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.6.3.tgz",
"integrity": "sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
]
},
"node_modules/turbo-windows-64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.6.3.tgz",
"integrity": "sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
]
},
"node_modules/turbo-windows-arm64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.6.3.tgz",
"integrity": "sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
]
}
},
"dependencies": {
"turbo": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo/-/turbo-2.6.3.tgz",
"integrity": "sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==",
"dev": true,
"requires": {
"turbo-darwin-64": "2.6.3",
"turbo-darwin-arm64": "2.6.3",
"turbo-linux-64": "2.6.3",
"turbo-linux-arm64": "2.6.3",
"turbo-windows-64": "2.6.3",
"turbo-windows-arm64": "2.6.3"
}
},
"turbo-darwin-64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.6.3.tgz",
"integrity": "sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==",
"dev": true,
"optional": true
},
"turbo-darwin-arm64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.6.3.tgz",
"integrity": "sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==",
"dev": true,
"optional": true
},
"turbo-linux-64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.6.3.tgz",
"integrity": "sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==",
"dev": true,
"optional": true
},
"turbo-linux-arm64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.6.3.tgz",
"integrity": "sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==",
"dev": true,
"optional": true
},
"turbo-windows-64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.6.3.tgz",
"integrity": "sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==",
"dev": true,
"optional": true
},
"turbo-windows-arm64": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.6.3.tgz",
"integrity": "sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==",
"dev": true,
"optional": true
}
}
}