test.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. // 异或和校验
  2. function xor_verify(data){
  3. if (data.length < 2){
  4. return false;
  5. }
  6. var xor_sum = xor(data, 1, data.length - 2);
  7. if (xor_sum == data[data.length - 1]){
  8. return true;
  9. }
  10. return false;
  11. }
  12. // 获取异或和
  13. function xor(data, start, end){
  14. var xor_sum = data[start];
  15. for (var i = start + 1; i < end + 1; i++){
  16. xor_sum ^= data[i];
  17. }
  18. return xor_sum;
  19. }
  20. // crc校验
  21. function crc(bytes) {
  22. // CRC寄存器全为1
  23. var CRC = 0x0000ffff;
  24. // 多项式校验值
  25. var POLYNOMIAL = 0x0000a001;
  26. for (var i = 0; i < bytes.length; i++) {
  27. CRC ^= bytes[i] & 0x000000ff;
  28. for (var j = 0; j < 8; j++) {
  29. if (CRC & 0x00000001 != 0) {
  30. CRC >>= 1;
  31. CRC ^= POLYNOMIAL;
  32. } else {
  33. CRC >>= 1;
  34. }
  35. }
  36. }
  37. return CRC;
  38. }
  39. function crc_verify(data){
  40. var verifyBytes = ConvertToUint8Array(data, 1, data.length - 2);
  41. var crcBytes = ConvertToUint8Array(data, data.length - 2, data.length);
  42. var thisCrc = crc(verifyBytes);
  43. var thatCrc = new DataView(crcBytes.buffer).getUint16(0, true);
  44. if (thisCrc == thatCrc){
  45. return true;
  46. }
  47. return false;
  48. }
  49. // 字节数组
  50. function ArrayToHexString(data,start,end){
  51. start = start?start:0;
  52. end = end?end:data.length;
  53. var Hex = '';
  54. for (var i =start; i < end; i++) {
  55. var s = data[i].toString(16);
  56. if (s.length == 1) {
  57. s = "0"+s;
  58. }
  59. Hex += s;
  60. }
  61. return Hex.toUpperCase();
  62. }
  63. function ConvertToUint8Array(rawData, start, end) {
  64. start = start?start:0;
  65. end = end?end:rawData.length;
  66. var uint8Array = new Uint8Array(end - start);
  67. for (var i = start; i < end; i++) {
  68. uint8Array[i-start] = rawData[i] & 0xff;
  69. }
  70. return uint8Array;
  71. }
  72. // 合并字节数组
  73. function concat(array1, array2) {
  74. var uint8Array = new Uint8Array(array1.length + array2.length);
  75. for (var i = 0; i < array1.length; i++) {
  76. uint8Array[i] = array1[i] & 0xff;
  77. }
  78. for (var j = 0; j < array2.length; j++) {
  79. uint8Array[j + array1.length] = array2[j] & 0xff;
  80. }
  81. return uint8Array;
  82. }
  83. // 解析报警数据
  84. function analysis_old_alarm(dataArray, obj) {
  85. obj.dataType = 5;
  86. // 报警数据
  87. var dataView = new DataView(dataArray.buffer, 0);
  88. // 类型【1】
  89. var type = dataView.getUint8(1);
  90. if (type == 0x15){
  91. obj.pumpType = 1;
  92. }else if (type == 0x25){
  93. obj.pumpType = 2;
  94. }else if (type == 0x35){
  95. obj.pumpType = 3;
  96. }else {
  97. obj.pumpType = 0;
  98. obj.msg = '泵类型不存在';
  99. return;
  100. }
  101. // 泵号【2-9】
  102. obj.pumpCode = ArrayToHexString(dataArray, 2, 10);
  103. // 住院号【10-13】
  104. if (obj.pumpType == 1 && dataArray.length == 36){
  105. obj.patientCodeArray = concat(ConvertToUint8Array(dataArray, 10, 14), ConvertToUint8Array(dataArray, 32, 34));
  106. } else if (obj.pumpType == 2 && dataArray.length == 39){
  107. obj.patientCodeArray = concat(ConvertToUint8Array(dataArray, 10, 14), ConvertToUint8Array(dataArray, 35, 37));
  108. } else {
  109. obj.patientCodeArray = ConvertToUint8Array(dataArray, 10, 14);
  110. }
  111. var patientCodeDataView = new DataView(obj.patientCodeArray.buffer);
  112. var patientCode = patientCodeDataView.getUint32(0, true);
  113. if (patientCodeDataView.byteLength == 6){
  114. patientCode += patientCodeDataView.getUint16(4, true) * 1000000000;
  115. }
  116. obj.patientCode = patientCode + '';
  117. // 病区【14-15】
  118. obj.ward = dataView.getUint16(14, true);
  119. // 床号【16-17】
  120. obj.bedNo = dataView.getUint16(16, true);
  121. // 持续量【18-19】
  122. obj.continueDose = dataView.getUint16(18, true) * 0.1;
  123. // 锁定时间【20-21】
  124. obj.lockTime = dataView.getUint16(20, true);
  125. // 极限量【22-23】
  126. obj.ultimateDose = dataView.getUint16(22, true);
  127. // 首次量【24】
  128. obj.firstDose = dataView.getUint8(24);
  129. // 追加量【25-26】
  130. obj.appendDose = dataView.getUint16(25, true) * 0.1;
  131. // 报警【29】
  132. obj.alarm = [];
  133. obj.forcast = [];
  134. var alarmByte = dataView.getUint8(29);
  135. // 未装药盒 9
  136. if ((alarmByte & 0x03) == 0x03){
  137. obj.alarm.push(9);
  138. } else if ((alarmByte & 0x01) == 0x01){
  139. // 气泡或无液 1
  140. obj.alarm.push(1);
  141. } else if ((alarmByte & 0x02) == 0x02){
  142. // 堵塞 2
  143. obj.alarm.push(2);
  144. }
  145. // 总量 3
  146. if ((alarmByte & 0x04) == 0x04){
  147. obj.alarm.push(3);
  148. }
  149. // 极限量 4
  150. if ((alarmByte & 0x08) == 0x08){
  151. obj.alarm.push(4);
  152. }
  153. // 输液将结束 1
  154. if ((alarmByte & 0x10) == 0x10){
  155. obj.forcast.push(1);
  156. }
  157. // 输液结束 6
  158. if ((alarmByte & 0x20) == 0x20){
  159. obj.alarm.push(6);
  160. }
  161. // 电量偏低预警 5
  162. if ((alarmByte & 0x40) == 0x40){
  163. obj.alarm.push(5);
  164. }
  165. // 电量偏低预报 3
  166. if ((alarmByte & 0x80) == 0x80){
  167. obj.forcast.push(3);
  168. }
  169. var alarmByte30 = dataView.getUint8(30);
  170. // 点击失控 7
  171. if ((alarmByte30 & 0x0f) == 0x01){
  172. obj.alarm.push(7);
  173. } else if ((alarmByte30 & 0x0f) == 0x02){
  174. // 机器故障 8
  175. obj.alarm.push(8);
  176. }
  177. // 无报警
  178. if (obj.alarm.length == 0){
  179. obj.alarm.push(0);
  180. }
  181. // 无预报
  182. if (obj.forcast.length == 0){
  183. obj.forcast.push(0);
  184. }
  185. // 运行状态【30】
  186. obj.runStatus = (dataArray[30] & 0xf0) >> 4;
  187. // 电池电量【31】
  188. obj.electricity = dataView.getUint8(31);
  189. // 脉冲泵的属性
  190. if (obj.pumpType == 2){
  191. // 首次量锁时【32】
  192. obj.firstLockTime = dataView.getUint8(32);
  193. // 脉冲量【33】
  194. obj.pulseDose = dataView.getUint8(33);
  195. // 脉冲量锁时【34】
  196. obj.pulseLockTime = dataView.getUint8(34);
  197. } else if (obj.pumpType == 3){
  198. // 智能泵的属性
  199. // 加档时间【32】
  200. obj.filingCycle = dataView.getUint8(32) * 0.1;
  201. // 减档时间【33】
  202. obj.reductionPeriod = dataView.getUint8(33) * 0.1;
  203. // 加档PCA有效计数【34】
  204. obj.addTrueFrequency = dataView.getUint8(34);
  205. // 自调比例【35】
  206. obj.customScate = dataView.getUint8(35);
  207. // 加档上限【36】
  208. var data36 = dataView.getUint8(36);
  209. if (data36 > 100){
  210. obj.upperLimit = (data36 - 128) * 1.0;
  211. }else {
  212. obj.upperLimit = data36 * 0.1;
  213. }
  214. // 减档下限【37】
  215. obj.lowerLimit = dataView.getUint8(37) * 0.1;
  216. }
  217. }
  218. // 解析运行数据
  219. function analysis_old_run(dataArray, obj) {
  220. obj.dataType = 3;
  221. // 报警数据
  222. var dataView = new DataView(dataArray.buffer, 0);
  223. // 类型【1】
  224. var type = dataView.getUint8(1);
  225. if (type == 0x13){
  226. obj.pumpType = 1;
  227. }else if (type == 0x23){
  228. obj.pumpType = 2;
  229. }else if (type == 0x33){
  230. obj.pumpType = 3;
  231. }else {
  232. obj.pumpType = 0;
  233. obj.msg = '泵类型不存在';
  234. return;
  235. }
  236. // 住院号【2-5】
  237. if (obj.pumpType == 1 && dataArray.length == 18){
  238. obj.patientCodeArray = concat(ConvertToUint8Array(dataArray, 2, 6), ConvertToUint8Array(dataArray, 14, 16));
  239. } else if (obj.pumpType == 2 && dataArray.length == 18){
  240. obj.patientCodeArray = concat(ConvertToUint8Array(dataArray, 2, 6), ConvertToUint8Array(dataArray, 14, 16));
  241. } else {
  242. obj.patientCodeArray = ConvertToUint8Array(dataArray, 2, 6);
  243. }
  244. var patientCodeDataView = new DataView(obj.patientCodeArray.buffer);
  245. var patientCode = patientCodeDataView.getUint32(0, true);
  246. if (patientCodeDataView.byteLength == 6){
  247. patientCode += patientCodeDataView.getUint16(4, true) * 1000000000;
  248. }
  249. obj.patientCode = patientCode + '';
  250. // 总量。【6-7】
  251. obj.totalDose = dataView.getUint16(6, true);
  252. // 已输入量【8-9】
  253. obj.finishDose = dataView.getUint16(8, true) * 0.1;
  254. // 电池状态【10】
  255. obj.electricity = dataView.getUint8(10);
  256. // 有效次数【11】
  257. obj.validTimes = dataView.getUint8(11);
  258. // 无效次数【12】
  259. obj.invalidTimes = dataView.getUint8(12);
  260. // 预报【13】和报警
  261. obj.forcast = [];
  262. obj.alarm = [];
  263. var warnByte = dataView.getUint8(13);
  264. // 电量偏低预报 3
  265. if ((warnByte & 0x04) == 0x04){
  266. obj.forcast.push(3);
  267. }
  268. // 无预报
  269. if (obj.forcast.length == 0){
  270. obj.forcast.push(0);
  271. }
  272. // 无报警
  273. if (obj.alarm.length == 0){
  274. obj.alarm.push(0);
  275. }
  276. // 运行状态
  277. obj.runStatus = 2;
  278. }
  279. // 解析老协议
  280. function analysis_old(dataArray, obj) {
  281. // crc校验
  282. if (!crc_verify(dataArray)){
  283. obj.msg = '老协议数据CRC校验失败';
  284. return ;
  285. }
  286. // 泵数据
  287. var type = dataArray[1] & 0x0f;
  288. if (type == 5){
  289. analysis_old_alarm(dataArray, obj);
  290. }else if (type == 3){
  291. analysis_old_run(dataArray, obj);
  292. }else {
  293. obj.msg = '数据格式错误';
  294. }
  295. }
  296. // 解析新协议
  297. function analysis_new(dataArray, obj) {
  298. // crc校验
  299. if (!crc_verify(dataArray)){
  300. obj.msg = '新协议数据CRC校验失败';
  301. return ;
  302. }
  303. // 泵数据
  304. var dataView = new DataView(dataArray.buffer, 0);
  305. // 泵类型【2】 高4位
  306. obj.pumpType = (dataArray[2] & 0xf0) >> 4;
  307. // 版本【2】 低4位
  308. obj.version = dataArray[2] & 0x0f;
  309. // 泵号【3-10】
  310. obj.pumpCode = ArrayToHexString(dataArray, 3, 11);
  311. // 输注标识【11】
  312. obj.infusionId = dataView.getUint8(11);
  313. // 发送条数【12】
  314. obj.dataNumber = dataView.getUint8(12);
  315. // 医院编号【13-14】
  316. obj.userId = dataView.getUint16(13, true);
  317. // 住院号【15-20】
  318. var patientCodeArray = ConvertToUint8Array(dataArray, 15, 21);
  319. var patientCodeDataView = new DataView(patientCodeArray.buffer);
  320. var patientCode = patientCodeDataView.getUint32(0, true)
  321. + patientCodeDataView.getUint16(4, true) * 4294967295;
  322. obj.patientCode = patientCode + '';
  323. obj.patientCodeArray = patientCodeArray;
  324. // 持续量【21-22】
  325. obj.continueDose = dataView.getUint16(21, true) * 0.1;
  326. // 锁定时间【23】
  327. obj.lockTime = dataView.getUint8(23);
  328. // 极限量【24】
  329. obj.ultimateDose = dataView.getUint8(24);
  330. // 首次量【25】
  331. obj.firstDose = dataView.getUint8(25);
  332. // 追加量【26】
  333. obj.appendDose = dataView.getUint8(26) * 0.1;
  334. // 总量【27-28】
  335. obj.totalDose = dataView.getUint16(27, true);
  336. // 已输入量【29-30】
  337. obj.finishDose = dataView.getUint16(29, true) * 0.1;
  338. // 有效次数【31】
  339. obj.validTimes = dataView.getUint8(31);
  340. // 无效次数【32】
  341. obj.invalidTimes = dataView.getUint8(32);
  342. // 报警【33】
  343. obj.alarm = [];
  344. obj.forcast = [];
  345. var alarmByte = dataView.getUint8(33);
  346. // 气泡或无液 1
  347. if ((alarmByte & 0x01) == 0x01){
  348. obj.alarm.push(1);
  349. }
  350. // 堵塞 2
  351. if ((alarmByte & 0x02) == 0x02){
  352. obj.alarm.push(2);
  353. }
  354. // 未装药盒 9
  355. if ((alarmByte & 0x04) == 0x04){
  356. obj.alarm.push(9);
  357. }
  358. // 极限量 4
  359. if ((alarmByte & 0x08) == 0x08){
  360. obj.alarm.push(4);
  361. }
  362. // 总量 3
  363. if ((alarmByte & 0x10) == 0x10){
  364. obj.alarm.push(3);
  365. }
  366. // 输液将结束 1
  367. if ((alarmByte & 0x20) == 0x20){
  368. obj.forcast.push(1);
  369. }
  370. // 输液结束 6
  371. if ((alarmByte & 0x40) == 0x40){
  372. obj.alarm.push(6);
  373. }
  374. // 机器故障 8
  375. if ((alarmByte & 0x80) == 0x80){
  376. obj.alarm.push(8);
  377. }
  378. // 预报 [34]
  379. var warnByte = dataView.getUint8(34);
  380. // 电量偏低预警 5
  381. if ((warnByte & 0x01) == 0x01){
  382. obj.alarm.push(5);
  383. }
  384. // 电量偏低预报 3
  385. if ((warnByte & 0x02) == 0x02){
  386. obj.forcast.push(3);
  387. }
  388. // 遗忘报警 4
  389. if ((warnByte & 0x04) == 0x04){
  390. obj.forcast.push(4);
  391. }
  392. // 无报警
  393. if (obj.alarm.length == 0){
  394. obj.alarm.push(0);
  395. }
  396. // 无预报
  397. if (obj.forcast.length == 0){
  398. obj.forcast.push(0);
  399. }
  400. // 运行状态【35】
  401. obj.runStatus = (dataArray[35] & 0xf0) >> 4;
  402. // 电池电量【36】
  403. obj.electricity = dataView.getUint8(36);
  404. // CRC【37-38】不处理
  405. }
  406. // 获取返回的字节
  407. function responseData(dest, patientCodeArray){
  408. var length = dest.length + patientCodeArray.length + 7;
  409. var responseBytes = new Uint8Array(length);
  410. // 帧头
  411. responseBytes[0] = 0xFE;
  412. // 长度域
  413. responseBytes[1] = (dest.length + patientCodeArray.length + 2) & 0xff;
  414. // 命令域
  415. responseBytes[2] = 0x24;
  416. responseBytes[3] = 0x5f;
  417. // 目的地址
  418. responseBytes[4] = dest[0];
  419. responseBytes[5] = dest[1];
  420. // 固定位。0xAD 0xFC
  421. responseBytes[6] = 0xad;
  422. responseBytes[7] = 0xfc;
  423. // 数据。住院号
  424. for (var i = 0; i < patientCodeArray.length; i++){
  425. responseBytes[8 + i] = patientCodeArray[i];
  426. }
  427. // 异或和
  428. var xor_value = xor(responseBytes, 1, length - 1);
  429. responseBytes[length - 1] = xor_value & 0xff;
  430. return responseBytes;
  431. }
  432. // 四信网关
  433. function fourfaithHandle(rawData, obj) {
  434. var rawDataArray = ConvertToUint8Array(rawData);
  435. // obj.rawDataArray = ArrayToHexString(rawDataArray);
  436. // obj.rawDataArrayLength = rawDataArray.length
  437. if (rawDataArray.length == 1 && rawDataArray[0] == 0xFE){
  438. obj.msg = '网关心跳';
  439. return ;
  440. }
  441. if (rawDataArray[0] == 0x78 && rawDataArray[1] == 0x56){
  442. obj.msg = '网关连接';
  443. return ;
  444. }
  445. // 校验
  446. if (!xor_verify(rawDataArray)){
  447. throw 'API数据异或和校验失败';
  448. }
  449. // 获取api协议中的数据
  450. var dataArray = ConvertToUint8Array(rawData, 6, rawData.length - 1);
  451. // obj.dataArray = ArrayToHexString(dataArray);
  452. // obj.dataArrayLength = dataArray.length;
  453. // 判断新老协议
  454. if (dataArray[0] == 0xEF){
  455. analysis_new(dataArray, obj);
  456. }else {
  457. analysis_old(dataArray, obj);
  458. }
  459. // 获取api协议中的目的地址
  460. var addressArray = ConvertToUint8Array(rawData, 4, 6);
  461. if (obj.patientCodeArray){
  462. obj.responseHex = ArrayToHexString(responseData(addressArray, obj.patientCodeArray));
  463. delete obj.patientCodeArray
  464. }
  465. }
  466. // 判断数组中是否包含某个元素
  467. function includes(array, item) {
  468. for (var i = 0; i < array.length; i++){
  469. if (array[i] == item){
  470. return true;
  471. }
  472. }
  473. return false;
  474. }
  475. function updateItems(device, analysisResult) {
  476. var oldPatientCode = device.patientCode;
  477. var newPatientCode = analysisResult.patientCode;
  478. var date = new Date();
  479. // 设置输注标识
  480. if (analysisResult.hasOwnProperty('infusionId')){
  481. } else if (!device.items.hasOwnProperty("infusionId")){
  482. device.items.infusionId = 1;
  483. device.items.dataNumber = 1;
  484. } else if (oldPatientCode != newPatientCode){
  485. var infusionId = device.items.infusionId;
  486. device.items.infusionId = infusionId + 1;
  487. } else {
  488. var dataNumber = device.items.dataNumber;
  489. device.items.dataNumber = dataNumber + 1;
  490. }
  491. // 更新items
  492. for (var key in analysisResult) {
  493. if (analysisResult.hasOwnProperty(key)) {
  494. device.items[key] = analysisResult[key];
  495. }
  496. }
  497. // 更新models
  498. for (var key in device.items) {
  499. if (device.items.hasOwnProperty(key)) {
  500. device.models[key] = {
  501. time: date.getTime(),
  502. value: device.items[key],
  503. };
  504. }
  505. }
  506. device.patientCode = newPatientCode;
  507. device.updateTime = date;
  508. }
  509. /*
  510. * 粘包处理
  511. */
  512. function stick(rawData){
  513. rawData = ConvertToUint8Array(rawData);
  514. var obj = {
  515. valid: '',
  516. surplus: ''
  517. };
  518. var start = -1;
  519. for(var i = 0; i < rawData.length; i++){
  520. if(rawData[i] == 0xFE && rawData.length > 1){
  521. start = i;
  522. break;
  523. }
  524. }
  525. if(start == -1){
  526. obj.valid = ArrayToHexString(ConvertToUint8Array(rawData));
  527. }else if (start > 0) {
  528. obj.valid = ArrayToHexString(ConvertToUint8Array(rawData, 0, start));
  529. obj.surplus = ArrayToHexString(ConvertToUint8Array(rawData, start, rawData.length));
  530. }else if(rawData[1] + 5 == rawData.length){
  531. obj.valid = ArrayToHexString(ConvertToUint8Array(rawData, 0, rawData[1] + 5));
  532. }else if(rawData[1] + 5 < rawData.length){
  533. obj.valid = ArrayToHexString(ConvertToUint8Array(rawData, 0, rawData[1] + 5));
  534. obj.surplus = ArrayToHexString(ConvertToUint8Array(rawData, rawData[1] + 5, rawData.length));
  535. }else if(rawData[1] + 5 > rawData.length){
  536. obj.surplus = ArrayToHexString(ConvertToUint8Array(rawData, 0, rawData.length));
  537. }
  538. var json = JSON.stringify(obj);
  539. return json;
  540. }
  541. /*
  542. * 从tcp发来的数据
  543. * 第一步:解析。
  544. * 解析tcp数据
  545. */
  546. function fromTcp(rawData){
  547. var obj = {};
  548. fourfaithHandle(rawData, obj)
  549. obj.productId = '1dbfd476b7nm2';
  550. var json = JSON.stringify(obj);
  551. return json;
  552. }
  553. /*
  554. * 从数据下发系统发来的数据
  555. * 第一步:解析。
  556. * 解析mqtt数据
  557. */
  558. function fromMqtt(rawData) {
  559. var items = JSON.parse(rawData);
  560. var obj = items.items;
  561. obj.productId = '1dbfd476b7nm2';
  562. obj.pumpCode = items.mac;
  563. var json = JSON.stringify(obj);
  564. return json;
  565. }
  566. /*
  567. * 整合数据
  568. * 第二步:整合。
  569. * 根据解析获取到设备列表。选择一个设备作为返回,并整合设备的参数。
  570. */
  571. function zhenghe(deviceList, analysisResult) {
  572. deviceList = JSON.parse(deviceList);
  573. analysisResult = JSON.parse(analysisResult);
  574. // 设备
  575. var device;
  576. // 设备不存在
  577. if(deviceList.length > 0){
  578. device = deviceList[0];
  579. }else if(analysisResult.hasOwnProperty('pumpCode')){
  580. device = {
  581. id: analysisResult.pumpCode,
  582. };
  583. device.items = {};
  584. device.models = {};
  585. device.createTime = new Date();
  586. }else {
  587. throw 'pumpCode不存在';
  588. }
  589. device.productId = analysisResult.productId;
  590. // 更新属性
  591. updateItems(device, analysisResult);
  592. var json = JSON.stringify(device);
  593. return json;
  594. }
  595. /*
  596. * 向web端发送的数据
  597. * 第三步:发送数据。
  598. * 发送到web端
  599. */
  600. function toWeb(rawData){
  601. var device = JSON.parse(rawData);
  602. var items = device.items;
  603. // web端对象
  604. var obj = {
  605. deviceId: items.pumpCode, // 设备编号
  606. classification: items.infusionId, // 输注编号
  607. dataNumber: items.dataNumber, // 数据编号
  608. type: items.pumpType, // 设备类型
  609. runState: items.runStatus, // 运行状态
  610. appendDose: items.appendDose, // 追加量
  611. continueDose: items.continueDose, // 持续量
  612. electricQuantity: items.electricity, // 电量
  613. firstDose: items.firstDose, // 首次量
  614. inputDose: items.finishDose, // 已输入量
  615. maxDose: items.ultimateDose, // 极限量
  616. patientCode: items.patientCode, // 住院号
  617. pcaValidCount: items.validTimes, // 有效次数
  618. pcaInvalidCount: items.invalidTimes, // 无效次数
  619. totalDose: items.totalDose, // 总量
  620. userId: 1000, // 医院编号
  621. selfControlLockTime: items.lockTime, // 锁时
  622. alarm: 0, // 报警
  623. };
  624. if(obj.type == 2){
  625. obj.type=3
  626. }else if(obj.type == 3){
  627. obj.type=2
  628. }
  629. var alarms = items.alarm;
  630. // 气泡无液
  631. if (includes(alarms, 1)){
  632. obj.alarm = 1;
  633. }
  634. // 堵塞
  635. if (includes(alarms, 2)){
  636. obj.alarm = 2;
  637. }
  638. // 未装药盒
  639. if (includes(alarms, 9)){
  640. obj.alarm = 3;
  641. }
  642. // 输注总量报警
  643. if (includes(alarms, 3)){
  644. obj.alarm = 4;
  645. }
  646. // 极限报警
  647. if (includes(alarms, 4)){
  648. obj.alarm = 5;
  649. }
  650. // 输液结束
  651. if (includes(alarms, 6)){
  652. obj.alarm = 6;
  653. }
  654. // 电量耗尽
  655. if (includes(alarms, 5)){
  656. obj.alarm = 7;
  657. }
  658. // 机械故障
  659. if (includes(alarms, 8)){
  660. obj.alarm = 9;
  661. }
  662. // 预报
  663. var forcasts = items.forcast;
  664. // 0:无预报
  665. // 1:输液将结束
  666. if (includes(forcasts, 1)){
  667. }
  668. // 2:镇痛不足
  669. if (includes(forcasts, 2)){
  670. }
  671. // 3:电量偏低
  672. if (includes(forcasts, 3)){
  673. }
  674. // 4:遗忘;
  675. if (includes(forcasts, 4)){
  676. }
  677. // 输出json字符串
  678. var json = JSON.stringify(obj);
  679. return json;
  680. }
  681. /*
  682. * 向PC端数据库发送的数据
  683. * 第三步:发送数据。
  684. * 存储到上位机数据库
  685. */
  686. function toPc(rawData){
  687. var device = JSON.parse(rawData);
  688. var items = device.items;
  689. var obj = {
  690. sysProductId: items.pumpType, // 泵类型
  691. sysHospitalId: items.userId, // 医院编号
  692. pumpCode: items.pumpCode, // 泵号
  693. patientCode: items.patientCode, // 住院号
  694. ward: items.ward, // 病区
  695. bedNo: items.bedNo, // 床号
  696. continueQuantity: items.continueDose, // 持续量
  697. lockTime: items.lockTime, // 锁时时间
  698. maxQuantity: items.ultimateDose, // 极限量
  699. firstQuantity: items.firstDose, // 首次量
  700. singleQuantity: items.appendDose, // 追加量
  701. runState: items.runStatus, // 运行状态
  702. bufState6: items.electricity, // 电量
  703. // user1: items.infusionId, // 输注编号
  704. // number2: items.dataNumber, // 数据编号
  705. allQuantity: items.totalDose, // 总量
  706. inputQuantity: items.finishDose, // 已输入量
  707. trueNum: items.validTimes, // 有效次数
  708. falseNum: items.invalidTimes, // 无效次数
  709. // 报警
  710. bufState1: 0,
  711. bufState2: 0,
  712. bufState3: 0,
  713. bufState4: 0,
  714. bufState5: 0,
  715. bufState7: 0,
  716. bufState8: 0,
  717. viewState: '',
  718. // 脉冲泵
  719. firstLockTime: items.firstLockTime, // 首次量锁时
  720. pulseQuantity: items.pulseDose, // 脉冲量
  721. pulseLockTime: items.pulseLockTime, // 脉冲量锁时
  722. };
  723. // 判断运行状态
  724. if (obj.runState == 0){
  725. obj.viewState = '关机';
  726. obj.stateFlag = 2;
  727. }else if (obj.runState == 1){
  728. obj.viewState = '开机';
  729. obj.stateFlag = 1;
  730. }else if (obj.runState == 2){
  731. obj.viewState = '运行';
  732. obj.stateFlag = 3;
  733. }else if (obj.runState == 3){
  734. obj.viewState = '暂停';
  735. obj.stateFlag = 1;
  736. }else if (obj.runState == 4){
  737. obj.viewState = '待机';
  738. obj.stateFlag = 4;
  739. }
  740. // 报警和预报
  741. var alarms = items.alarm;
  742. // 气泡无液
  743. if (includes(alarms, 1)){
  744. obj.bufState1 = 1;
  745. obj.viewState = '气泡无液';
  746. obj.stateFlag = 4;
  747. }
  748. // 堵塞
  749. if (includes(alarms, 2)){
  750. obj.bufState1 = 2;
  751. obj.viewState = '堵塞';
  752. obj.stateFlag = 4;
  753. }
  754. // 未装药盒
  755. if (includes(alarms, 9)){
  756. obj.bufState1 = 3;
  757. obj.viewState = '未装药盒';
  758. obj.stateFlag = 4;
  759. }
  760. // 输注总量报警
  761. if (includes(alarms, 3)){
  762. obj.bufState2 = 1;
  763. obj.viewState = '输入总量报警';
  764. obj.stateFlag = 4;
  765. }
  766. // 极限报警
  767. if (includes(alarms, 4)){
  768. obj.bufState3 = 1;
  769. obj.viewState = '极限';
  770. obj.stateFlag = 4;
  771. }
  772. // 输液结束
  773. if (includes(alarms, 6)){
  774. obj.bufState3 = 3;
  775. obj.viewState = '输液结束';
  776. obj.stateFlag = 4;
  777. }
  778. // 电量耗尽
  779. if (includes(alarms, 5)){
  780. obj.bufState5 = 1;
  781. obj.viewState = '电量耗尽';
  782. obj.stateFlag = 4;
  783. }
  784. // 电机失控
  785. if (includes(alarms, 7)){
  786. obj.bufState7 = 1;
  787. obj.viewState = '电机失控';
  788. obj.stateFlag = 4;
  789. }
  790. // 机械故障
  791. if (includes(alarms, 8)){
  792. obj.bufState8 = 1;
  793. obj.viewState = '机械故障';
  794. obj.stateFlag = 4;
  795. }
  796. // 预报
  797. var forcasts = items.forcast;
  798. // 0:无预报
  799. // 1:输液将结束
  800. if (includes(forcasts, 1)){
  801. obj.bufState3 = 2;
  802. obj.viewState = '输液将结束';
  803. obj.stateFlag = 4;
  804. }
  805. // 2:镇痛不足
  806. if (includes(forcasts, 2)){
  807. obj.bufState4 = 1;
  808. }
  809. // 3:电量偏低
  810. if (includes(forcasts, 3)){
  811. obj.bufState5 = 2;
  812. }
  813. // 4:遗忘;
  814. if (includes(forcasts, 4)){
  815. }
  816. // 判断需要转换的java类型
  817. if (items.dataType == 5){
  818. obj.javaObject = 'AlarmInfo';
  819. }else if (items.dataType == 3){
  820. obj.javaObject = 'RunParameter';
  821. }else {
  822. obj.javaObject = 'Pump';
  823. }
  824. // 输出json字符串
  825. var json = JSON.stringify(obj);
  826. return json;
  827. }