From 3b826cbf1275f55717f13f71f78c75504183ec56 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期四, 31 七月 2025 16:22:28 +0800
Subject: [PATCH] 更新到大连仁人inbody分析仪接口
---
app.js | 282 +++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 187 insertions(+), 95 deletions(-)
diff --git a/app.js b/app.js
index 1c11c5e..373b4c8 100644
--- a/app.js
+++ b/app.js
@@ -2,24 +2,18 @@
const bodyParser = require('body-parser');
const mysql = require('mysql2');
const fs = require('fs').promises;
-const fs2=require('fs')
const path = require('path');
-const moment = require('moment')
-const axios = require('axios');
+const logger = require(path.resolve(__dirname, 'logger'));
// 转成能识别的url
const ViapiUtil = require('@alicloud/viapi-utils');
const facebody20191230 = require('@alicloud/facebody20191230');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
-const thirdPartyApi = require('./thirdPartyApi');
-
-/**token缓存 */
-let cachedToken = null;
-/**token缓存时间 */
-let tokenExpiresAt = null;
+const thirdPartyApi = require(path.resolve(__dirname, 'thirdPartyApi'));
const app = express();
+app.use(bodyParser.json())
const port = 3000;
// 设置 JSON 请求体的最大大小为 5MB
@@ -54,27 +48,18 @@
return new facebody20191230.default(config);
}
app.get('/', (req, res) => {
- const title = '岱特智能'; // 动态设置标题
- const html = `
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>${title}</title>
- </head>
- <body>
- <iframe
- src="https://udify.app/chatbot/irsmISE8DBCWAhxz"
- style="width: 100%; height: 100%; min-height: 700px"
- frameborder="0"
- allow="microphone">
- </iframe>
- </body>
- </html>
- `;
- res.send(html);
+
+ res.json({mas:'h'});
});
+app.get('/test', async (req, res) => {
+try {
+const token=await thirdPartyApi.getAccessToken()
+logger.info('返回token=='+JSON.stringify(token))
+res.json(token);
+}catch(err){
+ logger.info('catch=='+JSON.stringify(err))
+}
+});
// 定义 /webuser 路由处理器 用患者code 换信息
app.post('/webuser', async (req, res) => {
const mode=req.body
@@ -83,12 +68,13 @@
const deviceID = req.body.deviceID;
const type = req.body.type;
const xid = req.body.xid;
- console.log(`action=${action},deviceID=${deviceID},type=${type},xid=${xid}`)
+ logger.info(`成分分析仪用户请求req body action=${action},deviceID=${deviceID},type=${type},xid=${xid}`)
if (action === 'doWebUser' && deviceID && type !== undefined) {
try {
const pathParams={code:xid}
const data = await thirdPartyApi.fetchThirdPartyData('/patient/info/detail2', 'POST', {}, null, pathParams,{});
- console.log('--------------获取到了患者信息',data.data)
+ logger.info(`get patInfo data=${JSON.stringify(data)}`)
+ console.log('get patInfo ----',data.data)
// console.log(data)
if(data?.code===200&&data?.message==='SUCCESS'&&data?.data){
const user = data.data;
@@ -104,7 +90,8 @@
},
remsg: "success"
};
- console.log('返回患者信息成功')
+ logger.info('Successfully returned patient information')
+ console.log('Successfully returned patient information')
}else{
response = {
retcode: 1001,
@@ -115,6 +102,7 @@
} catch (err) {
console.error(err);
+ logger.error(err)
res.status(500).json({ retCode: "-1", msg: err });
}
} else {
@@ -122,47 +110,6 @@
res.status(400).json({ retCode: "-1", msg: "Invalid request parameters" });
}
});
-app.post('/webuserPatientId',async(req,res)=>{
- const mode=req.body
- logHttps(mode)
- const patientId = req.query.patientId;
- if (patientId) {
- try {
- const pathParams={code:xid}
- const data = await thirdPartyApi.fetchThirdPartyData('/patient/info/detail2', 'POST', {}, null, pathParams,{});
- console.log('--------------获取到了患者信息')
- // console.log(data)
- if(data?.code===200&&data?.message==='SUCCESS'&&data?.data){
- const user = data.data;
- response = {
- recode: 2001,
- userinfo: {
- name: user.patientName,
- sex: user.patientGenderText,
- age: user.age,
- usernum: user.code, //这个是数据返回会携带回来UID
- address: user.patientAddress,
- remark: '患者人脸识别111'
- },
- remsg: "success"
- };
- console.log('返回患者信息成功')
- }else{
- response = {
- retcode: 1001,
- remsg: "没有找到患者,请先检查患者code"
- };
- }
- } catch (err) {
- console.error(err);
- res.status(500).json({ retCode: "-1", msg: "Database error" });
- }
- } else {
- // 如果请求参数不符合预期,则返回错误信息
- res.status(400).json({ retCode: "-1", msg: "Invalid request parameters" });
- }
-})
-
// 定义人脸识别 用base64图片文件换患者信息
app.post('/faceuser', async (req, res) => {
try{
@@ -172,11 +119,11 @@
const content = req.body.content;
const mode=req.body
mode.content=''
- logHttps(mode)
+ logger.info(`人脸识别请求deviceID=${deviceID},action=${action}`)
if (action == 'doFace' && deviceID && content) {
// 转成oss路径
const ossurl = await base64toFile(content, deviceID)
- console.log('得到oss图片路径', ossurl)
+ logger.info(`得到oss图片路径=${ossurl}`)
let searchFaceRequest = new facebody20191230.SearchFaceRequest({
dbName: 'Face_systemtest',
imageUrl: ossurl,
@@ -192,7 +139,7 @@
if (matchList?.length > 0) {
const faceItems = matchList[0].faceItems
if (faceItems?.length === 0) {
- console.log('没有找到患者对应的人脸')
+ logger.info(`没有找到患者对应的人脸`)
response = {
retCode: "0",
msg: "没有找到患者,请先检查患者code"
@@ -202,8 +149,7 @@
console.log(entityId, '患者id找到了')
const pathParams={code:entityId}
const data = await thirdPartyApi.fetchThirdPartyData('/patient/info/detail2', 'POST', {}, null, pathParams,{});
- console.log('--------------获取到了患者信息')
- // console.log(data)
+ logger.info(`患者接口请求成功`)
if(data?.code===200&&data?.message==='SUCCESS'&&data?.data){
const user = data.data;
response = {
@@ -218,7 +164,7 @@
},
remsg: "success"
};
- console.log('返回患者信息成功')
+ logger.info(`返回患者信息成功=${user.patientName}`)
}else{
response = {
retcode: 1001,
@@ -263,7 +209,7 @@
const deviceID = req.body.deviceID;
const mode=req.body
mode.action='webResults'
- logHttps(mode)
+ logger.info(`人体成分分析仪结果返回请求deviceID=${deviceID},action=${JSON.stringify(mode)}`)
try {
const datas=mode.datas
@@ -292,7 +238,7 @@
}
console.log(data)
const resdata = await thirdPartyApi.fetchThirdPartyData('/patient/rtcf/result/save', 'POST', {}, data,{},{});
- console.log('-----返回人体成分分析保存')
+ logger.info(`结果插入成功`)
console.log(resdata)
});
response = {
@@ -302,6 +248,7 @@
res.json(response)
}catch(err){
+ logger.errer(`结果插入失败`)
res.status(4000).json({ reCode: "4000", msg: "Invalid request parameters" });
}
@@ -316,7 +263,7 @@
const clientCode = req.query.clientCode;
const mode={"action":'getpatientInfo',"patientId":patientId,}
console.log(patientId,'-----------------',clientCode)
- logHttps(mode)
+ logger.info(`血流量设备请求患者信息,请求参数=${patientId},clintCode=${clientCode}`)
if(patientId&&clientCode){
// 输出传入的patientid值
try {
@@ -350,21 +297,21 @@
diagnosisDoctor:''
})
})
+ logger.info(`血流量设备请求患者信息,请求成功返回患者信息=${JSON.stringify(users)}`)
res.json(users);
} else {
- const response = {
- retCode: "0",
- msg: "没有找到患者,请先检查患者code"
- };
+ logger.info(`血流量设备请求患者信息,请求成功返回患者信息=[]`)
res.json([]);
}
} catch (err) {
console.error(err);
+ logger.errer(`血流量设备请求患者信息,请求失败=${err}`)
res.status(500).json({ retCode: "-1", msg: "接口出错!"+err });
}
}else{
// 如果请求参数不符合预期,则返回错误信息
+
res.status(400).json({ retCode: "-1", msg: "请求参数出错" });
}
@@ -382,11 +329,7 @@
}
const body=req.body
console.log(body)
- const mode={
- action:'PostCheckExam',
- params:body.examId
- }
- logHttps(mode)
+ logger.info(`血流量设备上报结果,请求信息clientCode=${clientCode}`)
// 组合上传数据
const data={
id:0,
@@ -441,10 +384,10 @@
image:body.image,
request_doctor:body.requestDoctor,
request_department:body.requestDepartment,
- request_date:body.requestDate,
+ request_date:getDateString(body.requestDate),
exam_department:body.examDepartment,
diagnostician_doctor:body.diagnosticianDoctor,
- check_date:body.checkDate,
+ check_date:getDateString(body.checkDate),
check_result:body.checkResult,
diagnosis:body.diagnosis,
exam_type_id:body.examTypeId,
@@ -456,22 +399,114 @@
const resdata = await thirdPartyApi.fetchThirdPartyDataNoToke('/patient/result/from/doppler/blood/flow/device/saveData', 'POST', {}, data,{},{});
console.log(resdata)
if(resdata.code===200&&resdata?.data=='OK'){
+ logger.info(`血流量设备上报结果,请求成功`)
res.json({"Msg": "检查结果上传成功", "Status": "SUCCESS" });
+
}else{
+ logger.info(`血流量设备上报结果,请求失败`)
res.json({"Msg": "检查结果上传失败", "Status": "err" });
}
}
catch(err){
- console.log(err)
- res.status(400).json({ retCode: "-1", msg: "请求出错了" });
+ logger.info(`血流量设备上报结果,请求报错`)
+ res.status(400).json({ retCode: "-1", msg: "请求出错了11" });
}
})
+// 大连新的InBody 人体成分分析仪患者注册
+app.post('/inbodyapi/getuserinfo',async (req, res) => {
+ logger.info(`人体成分分析仪患者注册请求body=${JSON.stringify(req.body)}`)
+ // 从请求体中获取用户信息
+ // 这里假设请求体包含 USER_ID 和 ORDER_DATE 字段
+ const { USER_ID, ORDER_DATE } = req.body;
+ // 检查请求参数是否有效
+ if (!USER_ID) {
+ return res.status(400).json({
+ IsResult: false,
+ INBODY_USER_INFO: [],
+ ErrorMsg: 'USER_ID or ORDER_DATE is missing'
+ });
+ }
+ const pathParams = { clientCode:'CLIENT9195181802236kHJF',patientHemoCode:USER_ID}
+ const data = await thirdPartyApi.fetchThirdPartyData('/patient/info/queryInAndOuts', 'POST', {}, pathParams, {},{});
+ // console.log('查询InAndOuts数据',data)
+ if(data.code===200&&data?.message==='SUCCESS'&&data?.data){
+ const list= data.data.list;
+ if(list.length>0){
+
+ console.log(list[0])
+ const mode=list[0]
+ const user={
+ USER_ID: mode.patientHemoCode,
+ USER_NAME: mode.patientName,
+ USER_GENDER: mode.patientGender===0? 'M':'F',
+ USER_BIRTHDAY: '',
+ USER_AGE: mode.age,
+ USER_HEIGHT: mode.patientHeight,
+ ORDER_DATE:mode.code
+ }
+ res.json({
+ IsResult: true,
+ INBODY_USER_INFO: [user],
+ ErrorMsg: ''
+ });
+
+ logger.info(`请求患者成功:${mode.patientName}`)
+ }
+ else{
+ res.json({
+ IsResult: false,
+ INBODY_USER_INFO: [],
+ ErrorMsg: 'User not found'
+ });
+ logger.info(`请求患者失败:没有找到用户`)
+ }
+ }else{
+ res.json({
+ IsResult: false,
+ INBODY_USER_INFO: [],
+ ErrorMsg: 'User not found'
+ });
+ logger.info(`请求患者失败:没有找到用户`)
+ }
+})
+app.post('/inbodyapi/setinbodydata',async (req, res) => {
+ logger.info(`人体成分分析仪结果请求body=${JSON.stringify(req.body)}`)
+ const element = req.body;
+ try {
+ const data={
+ id:0,
+ code:'',
+ // code:element.DATETIMES,
+ patientCode:element.ORDER_DATE,
+ commTime:formatted(),
+ uploadTime:formatTimestamp(element.DATETIMES),
+ rtcfJsonBmi:JSON.stringify(element),
+ }
+ const resdata = await thirdPartyApi.fetchThirdPartyData('/patient/rtcf/result/save', 'POST', {}, data,{},{});
+ if(resdata.code===200&&resdata?.message==='SUCCESS'){
+ logger.info(`结果插入成功`+JSON.stringify(resdata))
+ res.json({
+ IsResult: true,
+ ErrorMsg: 'User not found'
+ });
+ }else{
+ logger.info(`结果插入失败`+JSON.stringify(resdata))
+ }
+ } catch (error) {
+ return res.status(400).json({
+ IsResult: false,
+ ErrorMsg: error
+ });
+ }
+})
+
// 启动服务器
app.listen(port, async () => {
+ logger.info(`Server running at http://localhost:${port}/`)
console.log(`Server running at http://localhost:${port}/`);
});
/**
@@ -564,3 +599,60 @@
return age;
}
+
+/**
+ * 时间戳转string 输出: "2024-01-08 00:00:00" (假设时区为东八区)
+ * @param {*} date
+ */
+function getDateString(date){
+ try{
+ if(date){
+ let timestamp = 1734624000000;
+ let d = new Date(timestamp);
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`;
+ }else{
+ return ''
+ }
+ }
+ catch(err){
+ console.log(err)
+ return ''
+ }
+
+
+}
+function getCurrentDateFormatted() {
+ const date = new Date();
+
+ const year = date.getFullYear(); // 获取年份,如 2025
+
+ const month = String(date.getMonth() + 1).padStart(2, '0'); // 获取月份(0-11),需要 +1,然后补零
+
+ const day = String(date.getDate()).padStart(2, '0'); // 获取日期,并补零
+
+ return `${year}${month}${day}`;
+}
+function formatTimestamp(timestampStr) {
+ const str = String(timestampStr);
+
+ // 使用正则表达式匹配 YYYYMMDDHHMMSS 并分组
+ const match = str.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/);
+
+ if (!match) {
+ throw new Error("Invalid timestamp format");
+ }
+
+ // 重组为 YYYY-MM-DD HH:mm:ss
+ return `${match[1]}-${match[2]}-${match[3]} ${match[4]}:${match[5]}:${match[6]}`;
+}
+
+
+function formatted() {
+ const date = new Date();
+ return date.getFullYear() + '-' +
+ String(date.getMonth() + 1).padStart(2, '0') + '-' +
+ String(date.getDate()).padStart(2, '0') + ' ' +
+ String(date.getHours()).padStart(2, '0') + ':' +
+ String(date.getMinutes()).padStart(2, '0') + ':' +
+ String(date.getSeconds()).padStart(2, '0');
+}
\ No newline at end of file
--
Gitblit v1.8.0