SetInfoDialog.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  1. <template>
  2. <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
  3. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  4. <el-row>
  5. <el-col :span="24"
  6. v-if="type != 'goal' && type != 'languageSet' && type != 'messageSend' && type != 'fallcheckSensitivity' && type != 'measureIntervalHr' && type != 'measureIntervalOther' && type != 'phonebookSync'">
  7. <el-form-item label="开关设置" prop="flag">
  8. <el-switch v-model="form.flag" active-text="开启" inactive-text="关闭">
  9. </el-switch>
  10. </el-form-item>
  11. </el-col>
  12. <el-col :span="24" v-if="type == 'autolocate' || type == 'datafreq'">
  13. <el-form-item label="设备省电设置" prop="mode" label-width="105px">
  14. <el-radio-group v-model="form.mode">
  15. <el-radio :label="1">low耗电</el-radio>
  16. <el-radio :label="2">mid耗电</el-radio>
  17. <el-radio :label="3">high耗电</el-radio>
  18. </el-radio-group>
  19. </el-form-item>
  20. </el-col>
  21. <el-col :span="24" v-if="type == 'autolocate' || type == 'datafreq'">
  22. <el-form-item label="数据上传间隔(分钟)" prop="time" label-width="150px">
  23. <el-select v-model="form.time" placeholder="请选择数据上传间隔">
  24. <el-option v-for="item in timeOptions" :key="item" :label="item" :value="item">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. </el-col>
  29. <!-- 翻腕亮屏的开始时间,结束时间(开启时需要,不开启不需要) -->
  30. <el-col :span="24" v-if="type == 'lcdgesture' && form.flag">
  31. <el-form-item label="开始时间" prop="start">
  32. <el-select v-model="form.start" placeholder="请选择开始时间">
  33. <el-option v-for="i in startOptions" :key="i" :label="i" :value="i">
  34. </el-option>
  35. </el-select>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="24" v-if="type == 'lcdgesture' && form.flag">
  39. <el-form-item label="结束时间" prop="end">
  40. <el-select v-model="form.end" placeholder="请选择结束时间">
  41. <el-option v-for="i in endOptions" :key="i" :label="i" :value="i">
  42. </el-option>
  43. </el-select>
  44. </el-form-item>
  45. </el-col>
  46. <!-- 心率报警设置 -->
  47. <template v-if="type == 'hralarm' && form.flag">
  48. <el-col :span="24">
  49. <el-form-item label="正常心率最高值" prop="high" label-width="130px">
  50. <!-- <el-input v-model="form.high" maxlength="5" placeholder="请输入正常心率最高值" /> -->
  51. <el-select v-model="form.high" placeholder="请选择正常心率最高值">
  52. <el-option
  53. v-for="item in hrRangeHigh"
  54. :key="item"
  55. :label="item"
  56. :value="item">
  57. </el-option>
  58. </el-select>
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="24">
  62. <el-form-item label="正常心率最低值" prop="low" label-width="130px">
  63. <!-- <el-input v-model="form.low" maxlength="5" placeholder="请输入正常心率最低值" /> -->
  64. <el-select v-model="form.low" placeholder="请选择正常心率最低值">
  65. <el-option
  66. v-for="item in hrRangeLow"
  67. :key="item"
  68. :label="item"
  69. :value="item">
  70. </el-option>
  71. </el-select>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="24">
  75. <el-form-item label-width="0" prop="timeout" class="timeout">
  76. <div class="timeout-box">
  77. <span class="timeout-txt">产生</span>
  78. <el-input class="timeout-input" v-model="form.timeout" maxlength="4" placeholder="请输入次数" />
  79. <span class="timeout-txt">次异常心率,开始报警</span>
  80. </div>
  81. </el-form-item>
  82. </el-col>
  83. <el-col :span="24">
  84. <el-form-item label="报警间隔(分钟)" prop="interval" label-width="130px">
  85. <el-input v-model="form.interval" maxlength="4" placeholder="请输入报警间隔" />
  86. </el-form-item>
  87. </el-col>
  88. </template>
  89. <!-- 血氧报警设置 -->
  90. <template v-if="type == 'spo2alarm' && form.flag">
  91. <el-col :span="24">
  92. <el-form-item label="血氧报警值(%)" prop="spo2low" label-width="120px">
  93. <!-- <el-input v-model="form.spo2low" maxlength="5" placeholder="请输入血氧报警值" /> -->
  94. <el-select v-model="form.spo2low" placeholder="请选择血氧报警值">
  95. <el-option
  96. v-for="item in boRange"
  97. :key="item"
  98. :label="item"
  99. :value="item">
  100. </el-option>
  101. </el-select>
  102. </el-form-item>
  103. </el-col>
  104. </template>
  105. <!-- 血压报警设置 -->
  106. <template v-if="type == 'bpalarm' && form.flag">
  107. <el-col :span="24">
  108. <el-form-item label="高压最高值(mmhg)" prop="sbp_high" label-width="155px">
  109. <el-input v-model="form.sbp_high" maxlength="5" placeholder="请输入高压最高值" />
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="24">
  113. <el-form-item label="高压最低值(mmhg)" prop="sbp_below" label-width="155px">
  114. <el-input v-model="form.sbp_below" maxlength="5" placeholder="请输入高压最低值" />
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="24">
  118. <el-form-item label="低压最高值(mmhg)" prop="dbp_high" label-width="155px">
  119. <el-input v-model="form.dbp_high" maxlength="5" placeholder="请输入低压最高值" />
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="24">
  123. <el-form-item label="低压最低值(mmhg)" prop="dbp_below" label-width="155px">
  124. <el-input v-model="form.dbp_below" maxlength="5" placeholder="请输入低压最低值" />
  125. </el-form-item>
  126. </el-col>
  127. </template>
  128. <!-- 温度报警设置 -->
  129. <template v-if="type == 'temperatureAlarm' && form.flag">
  130. <el-col :span="24">
  131. <el-form-item label="最高温度报警值(℃)" prop="temperatureHigh" label-width="155px">
  132. <el-input v-model="form.temperatureHigh" maxlength="6" placeholder="请输入最高温度报警值" />
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="24">
  136. <el-form-item label="最低温度报警值(℃)" prop="temperatureLow" label-width="155px">
  137. <el-input v-model="form.temperatureLow" maxlength="6" placeholder="请输入最低温度报警值" />
  138. </el-form-item>
  139. </el-col>
  140. </template>
  141. <!-- 自动房颤设置 -->
  142. <template v-if="type == 'autoaf' && form.flag">
  143. <el-col :span="24">
  144. <el-form-item label="测量持续时间(秒)" prop="autoafInterval" label-width="140px">
  145. <el-input v-model="form.autoafInterval" maxlength="3" placeholder="请输入测量持续时间" />
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="24">
  149. <el-form-item label="测量频率" prop="rriSingleTime" label-width="140px">
  150. <el-select v-model="form.rriSingleTime" clearable placeholder="请选择测量频率">
  151. <el-option label="按照心率间隔,每次测量完心率后测量一次" :value="true" />
  152. <el-option label="一直测量" :value="false" />
  153. </el-select>
  154. </el-form-item>
  155. </el-col>
  156. </template>
  157. <!-- 目标设置 -->
  158. <template v-if="type == 'goal'">
  159. <el-col :span="24">
  160. <el-form-item label="目标步数" prop="step" label-width="135px">
  161. <el-input v-model="form.step" maxlength="7" placeholder="请输入目标步数" />
  162. </el-form-item>
  163. </el-col>
  164. <el-col :span="24">
  165. <el-form-item label="目标距离(米)" prop="distance" label-width="135px">
  166. <el-input v-model="form.distance" maxlength="7" placeholder="请输入目标距离" />
  167. </el-form-item>
  168. </el-col>
  169. <el-col :span="24">
  170. <el-form-item label="目标卡路里(千卡)" prop="calorie" label-width="135px">
  171. <el-input v-model="form.calorie" maxlength="7" placeholder="请输入目标卡路里" />
  172. </el-form-item>
  173. </el-col>
  174. </template>
  175. <!-- 语言设置 -->
  176. <template v-if="type == 'languageSet'">
  177. <el-col :span="24">
  178. <el-form-item label="选择语言" prop="language">
  179. <el-select v-model="form.language" clearable placeholder="请选择语言">
  180. <el-option label="English" :value="0" />
  181. <el-option label="Chinese" :value="1" />
  182. <el-option label="Italian" :value="2" />
  183. <el-option label="Japanese" :value="3" />
  184. <el-option label="France" :value="4" />
  185. <el-option label="German" :value="5" />
  186. <el-option label="Portuguese" :value="6" />
  187. <el-option label="Spanish" :value="7" />
  188. <el-option label="Russian" :value="8" />
  189. <el-option label="Korean" :value="9" />
  190. <el-option label="Arabic" :value="10" />
  191. <el-option label="Vietnam" :value="11" />
  192. <el-option label="Polish" :value="12" />
  193. <el-option label="Romanian" :value="13" />
  194. <el-option label="Swedish" :value="14" />
  195. <el-option label="Thai" :value="15" />
  196. <el-option label="Turkish" :value="16" />
  197. <el-option label="Denish" :value="17" />
  198. <el-option label="Ukrainian" :value="18" />
  199. <el-option label="Norwegian" :value="19" />
  200. <el-option label="Dutch" :value="20" />
  201. <el-option label="Czech" :value="21" />
  202. <el-option label="Chinese_Tc" :value="22" />
  203. <el-option label="Indonesian" :value="23" />
  204. </el-select>
  205. </el-form-item>
  206. </el-col>
  207. </template>
  208. <!-- 发送设备消息 -->
  209. <template v-if="type == 'messageSend'">
  210. <el-col :span="24">
  211. <el-form-item label="标题" prop="title">
  212. <el-input v-model="form.title" maxlength="15" placeholder="请输入标题" />
  213. </el-form-item>
  214. </el-col>
  215. <el-col :span="24">
  216. <el-form-item label="描述" prop="description">
  217. <el-input type="textarea" autosize v-model="form.description" maxlength="240" placeholder="请输入描述" />
  218. </el-form-item>
  219. </el-col>
  220. </template>
  221. <!-- 设置跌倒检测灵敏度 -->
  222. <template v-if="type == 'fallcheckSensitivity'">
  223. <el-col :span="24">
  224. <el-form-item label="跌倒检测灵敏度" prop="fallThreshold" label-width="130px">
  225. <el-input v-model="form.fallThreshold" maxlength="8" placeholder="请输入跌倒检测灵敏度" />
  226. </el-form-item>
  227. </el-col>
  228. </template>
  229. <!-- 心率数据测量间隔设置 -->
  230. <template v-if="type == 'measureIntervalHr'">
  231. <el-col :span="24">
  232. <el-form-item label="测量间隔(分钟)" prop="measureIntervalHr" label-width="130px">
  233. <el-input v-model="form.measureIntervalHr" maxlength="4" placeholder="请输入测量间隔" />
  234. </el-form-item>
  235. </el-col>
  236. </template>
  237. <!-- 其他非心率数据测量间隔设置 -->
  238. <template v-if="type == 'measureIntervalOther'">
  239. <el-col :span="24">
  240. <el-form-item label="测量间隔(分钟)" prop="measureIntervalOther" label-width="130px">
  241. <el-input v-model="form.measureIntervalOther" maxlength="4" placeholder="请输入测量间隔" />
  242. </el-form-item>
  243. </el-col>
  244. </template>
  245. </el-row>
  246. </el-form>
  247. <div slot="footer" class="dialog-footer">
  248. <el-button type="primary" @click="submitForm" :loading="btnLoading">确 定</el-button>
  249. <el-button @click="cancel">取 消</el-button>
  250. </div>
  251. </el-dialog>
  252. </template>
  253. <script>
  254. import { isInteger } from "@/utils/validate.js";
  255. import {
  256. fallcheck,
  257. autolocate,
  258. datafreq,
  259. lcdgesture,
  260. hralarm,
  261. spo2alarm,
  262. bpalarm,
  263. temperatureAlarm,
  264. autoaf,
  265. goal,
  266. languageSet,
  267. messageSend,
  268. fallcheckSensitivity,
  269. measureIntervalHr,
  270. measureIntervalOther
  271. } from "@/api/watch/deviceInfoSet.js";
  272. export default {
  273. data() {
  274. const checkIsInteger = (rule, value, callback) => {
  275. if (!isInteger(value)) {
  276. callback(new Error("请输入正确的数字"));
  277. } else {
  278. callback();
  279. }
  280. };
  281. // 检查翻腕亮屏开始时间
  282. const checkStart = (rule, value, callback) => {
  283. if (value && this.form.end) {
  284. if(Number(value) >= Number(this.form.end)) {
  285. callback(new Error("开始时间不能大于等于结束时间"));
  286. } else {
  287. this.$refs["form"].validateField("end");
  288. callback();
  289. }
  290. }else {
  291. callback();
  292. }
  293. };
  294. // 检查翻腕亮屏结束时间
  295. const checkEnd = (rule, value, callback) => {
  296. if (value && this.form.start) {
  297. if(Number(value) <= Number(this.form.start)) {
  298. callback(new Error("结束时间不能小于等于开始时间"));
  299. } else {
  300. this.$refs["form"].validateField("start");
  301. callback();
  302. }
  303. }else {
  304. callback();
  305. }
  306. };
  307. // 检查正常心率最高值
  308. const checkHigh = (rule, value, callback) => {
  309. if (!isInteger(value)) {
  310. callback(new Error("请输入正确的数字"));
  311. } else if (isInteger(this.form.low)) {
  312. if(Number(value) < Number(this.form.low)) {
  313. callback(new Error("正常心率最高值不能小于正常心率最低值"));
  314. } else {
  315. this.$refs["form"].validateField("low");
  316. callback();
  317. }
  318. } else {
  319. callback();
  320. }
  321. };
  322. // 检查正常心率最低值
  323. const checkLow = (rule, value, callback) => {
  324. if (!isInteger(value)) {
  325. callback(new Error("请输入正确的数字"));
  326. } else if (isInteger(this.form.high)) {
  327. if(Number(value) > Number(this.form.high)) {
  328. callback(new Error("正常心率最低值不能大于正常心率最高值"));
  329. } else {
  330. this.$refs["form"].validateField("high");
  331. callback();
  332. }
  333. } else {
  334. callback();
  335. }
  336. };
  337. // 检查高压最高值
  338. const checkSbpHigh = (rule, value, callback) => {
  339. if (!isInteger(value)) {
  340. callback(new Error("请输入正确的数字"));
  341. } else if (isInteger(this.form.sbp_below)) {
  342. if(Number(value) < Number(this.form.sbp_below)) {
  343. callback(new Error("高压最高值不能小于高压最低值"));
  344. } else {
  345. this.$refs["form"].validateField("sbp_below");
  346. callback();
  347. }
  348. } else {
  349. callback();
  350. }
  351. };
  352. // 检查高压最低值
  353. const checkSbpBelow = (rule, value, callback) => {
  354. if (!isInteger(value)) {
  355. callback(new Error("请输入正确的数字"));
  356. } else if (isInteger(this.form.sbp_high)) {
  357. if(Number(value) > Number(this.form.sbp_high)) {
  358. callback(new Error("高压最低值不能大于高压最高值"));
  359. } else {
  360. this.$refs["form"].validateField("sbp_high");
  361. callback();
  362. }
  363. } else {
  364. callback();
  365. }
  366. };
  367. // 检查低压最高值
  368. const checkDbpHigh = (rule, value, callback) => {
  369. if (!isInteger(value)) {
  370. callback(new Error("请输入正确的数字"));
  371. } else if (isInteger(this.form.dbp_below)) {
  372. if(Number(value) < Number(this.form.dbp_below)) {
  373. callback(new Error("低压最高值不能小于低压最低值"));
  374. } else {
  375. this.$refs["form"].validateField("dbp_below");
  376. callback();
  377. }
  378. } else {
  379. callback();
  380. }
  381. };
  382. // 检查低压最低值
  383. const checkDbpBelow = (rule, value, callback) => {
  384. if (!isInteger(value)) {
  385. callback(new Error("请输入正确的数字"));
  386. } else if (isInteger(this.form.dbp_high)) {
  387. if(Number(value) > Number(this.form.dbp_high)) {
  388. callback(new Error("低压最低值不能大于低压最高值"));
  389. } else {
  390. this.$refs["form"].validateField("dbp_high");
  391. callback();
  392. }
  393. } else {
  394. callback();
  395. }
  396. };
  397. // 检查最高温度报警值
  398. const checkTemperatureHigh = (rule, value, callback) => {
  399. // 判断字符串为负数/正数/小数(小数保留一位)
  400. const reg = /^-?\d+(.\d{1})?$/
  401. const flag = (val) => reg.test(val) && -100 < Number(val) && Number(val) < 100
  402. if (!flag(value)) {
  403. callback(new Error("请输入正确的数字"));
  404. } else if (flag(this.form.temperatureLow)) {
  405. if(Number(value) <= Number(this.form.temperatureLow)) {
  406. callback(new Error("最高温度报警值不能小于等于最低温度报警值"));
  407. } else {
  408. this.$refs["form"].validateField("temperatureLow");
  409. callback();
  410. }
  411. } else {
  412. callback();
  413. }
  414. };
  415. // 检查最低温度报警值
  416. const checkTemperatureLow = (rule, value, callback) => {
  417. const reg = /^-?\d+(.\d{1})?$/
  418. const flag = (val) => reg.test(val) && -100 < Number(val) && Number(val) < 100
  419. if (!flag(value)) {
  420. callback(new Error("请输入正确的数字"));
  421. } else if (flag(this.form.temperatureHigh)) {
  422. if(Number(value) >= Number(this.form.temperatureHigh)) {
  423. callback(new Error("最低温度报警值不能大于等于最高温度报警值"));
  424. } else {
  425. this.$refs["form"].validateField("temperatureHigh");
  426. callback();
  427. }
  428. } else {
  429. callback();
  430. }
  431. };
  432. // 检查自动房颤测量持续时间
  433. const checkInterval = (rule, value, callback) => {
  434. if (!isInteger(value)) {
  435. callback(new Error("请输入正确的数字"));
  436. } else if (Number(value) < 30 || Number(value) > 120) {
  437. // 最小取值30,最大取值120
  438. callback(new Error("最小值30,最大值120"));
  439. } else {
  440. callback();
  441. }
  442. };
  443. // 检查其他非心率数据测量间隔设置
  444. const checkMeasureIntervalOther = (rule, value, callback) => {
  445. if (!isInteger(value)) {
  446. callback(new Error("请输入正确的数字"));
  447. } else if (Number(value) < 5) {
  448. // 最小5分钟
  449. callback(new Error("最小5分钟"));
  450. } else {
  451. callback();
  452. }
  453. };
  454. const hrRangeLow = Array.from({length: 151}, (_, i) => i + 40)
  455. const hrRangeHigh = Array.from({length: 151}, (_, i) => i + 50)
  456. return {
  457. pickerOptions: {
  458. disabledDate(time) {
  459. return time.getTime() > Date.now();
  460. },
  461. },
  462. hrRangeLow,
  463. hrRangeHigh,
  464. boRange: [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93],
  465. btnLoading: false,
  466. // 弹出层标题
  467. title: "",
  468. // 是否显示弹出层
  469. open: false,
  470. // 表单参数
  471. form: {},
  472. // 表单校验
  473. rules: {
  474. time: [
  475. { required: true, message: "数据上传间隔不能为空", trigger: ["blur", "change"] },
  476. ],
  477. start: [
  478. { required: true, message: "开始时间不能为空", trigger: ["blur", "change"] },
  479. { validator: checkStart, trigger: ["blur", "change"] }
  480. ],
  481. end: [
  482. { required: true, message: "结束时间不能为空", trigger: ["blur", "change"] },
  483. { validator: checkEnd, trigger: ["blur", "change"] }
  484. ],
  485. high: [
  486. { required: true, message: "正常心率最高值不能为空", trigger: ["blur", "change"] },
  487. { validator: checkHigh, trigger: ["blur", "change"] }
  488. ],
  489. low: [
  490. { required: true, message: "正常心率最低值不能为空", trigger: ["blur", "change"] },
  491. { validator: checkLow, trigger: ["blur", "change"] }
  492. ],
  493. timeout: [
  494. { required: true, message: "异常心率次数不能为空", trigger: ["blur", "change"] },
  495. { validator: checkIsInteger, trigger: ["blur", "change"] }
  496. ],
  497. interval: [
  498. { required: true, message: "报警间隔不能为空", trigger: ["blur", "change"] },
  499. { validator: checkIsInteger, trigger: ["blur", "change"] }
  500. ],
  501. spo2low: [
  502. { required: true, message: "血氧报警值不能为空", trigger: ["blur", "change"] },
  503. { validator: checkIsInteger, trigger: ["blur", "change"] }
  504. ],
  505. sbp_high: [
  506. { required: true, message: "高压最高值不能为空", trigger: ["blur", "change"] },
  507. { validator: checkSbpHigh, trigger: ["blur", "change"] }
  508. ],
  509. sbp_below: [
  510. { required: true, message: "高压最低值不能为空", trigger: ["blur", "change"] },
  511. { validator: checkSbpBelow, trigger: ["blur", "change"] }
  512. ],
  513. dbp_high: [
  514. { required: true, message: "低压最高值不能为空", trigger: ["blur", "change"] },
  515. { validator: checkDbpHigh, trigger: ["blur", "change"] }
  516. ],
  517. dbp_below: [
  518. { required: true, message: "低压最低值不能为空", trigger: ["blur", "change"] },
  519. { validator: checkDbpBelow, trigger: ["blur", "change"] }
  520. ],
  521. temperatureHigh: [
  522. { required: true, message: "最高温度报警值不能为空", trigger: ["blur", "change"] },
  523. { validator: checkTemperatureHigh, trigger: ["blur", "change"] }
  524. ],
  525. temperatureLow: [
  526. { required: true, message: "最低温度报警值不能为空", trigger: ["blur", "change"] },
  527. { validator: checkTemperatureLow, trigger: ["blur", "change"] }
  528. ],
  529. autoafInterval: [
  530. { required: true, message: "测量持续时间不能为空", trigger: ["blur", "change"] },
  531. { validator: checkInterval, trigger: ["blur", "change"] }
  532. ],
  533. step: [
  534. { required: true, message: "目标步数不能为空", trigger: ["blur", "change"] },
  535. { validator: checkIsInteger, trigger: ["blur", "change"] }
  536. ],
  537. distance: [
  538. { required: true, message: "目标距离不能为空", trigger: ["blur", "change"] },
  539. { validator: checkIsInteger, trigger: ["blur", "change"] }
  540. ],
  541. calorie: [
  542. { required: true, message: "目标卡路里不能为空", trigger: ["blur", "change"] },
  543. { validator: checkIsInteger, trigger: ["blur", "change"] }
  544. ],
  545. language: [
  546. { required: true, message: "请选择语言", trigger: "change" }
  547. ],
  548. title: [
  549. { required: true, message: "标题不能为空", trigger: ["blur", "change"] }
  550. ],
  551. description: [
  552. { required: true, message: "描述不能为空", trigger: ["blur", "change"] }
  553. ],
  554. fallThreshold: [
  555. { required: true, message: "跌倒检测灵敏度不能为空", trigger: ["blur", "change"] },
  556. { validator: checkIsInteger, trigger: ["blur", "change"] }
  557. ],
  558. measureIntervalHr: [
  559. { required: true, message: "测量间隔不能为空", trigger: ["blur", "change"] },
  560. { validator: checkIsInteger, trigger: ["blur", "change"] }
  561. ],
  562. measureIntervalOther: [
  563. { required: true, message: "测量间隔不能为空", trigger: ["blur", "change"] },
  564. { validator: checkMeasureIntervalOther, trigger: ["blur", "change"] }
  565. ],
  566. },
  567. // 弹窗事件类型
  568. type: "",
  569. // 数据上传时间间隔(分钟)
  570. timeOptions: [10, 20, 30, 40, 50, 60, 120],
  571. // 翻腕亮屏开始时间
  572. startOptions: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
  573. // 翻腕亮屏结束时间
  574. endOptions: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24],
  575. };
  576. },
  577. methods: {
  578. // 取消按钮
  579. cancel() {
  580. this.open = false;
  581. this.reset();
  582. },
  583. // 表单重置
  584. reset() {
  585. this.form = {
  586. deviceid: undefined, // 设备id
  587. deviceNumber: undefined, // 设备编号
  588. flag: false,
  589. mode: 2, // 设备自动定位开关(可选,设备省电设置)
  590. time: 10, // 设备数据上传间隔设置
  591. start: 0, // 翻腕亮屏的开始时间
  592. end: 24, // 翻腕亮屏的结束时间
  593. high: undefined, // 正常心率最高值
  594. low: undefined, // 正常心率最低值
  595. timeout: undefined, // 产生几次异常心率,开始报警
  596. interval: undefined, // 报警间隔,单位分钟
  597. spo2low: undefined, // 血氧值报警
  598. sbp_high: undefined, // 血压 高压最高值
  599. sbp_below: undefined, // 血压 高压最低值
  600. dbp_high: undefined, // 血压 低压最高值
  601. dbp_below: undefined, // 血压 低压最低值
  602. temperatureHigh: undefined, // 温度报警设置最高值
  603. temperatureLow: undefined, // 温度报警设置最低值
  604. autoafInterval: undefined, // 自动房颤设置 测量持续时间(秒)
  605. rriSingleTime: undefined, // 自动房颤设置(可选值。设置为true,按照心率间隔,每次测量完心率后测量一次。设置为false,一直测量)
  606. step: undefined, // 目标步数
  607. distance: undefined, // 目标距离,单位米
  608. calorie: undefined, // 目标卡路里,单位千卡
  609. language: undefined, // 语言设置
  610. title: undefined, // 发送设备消息 标题
  611. description: undefined, // 发送设备消息 描述
  612. fallThreshold: 14000, // 跌倒检测的灵敏度,默认14000
  613. measureIntervalHr: undefined, // 心率数据测量间隔设置 分钟
  614. };
  615. this.resetForm("form");
  616. this.btnLoading = false
  617. },
  618. /** 修改按钮操作 */
  619. handleSet(deviceid, deviceNumber, item) {
  620. this.reset();
  621. this.form.deviceid = deviceid
  622. this.form.deviceNumber = deviceNumber;
  623. this.open = true;
  624. this.title = item.label;
  625. this.type = item.eventName
  626. },
  627. /** 提交按钮 */
  628. submitForm() {
  629. this.$refs["form"].validate((valid) => {
  630. if (valid) {
  631. if (this.form.deviceNumber != undefined) {
  632. this.confirmFun()
  633. } else {
  634. this.msgError("设备id错误~");
  635. }
  636. }
  637. });
  638. },
  639. confirmFun() {
  640. const flagTxt = this.form.flag ? '开启' : '关闭'
  641. const typeTxt = {
  642. fallcheck: `是否确认${flagTxt}设备信息编号为${this.form.deviceNumber}的跌倒检测?`,
  643. autolocate: `是否确认${flagTxt}设备信息编号为${this.form.deviceNumber}的自动定位?`,
  644. }
  645. this.$confirm(typeTxt[this.type] || `是否确认对设备id为${this.form.deviceNumber}进行以上操作?`, "警告", {
  646. confirmButtonText: "确定",
  647. cancelButtonText: "取消",
  648. type: "warning"
  649. }).then(() => {
  650. this.handleFun()
  651. }).then(() => {
  652. this.open = false
  653. // this.$emit("refreshList")
  654. }).catch(() => { });
  655. },
  656. handleFun() {
  657. const options = {
  658. // 设备跌倒检测开关
  659. fallcheck: () => fallcheck({
  660. deviceNumber: this.form.deviceNumber,
  661. flag: this.form.flag
  662. }),
  663. // 设备自动定位开关
  664. autolocate: () => autolocate({
  665. deviceNumber: this.form.deviceNumber,
  666. flag: this.form.flag,
  667. time: this.form.time,
  668. mode: this.form.mode
  669. }),
  670. // 设备数据上传间隔设置
  671. datafreq: () => datafreq({
  672. deviceNumber: this.form.deviceNumber,
  673. flag: this.form.flag,
  674. time: this.form.time,
  675. mode: this.form.mode
  676. }),
  677. // 翻腕亮屏设置
  678. lcdgesture: () => lcdgesture({
  679. deviceNumber: this.form.deviceNumber,
  680. flag: this.form.flag,
  681. start: this.form.flag ? this.form.start : undefined,
  682. end: this.form.flag ? this.form.end : undefined
  683. }),
  684. // 心率报警设置
  685. hralarm: () => hralarm({
  686. deviceid: this.form.deviceNumber,
  687. open: this.form.flag,
  688. high: this.form.high,
  689. low: this.form.low,
  690. timeout: this.form.timeout,
  691. interval: this.form.interval,
  692. }),
  693. // 血氧报警设置
  694. spo2alarm: () => spo2alarm({
  695. deviceid: this.form.deviceNumber,
  696. open: this.form.flag,
  697. low: this.form.spo2low,
  698. }),
  699. // 血压报警设置
  700. bpalarm: () => bpalarm({
  701. deviceid: this.form.deviceNumber,
  702. open: this.form.flag,
  703. sbp_high: this.form.sbp_high,
  704. sbp_below: this.form.sbp_below,
  705. dbp_high: this.form.dbp_high,
  706. dbp_below: this.form.dbp_below,
  707. }),
  708. // 温度报警设置
  709. temperatureAlarm: () => temperatureAlarm({
  710. deviceNumber: this.form.deviceNumber,
  711. flag: this.form.flag,
  712. high: this.form.flag ? Number(this.form.temperatureHigh) * 10 : undefined,
  713. low: this.form.flag ? Number(this.form.temperatureLow) * 10 : undefined,
  714. }),
  715. // 自动房颤设置
  716. autoaf: () => autoaf({
  717. deviceNumber: this.form.deviceNumber,
  718. flag: this.form.flag,
  719. interval: this.form.autoafInterval,
  720. rriSingleTime: this.form.rriSingleTime,
  721. }),
  722. // 目标设置
  723. goal: () => goal({
  724. deviceid: this.form.deviceNumber,
  725. step: this.form.step,
  726. distance: this.form.distance,
  727. calorie: this.form.calorie,
  728. }),
  729. // 设置语言
  730. languageSet: () => languageSet({
  731. deviceid: this.form.deviceNumber,
  732. languageid: this.form.language,
  733. }),
  734. // 发送设备消息
  735. messageSend: () => messageSend({
  736. deviceNumber: this.form.deviceNumber,
  737. title: this.form.title,
  738. description: this.form.description,
  739. }),
  740. // 设置跌倒检测灵敏度
  741. fallcheckSensitivity: () => fallcheckSensitivity({
  742. deviceNumber: this.form.deviceNumber,
  743. fallThreshold: this.form.fallThreshold
  744. }),
  745. // 心率数据测量间隔设置
  746. measureIntervalHr: () => measureIntervalHr({
  747. deviceNumber: this.form.deviceNumber,
  748. interval: this.form.measureIntervalHr
  749. }),
  750. // 其他非心率数据测量间隔设置
  751. measureIntervalOther: () => measureIntervalOther({
  752. deviceNumber: this.form.deviceNumber,
  753. interval: this.form.measureIntervalOther
  754. }),
  755. };
  756. const option = options[this.type];
  757. if (option) {
  758. this.btnLoading = true
  759. option().then(res => {
  760. this.btnLoading = false
  761. if (res.code == 200) {
  762. this.msgSuccess("操作成功");
  763. } else {
  764. this.msgError(res.msg);
  765. }
  766. }).catch(err => {
  767. this.btnLoading = false
  768. })
  769. }
  770. }
  771. },
  772. };
  773. </script>
  774. <style lang="scss" scoped>
  775. .timeout {
  776. ::v-deep {
  777. .el-form-item__error {
  778. left: 100px;
  779. }
  780. }
  781. &-box {
  782. display: flex;
  783. align-items: center;
  784. font-size: 14px;
  785. color: #606266;
  786. font-weight: 700;
  787. &::before {
  788. content: '*';
  789. color: #ff4949;
  790. margin-right: -8px;
  791. }
  792. }
  793. &-txt {
  794. flex-shrink: 0;
  795. margin: 0 12px;
  796. }
  797. &-input {
  798. flex: 1;
  799. }
  800. }
  801. </style>