From bc9ea4cb108e4a4403889103778c905ff3e66ab9 Mon Sep 17 00:00:00 2001 From: "gao.zhiyuan" Date: Tue, 20 Dec 2022 15:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=BD=95=E5=85=A5=E6=91=84?= =?UTF-8?q?=E5=83=8F=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.vscode/launch.json | 17 ++++ .../data/1_update_status_code_data/index.js | 78 ++++++++++++++++++ .../1_update_status_code_data/package.json | 17 ++++ .../摄像头信息对接.xlsx | Bin 0 -> 12431 bytes 4 files changed, 112 insertions(+) create mode 100644 code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/.vscode/launch.json create mode 100644 code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/index.js create mode 100644 code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/package.json create mode 100644 code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/摄像头信息对接.xlsx diff --git a/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/.vscode/launch.json b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/.vscode/launch.json new file mode 100644 index 0000000..3a3fcba --- /dev/null +++ b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "启动程序", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\index.js" + } + ] +} \ No newline at end of file diff --git a/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/index.js b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/index.js new file mode 100644 index 0000000..8a1a017 --- /dev/null +++ b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/index.js @@ -0,0 +1,78 @@ +try { + const { Pool, Client } = require('pg') + const XLSX = require('xlsx') + const path = require('path') + const moment = require('moment') + + // 连接数据库 + const pool = new Pool({ + user: 'postgres', + host: '10.8.30.32', + database: 'video_access', + password: '123', + port: 5432, + }) + + const fun = async () => { + // note: we don't try/catch this because if connecting throws an exception + // we don't need to dispose of the client (it will be undefined) + const client = await pool.connect() + try { + await client.query('BEGIN') + + // 读取数据文件 + let workbook = XLSX.readFile(path.join(__dirname, '摄像头信息对接.xlsx')) + let firstSheetName = workbook.SheetNames[0]; + let worksheet = workbook.Sheets[firstSheetName]; + let res = XLSX.utils.sheet_to_json(worksheet); + + // console.log(res); + + const yingshiSecretRes = await client.query(`SELECT * FROM secret_yingshi WHERE key='88c43faadfd545baaaadbb1a84a060d5'`) + console.log(yingshiSecretRes); + let secretRes = null + if (yingshiSecretRes && yingshiSecretRes.rows && yingshiSecretRes.rows.length) { + secretRes = yingshiSecretRes.rows[0] + } else { + throw '没有目标 SECRET' + } + + for (let d of res) { + console.log(`处理${d['设备序列号']} ${d['通道号']} USER ${d['userid']}`); + + let gbRes = await client.query(`SELECT * FROM "gbCamera" WHERE ipctype=$1 AND streamid=$2`, ['yingshi', d['设备序列号']]) + + let gb = null + if (gbRes.rows.length) { + gb = gbRes.rows[0] + } else { + console.log(`GB 里没查到`) + continue + } + + let cameraRes = await client.query(`SELECT * FROM camera WHERE type=$1 AND serial_no=$2 AND create_user_id=$3 AND channel_no=$4`, ['yingshi', d['设备序列号'], d['userid'], d['通道号']]); + let cameraRows = cameraRes.rows + + if (cameraRows.length) { + console.log(`添加过了`); + } else { + await client.query(`INSERT INTO "camera" (type, name, serial_no, cloud_control, high_definition, voice, longitude,latitude, forbidden, create_time, delete, create_user_id, yingshi_secret_id, gb_id, channel_no, kind_id) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)`, ['yingshi', gb.name || null, d['设备序列号'], false, true, false, 115.88, 28.54, false, moment().format('YYYY-MM-DD HH:mm:ss'), false, d['userid'], secretRes.id, gb.id, d['通道号'], 1]); + } + } + + // await client.query('ROLLBACK') + await client.query('COMMIT') + console.log('执行完毕~') + } catch (e) { + await client.query('ROLLBACK') + console.log('执行错误~') + throw e + } finally { + client.release(); + } + } + + fun() +} catch (error) { + console.error(error) +} diff --git a/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/package.json b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/package.json new file mode 100644 index 0000000..ed3062f --- /dev/null +++ b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/package.json @@ -0,0 +1,17 @@ +{ + "name": "appkey-generator", + "version": "1.0.0", + "description": "tool", + "main": "index.js", + "scripts": { + "test": "mocha", + "start": "set NODE_ENV=development&&node index" + }, + "author": "liu", + "license": "ISC", + "dependencies": { + "moment": "^2.29.4", + "pg": "^7.18.2", + "xlsx": "^0.17.1" + } +} diff --git a/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/摄像头信息对接.xlsx b/code/VideoAccess-VCMP/script/1.3.6/data/1_update_status_code_data/摄像头信息对接.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fdca9675867ca6fbd82e6dfa7f1674ba3f65387b GIT binary patch literal 12431 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