Browse Source

init

master
nicky 5 months ago
parent
commit
3aa3d55ead
  1. 26193
      package-lock.json
  2. 5
      package.json
  3. 10
      src/App.vue
  4. 25
      src/api/index.js
  5. BIN
      src/assets/images/icon-design-34.png
  6. BIN
      src/assets/images/login-bg2.png
  7. BIN
      src/assets/images/xz.png
  8. BIN
      src/assets/images/探针.png
  9. BIN
      src/assets/images/矩形标记.png
  10. BIN
      src/assets/images/长度测量直尺.png
  11. BIN
      src/assets/images/阴影.png
  12. 288
      src/components/yuanzhen-dcmView/dcmview.vue
  13. 16022
      src/components/yuanzhen-dcmView/dist/cornerstone.js
  14. 3
      src/components/yuanzhen-dcmView/dist/cornerstoneMath.min.js
  15. 38419
      src/components/yuanzhen-dcmView/dist/cornerstoneTools.js
  16. 2
      src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundle.min.js
  17. 2
      src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundleCopy.min.js
  18. 3
      src/components/yuanzhen-dcmView/dist/cornerstoneWebImageLoader.min.js
  19. 3942
      src/components/yuanzhen-dcmView/dist/dicomParser.min.js
  20. 1256
      src/components/yuanzhen-dcmView/dist/hammer.js
  21. 11
      src/components/yuanzhen-dcmView/package.json
  22. 168
      src/config/axios.js
  23. 650
      src/config/code.js
  24. 4
      src/layouts/BasicLayout.less
  25. 39
      src/layouts/BasicLayout.vue
  26. 27
      src/main.js
  27. 14
      src/store/index.js
  28. 17
      src/store/modules/storm/actions.js
  29. 655
      src/views/Patient/components/patient-create.vue
  30. 4
      src/views/Patient/components/patient-detail.vue
  31. 2
      src/views/Patient/index.vue
  32. 64
      src/views/document/components/detail.vue
  33. 9
      src/views/document/components/report.vue
  34. 55
      src/views/document/index.vue
  35. 97
      src/views/login/index.vue
  36. 247
      src/views/statistics/index.vue
  37. 134
      src/views/thrombolysis/components/throm-before.vue
  38. 2
      src/views/thrombolysis/components/throm-before0.vue
  39. 7
      src/views/thrombolysis/components/throm-before1.vue
  40. 45
      src/views/thrombolysis/components/throm-before2.vue
  41. 53
      src/views/thrombolysis/components/throm-before3.vue
  42. 34
      src/views/thrombolysis/components/throm-before4.vue
  43. 700
      src/views/thrombolysis/components/throm-ing-date.vue
  44. 69
      src/views/thrombolysis/components/throm-ing-min.vue
  45. 8
      src/views/thrombolysis/components/throm-ing-reactions.vue
  46. 4
      src/views/thrombolysis/components/throm-ing-record.vue
  47. 12
      src/views/thrombolysis/components/throm-ing-selDrug.vue
  48. 55
      src/views/thrombolysis/components/throm-ing.vue
  49. 410
      src/views/thrombolysis/components/throm-interfere-image-dcm.vue
  50. 82
      src/views/thrombolysis/components/throm-interfere-image.vue
  51. 340
      src/views/thrombolysis/components/throm-interfere-informed - 副本.vue
  52. 632
      src/views/thrombolysis/components/throm-interfere-informed.vue
  53. 72
      src/views/thrombolysis/components/throm-interfere-surgical.vue
  54. 7
      src/views/thrombolysis/components/throm-interfere.vue
  55. 208
      src/views/thrombolysis/components/throm-report.vue
  56. 451
      src/views/thrombolysis/components/throm-result-baseInfo.vue
  57. 707
      src/views/thrombolysis/components/throm-result-firstInfo.vue
  58. 169
      src/views/thrombolysis/components/throm-result.vue
  59. 66
      src/views/thrombolysis/index.vue

26193
package-lock.json

File diff suppressed because it is too large

5
package.json

@ -14,6 +14,8 @@
"core-js": "^3.6.5",
"dayjs": "^1.11.9",
"echarts": "^5.6.0",
"install": "^0.13.0",
"npm": "^11.1.0",
"reqwest": "^2.0.5",
"scss": "^0.2.4",
"scss-loader": "^0.0.1",
@ -24,7 +26,8 @@
"vue-infinite-scroll": "^2.0.2",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
"vuex": "^3.4.0",
"vuex-persistedstate": "^4.1.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.19",

10
src/App.vue

@ -16,8 +16,8 @@
</div>
</div>
</a-spin>
<!-- 全局计时 -->
<Dragger v-if="$route.name !== 'PatientList' && getCount" ref="timer" class="count-container">
<!-- 全局计时 $route.name !== 'PatientList' && -->
<Dragger v-if="getCount" ref="timer" class="count-container">
<div class="count-name">静脉溶栓</div>
<!-- <van-count-down :time="getCount" format="mm:ss" /> -->
<Count />
@ -337,11 +337,11 @@
.zhezhao .ant-spin-container {
height: 100%
}
.ant-modal div[aria-hidden="true"]{
.ant-modal div[aria-hidden="true"] {
display: none !important;
}
.storm {
display: flex;
flex: 1;

25
src/api/index.js

@ -25,6 +25,17 @@ export const queryTriageList = (params) =>
export const create = (params) =>
axios.post(`${proxyUrl1}/firstAid/create`, params);
//根据id,查询患者信息,回写患者信息
export const queryById = (params) =>
axios.post(`${proxyUrl1}/firstAid/queryById`, params);
// 编辑患者
export const eduitPatient = (params) =>
axios.post(`${proxyUrl1}//firstAid/eduitPatient`, params);
// 查病历数据
export const queryAidRecord = (firstAidId, codeList) =>
axios.post(`${proxyUrl1}/firstAid/queryAidRecord`, {
@ -301,6 +312,12 @@ export const operationLog = (params) =>
axios.post(`${proxyUrl1}/interfere/operationLog`, {
...params
});
// 介入手术记录/总报告/DNT时间表
export const operationLogEx = (params) =>
axios.post(`${proxyUrl1}//export/operationLog`, {
...params
});
// 创建急救
export const createFirstAid = (params) =>
axios.post(`${proxyUrl1}/firstAid/createFirstAid`, {
@ -310,7 +327,7 @@ export const createPatient = (params) =>
axios.post(`${proxyUrl1}/firstAid/createPatient`, {
...params
});
export const eduitPatient = (params) =>
axios.post(`${proxyUrl1}/firstAid/eduitPatient`, {
...params
});
// export const eduitPatient = (params) =>
// axios.post(`${proxyUrl1}/firstAid/eduitPatient`, {
// ...params
// });

BIN
src/assets/images/icon-design-34.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src/assets/images/login-bg2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 KiB

BIN
src/assets/images/xz.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
src/assets/images/探针.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/images/矩形标记.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/images/长度测量直尺.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
src/assets/images/阴影.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

288
src/components/yuanzhen-dcmView/dcmview.vue

@ -0,0 +1,288 @@
<template>
<div style="width: 100%; height: 100%">
<div id="dicomImage"></div>
</div>
</template>
<script>
//
import cornerstone from './dist/cornerstone.js';
import cornerstoneTools from './dist/cornerstoneTools';
import cornerstoneWADOImageLoader from './dist/cornerstoneWADOImageLoader.bundle.min';
import Hammer from './dist/hammer';
import dicomParser from './dist/dicomParser.min';
import cornerstoneMath from './dist/cornerstoneMath.min';
export default {
name: 'dcmview',
props: {
currentDcm: {
type: Array,
default: [],
},
imgurl: {
type: String,
default: '',
},
toolType: {
type: String,
default: '',
},
width: {
type: String,
default: '750rpx',
},
height: {
type: String,
default: '1000rpx',
},
},
data() {
return {
imageIds: [],
};
},
watch: {
toolType: {
handler(newVal, lodVal) {
console.log(newVal, lodVal);
this.viewDcm1();
},
},
currentDcm: {
handler(newVal, lodVal) {
console.log('newVal', newVal);
this.handleDcm(newVal);
},
},
},
mounted() {
console.log(11111111, '1212');
this.handleDcm(this.currentDcm);
console.log(11111111, this.currentDcm);
},
methods: {
//
async handleDcm(_Arr) {
let that = this;
this.imageIds = [];
await _Arr.forEach((item) => {
this.imageIds.push('dicomweb:' + item.dcmPath);
});
this.viewDcm();
},
// dcm
viewDcm() {
cornerstoneTools.external.cornerstone = cornerstone;
cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
cornerstoneTools.external.Hammer = Hammer;
cornerstoneWADOImageLoader.external.dicomParser = dicomParser;
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
cornerstoneWADOImageLoader.webWorkerManager.initialize({
maxWebWorkers: navigator.hardwareConcurrency || 1,
startWebWorkersOnDemand: true,
taskConfiguration: {
decodeTask: {
initializeCodecsOnStartup: false,
},
},
webWorkerPath: './dist/cornerstoneWADOImageLoader.bundleCopy.min.js',
});
cornerstoneTools.init({
mouseEnabled: true, //
touchEnabled: true, //
showSVGCursors: true,
autoResizeViewports: true,
});
const element = document.getElementById('dicomImage');
cornerstone.enable(element);
// const PanTool = cornerstoneTools.PanTool;
const StackScrollTool = cornerstoneTools.StackScrollTool;
const StackScrollMouseWheelTool =
cornerstoneTools.StackScrollMouseWheelTool;
const imageIds = this.imageIds;
const stack = {
currentImageIdIndex: 0,
imageIds: imageIds,
};
console.log('imageIds', imageIds);
element.addEventListener('cornerstonenewimage', (event) => {
console.log('event: ', event);
// console.log(event.detail.oldImage, stack.currentImageIdIndex, 'event')
this.hanldeByValue(stack.currentImageIdIndex);
});
element.addEventListener('cornerstonetap', (event) => {
console.log('cornerstonetap: ', cornerstonetap);
const direction = event.detail.direction;
if (direction === 'LEFT') {
//
stack.currentImageIdIndex++;
} else if (direction === 'RIGHT') {
//
stack.currentImageIdIndex--;
}
//
const imageIds = stack.imageIds;
const newImageIdIndex = stack.currentImageIdIndex;
const newImageId = imageIds[newImageIdIndex];
cornerstone
.loadAndCacheImage(newImageId)
.then((loadedImage) => {
cornerstone.displayImage(element, loadedImage);
});
});
console.log('imageIds,', imageIds)
cornerstone.loadImage(imageIds[0]).then((image) => {
console.log(image, 'image');
cornerstone.displayImage(element, image);
cornerstoneTools.addStackStateManager(element, ['stack']);
cornerstoneTools.addToolState(element, 'stack', stack);
// cornerstoneTools.addTool(PanTool);
cornerstoneTools.addTool(StackScrollTool, {
configuration: {
loop: true,
allowSkipping: true,
},
});
cornerstoneTools.addTool(StackScrollMouseWheelTool, {
configuration: {
loop: true,
allowSkipping: true,
invert: false,
},
});
// cornerstoneTools.setToolActive('Pan', { mouseButtonMask: 1 });
cornerstoneTools.setToolActive('StackScroll', {
mouseButtonMask: 1,
});
cornerstoneTools.setToolActive('StackScrollMouseWheel', {
mouseButtonMask: 4,
});
});
},
// dcm
viewDcm1() {
var element = document.getElementById('dicomImage');
//
console.log('this.toolType: ', this.toolType);
switch (this.toolType) {
case 'ScrollTool':
const StackScrollTool = cornerstoneTools.StackScrollTool;
const StackScrollMouseWheelTool =
cornerstoneTools.StackScrollMouseWheelTool;
cornerstoneTools.addTool(StackScrollTool, {
configuration: {
loop: true,
allowSkipping: true,
},
});
cornerstoneTools.addTool(StackScrollMouseWheelTool, {
configuration: {
loop: true,
allowSkipping: true,
invert: false,
},
});
// cornerstoneTools.setToolActive('Pan', { mouseButtonMask: 1 });
cornerstoneTools.setToolActive('StackScroll', {
mouseButtonMask: 1,
});
cornerstoneTools.setToolActive('StackScrollMouseWheel', {
mouseButtonMask: 4,
});
break;
case 'Wwwc':
// cornerstoneTools,
const WwwcTool = cornerstoneTools.WwwcTool;
//WwwcTool,
cornerstoneTools.addTool(WwwcTool);
//
cornerstoneTools.setToolActive('Wwwc', {
mouseButtonMask: 1,
});
break;
case 'Angle':
//
const AngleTool = cornerstoneTools.AngleTool;
cornerstoneTools.addTool(AngleTool);
cornerstoneTools.setToolActive('Angle', {
mouseButtonMask: 1,
});
break;
case 'RectangleRoi':
// Roi
const RectangleRoiTool = cornerstoneTools.RectangleRoiTool;
cornerstoneTools.addTool(RectangleRoiTool);
cornerstoneTools.setToolActive('RectangleRoi', {
mouseButtonMask: 1,
});
break;
case 'DragProbe':
//
const DragProbeTool = cornerstoneTools.DragProbeTool;
cornerstoneTools.addTool(DragProbeTool);
cornerstoneTools.setToolActive('DragProbe', {
mouseButtonMask: 1,
});
break;
case 'Length':
//
const LengthTool = cornerstoneTools.LengthTool;
cornerstoneTools.addTool(LengthTool);
cornerstoneTools.setToolActive('Length', {
mouseButtonMask: 1,
});
break;
case 'Zoom':
//
const ZoomMouseWheelTool =
cornerstoneTools.ZoomMouseWheelTool;
cornerstoneTools.addTool(ZoomMouseWheelTool);
cornerstoneTools.setToolActive('ZoomMouseWheel', {
mouseButtonMask: 1,
});
break;
case 'eliminate':
//
cornerstoneTools.clearToolState(element, 'Length');
break;
default:
throw new Error('工具参数错误');
break;
}
},
clearAllTool() {
for (let k in this.name) {
cornerstoneTools.clearToolState(this.element, this.name[k]);
}
// tool
cornerstone.updateImage(this.element);
// reset viewport
cornerstone.reset(this.element);
},
//
hanldeByValue(_index) {
this.$emit('byValue', _index);
},
},
};
</script>
<style>
/* 定义图片显示区域div大小 */
#dicomImage {
width: 100%;
height: 100%;
}
.btn {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
</style>

16022
src/components/yuanzhen-dcmView/dist/cornerstone.js

File diff suppressed because it is too large

3
src/components/yuanzhen-dcmView/dist/cornerstoneMath.min.js

File diff suppressed because one or more lines are too long

38419
src/components/yuanzhen-dcmView/dist/cornerstoneTools.js

File diff suppressed because it is too large

2
src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundle.min.js

File diff suppressed because one or more lines are too long

2
src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundleCopy.min.js

File diff suppressed because one or more lines are too long

3
src/components/yuanzhen-dcmView/dist/cornerstoneWebImageLoader.min.js

@ -0,0 +1,3 @@
/*! cornerstone-web-image-loader - 2.1.1 - 2018-12-05 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWebImageLoader */
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstoneWebImageLoader",[],t):"object"==typeof exports?exports.cornerstoneWebImageLoader=t():e.cornerstoneWebImageLoader=t()}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=5)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.external=void 0;var r,o=n(4),a=(r=o)&&r.__esModule?r:{default:r};var u=void 0,i={set cornerstone(e){u=e,(0,a.default)(u)},get cornerstone(){return u}};t.external=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadImage=function(e){var t=r.external.cornerstone,n=new XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",i.beforeSend(n),n.onprogress=function(n){if(n.lengthComputable){var r=n.loaded,o=n.total,a=Math.round(r/o*100),u={imageId:e,loaded:r,total:o,percentComplete:a};t.triggerEvent(t.events,"cornerstoneimageloadprogress",u)}},{promise:new Promise(function(t,r){n.onload=function(){(0,o.default)(this.response).then(function(n){var r=(0,a.default)(n,e);t(r)},r)},n.send()}),cancelFn:function(){n.abort()}}},t.configure=function(e){i=e};var r=n(0),o=u(n(3)),a=u(n(2));function u(e){return e&&e.__esModule?e:{default:e}}var i={beforeSend:function(){}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=e.naturalHeight,u=e.naturalWidth;return{imageId:t,minPixelValue:0,maxPixelValue:255,slope:1,intercept:0,windowCenter:128,windowWidth:255,render:r.external.cornerstone.renderWebImage,getPixelData:function(){return(n=void 0,a===t?n=o.getContext("2d"):(o.height=e.naturalHeight,o.width=e.naturalWidth,(n=o.getContext("2d")).drawImage(e,0,0),a=t),n.getImageData(0,0,e.naturalWidth,e.naturalHeight)).data;var n},getCanvas:function(){return a===t?o:(o.height=e.naturalHeight,o.width=e.naturalWidth,o.getContext("2d").drawImage(e,0,0),a=t,o)},getImage:function(){return e},rows:n,columns:u,height:n,width:u,color:!0,rgba:!1,columnPixelSpacing:void 0,rowPixelSpacing:void 0,invert:!1,sizeInBytes:n*u*4}};var r=n(0),o=document.createElement("canvas"),a=void 0},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return new Promise(function(t,n){var r=new Image,o=new Uint8Array(e),a=new Blob([o]),u=window.URL||window.webkitURL,i=u.createObjectURL(a);r.src=i,r.onload=function(){t(r),u.revokeObjectURL(i)},r.onerror=function(e){u.revokeObjectURL(i),n(e)}})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){e.registerImageLoader("http",r.loadImage),e.registerImageLoader("https",r.loadImage)};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.external=t.configure=t.loadImage=t.createImage=t.arrayBufferToImage=void 0;var r=i(n(3)),o=i(n(2)),a=n(1),u=n(0);function i(e){return e&&e.__esModule?e:{default:e}}var d={arrayBufferToImage:r.default,createImage:o.default,loadImage:a.loadImage,configure:a.configure,external:u.external};t.arrayBufferToImage=r.default,t.createImage=o.default,t.loadImage=a.loadImage,t.configure=a.configure,t.external=u.external,t.default=d}])});
//# sourceMappingURL=cornerstoneWebImageLoader.min.js.map

3942
src/components/yuanzhen-dcmView/dist/dicomParser.min.js

File diff suppressed because it is too large

1256
src/components/yuanzhen-dcmView/dist/hammer.js

File diff suppressed because it is too large

11
src/components/yuanzhen-dcmView/package.json

@ -0,0 +1,11 @@
{
"name": "dcmview",
"version": "1.1.0",
"description": "基于cornerstone.js的前端预览dicom医学影像组件",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

168
src/config/axios.js

@ -4,8 +4,12 @@ import Vue from 'vue';
import axios from 'axios';
import router from '../router/index';
import store from '../store/index';
import { message } from 'ant-design-vue';
let { proxyUrl } = require('@/config/setting');
import {
message
} from 'ant-design-vue';
let {
proxyUrl
} = require('@/config/setting');
let config = {
timeout: 10000, // Timeout
};
@ -37,87 +41,93 @@ axios.interceptors.request.use(
// Add a response interceptor
axios.interceptors.response.use(
async (res) => {
store.commit('storm/setSpinning', false);
const { code, msg, data } = res.data;
if (code === 200) {
return res.data;
} else if (code === 401) {
localStorage.setItem('anyringToken', null);
let [err, data] = await store.dispatch('storm/toLogin', {
padNo: store.state.storm.padNo,
});
let token = data.access_token;
const config = res.config;
let reTry = config.reTry + 1;
let cfg = Object.assign({}, config);
cfg.reTry = reTry;
cfg.headers['Authorization'] = `Bearer ${token}`;
// console.log('token222: ', token);
let resNew;
if (reTry < 3 && token) {
resNew = await axios(cfg);
store.commit('storm/setSpinning', false);
const {
code,
msg,
data
} = res.data;
if (code === 200) {
return res.data;
} else if (code === 401) {
router.replace('/login')
return Promise.resolve(res.data);
// localStorage.setItem('anyringToken', null);
// let [err, data] = await store.dispatch('storm/toLogin', {
// padNo: store.state.storm.padNo,
// });
// let token = data.access_token;
// const config = res.config;
// let reTry = config.reTry + 1;
// let cfg = Object.assign({}, config);
// cfg.reTry = reTry;
// cfg.headers['Authorization'] = `Bearer ${token}`;
// // console.log('token222: ', token);
// let resNew;
// if (reTry < 3 && token) {
// resNew = await axios(cfg);
// }
// return Promise.resolve(resNew || res.data);
} else {
message.error(msg || '请求发生错误');
return Promise.resolve(res.data);
}
return Promise.resolve(resNew || res.data);
} else {
message.error(msg || '请求发生错误');
return Promise.resolve(res.data);
}
},
(error) => {
//异常关闭loading
store.commit('storm/setSpinning', false);
// Do something with response error
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = '请求错误';
break;
case 401:
error.message = '';
// executeSkip();
break;
case 403:
error.message = '拒绝访问';
break;
case 404:
error.message = '请求出错';
break;
case 408:
error.message = '请求超时';
break;
case 500:
error.message = '请求错误,请稍后重试';
//设置响应后加载状态
break;
case 501:
error.message = '服务未实现';
break;
case 502:
error.message = '网络错误';
break;
case 503:
error.message = '服务不可用';
break;
case 504:
error.message = '网络超时';
break;
case 505:
error.message = 'HTTP版本不受支持';
break;
default:
error.message = '连接出错';
},
(error) => {
//异常关闭loading
store.commit('storm/setSpinning', false);
// Do something with response error
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = '请求错误';
break;
case 401:
error.message = '';
// executeSkip();
break;
case 403:
error.message = '拒绝访问';
break;
case 404:
error.message = '请求出错';
break;
case 408:
error.message = '请求超时';
break;
case 500:
error.message = '请求错误,请稍后重试';
//设置响应后加载状态
break;
case 501:
error.message = '服务未实现';
break;
case 502:
error.message = '网络错误';
break;
case 503:
error.message = '服务不可用';
break;
case 504:
error.message = '网络超时';
break;
case 505:
error.message = 'HTTP版本不受支持';
break;
default:
error.message = '连接出错';
}
} else {
error.message = '网络异常,请稍后重试';
}
} else {
error.message = '网络异常,请稍后重试';
}
if (error.message) {
message.error(error.message);
if (error.message) {
message.error(error.message);
}
return Promise.reject(error);
}
return Promise.reject(error);
}
);
Plugin.install = function (Vue) {
Plugin.install = function(Vue) {
Vue.axios = _axios;
window.axios = _axios;
Object.defineProperties(Vue.prototype, {
@ -141,4 +151,4 @@ Plugin.install = function (Vue) {
Vue.use(Plugin);
export default Plugin;
export default Plugin;

650
src/config/code.js

@ -23,6 +23,26 @@ export const MEDICAL_CODE = {
醒后卒中: '醒后卒中',
},
},
'JBXX-ISRS': {
// 是否溶栓
text: '是否溶栓',
type: 'radio',
default: '是',
range: {
: '是',
: '否',
},
},
'JBXX-ISJR': {
// 是否介入
text: '是否介入',
type: 'radio',
default: '是',
range: {
: '是',
: '否',
},
},
'JBXX-FBSJ': {
text: '发病时间',
type: 'datetime',
@ -149,15 +169,12 @@ export const MRS_LIST = {
};
// nihss
export const NIHSS_LIST = [
{
export const NIHSS_LIST = [{
text: '1a.意识水平',
description:
'即使不能全面评价(如气管插管、语言障碍、气管创伤及绷带包扎等),检查者也必须选择1个反应。只在患者对有害刺激无反应时(不是反射)才能记录3分。',
description: '即使不能全面评价(如气管插管、语言障碍、气管创伤及绷带包扎等),检查者也必须选择1个反应。只在患者对有害刺激无反应时(不是反射)才能记录3分。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '清醒,反应灵敏(0分)',
},
@ -177,12 +194,10 @@ export const NIHSS_LIST = [
},
{
text: '1b.意识水平提问',
description:
'月份、年龄。仅对初次回答评分。失语和昏迷者不能理解问题记2分,因气管插管、气管创伤、严重构音障碍、语言障碍或其他任何原因不能完成者(非失语所致)记1分。可书面回答。',
description: '月份、年龄。仅对初次回答评分。失语和昏迷者不能理解问题记2分,因气管插管、气管创伤、严重构音障碍、语言障碍或其他任何原因不能完成者(非失语所致)记1分。可书面回答。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '两项均正确',
},
@ -198,12 +213,10 @@ export const NIHSS_LIST = [
},
{
text: '1c.意识水平指令',
description:
'睁闭眼;非瘫痪侧握拳松开。仅对最初反应评分,有明确努力但未完成的也给分。若对指令无反应,用动作示意,然后记录评分。对创伤、截肢或其他生理缺陷者,应予适当的指令。',
description: '睁闭眼;非瘫痪侧握拳松开。仅对最初反应评分,有明确努力但未完成的也给分。若对指令无反应,用动作示意,然后记录评分。对创伤、截肢或其他生理缺陷者,应予适当的指令。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '两项均正确',
},
@ -220,12 +233,10 @@ export const NIHSS_LIST = [
{
text: '2.凝视',
description:
'只测试水平眼球运动。对随意或反射性眼球运动记分。若眼球偏斜能被随意或反射性活动纠正,记1分。若为孤立的周围性眼肌麻痹记1分。对失语者,凝视是可以测试的。对眼球创伤、绷带包扎、盲人或有其他视力、视野障碍者,由检查者选择一种反射性运动来测试,确定眼球的联系,然后从一侧向另一侧运动,偶尔能发现部分性凝视麻痹。',
description: '只测试水平眼球运动。对随意或反射性眼球运动记分。若眼球偏斜能被随意或反射性活动纠正,记1分。若为孤立的周围性眼肌麻痹记1分。对失语者,凝视是可以测试的。对眼球创伤、绷带包扎、盲人或有其他视力、视野障碍者,由检查者选择一种反射性运动来测试,确定眼球的联系,然后从一侧向另一侧运动,偶尔能发现部分性凝视麻痹。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '正常',
},
@ -241,12 +252,10 @@ export const NIHSS_LIST = [
},
{
text: '3.视野',
description:
'若能看到侧面的手指,记录正常。若单眼盲或眼球摘除,检查另一只眼。明确的非对称盲(包括象限盲)记1分。若全盲(任何原因)记3分。若频临死亡记1分,结果用于回答问题',
description: '若能看到侧面的手指,记录正常。若单眼盲或眼球摘除,检查另一只眼。明确的非对称盲(包括象限盲)记1分。若全盲(任何原因)记3分。若频临死亡记1分,结果用于回答问题',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '无视野缺损',
},
@ -269,8 +278,7 @@ export const NIHSS_LIST = [
description: null,
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '正常',
},
@ -290,12 +298,10 @@ export const NIHSS_LIST = [
},
{
text: '5.上肢运动',
description:
'置肢体于合适的位置:坐位时0上肢平举90°,仰卧时上抬45,掌心向下,下L肢卧位抬高30°,若上肢在10秒内,下肢在5秒内下落,记1~4分。对失语者用语言或动作鼓励,不用有害刺激,依次检查每个肢体,从非瘫痪侧上肢开始。',
description: '置肢体于合适的位置:坐位时0上肢平举90°,仰卧时上抬45,掌心向下,下L肢卧位抬高30°,若上肢在10秒内,下肢在5秒内下落,记1~4分。对失语者用语言或动作鼓励,不用有害刺激,依次检查每个肢体,从非瘫痪侧上肢开始。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '无下落,置肢体于90°(或45°)坚持10秒',
},
@ -323,12 +329,10 @@ export const NIHSS_LIST = [
},
{
text: '6.下肢运动',
description:
'置肢体于合适的位置:坐位时0上肢平举90°,仰卧时上抬45,掌心向下,下L肢卧位抬高30°,若上肢在10秒内,下肢在5秒内下落,记1~4分。对失语者用语言或动作鼓励,不用有害刺激,依次检查每个肢体,从非瘫痪侧上肢开始。',
description: '置肢体于合适的位置:坐位时0上肢平举90°,仰卧时上抬45,掌心向下,下L肢卧位抬高30°,若上肢在10秒内,下肢在5秒内下落,记1~4分。对失语者用语言或动作鼓励,不用有害刺激,依次检查每个肢体,从非瘫痪侧上肢开始。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '无下落,于要求位置坚持5秒',
},
@ -356,12 +360,10 @@ export const NIHSS_LIST = [
},
{
text: '7.肢体共济失调',
description:
'目的是发现一侧小脑病变。检查时睁眼,若有视力障碍,确保检查在无视野缺损中进行双侧指鼻试验、跟膝径试验,共济失调与无力明显,不呈比例时记分。若患者不能理解或肢体瘫痪不记分。盲人用伸展的上肢摸鼻。若为截肢或关节融合记9分',
description: '目的是发现一侧小脑病变。检查时睁眼,若有视力障碍,确保检查在无视野缺损中进行双侧指鼻试验、跟膝径试验,共济失调与无力明显,不呈比例时记分。若患者不能理解或肢体瘫痪不记分。盲人用伸展的上肢摸鼻。若为截肢或关节融合记9分',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '无共济失调',
},
@ -381,12 +383,10 @@ export const NIHSS_LIST = [
},
{
text: '8.感觉',
description:
'检查对针刺的感觉和表情,或意识障碍及失语者对有害刺激的躲避。只对与脑卒中有关的感觉缺失评分。偏身感觉丧失者需要精确检查,应测试身体多处[上肢(不包括手)、下肢、躯干、面部]确定有无偏身肢感觉缺失 严重或完全的感觉。缺失记2分。昏睡或失语者记1 或0分。脑干卒中双侧感觉缺失记2分。无反应或四肢瘫痪者记2分。昏迷患者(la=3)记2分。',
description: '检查对针刺的感觉和表情,或意识障碍及失语者对有害刺激的躲避。只对与脑卒中有关的感觉缺失评分。偏身感觉丧失者需要精确检查,应测试身体多处[上肢(不包括手)、下肢、躯干、面部]确定有无偏身肢感觉缺失 严重或完全的感觉。缺失记2分。昏睡或失语者记1 或0分。脑干卒中双侧感觉缺失记2分。无反应或四肢瘫痪者记2分。昏迷患者(la=3)记2分。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '正常',
},
@ -402,12 +402,10 @@ export const NIHSS_LIST = [
},
{
text: '9.语言',
description:
'命名、阅读测试。若视觉缺损干扰测试,可让患者识别放在手上的物品,重复和发音。气管插管者手写回答。昏迷者记3分。给恍惚或不合作者选择一个记分,但3分仅给不能说话且不能执行任何指令者。',
description: '命名、阅读测试。若视觉缺损干扰测试,可让患者识别放在手上的物品,重复和发音。气管插管者手写回答。昏迷者记3分。给恍惚或不合作者选择一个记分,但3分仅给不能说话且不能执行任何指令者。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '正常',
},
@ -427,12 +425,10 @@ export const NIHSS_LIST = [
},
{
text: '10.构音障碍',
description:
'读或重复表上的单词。若有严重的实语,评估自发语言时发音的清晰度。若因气管插管或其他物理障碍不能讲话,记9分。',
description: '读或重复表上的单词。若有严重的实语,评估自发语言时发音的清晰度。若因气管插管或其他物理障碍不能讲话,记9分。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '正常',
},
@ -452,12 +448,10 @@ export const NIHSS_LIST = [
},
{
text: '11.忽视',
description:
'若患者严重视觉缺失影响双侧视觉的同时检查,皮肤刺激正常,记为正常。若失语,但确实表现为对双侧的注意,记分正常。视空间忽视或疾病失认也可认为是异常的证据。',
description: '若患者严重视觉缺失影响双侧视觉的同时检查,皮肤刺激正常,记为正常。若失语,但确实表现为对双侧的注意,记分正常。视空间忽视或疾病失认也可认为是异常的证据。',
value: null,
visible: false,
range: [
{
range: [{
value: 0,
text: '正常',
},
@ -813,6 +807,16 @@ export const BASE_CODE = {
},
default: '',
},
'JBXX-Result': {
text: '救治结果',
type: 'select',
range: {
住院: '住院',
转院: '转院',
死亡: '死亡',
},
default: '',
},
};
//患者急救信息
export const AID_CODE = {
@ -918,90 +922,90 @@ export const AID_CODE = {
};
// 静脉溶栓
export const JMRS_CODE = {
'JMRS-Y': {
text: '是否进行静脉溶栓',
type: 'radio',
default: '',
range: {
: '是',
: '否',
},
},
'JMRS-WRSYY': {
text: '未溶栓原因',
type: 'checkbox',
default: [''],
range: ['超时间创', '禁忌症', '患者/家属拒绝', '其他'],
showType: {
type: 'value',
code: 'JMRS-Y',
value: '否',
},
},
'JMRS-WRSYY-ELSE': {
text: '',
type: 'input',
inputType: 'text',
default: '',
showType: {
type: 'valueInclude',
code: 'JMRS-WRSYY',
value: '其他',
},
},
'JMRS-TH-TIME': {
text: '谈话开始时间',
type: 'datetime',
default: '',
valueType: 'string',
},
'JMRS-SIGN': {
text: '签署知情同意书',
type: 'modal',
rightText: '去签署',
rightArrow: true,
path: {
name: 'Informed',
},
},
'JMRS-Q-NIHSS': {
text: 'NIHSS评分',
description: '',
type: 'pageText',
rightArrow: true,
default: '',
operate: 'collapse',
operateData: {
text: '溶栓开始前',
code: [
'JMRS-Q-NIHSS',
'JMRS-Q-SYSTOLIC-PRESSURE',
'JMRS-Q-DIASTOLIC-PRESSURE',
],
},
},
'JMRS-Q-SYSTOLIC-PRESSURE': {
text: '收缩压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: 'JMRS-Q-NIHSS',
},
},
'JMRS-Q-DIASTOLIC-PRESSURE': {
text: '舒张压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: 'JMRS-Q-NIHSS',
},
},
// 'JMRS-Y': {
// text: '是否进行静脉溶栓',
// type: 'radio',
// default: '',
// range: {
// 是: '是',
// 否: '否',
// },
// },
// 'JMRS-WRSYY': {
// text: '未溶栓原因',
// type: 'checkbox',
// default: [''],
// range: ['超时间创', '禁忌症', '患者/家属拒绝', '其他'],
// showType: {
// type: 'value',
// code: 'JMRS-Y',
// value: '否',
// },
// },
// 'JMRS-WRSYY-ELSE': {
// text: '',
// type: 'input',
// inputType: 'text',
// default: '',
// showType: {
// type: 'valueInclude',
// code: 'JMRS-WRSYY',
// value: '其他',
// },
// },
// 'JMRS-TH-TIME': {
// text: '谈话开始时间',
// type: 'datetime',
// default: '',
// valueType: 'string',
// },
// 'JMRS-SIGN': {
// text: '签署知情同意书',
// type: 'modal',
// rightText: '去签署',
// rightArrow: true,
// path: {
// name: 'Informed',
// },
// },
// 'JMRS-Q-NIHSS': {
// text: 'NIHSS评分',
// description: '',
// type: 'pageText',
// rightArrow: true,
// default: '',
// operate: 'collapse',
// operateData: {
// text: '溶栓开始前',
// code: [
// 'JMRS-Q-NIHSS',
// 'JMRS-Q-SYSTOLIC-PRESSURE',
// 'JMRS-Q-DIASTOLIC-PRESSURE',
// ],
// },
// },
// 'JMRS-Q-SYSTOLIC-PRESSURE': {
// text: '收缩压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: 'JMRS-Q-NIHSS',
// },
// },
// 'JMRS-Q-DIASTOLIC-PRESSURE': {
// text: '舒张压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: 'JMRS-Q-NIHSS',
// },
// },
'JMRS-RSCS': {
text: '开始静脉溶栓场所',
type: 'select',
@ -1019,192 +1023,192 @@ export const JMRS_CODE = {
default: '',
valueType: 'string',
},
'JMRS-RSYW': {
text: '静脉溶栓药物',
type: 'select',
range: {
'rt-PA': 'rt-PA',
尿激酶: '尿激酶',
替奈普酶: '替奈普酶',
瑞替普酶: '瑞替普酶',
阿尼普酶: '阿尼普酶',
},
default: 'rt-PA',
},
'JMRS-RSYW-ZL': {
text: 'rt-PA',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'value',
code: 'JMRS-RSYW',
value: 'rt-PA',
},
},
'JMRS-TZJL': {
text: '团注剂量',
description: '(mg)',
type: 'input',
inputType: 'number',
default: '',
},
'JMRS-JDJL': {
text: '静滴剂量',
description: '(mg)',
type: 'input',
inputType: 'number',
default: '',
},
'JMRS-15-NIHSS': {
text: 'NIHSS评分',
description: '',
type: 'pageText',
rightArrow: true,
default: '',
operate: 'collapse',
operateData: {
text: '15min',
code: [
'JMRS-15-NIHSS',
'JMRS-15-SYSTOLIC-PRESSURE',
'JMRS-15-DIASTOLIC-PRESSURE',
],
},
},
'JMRS-15-SYSTOLIC-PRESSURE': {
text: '收缩压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '15min',
},
},
'JMRS-15-DIASTOLIC-PRESSURE': {
text: '舒张压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '15min',
},
},
'JMRS-30-NIHSS': {
text: 'NIHSS评分',
description: '',
type: 'pageText',
default: '',
operate: 'collapse',
operateData: {
text: '30min',
code: [
'JMRS-30-NIHSS',
'JMRS-30-SYSTOLIC-PRESSURE',
'JMRS-30-DIASTOLIC-PRESSURE',
],
},
},
'JMRS-30-SYSTOLIC-PRESSURE': {
text: '收缩压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '30min',
},
},
'JMRS-30-DIASTOLIC-PRESSURE': {
text: '舒张压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '30min',
},
},
'JMRS-45-NIHSS': {
text: 'NIHSS评分',
description: '',
type: 'pageText',
default: '',
operate: 'collapse',
operateData: {
text: '45min',
code: [
'JMRS-45-NIHSS',
'JMRS-45-SYSTOLIC-PRESSURE',
'JMRS-45-DIASTOLIC-PRESSURE',
],
},
},
'JMRS-45-SYSTOLIC-PRESSURE': {
text: '收缩压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '45min',
},
},
'JMRS-45-DIASTOLIC-PRESSURE': {
text: '舒张压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '45min',
},
},
'JMRS-60-NIHSS': {
text: 'NIHSS评分',
description: '',
type: 'pageText',
default: '',
operate: 'collapse',
operateData: {
text: '60min',
code: [
'JMRS-60-NIHSS',
'JMRS-60-SYSTOLIC-PRESSURE',
'JMRS-60-DIASTOLIC-PRESSURE',
],
},
},
'JMRS-60-SYSTOLIC-PRESSURE': {
text: '收缩压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '60min',
},
},
'JMRS-60-DIASTOLIC-PRESSURE': {
text: '舒张压',
description: '(mmHg)',
type: 'input',
inputType: 'number',
default: '',
showType: {
type: 'collapse',
code: '60min',
},
},
// 'JMRS-RSYW': {
// text: '静脉溶栓药物',
// type: 'select',
// range: {
// 'rt-PA': 'rt-PA',
// 尿激酶: '尿激酶',
// 替奈普酶: '替奈普酶',
// 瑞替普酶: '瑞替普酶',
// 阿尼普酶: '阿尼普酶',
// },
// default: 'rt-PA',
// },
// 'JMRS-RSYW-ZL': {
// text: 'rt-PA',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'value',
// code: 'JMRS-RSYW',
// value: 'rt-PA',
// },
// },
// 'JMRS-TZJL': {
// text: '团注剂量',
// description: '(mg)',
// type: 'input',
// inputType: 'number',
// default: '',
// },
// 'JMRS-JDJL': {
// text: '静滴剂量',
// description: '(mg)',
// type: 'input',
// inputType: 'number',
// default: '',
// },
// 'JMRS-15-NIHSS': {
// text: 'NIHSS评分',
// description: '',
// type: 'pageText',
// rightArrow: true,
// default: '',
// operate: 'collapse',
// operateData: {
// text: '15min',
// code: [
// 'JMRS-15-NIHSS',
// 'JMRS-15-SYSTOLIC-PRESSURE',
// 'JMRS-15-DIASTOLIC-PRESSURE',
// ],
// },
// },
// 'JMRS-15-SYSTOLIC-PRESSURE': {
// text: '收缩压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '15min',
// },
// },
// 'JMRS-15-DIASTOLIC-PRESSURE': {
// text: '舒张压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '15min',
// },
// },
// 'JMRS-30-NIHSS': {
// text: 'NIHSS评分',
// description: '',
// type: 'pageText',
// default: '',
// operate: 'collapse',
// operateData: {
// text: '30min',
// code: [
// 'JMRS-30-NIHSS',
// 'JMRS-30-SYSTOLIC-PRESSURE',
// 'JMRS-30-DIASTOLIC-PRESSURE',
// ],
// },
// },
// 'JMRS-30-SYSTOLIC-PRESSURE': {
// text: '收缩压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '30min',
// },
// },
// 'JMRS-30-DIASTOLIC-PRESSURE': {
// text: '舒张压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '30min',
// },
// },
// 'JMRS-45-NIHSS': {
// text: 'NIHSS评分',
// description: '',
// type: 'pageText',
// default: '',
// operate: 'collapse',
// operateData: {
// text: '45min',
// code: [
// 'JMRS-45-NIHSS',
// 'JMRS-45-SYSTOLIC-PRESSURE',
// 'JMRS-45-DIASTOLIC-PRESSURE',
// ],
// },
// },
// 'JMRS-45-SYSTOLIC-PRESSURE': {
// text: '收缩压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '45min',
// },
// },
// 'JMRS-45-DIASTOLIC-PRESSURE': {
// text: '舒张压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '45min',
// },
// },
// 'JMRS-60-NIHSS': {
// text: 'NIHSS评分',
// description: '',
// type: 'pageText',
// default: '',
// operate: 'collapse',
// operateData: {
// text: '60min',
// code: [
// 'JMRS-60-NIHSS',
// 'JMRS-60-SYSTOLIC-PRESSURE',
// 'JMRS-60-DIASTOLIC-PRESSURE',
// ],
// },
// },
// 'JMRS-60-SYSTOLIC-PRESSURE': {
// text: '收缩压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '60min',
// },
// },
// 'JMRS-60-DIASTOLIC-PRESSURE': {
// text: '舒张压',
// description: '(mmHg)',
// type: 'input',
// inputType: 'number',
// default: '',
// showType: {
// type: 'collapse',
// code: '60min',
// },
// },
};
// 血管内治疗
export const XGZL_CODE = {
@ -1354,4 +1358,4 @@ export const CODE_DICT = {
...AID_CODE, //患者急救信息
...JMRS_CODE, //静脉溶栓
...XGZL_CODE,
};
};

4
src/layouts/BasicLayout.less

@ -122,8 +122,8 @@
position: relative;
.global-layout-content{
height: calc(100vh - 5vw);
overflow-y: auto;
height: calc(100vh - 66px);
// overflow-y: auto;
padding: 10px;
}

39
src/layouts/BasicLayout.vue

@ -27,11 +27,13 @@
<a-layout>
<a-layout-header>
<div class="patient-box">
<div class="patient-info">
<div class="patient-info" @click="onClickPat"
v-if="patientData.firstAidId && patientData.finish_status != 1">
<span class="lable">姓名: </span>
<span class="text">{{patientData.patientName || '-'}}</span>
<span class="lable">性别: </span>
<span class="text">{{patientData.patientGender == 1 ? '女' : patientData.patientGender == 0 ? '男' : '-'}}</span>
<span
class="text">{{patientData.patientGender == 1 ? '女' : patientData.patientGender == 0 ? '男' : '-'}}</span>
<span class="lable">年龄: </span>
<span class="text">{{patientData.patientAge || '-'}}</span>
<span class="lable">证件号: </span>
@ -46,7 +48,7 @@
<div class="global-layout-content" id="globalLayoutContent">
<router-view />
</div>
<a-drawer placement="left" :visible="visible" width="320" @close="onClose" :getContainer="false"
:closable="false" :wrap-style="{ position: 'absolute' }">
<div class="person-drawer">
@ -85,14 +87,14 @@
</div>
<div class="person-footer">
<a-button class="persion-footer-button person-footer-reset" block>修改密码</a-button>
<a-button class="persion-footer-button person-footer-logout" type="primary"
block @click="logout" >退出登录</a-button>
<a-button class="persion-footer-button person-footer-logout" type="primary" block
@click="logout">退出登录</a-button>
</div>
</div>
</a-drawer>
</a-layout-content>
</a-layout>
</a-layout>
</div>
@ -103,7 +105,10 @@
mapMutations,
mapState
} from 'vuex';
import { loginInfo } from 'api';
import store from '@/store';
import {
loginInfo
} from 'api';
import icon01 from '@/assets/images/slice/icon01.png'
import icon01H from '@/assets/images/slice/icon01H.png'
import icon02 from '@/assets/images/slice/icon02.png'
@ -131,7 +136,7 @@
icon: icon02H,
iconactive: icon02,
}, {
name: '统计',
name: '质控',
path: '/statistics',
icon: icon03H,
iconactive: icon03,
@ -154,12 +159,15 @@
} else if (to.fullPath == '/statistics') {
vm.current = 2
vm.current_ = 2
} else if (to.fullPath == '/firstaid/patientList') {
vm.current = 0
vm.current_ = 0
} else {
vm.current = 0
vm.current_ = 0
if (to.fullPath != '/firstaid/patientList') {
vm.$router.replace('/firstaid/patientList')
}
// if (to.fullPath != '/firstaid/patientList') {
// vm.$router.replace('/firstaid/patientList')
// }
}
});
},
@ -174,13 +182,16 @@
else this.showPersion()
} else {
this.visible = false;
this.$router.replace(item.path)
this.$router.push(item.path)
}
},
onClickPat() {
this.$router.push('/firstaid/thrombolysis')
},
async showPersion() {
this.visible = true;
document.getElementById('globalLayoutContent').style.overflowY = 'hidden';
if(!this.loginInfo){
if (!this.loginInfo) {
var res = await loginInfo();
this.loginInfo = res.data || {}
}
@ -192,7 +203,7 @@
document.getElementById('globalLayoutContent').style.overflowY = 'auto';
this.current = this.current_
},
logout(){
logout() {
this.$router.replace('/login')
}
}

27
src/main.js

@ -40,7 +40,16 @@ Vue.prototype.home = home;
Vue.prototype.utils = util;
router.beforeEach(async (to, from, next) => {
const { back, more } = to.meta;
let token = localStorage.getItem('anyringToken');
console.log(to)
if (to.path != '/login' && !token) {
next('/login')
return
}
const {
back,
more
} = to.meta;
store.commit('storm/setShowBack', back);
store.commit('storm/setShowMore', more);
//患者列表清楚定时器
@ -48,7 +57,9 @@ router.beforeEach(async (to, from, next) => {
util.AnimationFrame.done('timerTask');
util.AnimationFrame.done('countTask');
}
const { deviceNo } = to.query;
const {
deviceNo
} = to.query;
if (deviceNo) {
if (deviceNo !== localStorage.getItem('APP_DEVICE_NO')) {
localStorage.setItem('anyringToken', null);
@ -61,8 +72,14 @@ router.beforeEach(async (to, from, next) => {
next();
}
});
document.addEventListener('UniAppJSBridgeReady', function () {
uni.getEnv(function (res) {
router.afterEach(async (to, from) => {
if(to.path == '/firstaid/patientList' && store.state?.patient?.patientData?.firstAidId){
router.replace('/firstaid/thrombolysis')
return;
}
})
document.addEventListener('UniAppJSBridgeReady', function() {
uni.getEnv(function(res) {
console.log('当前环境:' + JSON.stringify(res));
});
new Vue({
@ -70,4 +87,4 @@ document.addEventListener('UniAppJSBridgeReady', function () {
store,
render: (h) => h(App),
}).$mount('#app');
});
});

14
src/store/index.js

@ -2,6 +2,18 @@ import Vue from 'vue';
import Vuex from 'vuex';
import storm from './modules/storm/index';
import patient from './modules/patient/index';
import createPersistedState from "vuex-persistedstate"
Vue.use(Vuex);
export default new Vuex.Store({ modules: { storm, patient } });
export default new Vuex.Store({
plugins: [createPersistedState({
storage: window.localStorage,
reducer(state) {
return {
patient: { ...state.patient },
storm: { ...state.storm }
}
}
})],
modules: { storm, patient } ,
});

17
src/store/modules/storm/actions.js

@ -5,22 +5,11 @@ const actions = {
toLogin({
commit,
state
}, {
no
}) {
}, loginForm) {
return new Promise(async (resolve, reject) => {
try {
console.log('state', state.APP_DEVICE_NO)
console.log('no', no)
let padNo = state.APP_DEVICE_NO;
// if (!padNo) return;
const res = await Loginnew({
...no,
// param: {
// // padNo: '3333',
// ...no
// },
});
const res = await Loginnew(loginForm);
const {
code,
data,
@ -34,7 +23,7 @@ const actions = {
message.error(msg);
}
} catch (error) {
throw new Error(error);
// throw new Error(error);
}
})
.then((res) => [null, res])

655
src/views/Patient/components/patient-create.vue

@ -1,62 +1,34 @@
<!--
* @desc: 创建患者
* @Author: gaowenya
* @Date: 2023-06-20 14:27
* @LastEditors:
* @LastEditTime:
-->
<template>
<a-modal
class="patient-form"
:width="600"
:maskClosable="false"
:confirmLoading="confirmLoading"
:closable="false"
:destroyOnClose="true"
v-model="createVisible"
title="新建患者"
@ok="handleSubmit"
:footer="null"
>
<a-form-model
ref="form"
:model="form"
:label-col="{ span: 4 }"
:wrapper-col="{ span: 20 }"
labelAlign="left"
class="create-form"
:rules="rules"
>
<a-modal class="patient-form" :width="600" :maskClosable="false" :confirmLoading="confirmLoading" :closable="false"
:destroyOnClose="true" v-model="createVisible" :title="title" @ok="handleSubmit" :footer="null">
<a-form-model ref="form" :model="form" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }" labelAlign="left"
class="create-form" :rules="rules">
<a-row :gutter="20">
<a-col :span="12">
<a-form-model-item label="姓名">
<a-input v-model="form.patientName" placeholder="请输入姓名" />
<a-input v-model="form.name" placeholder="请输入姓名" />
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="民族">
<a-select v-model="form.patientNation" placeholder="请选择民族">
<a-select-option
v-for="item in nationList"
:key="item"
:value="item"
>
<a-select v-model="form.nation" placeholder="请选择民族">
<a-select-option v-for="item in nationList" :key="item" :value="item">
{{ item }}
</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="性别" >
<a-select v-model="form.patientGender" placeholder="请选择性别">
<a-select-option :value="0" ></a-select-option>
<a-select-option :value="1" ></a-select-option>
<a-form-model-item label="性别">
<a-select v-model="form.gender" placeholder="请选择性别">
<a-select-option :value="0"></a-select-option>
<a-select-option :value="1"></a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="身高">
<a-input v-model="form.height" placeholder="请输入身高 (cm)" />
<a-input v-model="form.height" placeholder="请输入身高 (cm)" />
</a-form-model-item>
</a-col>
<a-col :span="12">
@ -65,22 +37,20 @@
</a-form-model-item>
</a-col>
<a-col :span="16">
<a-form-model-item label="身份证号" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" placeholder="请输入身份证号">
<keyboard
placeHolder="请输入手机号"
:index-num="indexNum"
@keyboard-input="handleKeyBoard"
:old-value="patientIdCardNo"
/>
<a-form-model-item label="身份证号" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }"
placeholder="请输入身份证号">
<keyboard placeHolder="请输入身份证号" :index-num="indexNum" @keyboard-input="handleKeyBoard"
:old-value="idcard" />
</a-form-model-item>
</a-col>
<a-col :span="8" style="padding-top: 0.15vw;">
<a-button type="primary" class="idcard" @click="openCamera">扫描身份证</a-button>
</a-col>
<a-col :span="16">
<a-form-model-item label="联系方式" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" placeholder="请输入联系方式">
<a-input v-model="form.contract" placeholder="请输入联系方式" />
<a-form-model-item label="联系方式" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }"
placeholder="请输入联系方式">
<a-input v-model="form.contract" placeholder="请输入联系方式" />
</a-form-model-item>
</a-col>
<a-col :span="24">
@ -89,24 +59,20 @@
<a-col :span="12">
<a-form-model-item label="急救类型" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
<a-select v-model="form.type" placeholder="请选择类型">
<a-select-option :value="0" >卒中急救</a-select-option>
<a-select-option :value="1" >胸痛</a-select-option>
<a-select-option :value="2" >创伤</a-select-option>
<a-select-option :value="0">卒中急救</a-select-option>
<a-select-option :value="1">胸痛</a-select-option>
<a-select-option :value="2">创伤</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="平车" >
<a-form-model-item label="平车">
<!-- <a-select v-model="form.carNo" placeholder="请选择平车号">
<a-select-option :value="0" ></a-select-option>
<a-select-option :value="1" ></a-select-option>
</a-select> -->
<a-select v-model="form.carNo" placeholder="请选择平车号">
<a-select-option
v-for="item in carList"
:key="item.id"
:value="item.deviceNo"
>
<a-select-option v-for="item in carList" :key="item.id" :value="item.deviceNo">
{{ item.deviceNo }}
</a-select-option>
</a-select>
@ -117,329 +83,418 @@
<a-switch v-model="form.greenRoadFlag" />
</a-form-model-item>
</a-col>
<a-col :span="24" class="footer-btns" >
<a-button class="footer-btn" type="primary" block @click="handleSubmit">新建</a-button>
<a-col :span="24" class="footer-btns">
<a-button class="footer-btn" type="primary" block @click="handleSubmit">提交</a-button>
</a-col>
<a-col :span="24" class="footer-btns" >
<a-button class="footer-btn cencelBtn" block @click="close">取消</a-button>
<a-col :span="24" class="footer-btns">
<a-button class="footer-btn cencelBtn" block @click="close">取消</a-button>
</a-col>
</a-row>
</a-form-model>
</a-modal>
</template>
<script>
import keyboard from '@/components/keyboard.vue';
import { create, uploadIdcard, idcardInfo, idcardInfoBase64 } from 'api';
import { mapState } from 'vuex';
export default {
name: 'create',
components: {
keyboard,
},
props: ['firstAidData', 'carList', 'carNo'],
data() {
return {
indexNum: 0, //
patientIdCardNo: '',
keyboard: false,
createVisible: false,
inputFile: '',
file: '',
form: {},
rules: {},
confirmLoading: false,
};
},
computed: {
...mapState('storm', ['nationList', 'anyringToken']),
},
methods: {
handleKeyBoard(value) {
//value
this.patientIdCardNo = value;
},
open(data) {
console.log('open', data)
this.createVisible = true;
this.confirmLoading = false;
this.patientIdCardNo = '';
console.log(this.form)
this.form = data || {}
// #ifdef APP-PLUS
this.openCamera();
// #endif
},
close() {
this.createVisible = false;
this.confirmLoading = false;
this.patientIdCardNo = '';
import keyboard from '@/components/keyboard.vue';
import {
createPatient,
uploadIdcard,
idcardInfo,
idcardInfoBase64,
queryById,
eduitPatient
} from 'api';
import {
mapState
} from 'vuex';
export default {
name: 'create',
components: {
keyboard,
},
openCamera() {
const cmr = plus.camera.getCamera();
const res = cmr.supportedImageResolutions[0];
const fmt = cmr.supportedImageFormats[0];
cmr.captureImage(
(path) => {
plus.io.resolveLocalFileSystemURL(
path,
(entry) => {
//
this.compressImage(entry.toLocalURL(), entry.name);
},
(e) => {
plus.nativeUI.toast(
'读取拍照文件错误:' + e.message
);
}
);
},
(error) => {
// alert("Capture image failed: " + error.message);
},
{
resolution: res,
format: fmt,
filter: 'image',
}
);
},
//
compressImage(url, filename) {
var name = '_doc/upload/' + filename;
plus.zip.compressImage(
{
src: url, //src: (String )
dst: name, //
quality: 90, //quality: (Number ).1-100
overwrite: true, //overwrite: (Boolean )
width: '250',
height: '320',
},
(zip) => {
//
this.showPics(zip.target, name);
},
(error) => {
plus.nativeUI.toast('压缩图片失败,请稍候再试');
}
);
},
//
showPics(url, name) {
let _this = this;
//
plus.io.resolveLocalFileSystemURL(url, (entry) => {
entry.file((file) => {
var fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = (e) => {
var picUrl = e.target.result.toString();
this.idcardInfoBase64(picUrl);
};
});
});
props: ['firstAidData', 'carList', 'carNo', 'patientId'],
data() {
return {
title: "新建患者",
indexNum: 0, //
idcard: '',
keyboard: false,
createVisible: false,
inputFile: '',
file: '',
form: {},
rules: {},
confirmLoading: false,
};
},
dataURLToFile(dataUrl, fileName) {
const dataArr = dataUrl.split(',');
const mime = dataArr[0].match(/:(.*);/)[1];
const originStr = atob(dataArr[1]);
return new File([originStr], fileName, {
type: mime,
});
},
async idcardInfoBase64(url) {
let res = await idcardInfoBase64(url);
const { data, code, msg } = res;
if (code === 200) {
const { name, sex, idCardNo, nation } = data;
this.form.patientName = name
this.form.patientGender = sex
this.form.patientNation = nation
this.patientIdCardNo = idCardNo;
} else {
this.$message.error(res.msg);
}
computed: {
...mapState('storm', ['nationList', 'anyringToken']),
},
//
handleBeforeUpload(file) {
const isLt10M = file.size / 1024 / 1024 < 10000;
//
if (!isLt10M) {
this.$message.error('上传头像图片大小不能超过 10MB!');
}
this.file = file;
return isLt10M;
create() {
},
//
async handleUploadAdd() {
if (!this.file) return '您还未选择文件';
// 使FormData
var form = new FormData();
//
form.append('file', this.file);
uploadIdcard(form).then((res) => {
if (res.code === 200) {
const { name, sex, idCardNo, nation } = res.data;
this.form.setFieldsValue({
['patientName']: name,
['patientGender']: sex,
['patientNation']: nation,
});
this.patientIdCardNo = idCardNo;
methods: {
handleKeyBoard(value) {
//value
this.idcard = value;
},
open(data) {
this.createVisible = true;
this.confirmLoading = false;
if (data.firstAidId) {
this.title = "编辑患者";
queryById({
firstAidId: data.firstAidId,
}).then(res => {
if (res.code === 200) {
this.form = res.data;
}
})
} else {
this.$message.error(res.msg);
this.idcard = '';
this.form = data || {}
}
});
},
onDelete() {
this.patientIdCardNo = '';
},
handleSubmit(e) {
e.preventDefault();
this.$refs.form.validate(async (valid) => {
if (valid) {
const reg =
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
if ( !reg.test(this.patientIdCardNo) && this.patientIdCardNo ) {
this.$message.error('身份证格式不正确');
return;
},
close() {
this.createVisible = false;
this.confirmLoading = false;
this.form = {}
this.idcard = '';
},
openCamera() {
const cmr = plus.camera.getCamera();
const res = cmr.supportedImageResolutions[0];
const fmt = cmr.supportedImageFormats[0];
cmr.captureImage(
(path) => {
plus.io.resolveLocalFileSystemURL(
path,
(entry) => {
//
this.compressImage(entry.toLocalURL(), entry.name);
},
(e) => {
plus.nativeUI.toast(
'读取拍照文件错误:' + e.message
);
}
);
},
(error) => {
// alert("Capture image failed: " + error.message);
}, {
resolution: res,
format: fmt,
filter: 'image',
}
if (typeof this.firstAidData.greenRoadFlag == 'boolean') {
this.firstAidData.greenRoadFlag = 0;
);
},
//
compressImage(url, filename) {
var name = '_doc/upload/' + filename;
plus.zip.compressImage({
src: url, //src: (String )
dst: name, //
quality: 90, //quality: (Number ).1-100
overwrite: true, //overwrite: (Boolean )
width: '250',
height: '320',
},
(zip) => {
//
this.showPics(zip.target, name);
},
(error) => {
plus.nativeUI.toast('压缩图片失败,请稍候再试');
}
let res = await create({
param: {
...this.form,
patientIdCardNo: this.patientIdCardNo,
},
);
},
//
showPics(url, name) {
let _this = this;
//
plus.io.resolveLocalFileSystemURL(url, (entry) => {
entry.file((file) => {
var fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = (e) => {
var picUrl = e.target.result.toString();
this.idcardInfoBase64(picUrl);
};
});
const { data, code, msg } = res;
if (code === 200) {
this.confirmLoading = true;
this.createVisible = false;
this.$message.success('创建成功');
this.$emit('on-success', data);
});
},
dataURLToFile(dataUrl, fileName) {
const dataArr = dataUrl.split(',');
const mime = dataArr[0].match(/:(.*);/)[1];
const originStr = atob(dataArr[1]);
return new File([originStr], fileName, {
type: mime,
});
},
async idcardInfoBase64(url) {
let res = await idcardInfoBase64(url);
const {
data,
code,
msg
} = res;
if (code === 200) {
const {
name,
sex,
idCardNo,
nation
} = data;
this.form.name = name
this.form.gender = sex
this.form.nation = nation
this.idcard = idCardNo;
} else {
this.$message.error(res.msg);
}
},
//
handleBeforeUpload(file) {
const isLt10M = file.size / 1024 / 1024 < 10000;
//
if (!isLt10M) {
this.$message.error('上传头像图片大小不能超过 10MB!');
}
this.file = file;
return isLt10M;
},
//
async handleUploadAdd() {
if (!this.file) return '您还未选择文件';
// 使FormData
var form = new FormData();
//
form.append('file', this.file);
uploadIdcard(form).then((res) => {
if (res.code === 200) {
const {
name,
sex,
idCardNo,
nation
} = res.data;
this.form.setFieldsValue({
['name']: name,
['gender']: sex,
['nation']: nation,
});
this.idcard = idCardNo;
} else {
this.confirmLoading = false;
this.$message.error(res.msg);
}
}
});
});
},
onDelete() {
this.idcard = '';
},
handleSubmit(e) {
e.preventDefault();
this.$refs.form.validate(async (valid) => {
if (valid) {
const reg =
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
if (!reg.test(this.idcard) && this.idcard) {
this.$message.error('身份证格式不正确');
return;
}
// if (typeof this.firstAidData.greenRoadFlag == 'boolean') {
// this.firstAidData.greenRoadFlag = 0;
// }
console.log(this.patientId)
if (this.form.id) {
let res = await createPatient({
param: {
...this.form,
idcard: this.idcard,
// id:this.patientId
},
});
const {
data,
code,
msg
} = res;
if (code === 200) {
this.confirmLoading = true;
this.createVisible = false;
this.$message.success('修改成功');
this.$emit('on-success', data);
} else {
this.confirmLoading = false;
}
} else {
let res = await createPatient({
param: {
...this.form,
idcard: this.idcard,
},
});
const {
data,
code,
msg
} = res;
if (code === 200) {
this.confirmLoading = true;
this.createVisible = false;
this.$message.success('创建成功');
this.$emit('on-success', data);
} else {
this.confirmLoading = false;
}
}
}
});
},
},
},
};
};
</script>
<style scoped lang="less">
.patient-form{
.create-form{
.patient-form {
.create-form {
padding: 0 .6rem 1rem .6rem;
.ant-form-item{
.ant-form-item {
margin-bottom: .5rem;
.ant-form-item-label{}
.ant-input{
.ant-form-item-label {}
.ant-input {
font-size: 1rem;
border: none;
background: #F5F5F5;
border-radius: .3rem;
.acitve {
border: none !important;
}
}
.ant-select{
.ant-select {
font-size: 1rem;
border:none;
border: none;
background: #F5F5F5;
border-radius: 6px;
.ant-select-selection{
border:none;
.ant-select-selection {
border: none;
background-color: #F5F5F5;
font-size:13px;
font-size: 13px;
}
}
}
.footer-btns{
.footer-btns {
margin-top: 1.2rem;
padding: 0 1.5rem;
text-align:center;
.ant-btn.footer-btn{
width:80%;
text-align: center;
.ant-btn.footer-btn {
width: 80%;
border-radius: .8rem;
height: 3.64vw;
line-height: 3.64vw;
}
}
}
}
</style>
<style lang="less">
.patient-form{
.ant-modal-body{
.patient-form {
.ant-modal-body {
padding-top: 0;
}
.ant-modal-content{
.ant-modal-content {
border-radius: 1rem;
overflow: hidden;
.ant-modal-header{
.ant-modal-header {
border-bottom: none;
padding-top: 2rem;
.ant-modal-title {
font-size: 2rem;
font-weight: bold;
font-family: Source Han Sans CN, Source Han Sans CN-Medium;
text-align: left;
color: #393d4e;
padding: 10px 0;
font-size: 2rem;
font-weight: bold;
font-family: Source Han Sans CN, Source Han Sans CN-Medium;
text-align: left;
color: #393d4e;
padding: 10px 0;
}
}
.ant-select{
.ant-select-selection,.inputText{
background-color: #F5F5F5;
border:none;
.ant-select {
.ant-select-selection,
.inputText {
background-color: #F5F5F5;
border: none;
.acitve {
border: none !important;
}
}
.ant-input:hover{
.ant-input:hover {
border: none
}
.ant-select-arrow{
.ant-select-arrow {
position: absolute;
top: 36%;
svg{
top: 36%;
svg {
font-size: 1rem;
color: #ccc;
color: #ccc;
}
}
}
.input-container{
background-color: #F5F5F5;
border:none;
.input-container {
background-color: #F5F5F5;
border: none;
}
.ant-switch{
.ant-switch {
height: 2.73vw;
width: 4.55vw;
color: #f5f5f5;
background-color: #f5f5f5;
}
.ant-switch::after{
.ant-switch::after {
width: 2.3vw;
height: 2.3vw;
top: 1.5px;
}
.ant-switch-checked{
background-color:#34C759;
.ant-switch-checked {
background-color: #34C759;
}
.cencelBtn{
background:#ddd;
.cencelBtn {
background: #ddd;
}
}
}
</style>

4
src/views/Patient/components/patient-detail.vue

@ -236,7 +236,9 @@
msg
} = res;
if (code === 200) {
this.setPatientData({ ...this.patientDataCur, firstAidId: data.firstAidId })
this.home.queryAid(data.firstAidId, false);
// this.setPatientData({ ...this.patientDataCur, firstAidId: data.firstAidId })
this.authEdit = false
this.$message.success('更新成功');
this.$router.push('/firstaid/thrombolysis')

2
src/views/Patient/index.vue

@ -218,7 +218,7 @@
this.queryByPadNo();
this.queryVideo(); //
this.queryBook(); //
this.getMessageQuery();
// this.getMessageQuery();
},
methods: {
...mapMutations('storm', ['setNationList']),

64
src/views/document/components/detail.vue

@ -0,0 +1,64 @@
<template>
<a-modal class="" width="80%" :maskClosable="false" destroyOnClose v-model="visible" :title="title" :footer="null"
@cancel="close">
<a-card :tab-list="tabList" :active-tab-key="activeKey" @tabChange="key => onTabChange(key)">
<div style="height: calc(100vh - 25vw); width: 100%; overflow-y: auto;">
<throm-result-baseInfo v-if="activeKey == 'base'" :patientId="patientId"></throm-result-baseInfo>
<throm-result-firstInfo v-else-if="activeKey == 'first'" :patientId="patientId"></throm-result-firstInfo>
</div>
</a-card>
</a-modal>
</template>
<script>
import ThromResultBaseInfo from "@/views/thrombolysis/components/throm-result-baseInfo.vue"
import ThromResultFirstInfo from "@/views/thrombolysis/components/throm-result-firstInfo.vue"
export default {
name: 'DocDetail',
components: {
ThromResultBaseInfo,
ThromResultFirstInfo
},
data() {
return {
title: "患者详情",
patientId: '',
visible: false,
activeKey: "base",
tabList: [{
key: 'base',
tab: '患者基本信息',
},
{
key: 'first',
tab: '急救信息记录',
},
],
}
},
created() {
},
methods: {
open(data) {
this.patientId = data.firstAidId
this.visible = true;
},
close() {
console.log('close')
this.patientId = undefined;
this.activeKey = "base";
this.visible = false;
},
onTabChange(key) {
this.activeKey = key;
},
}
}
</script>
<style>
</style>

9
src/views/document/components/report.vue

@ -11,7 +11,7 @@
mapState
} from 'vuex'
import {
queryLog
queryAidRecord
} from 'api'
import ThromReport from '@/views/thrombolysis/components/throm-report.vue';
export default {
@ -26,8 +26,11 @@
ThromReport
},
methods: {
open(item) {
this.dataSource = item
async open(item) {
console.log(item)
const res = await queryAidRecord(item.firstAidId)
console.log(res)
this.dataSource = res.data
this.visible = true
}
}

55
src/views/document/index.vue

@ -14,8 +14,8 @@
<div class="doc-list-btns">
<!-- <a-button type="primary" icon="plus" @click="goCreate">新建患者</a-button> -->
<a-input placeholder="请输入患者姓名 (支持拼音、首拼、关键字)" style="width: 34vw" size="large" v-model="searchVal"
@pressEnter="onSearch" allowClear>
<a-icon slot="prefix" type="search" @click="onSearch" />
@pressEnter="onSearch(1)" allowClear>
<a-icon slot="prefix" type="search" @click="onSearch(1)" />
</a-input>
</div>
</div>
@ -23,6 +23,7 @@
<a-table :columns="columns" :data-source="dataSource" :scroll="{ y: 720, x: 1000 }"
:locale="{ emptyText: '暂无数据'}" rowKey="firstAidId" size="middle" :pagination="pagination">
<template slot="action" slot-scope="text, row">
<a-button type="link" @click="editReport(row, 'patientDetail')">详情</a-button>
<a-button type="link" @click="checkReport(row, 'docReport')">报告单</a-button>
<a-button type="link" @click="checkReport(row, 'docCT')">CT影像</a-button>
<a-button type="link" @click="checkReport(row, 'docInspect')">检验报告</a-button>
@ -34,11 +35,14 @@
</a-table>
</div>
</div>
<PatientCreate ref="patientCreate" @on-success="onSearch" :firstAidData="firstAidData" :carList="carList"
:carNo="carNo" />
<!-- <PatientCreate ref="patientCreate" @on-success="onSearch" :firstAidData="firstAidData" :carList="carList"
:carNo="carNo" /> -->
<DocReport ref="docReport"></DocReport>
<DocCT ref="docCT"></DocCT>
<DocInspect ref="docInspect"></DocInspect>
<PatientDdit ref='patientddit' :patientId="patientId" @on-success="onSearch(pageNum)" :carList="carList"
:carNo="carNo"></PatientDdit>
<doc-detail ref='patientDetail'></doc-detail>
</div>
</template>
@ -48,10 +52,12 @@
mapActions,
mapMutations
} from 'vuex';
import PatientCreate from '@/views/Patient/components/patient-create.vue';
// import PatientCreate from '@/views/Patient/components/patient-create.vue';
import DocDetail from './components/detail.vue';
import DocReport from '@/views/document/components/report.vue';
import DocCT from '@/views/document/components/ct.vue';
import DocInspect from '@/views/document/components/inspect.vue';
import PatientDdit from '@/views/Patient/components/patient-create.vue';
import {
getList,
selectList
@ -59,10 +65,12 @@
export default {
name: "Document",
components: {
PatientCreate,
// PatientCreate,
DocDetail,
DocReport,
DocCT,
DocInspect
DocInspect,
PatientDdit
},
data() {
return {
@ -216,7 +224,7 @@
key: 'operation',
fixed: 'right',
align: 'center',
width: 260,
width: 300,
scopedSlots: {
customRender: 'action'
},
@ -225,13 +233,34 @@
firstAidData: {},
carList: [], //
carNo: '', //
patientId: '' //Id
}
},
created() {
this.getData()
this.getSelectList();
},
methods: {
...mapMutations('patient', ['setPatientData']),
//
async getSelectList() {
let res = await selectList({
param: {
deviceType: 0,
},
});
const {
data,
code,
msg
} = res;
if (code === 200) {
this.carList = data.list;
// this.carNo = this.carList[0]?.deviceNo || ''; //
// console.log('this.carNo ', this.carNo);
}
this.component = "patient-list"
},
//list
async getData(pageNum) {
if (pageNum) {
@ -287,7 +316,11 @@
},
//
onSearch(data) {
this.getData(1)
this.getData(data || 1)
},
editReport(item, modalRef) {
// this.patientId=item.firstAidId
this.$refs[modalRef].open(item)
},
checkReport(item, modalRef) {
// const {
@ -330,8 +363,8 @@
.doc-list-btns {}
}
.doc-list-table{
.doc-list-table {
background-color: #fff;
padding: 10px;
}

97
src/views/login/index.vue

@ -6,7 +6,7 @@
<div class="login-head-title">卒中医生工作站</div>
</div>
<div class="login-left-bg">
<img src="@/assets/images/login-bg.png" alt="" />
<!-- <img src="@/assets/images/login-bg2.png" alt="" /> -->
</div>
</div>
<div class="login-right">
@ -14,32 +14,48 @@
<div class="login-subflex"></div>
<div class="login-form">
<div class="login-form-title">欢迎登录</div>
<!-- <div class="login-form-tabs">
<div v-if="!curtab" @click="curtab = 1">使用账号密码登录</div>
<div v-else @click="curtab = 0">使用短信登录</div>
</div> -->
<div class="login-form-container">
<a-form-model :model="form">
<a-form-model-item>
<a-select v-model="form.username" placeholder="选择账号" size="large">
<a-select-option v-for="u in userlist"
:value="u.username">{{u.username}}</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-input v-model="form.password" placeholder="请输入密码" size="large" />
</a-form-model-item>
<a-form-model-item>
<div style="display: flex;">
<div style="flex: 1;margin-right: 12px;">
<a-input v-model="form.code" placeholder="请输入验证吗" size="large" />
</div>
<div>
<a-button type="primary" size="large">发送验证码</a-button>
<template v-if="!curtab">
<a-form-model-item>
<!-- <a-select v-model="form.username" placeholder="选择账号" size="large">
<a-select-option v-for="u in userlist"
:value="u.username">{{u.username}}</a-select-option>
</a-select> -->
<a-input v-model="form.username" placeholder="请输入用户名" size="large" >
<a-icon slot="prefix" type="user" />
</a-input>
</a-form-model-item>
<a-form-model-item style="margin-bottom: 4px;">
<a-input-password v-model="form.password" placeholder="请输入密码" size="large" >
<a-icon slot="prefix" type="lock" />
</a-input-password>
</a-form-model-item>
</template>
<template v-else>
<a-form-model-item>
<a-input v-model="form.username" placeholder="请输入手机号码" size="large" />
</a-form-model-item>
<a-form-model-item>
<div style="display: flex;">
<div style="flex: 1;margin-right: 12px;">
<a-input v-model="form.code" placeholder="请输入验证吗" size="large" />
</div>
<div>
<a-button type="primary" size="large">发送验证码</a-button>
</div>
</div>
</div>
</a-form-model-item>
</a-form-model-item>
</template>
<a-form-model-item>
<a-checkbox v-model="form.pwd">记住我</a-checkbox>
<a-checkbox v-model="form.remember">记住账号</a-checkbox>
</a-form-model-item>
<a-form-model-item>
<a-checkbox v-model="form.agreement"><span>我已阅读并同意 </span><span class="agreement">服务协议隐私权政策</span></a-checkbox>
<a-button type="primary" block size="large" @click="login">登录</a-button>
</a-form-model-item>
@ -67,26 +83,37 @@
data() {
return {
userlist: [],
curtab: 0,
form: {
username: 'admin',
password: 'Sxinf18aA!',
code: '1'
username: '',
password: '', // Sxinf18aA!
code: '',
agreement: false,
remember: false
}
}
},
created() {
const formData = localStorage.getItem('NICKY_REMEMBER_PWD')
if(formData) Object.assign(this.form, JSON.parse(formData))
this.queryUser()
},
methods: {
...mapActions('storm', ['toLogin']),
async login() {
let res = await this.toLogin({
no: {
...this.form,
// uuid: '7a996ab78a784c9cad3cf16d1b4b3d81',
},
});
this.$router.replace('/firstaid/patientList?deviceNo=P000001')
if(!this.form.agreement){
this.$message.warning("请阅读并同意服务协议、隐私权政策")
return;
}
if(this.form.remember){
localStorage.setItem('NICKY_REMEMBER_PWD', JSON.stringify(this.form))
}else{
localStorage.removeItem('NICKY_REMEMBER_PWD')
}
let res = await this.toLogin(this.form);
this.$router.replace('/firstaid/patientList')
// this.$router.replace('/firstaid/patientList?deviceNo=P000001')
},
async queryUser() {
let res = await queryUser();
@ -103,6 +130,9 @@
height: 100vh;
overflow: hidden;
background-color: #fff;
background-image: url('../../assets/images/login-bg2.png');
background-size: 100% 100%;
background-repeat: no-repeat;
.login-left {
flex: 4;
@ -135,6 +165,7 @@
}
.login-left-bg {
flex: 2;
img {
width: 100%;
height: 100%;
@ -165,6 +196,10 @@
}
.login-form-container {}
.agreement{
color: #007AFF;
}
}
}

247
src/views/statistics/index.vue

@ -121,19 +121,19 @@
data() {
return {
queryParams1: {
"timeType":"0", // 0: 1: 2: 3:
"startTime":"2024-10-01 00:00:00", //
"endTime":"2025-01-01 00:00:00" //
"timeType": "0", // 0: 1: 2: 3:
"startTime": "2024-10-01 00:00:00", //
"endTime": "2025-01-01 00:00:00" //
},
queryParams2: {
"timeType":"0", // 0: 1: 2: 3:
"startTime":"2024-10-01 00:00:00", //
"endTime":"2025-01-01 00:00:00" //
"timeType": "0", // 0: 1: 2: 3:
"startTime": "2024-10-01 00:00:00", //
"endTime": "2025-01-01 00:00:00" //
},
queryParams3: {
"timeType":"0", // 0: 1: 2: 3:
"startTime":"2024-10-01 00:00:00", //
"endTime":"2025-01-01 00:00:00" //
"timeType": "0", // 0: 1: 2: 3:
"startTime": "2024-10-01 00:00:00", //
"endTime": "2025-01-01 00:00:00" //
}
}
},
@ -145,7 +145,7 @@
// "endTime":"2025-01-01 00:00:00" //
// }
// })
// queryDptResult({
// param: {
// "timeType":"0", // 0: 1: 2: 3:
@ -205,9 +205,8 @@
this.init()
},
methods: {
init(filed){
switch(filed)
{
init(filed) {
switch (filed) {
case "queryParams1":
this.getData1()
this.getData2()
@ -237,15 +236,15 @@
this.getData10()
break;
}
},
typeChange(e, filed){
typeChange(e, filed) {
this[filed]['timeType'] = e.target.value
this.init(filed)
},
dateChange(dates,filed){
dateChange(dates, filed) {
const startTime = dates[0].format('YYYY-MM-DD HH:mm:ss')
const endTime = dates[1].format('YYYY-MM-DD HH:mm:ss')
this[filed]['startTime'] = startTime
@ -254,8 +253,12 @@
},
// -
async getData1() {
const res = await queryPatient({param: this.queryParams1})
const { onlyRs = 0, onlyXgzl = 0, both = 0, neither = 0} = res.data
const res = await queryPatient({
param: this.queryParams1
})
const {
onlyRs = 0, onlyXgzl = 0, both = 0, neither = 0
} = res.data
var series = [{
value: onlyRs,
name: '仅溶栓人数'
@ -289,17 +292,42 @@
series: [{
name: '病历统计',
type: 'pie',
avoidLabelOverlap: false,
// avoidLabelOverlap: false,
// label: {
// show: true,
// position: 'center'
// },
label: {
show: false,
position: 'center'
alignTo: 'edge',
formatter: '{name|{b}}\n{time|{c} 人}',
minMargin: 5,
edgeDistance: 10,
lineHeight: 15,
rich: {
time: {
fontSize: 10,
color: '#999'
}
}
},
labelLine: {
length: 15,
length2: 0,
maxSurfaceAngle: 80
},
itemStyle: {
borderColor: '#fff',
borderWidth: 2
},
radius: ['5%', '70%'],
data: series
data: series,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
};
@ -310,18 +338,25 @@
async getData2() {
var chartDom = this.$refs.blboxr
var myChart = echarts.init(chartDom);
const res = await queryByDatePatient({param: this.queryParams1})
const {list = []} = res.data
const res = await queryByDatePatient({
param: this.queryParams1
})
const {
list = []
} = res.data
var items = ['仅溶栓人数', '仅介入人数', '未溶栓且未介入人数', '溶栓且未介入人数']
var xdata = [];
var series = [];
const newlist = list.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
items.forEach(i => {
var item = {
@ -331,10 +366,10 @@
data: [],
}
var filed = ""
if(i == '仅溶栓人数') filed = "onlyRs"
else if(i == '仅介入人数') filed = "onlyXgzl"
else if(i == '溶栓且介入人数') filed = "both"
else if(i == '未溶栓且未介入人数') filed = "neither"
if (i == '仅溶栓人数') filed = "onlyRs"
else if (i == '仅介入人数') filed = "onlyXgzl"
else if (i == '溶栓且介入人数') filed = "both"
else if (i == '未溶栓且未介入人数') filed = "neither"
newlist.forEach(a => {
var itemdata = {
value: a[filed],
@ -346,7 +381,7 @@
})
series.push(item)
})
var option = {
title: {
text: '数据对比',
@ -373,13 +408,18 @@
async getData3() {
var chartDom = this.$refs.jmrsboxlt
var myChart = echarts.init(chartDom);
const res = await queryJmrs({param: this.queryParams2})
const res = await queryJmrs({
param: this.queryParams2
})
var xdata = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
var series = [{
@ -417,16 +457,21 @@
var chartDom = this.$refs.jmrsboxrt
var myChart = echarts.init(chartDom);
const res = await queryJmrs({param: this.queryParams2})
const res = await queryJmrs({
param: this.queryParams2
})
const list = res.data
var items = ['静脉溶栓人数', '急救特征人数']
var xdata = [];
var series = [];
const newlist = list.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
items.forEach(i => {
var item = {
@ -435,8 +480,8 @@
data: [],
}
var filed = ""
if(i == '静脉溶栓人数') filed = "gailv"
else if(i == '急救特征人数') filed = "total"
if (i == '静脉溶栓人数') filed = "gailv"
else if (i == '急救特征人数') filed = "total"
newlist.forEach(a => {
var itemdata = {
value: a[filed],
@ -474,14 +519,19 @@
async getData5() {
var chartDom = this.$refs.jmrsboxlb
var myChart = echarts.init(chartDom);
const res = await querySichResult({param: this.queryParams2})
const res = await querySichResult({
param: this.queryParams2
})
var xdata = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
var series = [{
type: 'line',
areaStyle: {},
@ -518,14 +568,19 @@
async getData6() {
var chartDom = this.$refs.jmrsboxrb
var myChart = echarts.init(chartDom);
const res = await queryDntResult({param: this.queryParams2})
const res = await queryDntResult({
param: this.queryParams2
})
var items = ['≤45min', '≤60min', '>60min']
var xdata = [];
var series = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
items.forEach(i => {
var item = {
@ -535,9 +590,9 @@
data: [],
}
var filed = ""
if(i == '≤45min') filed = "dy45"
else if(i == '≤60min') filed = "dy60"
else if(i == '>60min') filed = "other"
if (i == '≤45min') filed = "dy45"
else if (i == '≤60min') filed = "dy60"
else if (i == '>60min') filed = "other"
newlist.forEach(a => {
var itemdata = {
value: a[filed],
@ -575,14 +630,19 @@
async getData7() {
var chartDom = this.$refs.xgnboxlt
var myChart = echarts.init(chartDom);
const res = await querySichResult({param: this.queryParams3})
const res = await querySichResult({
param: this.queryParams3
})
var xdata = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
var series = [{
type: 'line',
areaStyle: {},
@ -635,15 +695,20 @@
async getData8() {
var chartDom = this.$refs.xgnboxrt
var myChart = echarts.init(chartDom);
const res = await selectXgzl({param: this.queryParams3})
const res = await selectXgzl({
param: this.queryParams3
})
var items = ['桥接治疗人数', '非桥接治疗人数']
var xdata = [];
var series = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
items.forEach(i => {
var item = {
@ -653,8 +718,8 @@
data: [],
}
var filed = ""
if(i == '桥接治疗人数') filed = "qiaojie"
else if(i == '非桥接治疗人数') filed = "falseQiaojie"
if (i == '桥接治疗人数') filed = "qiaojie"
else if (i == '非桥接治疗人数') filed = "falseQiaojie"
newlist.forEach(a => {
var itemdata = {
value: a[filed],
@ -691,15 +756,20 @@
async getData9() {
var chartDom = this.$refs.xgnboxlb
var myChart = echarts.init(chartDom);
const res = await queryDptResult({param: this.queryParams3})
const res = await queryDptResult({
param: this.queryParams3
})
var items = ['≤60min', '≤90min', '>90min']
var xdata = [];
var series = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
items.forEach(i => {
var item = {
@ -709,9 +779,9 @@
data: [],
}
var filed = ""
if(i == '≤60min') filed = "dy60"
else if(i == '≤90min') filed = "dy90"
else if(i == '>90min') filed = "other"
if (i == '≤60min') filed = "dy60"
else if (i == '≤90min') filed = "dy90"
else if (i == '>90min') filed = "other"
newlist.forEach(a => {
var itemdata = {
value: a[filed],
@ -749,15 +819,20 @@
async getData10() {
var chartDom = this.$refs.xgnboxrb
var myChart = echarts.init(chartDom);
const res = await queryRptResult({param: this.queryParams3})
const res = await queryRptResult({
param: this.queryParams3
})
var items = ['≤60min', '≤90min', '>90min']
var xdata = [];
var series = [];
const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD'))
return { ...a, time: dayjs(a.time).format('YYYY-MM-DD') }
return {
...a,
time: dayjs(a.time).format('YYYY-MM-DD')
}
})
items.forEach(i => {
var item = {
@ -767,9 +842,9 @@
data: [],
}
var filed = ""
if(i == '≤60min') filed = "dy60"
else if(i == '≤90min') filed = "dy90"
else if(i == '>90min') filed = "other"
if (i == '≤60min') filed = "dy60"
else if (i == '≤90min') filed = "dy90"
else if (i == '>90min') filed = "other"
newlist.forEach(a => {
var itemdata = {
value: a[filed],
@ -809,43 +884,46 @@
<style lang="less" scoped>
.statistics {
// padding: 10px;
.statistics-container{
.statistics-container {
.sta-row {
background: #fff;
margin-bottom: .2rem;
padding: 10px;
overflow: hidden;
box-sizing: border-box;
.sta-row-head {
width: 100%;
display: flex;
justify-content: space-between;
border-bottom: 1px solid #eee;
.sta-row-title {
height: 50px;
line-height: 50px;
// display: flex;
// align-items: center;
img {
width: 5px;
}
.sta-row-text {
padding: 2px 10px;
font-size: 1.3rem;
font-weight: bold;
}
}
.sta-row-filter {
height: 50px;
display: flex;
align-items: center;
}
}
.echarts-box {
height: 420px;
background-color: #ffffff;
@ -856,7 +934,7 @@
}
}
}
}
</style>
@ -875,7 +953,8 @@
overflow: hidden;
box-sizing: border-box;
border-left: 1px solid #d9d9d9;
&.ant-radio-button-wrapper-checked{
&.ant-radio-button-wrapper-checked {
border-left: 1px solid #0062d9;
}
}

134
src/views/thrombolysis/components/throm-before.vue

@ -2,11 +2,11 @@
<div class="throm-before">
<div class="throm-step">
<a-steps progress-dot :current="currentIndex" direction="vertical" @change="handleClickStep">
<a-step :status="currentIndex == 0 ? 'process' : currentIndex > 0 ? 'finish' : 'wait'" title="病例信息" />
<a-step :status="currentIndex == 1 ? 'process' : currentIndex > 1 ? 'finish' : 'wait'" title="病情评估" />
<a-step :status="currentIndex == 2 ? 'process' : currentIndex > 2 ? 'finish' : 'wait'" title="检验调取" />
<a-step :status="currentIndex == 3 ? 'process' : currentIndex > 3 ? 'finish' : 'wait'" title="影像调取" />
<a-step :status="currentIndex == 4 ? 'process' : currentIndex > 4 ? 'finish' : 'wait'" title="知情同意" />
<a-step :status="currentIndex == 0 ? 'process' : currentIndex > 0 ? 'finish' : 'wait'" title="病例信息" />
<a-step :status="currentIndex == 1 ? 'process' : currentIndex > 1 ? 'finish' : 'wait'" title="病情评估" />
<a-step :status="currentIndex == 2 ? 'process' : currentIndex > 2 ? 'finish' : 'wait'" title="检验调取" />
<a-step :status="currentIndex == 3 ? 'process' : currentIndex > 3 ? 'finish' : 'wait'" title="影像调取" />
<a-step :status="currentIndex == 4 ? 'process' : currentIndex > 4 ? 'finish' : 'wait'" title="知情同意" />
</a-steps>
</div>
<div class="throm-content">
@ -25,8 +25,8 @@
import ThromBefore2 from './throm-before2.vue';
import ThromBefore3 from './throm-before3.vue';
import ThromBefore4 from './throm-before4.vue';
export default{
name: "ThromBefore",
export default {
name: "ThromBefore",
components: {
ThromBefore0,
ThromBefore1,
@ -35,18 +35,18 @@
ThromBefore4,
},
data() {
return{
return {
currentIndex: 0,
}
},
methods: {
handleClickStep(current){
handleClickStep(current) {
this.currentIndex = current;
},
handleNext(){
handleNext() {
this.currentIndex++
},
handleNextStep(){
handleNextStep() {
this.$emit('next')
}
},
@ -54,42 +54,55 @@
</script>
<style lang="less">
.throm-before{
.throm-before {
display: flex;
.throm-step{
.throm-step {
padding: 10px;
margin-right: .2rem;
background-color: #fff;
.ant-steps-vertical .ant-steps-item-content{
.ant-steps-vertical .ant-steps-item-content {
min-height: 6.8rem;
}
.ant-steps-item-title{
.ant-steps-item-title {
padding: 0;
}
.ant-steps-item-finish{
.ant-steps-item-title{
.ant-steps-item-finish {
.ant-steps-item-title {
color: #000000;
}
}
.ant-steps-item-process{
.ant-steps-item-title{
.ant-steps-item-process {
.ant-steps-item-title {
color: #007AFF;
// border-bottom: 1px solid #007AFF;
border-bottom: 3px solid transparent; /* 设置透明的底部边框 */
border-image: linear-gradient(to right, #fff, #007AFF) 1; /* 使用渐变色填充边框 */
border-radius: 10px; /* 设置圆角 */
border-bottom: 3px solid transparent;
/* 设置透明的底部边框 */
border-image: linear-gradient(to right, #fff, #007AFF) 1;
/* 使用渐变色填充边框 */
border-radius: 10px;
/* 设置圆角 */
}
}
}
.throm-content{
.throm-content {
height: calc(100vh - 126px);
overflow-y: auto;
padding: 10px;
flex: 1;
background-color: #fff;
.ant-form .ant-form-item-label label{
.ant-form .ant-form-item-label label {
font-size: 0.85rem;
font-weight: bold;
}
.ant-radio-button-wrapper{
.ant-radio-button-wrapper {
padding: 0 18px;
height: 40px;
line-height: 40px;
@ -100,62 +113,75 @@
border: 0.5px solid #a3acbf;
border-radius: 6px;
vertical-align: middle;
&:before, .ant-radio-button-wrapper-checked:before{
display: none!important;
&:before,
.ant-radio-button-wrapper-checked:before {
display: none !important;
}
&:first-child, &:last-child{
border-radius: 6px!important;
&:first-child,
&:last-child {
border-radius: 6px !important;
}
&:last-child{
&:last-child {
margin-right: 0;
}
}
.solid{
.ant-checkbox-wrapper {
// background: #f9f9f9;
border: 0.5px solid #a3acbf;
border-radius: 6px;
vertical-align: middle;
margin-right: 20px;
margin-bottom: 10px;
font-size: 0.75rem !important;
line-height: 40px;
padding: 0 18px;
height: 40px;
min-width: 0!important;
&.ant-checkbox-wrapper-checked{
.solid {
.ant-checkbox-wrapper {
// background: #f9f9f9;
border: 0.5px solid #a3acbf;
border-radius: 6px;
vertical-align: middle;
margin-right: 20px;
margin-bottom: 10px;
font-size: 0.75rem !important;
line-height: 40px;
padding: 0 18px;
height: 40px;
min-width: 0 !important;
&.ant-checkbox-wrapper-checked {
background: #007AFF;
color: #fff;
}
.ant-checkbox{
.ant-checkbox {
display: none;
}
}
}
}
}
}
.common-picker{
.common-picker {
position: absolute;
bottom: 0;
left: 0;
right: 0;
z-index: 999;
}
.btns{
.btns {
padding: 0 20% 1rem;
}
.ant-form-item{
.ant-form-item {
background: #f9f9f9;
margin-bottom: .5rem;
padding: 12px;
border-radius: 4px;
}
.ant-card-head .ant-tabs-bar{
.ant-card-head .ant-tabs-bar {
border-bottom-width: 0;
}
.ant-card-bordered{
.ant-card-bordered {
border: none;
.ant-card-head{
.ant-card-head {
border-bottom: none;
}
}

2
src/views/thrombolysis/components/throm-before0.vue

@ -60,6 +60,8 @@ export default{
'JBXX-ZHZC-TIME': '',
'JBXX-LYFS': '自行住院',
'RYPG-PULSE': '',
'JBXX-ISRS': '是',
'JBXX-ISJR': '是',
'RYPG-BLOOD-SUGAR': '',
'RYPG-HEIGHT': '',
'RYPG-WEIGHT': '',

7
src/views/thrombolysis/components/throm-before1.vue

@ -75,13 +75,14 @@
</template>
</van-slider>
</div>
<!-- radio -->
<!-- radio
v-decorator="[v, { initialValue: k.default }]"-->
<div class="mrsitem">
<a-radio-group
:disabled="writeAble"
size="large"
v-if="k.type === 'radio'"
v-decorator="[v, { initialValue: k.default }]"
v-model="k.value"
button-style="solid"
@change="changeRadio($event, v)"
>
@ -325,7 +326,7 @@
let codeAndAnswerList = [];
const { recordDict } = this;
const codes = [
'RYPG-MRS',
// 'RYPG-MRS',
'RYPG-NIHSS',
'JMRS-Q-NIHSS',
'JMRS-15-NIHSS',

45
src/views/thrombolysis/components/throm-before2.vue

@ -1,31 +1,24 @@
<template>
<div class="throm-before2">
<a-card
style="width:100%"
:tab-list="tabList"
:active-tab-key="activeTabKey"
@tabChange="key => onTabChange(key, 'key')"
>
<a-table
:columns="columns"
:data-source="dataList"
:pagination="false"
bordered
key="table"
rowKey="id"
size="small"
:locale="tablenodata"
class="throm-before-table"
>
<template slot="testResult" slot-scope="text, data">
<div>
<a-icon style="color: #f88152" type="arrow-up" v-if="data.testResultType == 's'" />
<a-icon type="arrow-down" style="color: #f88152" v-if="data.testResultType == 'x'" />
<span :style="{ paddingLeft: !data.testResultType ? '26px' : '4px', }" >{{ text }}</span>
</div>
</template>
</a-table>
</a-card>
<a-table
:columns="columns"
:data-source="dataList"
:pagination="false"
bordered
key="table"
rowKey="id"
size="small"
:locale="tablenodata"
class="throm-before-table"
>
<template slot="testResult" slot-scope="text, data">
<div>
<a-icon style="color: #f88152" type="arrow-up" v-if="data.testResultType == 's'" />
<a-icon type="arrow-down" style="color: #f88152" v-if="data.testResultType == 'x'" />
<span :style="{ paddingLeft: !data.testResultType ? '26px' : '4px', }" >{{ text }}</span>
</div>
</template>
</a-table>
<div class="btns" v-if="!outside">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large" @click="onSubmit">下一步</a-button>

53
src/views/thrombolysis/components/throm-before3.vue

@ -4,7 +4,10 @@
@tabChange="key => onTabChange(key, 'key')">
<div class="image-container">
<!-- <div class="notImg">单次检验影像安全区域</div> -->
<div class="emtpy">
<div v-if="list.length">
<img :src="apiUrl+ img.path" :alt="img.name" v-for="img in list" style="width: 100%;" />
</div>
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div>
</div>
@ -22,28 +25,37 @@
import {
mapState
} from 'vuex';
import {
apiUrl
} from '@/config/setting.js';
import emptyImage from '@/assets/images/slice/empty.png'
import {
queryFirstAidInspectData,
queryVideo
} from 'api';
export default {
name: 'ThromBefore3',
data() {
return {
apiUrl,
emptyImage,
activeTabKey: 'tab1',
previewVisible: false,
previewImage: '',
fileList: [],
list: [],
tabList: [{
key: 'tab1',
tab: '影像1',
},
{
key: 'tab2',
tab: '影像2',
},
{
key: 'tab3',
tab: '影像3',
tab: '影像',
},
// {
// key: 'tab2',
// tab: '2',
// },
// {
// key: 'tab3',
// tab: '3',
// },
{
key: 'ct',
tab: '院前CT(0张)',
@ -66,6 +78,9 @@
});
}
},
created() {
this.queryVideo()
},
methods: {
echo(data) {
if (data['JMRS-YQ-CT']) {
@ -89,6 +104,24 @@
this.previewImage = path;
this.previewVisible = true;
},
async queryVideo() {
const res = await queryVideo({
firstAidId: this.patientData.firstAidId,
type: 0
})
// let res = await queryFirstAidInspectData({
// firstAidId: this.patientData.firstAidId
// });
const {
data,
code,
msg
} = res;
if (code === 200) {
// this.setVideo(data.list);
this.list = data.list
}
},
openCamera() {
if (this.writeAble) {
this.$message.success('患者已审核,内容不可更改')

34
src/views/thrombolysis/components/throm-before4.vue

@ -141,10 +141,13 @@
<img src="@/assets/images/100.png" alt="" style="width: 100%;" />
</div>
<div class="image-container">
<div class="notImg">溶栓视频安全区</div>
<!-- <div class="emtpy">
<a-empty image="@/assets/images/slice/empty.png" description="未检测到影像信息" />
</div> -->
<video :src="getVideo" controls autoplay loop muted v-if="getVideo" width="100%">
您的浏览器不支持 video 标签
</video>
<!-- <div class="notImg" v-else>溶栓视频安全区</div> -->
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div>
</div>
</div>
<div class="btns">
@ -164,18 +167,21 @@
<script>
import {
mapState
mapState,
mapMutations
} from 'vuex';
import signature from '@/components/signature/signature';
import {
imgUrl
} from '@/config/setting.js';
import emptyImage from '@/assets/images/slice/empty.png'
import {
uploadfile,
saveInformedConsent,
queryConsentResult,
thTime,
uploadBase64
uploadBase64,
queryVideo
} from 'api';
export default {
name: 'ThromBefor4',
@ -188,6 +194,7 @@
data() {
return {
activeTabKey: 'tab1',
emptyImage,
tabList: [{
key: 'tab1',
tab: '知情同意',
@ -232,7 +239,6 @@
},
computed: {
...mapState('patient', ['patientData', 'book', 'video', 'writeAble']),
getDoctorTime() {
const {
informed
@ -267,6 +273,7 @@
},
created() {
console.log('book', this.book)
this.queryVideo()
this.content = this.book.find((item) => item.type === 0)?.content || '';
console.log(this.content);
},
@ -283,9 +290,22 @@
}
},
methods: {
...mapMutations('patient', ['setVideo']),
uploadImage() {
},
async queryVideo() {
let res = await queryVideo();
const {
data,
code,
msg
} = res;
if (code === 200) {
this.setVideo(data.list);
}
},
onSubmit() {
this.$emit('next')
},

700
src/views/thrombolysis/components/throm-ing-date.vue

@ -0,0 +1,700 @@
<template>
<div class="Overviewbasicr">
<div class="first-content">
<!-- <v-head text="主要治疗操作"></v-head> -->
<div class="basicr-back" style="background-color: transparent;">
<a-form class="detail-form" :form="firstForm">
<a-form-item
class="jmrs-form-item"
v-for="(k, v) in JMRS_CODE"
:key="v"
v-if="computeShow(v, codeForm)"
>
<!-- operate === collapse -->
<a-collapse
class="jmrs-form-item-con"
v-if="k.operate === 'collapse'"
:bordered="false"
expandIconPosition="right"
>
<a-collapse-panel
key="1"
:header="k.operateData.text"
>
<div
class="collapse-content"
v-for="item in k.operateData.code"
:key="item"
>
<div
class="content-left ant-form-item-label"
>
<label
:for="`FirstInfo_${JMRS_CODE[item]}`"
v-if="JMRS_CODE[item].text"
>
{{ `${JMRS_CODE[item].text}` }}
<span
v-if="
JMRS_CODE[item].description
"
class="label-info"
>{{
JMRS_CODE[item].description
}}</span
>
</label>
</div>
<div class="content-right">
<!-- input -->
<a-input
:disabled="writeAble"
v-if="
JMRS_CODE[item].type === 'input'
"
:type="item.inputType"
v-decorator="[item]"
@blur="
handleChange(
$event.target.value,
v
)
"
placeholder="请输入"
/>
<!-- pageText -->
<a-input
:disabled="writeAble"
v-if="
JMRS_CODE[item].type ===
'pageText'
"
@blur="
handleChange(
$event.target.value,
item
)
"
:type="item.inputType"
v-decorator="[item]"
placeholder="请输入"
/>
</div>
</div>
</a-collapse-panel>
</a-collapse>
<!-- operate === jump -->
<div
v-else-if="k.operate === 'jump'"
class="jmrs-form-item-con"
>
<div
class="content-left ant-form-item-label"
v-if="k.text"
>
<label :for="`FirstInfo_${v}`">
{{ `${k.text}` }}
<span
v-if="k.description"
class="label-info"
>{{ k.description }}</span
>
</label>
</div>
<div
class="content-right"
@click="toMore(k.path.name)"
>
<div class="operate fz24">
{{ k.rightText }}
</div>
</div>
</div>
<div class="jmrs-form-item-con" v-else :class="k.type">
<div class="content-left ant-form-item-label">
<label :for="`FirstInfo_${v}`" v-if="k.text">
{{ `${k.text}` }}
<span
v-if="k.description"
class="label-info"
>{{ k.description }}</span
>
</label>
</div>
<div class="content-right">
<!-- text -->
<a-input
:disabled="writeAble"
v-if="k.type === 'text'"
type="text"
v-decorator="[v]"
readOnly
/>
<!-- modal -->
<a-input
:disabled="writeAble"
v-if="k.type === 'modal'"
:placeholder="k.rightText"
@click="toInform"
type="text"
v-decorator="[v]"
readOnly
/>
<!-- radio -->
<a-radio-group
:disabled="writeAble"
v-if="k.type === 'radio'"
v-decorator="[
v,
{ initialValue: k.default },
]"
@change="
handleChange($event.target.value, v)
"
>
<a-radio
v-for="(item, index) in k.range"
:key="item"
:value="item"
>
{{ item }}
</a-radio>
</a-radio-group>
<!-- checkbox -->
<a-checkbox-group
:disabled="writeAble"
v-if="k.type === 'checkbox'"
:options="k.range"
v-decorator="[
v,
{ initialValue: k.default },
]"
@change="
handleChange($event, v, null, k.type)
"
/>
<!-- input -->
<a-input
:disabled="writeAble"
v-if="k.type === 'input'"
:type="k.inputType"
v-decorator="[v]"
@blur="handleChange($event.target.value, v)"
placeholder="请输入"
/>
<!-- datetime -->
<a-input
:disabled="writeAble"
v-if="k.type === 'datetime'"
readOnly
@click="selectOption(v)"
v-decorator="[
v,
{ initialValue: k.default },
]"
placeholder="请选择"
/>
<a-select
:disabled="writeAble"
v-if="k.type === 'select'"
v-decorator="[
v,
{ initialValue: k.default },
]"
@change="handleChange($event, v)"
placeholder="请选择"
style="display: block;"
>
<a-select-option
v-for="(item, v) in k.range"
:key="item"
>
{{ item }}
</a-select-option>
</a-select>
<!-- pageText -->
<a-input
:disabled="writeAble"
v-if="k.type === 'pageText'"
@blur="handleChange($event.target.value, v)"
v-decorator="[
v,
{ initialValue: k.default },
]"
placeholder="请输入"
/>
</div>
</div>
</a-form-item>
</a-form>
</div>
<div class="common-picker">
<van-datetime-picker
v-if="pickerVisable"
v-model="currentDate"
:formatter="formatter"
@cancel="pickerVisable = false"
@confirm="onConfirm"
/>
</div>
<!-- <a-modal
class="first"
:width="900"
wrapClassName="first-modal"
:destroyOnClose="true"
v-model="modalVisable"
@ok="modalVisable = false"
:footer="null"
>
<Informed
ref="informed"
source="first"
@on-success="successInformed"
/>
</a-modal> -->
</div>
<div class="btns">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large" @click="onSubmit">下一步</a-button>
</div>
<!-- <div class="first-footer">
<a-button
:disabled="writeAble"
type="link"
size="large"
@click="onSubmit"
>
保存<a-icon type="check" />
</a-button>
</div> -->
</div>
</template>
<script>
// import Adverse from '../ing/Adverse.vue';
// import Informed from '../before/Informed.vue';
// import head from './components/title';
import { idcardInfo } from 'api';
import { mapMutations, mapState } from 'vuex';
import { AID_CODE, JMRS_CODE, XGZL_CODE } from '@/config/code.js';
export default {
name: 'FirstInfo',
data() {
return {
//
modalVisable: false,
AID_CODE,
JMRS_CODE,
XGZL_CODE,
//
currentDate: new Date(),
//
pickerVisable: false,
radioStyle: {
display: 'block',
height: '30px',
lineHeight: '30px',
},
firstForm: this.$form.createForm(this, {
name: 'FirstInfo',
}),
//使code
codeForm: {
'RYPG-HEIGHT': '',
'RYPG-WEIGHT': '',
'RYPG-SYSTOLIC-PRESSURE': '',
'RYPG-DIASTOLIC-PRESSURE': '',
'RYPG-PULSE': '',
'RYPG-MRS': '',
'RYPG-NIHSS': '',
'RYPG-BLOOD-TIME': '',
'RYPG-BLOOD-SUGAR': '',
'RYPG-ECG-TIME': '',
'RYPG-CT-DD-TIME': '',
'RYPG-CT-OUTSIZE': '',
'JMRS-Y': '',
'JMRS-WRSYY': '',
'JMRS-WRSYY-ELSE': '',
'JMRS-TH-TIME': '',
'JMRS-SIGN': '',
'JMRS-Q-NIHSS': '',
'JMRS-Q-SYSTOLIC-PRESSURE': '',
'JMRS-Q-DIASTOLIC-PRESSURE': '',
'JMRS-RSCS': '',
'JMRS-TIME': '',
'JMRS-RSYW': '',
'JMRS-RSYW-ZL': '',
'JMRS-TZJL': '',
'JMRS-JDJL': '',
'JMRS-15-NIHSS': '',
'JMRS-15-SYSTOLIC-PRESSURE': '',
'JMRS-15-DIASTOLIC-PRESSURE': '',
'JMRS-30-NIHSS': '',
'JMRS-30-SYSTOLIC-PRESSURE': '',
'JMRS-30-DIASTOLIC-PRESSURE': '',
'JMRS-45-NIHSS': '',
'JMRS-45-SYSTOLIC-PRESSURE': '',
'JMRS-45-DIASTOLIC-PRESSURE': '',
'JMRS-60-NIHSS': '',
'JMRS-60-SYSTOLIC-PRESSURE': '',
'JMRS-60-DIASTOLIC-PRESSURE': '',
'JMRS-BFZ': '',
'XGZL-Y': '',
'XGZL-WZLYY': '',
'XGZL-WZLYY-ELSE': '',
'XGZL-ZQTH-TIME': '',
'XGZL-ZQTH-QZ': '',
'XGZL-SQ-NIHSS': '',
'XGZL-SQ-ASPECT-CT': '',
'XGZL-SQ-ASPECT-MRI': '',
'XGZL-SQ-TICI': '',
'XGZL-CCWC-TIME': '',
'XGZL-XGKT': '',
'XGZL-SH-SCXGZTSJ': '',
'XGZL-BFZ': '',
'XGZL-BFZ-ELSE': '',
},
selectCode: '', // code
};
},
components: {
// 'v-head': head,
// Adverse,
// Informed,
},
computed: {
...mapState('patient', ['patientData', 'writeAble']),
...mapState('storm', ['nationList']),
},
mounted() {
this.$nextTick(() => {
if (this.patientData) {
this.echo(this.patientData);
}
});
},
methods: {
successInformed() {
this.modalVisable = false;
},
//
toInform() {
this.modalVisable = true;
this.$nextTick(() => {
this.$refs.informed.open();
});
},
echo(data) {
const { recordValDict, patientGender } = data;
this.firstForm.getFieldDecorator(['RYPG-GENDER'], {
preserve: true, //便使
});
this.firstForm.setFieldsValue({
['RYPG-GENDER']: patientGender === 1 ? '女' : '男',
});
for (let k in recordValDict) {
if (recordValDict[k]) {
let answer = recordValDict[k][0].answer;
this.firstForm.getFieldDecorator([`${k}`], {
preserve: true, //便使
});
if (k === 'RYPG-WEIGHT' || k === 'RYPG-HEIGHT') {
let weight =
recordValDict['RYPG-WEIGHT'] &&
recordValDict['RYPG-WEIGHT'][0].answer.toString();
let height =
recordValDict['RYPG-HEIGHT'] &&
recordValDict['RYPG-HEIGHT'][0].answer.toString();
this.firstForm.setFieldsValue({
'RYPG-BMI': this.utils.computeBMI(weight, height),
});
}
if (Object.keys(this.codeForm).includes(k)) {
this.codeForm[k] = answer.toString() || '';
//
if (
k !== 'JMRS-WRSYY' &&
k !== 'JMRS-BFZ' &&
k !== 'XGZL-WZLYY' &&
k !== 'XGZL-BFZ' &&
k !== 'XGZL-XGKT'
) {
answer = answer.toString() || '';
}
this.firstForm.setFieldsValue({
[`${k}`]: answer,
});
}
}
}
},
toMore(name) {
if (!name) return;
this.$router.push({
name,
});
},
computeShow(code, codeForm) {
return this.utils.computeShow(code, codeForm);
},
selectOption(v) {
this.selectCode = v;
this.pickerVisable = true;
},
//
onConfirm(date) {
this.firstForm.setFieldsValue({
[`${this.selectCode}`]: this.utils.format(date),
});
this.pickerVisable = false;
// this.updateAidBase(this.selectCode, this.utils.format(date))
},
//
formatter(type, val) {
if (type === 'year') {
return val + '年';
}
if (type === 'month') {
return val + '月';
}
if (type === 'day') {
return val + '日';
}
if (type === 'hour') {
return val + '时';
}
if (type === 'minute') {
return val + '分';
}
return val;
},
handleChange(value, code, type, show) {
this.codeForm[code] = value;
if (show === 'checkbox') {
this.utils.computeShow(code, this.codeForm);
}
if (code === 'RYPG-WEIGHT' || code === 'RYPG-HEIGHT') {
this.codeForm['RYPG-BMI'] = this.utils.computeBMI(
this.codeForm['RYPG-WEIGHT'],
this.codeForm['RYPG-HEIGHT']
);
this.firstForm.setFieldsValue({
['RYPG-BMI']: this.codeForm['RYPG-BMI'],
});
}
// this.updateAidBase(code, value, type)
},
async onSubmit(e) {
e.preventDefault();
let codeAndAnswerList = [],
params = {};
this.$nextTick(async () => {
let adverseSubmit = this.$refs.adverse;
if (adverseSubmit) {
let res = await adverseSubmit.onAdverseSubmit(e, 'first');
if (res.length > 0) {
codeAndAnswerList = codeAndAnswerList.concat(res);
}
}
this.firstForm.validateFields(async (err, values) => {
for (var k in values) {
if (Object.keys(this.codeForm).includes(k)) {
let answer = [values[k]];
if (typeof values[k] !== 'string') {
answer = values[k];
}
if (values[k]) {
codeAndAnswerList.push({
questionCode: k,
answer,
time: '',
});
}
} else if (
values[k] &&
k !== 'RYPG-BMI' &&
k !== 'RYPG-GENDER'
) {
params[`${k}`] = values[k];
}
}
await this.home.updateAidCode(
{
...params,
codeAndAnswerList,
},
false
);
this.firstForm.resetFields()
this.$emit('next')
});
});
},
//
async updateAidBase(code, value, type) {
let params;
let codeAndAnswerList = [];
if (type) {
params = {
[`${code}`]: value,
};
} else {
let answer = [value];
if (typeof value !== 'string') {
answer = value;
}
codeAndAnswerList.push({
questionCode: code,
answer,
time: '',
});
}
await this.home.updateAidCode(
{
...params,
codeAndAnswerList,
},
false
);
},
},
};
</script>
<style scoped lang="less">
p {
margin: 0;
}
.Overviewbasicr {
display: flex;
margin-bottom: 0;
.first-content {
flex: 1;
overflow-y: auto;
background-color: #f9f9f9;
}
.first-footer {
display: flex;
align-items: center;
justify-content: center;
margin-top: 10px;
}
}
.first {
/deep/ .ant-modal {
max-height: 500px;
overflow-y: auto;
}
}
.adverse {
padding: 15px 0;
}
</style>
<style scoped>
>>> .adverse .ant-form-item {
display: flex;
justify-content: space-between;
}
>>> .adverse .ant-form-item-label {
width: 25%;
}
>>> .adverse .ant-form-item-control-wrapper {
flex: 1;
display: flex;
justify-content: flex-end;
}
>>> .adverse .ant-form-item-label label {
font-size: 22px !important;
}
>>> .adverse .ant-input {
width: 100% !important;
background: none;
}
>>> .adverse .ant-form-item-control {
margin-left: 0;
}
>>> .ant-btn-link {
color: #7690e5;
font-size: 24px;
font-weight: bold;
}
>>> .ant-radio-wrapper {
text-align: left;
font-size: 24px;
height: 58px !important;
line-height: 58px !important;
box-sizing: border-box;
border-bottom: 1px solid #f0f0f0 !important;
}
>>> .ant-collapse {
border: none;
background: none;
}
>>> .ant-collapse-header {
font-size: 24px;
padding: 10px 0 !important;
font-weight: bold;
text-align: left;
}
>>> .ant-collapse-item {
flex: 1;
border-bottom: 0px;
}
>>> .ant-collapse-content-box {
padding: 0 10px;
}
>>> .detail-form .jmrs-form-item .ant-form-item-control-wrapper {
flex: 1;
display: flex;
justify-content: space-between;
}
>>> .detail-form .jmrs-form-item .ant-form-item-control {
flex: 1;
margin-left: 0;
}
>>> .ant-radio-wrapper:last-child {
border-bottom: none !important;
}
>>> .ant-radio {
font-size: 24px;
}
>>> .ant-radio-inner::after {
width: 16px;
height: 16px;
}
>>> .ant-radio-inner {
width: 24px;
height: 24px;
}
.back-ff {
box-shadow: 0 2px 12px 0 rgba(52, 52, 52, 0.1);
background: #fff;
padding: 10px 20px;
border-radius: 12px;
}
</style>

69
src/views/thrombolysis/components/throm-ing-min.vue

@ -29,7 +29,7 @@
<van-stepper :disabled="writeAble" :integer="true" v-model="k.value" step="1" class="one"
theme="round" />
<van-slider :disabled="writeAble" class="common-slider-slider" :min="0" :max="300" step="10"
v-model="k.value" >
v-model="k.value">
<template #button>
<a-input-number :disabled="writeAble" type="number" id="inputNumber"
v-model="k.value" :min="0" :max="300" />
@ -60,13 +60,13 @@
<div class="item-info">{{
item.text
}}
<a-tooltip placement="top">
<template slot="title">
{{ item.description }}
</template>
<a-icon v-if="item.description" class="item-icon" type="question-circle" />
</a-tooltip>
</div>
<a-tooltip placement="top">
<template slot="title">
{{ item.description }}
</template>
<a-icon v-if="item.description" class="item-icon" type="question-circle" />
</a-tooltip>
</div>
</div>
<a-popover v-model="item.visible" placement="bottomRight" arrow-point-at-center>
<template slot="content" v-if="item.range">
@ -166,15 +166,27 @@
computed: {
...mapState('patient', ['patientData', 'timerData', 'writeAble']),
},
props:['timercode'],
props: ['timercode'],
watch: {
timercode: {
timercode: {
handler(code) {
NIHSS_LIST.forEach((item, index) => {
item.value = null;
});
if (code) {
this.recordDict = this.dataForm[`${code}`];
}else {
this.recordDict = EMERGENCY_CODE;
// this.recordDict[code].range.forEach(a => {
// a.value = null
// })
// console.log('timercode', this.recordDict)
} else {
this.recordDict = this.dataForm[`JMRS-Q-NIHSS`];
}
console.log('this.timercode', code)
this.$form.createForm(this, {
name: code,
})
const {
recordValDict
} = this.patientData;
@ -184,12 +196,11 @@
});
}
},
immediate: true,
immediate: true,
},
},
},
mounted() {
},
methods: {
...mapMutations('patient', ['setPatientData']),
@ -223,6 +234,7 @@
this.$refs.inputNumber[index].blur();
},
changeInput(value, item) {
console.log('changeInput', value)
item.visible = false;
item.value = value;
this.nissValue = '';
@ -318,6 +330,16 @@
answer: [values[k]],
time: '',
});
} else if (
codesQ.includes(k) &&
values[k] !== 'undefined' &&
values[k] !== 'null'
) {
codeAndAnswerList.push({
questionCode: k,
answer: [values[k]],
time: '',
});
}
}
this.home.updateAidCode({
@ -330,6 +352,7 @@
},
beforeDestroy() {
console.log('beforeDestroy')
NIHSS_LIST.forEach((item, index) => {
item.value = null;
});
@ -368,13 +391,15 @@
}
}
}
.niss-list-item{
margin-bottom:10px;
.niss-list-item {
margin-bottom: 10px;
}
.item-icon{
color:#007AFF;
font-size:22px;
margin-left:8px;
.item-icon {
color: #007AFF;
font-size: 22px;
margin-left: 8px;
}
</style>
<style lang="less">

8
src/views/thrombolysis/components/throm-ing-reactions.vue

@ -391,7 +391,7 @@
flex-direction: column;
&.pt {
padding-top: 36px;
// padding-top: 36px;
}
.border-bottom {
@ -414,7 +414,7 @@
z-index: 888;
.icon {
font-size: 30px;
font-size: 50px;
}
&.del {
@ -426,6 +426,10 @@
flex: 1;
}
}
.btns {
margin-top: 20px;
}
}
</style>
<style lang="less">

4
src/views/thrombolysis/components/throm-ing-record.vue

@ -73,8 +73,8 @@
// font-size: 36px;
// }
height: 50vh;
color: #fff;
background-color: #000;
color: #000;
background-color: #eee;
padding: 1rem;
.record-content {

12
src/views/thrombolysis/components/throm-ing-selDrug.vue

@ -9,7 +9,7 @@
<van-stepper :disabled="writeAble" v-model="k.value" step="0.1" :min="0" :max="k.max"
:decimal-length="1" theme="round" />
<van-slider :disabled="writeAble" class="common-slider-slider" :min="0" :max="k.max"
v-model="k.value" >
v-model="k.value">
<template #button>
<a-input-number :disabled="writeAble" v-model="k.value" :min="0" :max="k.max" />
<a-icon class="slider-icon" type="caret-down" />
@ -18,7 +18,9 @@
</van-slider>
</div>
<!-- radio -->
<a-radio-group :disabled="writeAble" size="large" v-if="k.type === 'radio'" v-decorator="[v, { initialValue: k.default }]" button-style="solid" @change="changeRadio($event, v)">
<a-radio-group :disabled="writeAble" size="large" v-if="k.type === 'radio'"
v-decorator="[v, { initialValue: k.default }]" button-style="solid"
@change="changeRadio($event, v)">
<a-radio-button v-for="(item, index) in k.range" :key="item" :value="item">
{{ item }}
</a-radio-button>
@ -26,7 +28,8 @@
</a-form-item>
</a-form>
<div class="btns">
<a-button :disabled="writeAble" class="common-button" type="primary" size="large" block @click="onSubmit">保存</a-button>
<a-button :disabled="writeAble" class="common-button" type="primary" size="large" block
@click="onSubmit">保存</a-button>
</div>
</div>
@ -60,6 +63,7 @@
...mapState('patient', ['patientData', 'writeAble']),
},
mounted() {
console.log('RSYW_CODE', this.RSYW_CODE)
const {
recordValDict
} = this.patientData;
@ -91,6 +95,7 @@
if (j !== 'JMRS-RSYW') {
if (data[j]) {
let ans = data[j][0].answer;
console.log('ans', ans.toString())
this.RSYW_CODE[`${j}`].value = Number(
ans.toString()
);
@ -175,5 +180,4 @@
max-width: 100%;
}
}
</style>

55
src/views/thrombolysis/components/throm-ing.vue

@ -2,23 +2,26 @@
<div class="throm-ing">
<div class="throm-step">
<a-steps progress-dot :current="currentIndex" direction="vertical" @change="handleClickStep">
<!-- <a-step :status="currentIndex == 0 ? 'process' : currentIndex > 0 ? 'finish' : 'wait'" title="溶栓时间"
:description="stepDesc.drugDesc" /> -->
<a-step :status="currentIndex == 0 ? 'process' : currentIndex > 0 ? 'finish' : 'wait'" title="选择药物"
:description="stepDesc.drugDesc" />
<a-step :status="currentIndex == 1 ? 'process' : currentIndex > 1 ? 'finish' : 'wait'" title="0min"
:description="stepDesc.min0Desc" />
<a-step :status="currentIndex == 2 ? 'process' : currentIndex > 2 ? 'finish' : 'wait'" title="15min"
<a-step :status="currentIndex == 2 ? 'process' : currentIndex > 2 ? 'finish' : 'wait'" title="15min"
:description="stepDesc.min15Desc" />
<a-step :status="currentIndex == 3 ? 'process' : currentIndex > 3 ? 'finish' : 'wait'" title="30min"
<a-step :status="currentIndex == 3 ? 'process' : currentIndex > 3 ? 'finish' : 'wait'" title="30min"
:description="stepDesc.min30Desc" />
<a-step :status="currentIndex == 4 ? 'process' : currentIndex > 4 ? 'finish' : 'wait'" title="45min"
<a-step :status="currentIndex == 4 ? 'process' : currentIndex > 4 ? 'finish' : 'wait'" title="45min"
:description="stepDesc.min45Desc" />
<a-step :status="currentIndex == 5 ? 'process' : currentIndex > 5 ? 'finish' : 'wait'" title="60min"
<a-step :status="currentIndex == 5 ? 'process' : currentIndex > 5 ? 'finish' : 'wait'" title="60min"
:description="stepDesc.min60Desc" />
<a-step :status="currentIndex == 6 ? 'process' : currentIndex > 6 ? 'finish' : 'wait'" title="不良反应" />
<a-step :status="currentIndex == 7 ? 'process' : currentIndex > 7 ? 'finish' : 'wait'" title="溶栓记录" />
</a-steps>
</div>
<div class="throm-content">
<!-- <ThromIngDate v-if="currentIndex == 0" @next="handleNext"></ThromIngDate> -->
<ThromIngDrug v-if="currentIndex == 0" @next="handleNext"></ThromIngDrug>
<ThromIngMin timercode="JMRS-Q-NIHSS" v-else-if="currentIndex == 1" @next="handleNext"></ThromIngMin>
<ThromIngMin timercode="JMRS-15-NIHSS" v-else-if="currentIndex == 2" @next="handleNext"></ThromIngMin>
@ -32,7 +35,10 @@
</template>
<script>
import { mapState } from 'vuex';
import {
mapState
} from 'vuex';
import ThromIngDate from './throm-ing-date.vue'
import ThromIngDrug from './throm-ing-selDrug.vue';
import ThromIngMin from './throm-ing-min.vue';
import ThromIngMin15 from './throm-ing-min15.vue';
@ -52,33 +58,37 @@
ThromIngMin60,
ThromIngReactions,
ThromIngRecord,
ThromIngDate
},
data() {
return {
currentIndex: 0,
stepDesc: {
drugDesc: '阿尼普酶',
min0Desc: 'NIHSS评分: 0',
min15Desc: 'NIHSS评分: 15',
min30Desc: 'NIHSS评分: 30',
min45Desc: 'NIHSS评分: 45',
min60Desc: 'NIHSS评分: 60',
}
}
},
computed: {
...mapState('patient', ['patientData', 'book']),
stepDesc() {
return {
drugDesc: this.patientData?.recordValDict?.['JMRS-RSYW']?.[0]?.answer[0] || '',
min0Desc: 'NIHSS评分: ' + (this.patientData?.recordValDict?.['JMRS-Q-NIHSS']?.[0]?.answer[0] || 0),
min15Desc: 'NIHSS评分: ' + (this.patientData?.recordValDict?.['JMRS-15-NIHSS']?.[0]?.answer[0] || 0),
min30Desc: 'NIHSS评分: ' + (this.patientData?.recordValDict?.['JMRS-30-NIHSS']?.[0]?.answer[0] || 0),
min45Desc: 'NIHSS评分: ' + (this.patientData?.recordValDict?.['JMRS-45-NIHSS']?.[0]?.answer[0] || 0),
min60Desc: 'NIHSS评分: ' + (this.patientData?.recordValDict?.['JMRS-60-NIHSS']?.[0]?.answer[0] || 0),
}
}
},
mounted() {
},
created() {
console.log('patientData', this.patientData)
console.log('book', this.book)
// console.log('book', this.book)
},
methods: {
handleClickStep(current){
handleClickStep(current) {
this.currentIndex = current;
},
handleNext() {
@ -99,6 +109,7 @@
padding: 10px;
margin-right: .2rem;
background-color: #fff;
.ant-steps-vertical .ant-steps-item-content {
min-height: 4rem;
}
@ -128,7 +139,10 @@
}
.throm-content {
height: calc(100vh - 120px);
overflow-y: auto;
padding: 10px;
box-sizing: border-box;
flex: 1;
background-color: #fff;
@ -136,12 +150,14 @@
font-size: 0.85rem;
font-weight: bold;
}
.ant-form-item{
.ant-form-item {
background: #f9f9f9;
margin-bottom: .5rem;
padding: 12px;
border-radius: 4px;
}
.ant-radio-button-wrapper {
padding: 0 1.64vw;
height: 3.64vw;
@ -152,6 +168,7 @@
border: 0.5px solid #a3acbf;
border-radius: 0.55vw;
vertical-align: middle;
&:before,
.ant-radio-button-wrapper-checked:before {
display: none !important;
@ -191,7 +208,7 @@
}
}
}
}
.common-picker {

410
src/views/thrombolysis/components/throm-interfere-image-dcm.vue

@ -0,0 +1,410 @@
<template>
<a-spin tip="正在请求..." class="zhezhao1" :spinning="load">
<div class="div-box1">
<div class="div-box">
<div class="div-box-left">
<!-- :class="highlight_id == item.id ? 'highlight1' : ''" -->
<div class="div-boxleft-li" v-for="(item, index) in imgurlArr" :key="index"
@click="handleView(item)" :class="
currentObj.id == item.id ? 'boxleft-current' : ''
">
{{ item.title }}
<span> #{{ item.fileSize }}</span>
</div>
</div>
<div class="div-box-right">
<!-- 工具 -->
<div class="div-boxright-butbox">
<div class="butbox-li" :class="highlight == index ? 'highlight' : ''"
v-for="(item, index) in tool" :key="index" @click="handleShadow(item.type, index)">
<div class="butbox-img">
<img :src="item.url" width="25" />
</div>
<div class="butbox-text">{{ item.text }}</div>
</div>
</div>
<!-- 图像 -->
<div class="dcmviewBox" style="">
<div class="dcmview" style="height: 100%">
<div class="dcmview-top">
<div>{{ currentObj.manufacturer }}</div>
<div v-show="currentObj.studyId">
EX{{ currentObj.studyId }}
</div>
<div v-show="currentObj.imagesInAcquisition">
Se{{ currentObj.imagesInAcquisition }}
</div>
<div v-show="currentObj.fileSize">
Lm{{ currentIndex }} /
{{ currentObj.fileSize }}
</div>
</div>
<div class="dcmview-right">
<div>{{ currentObj.institutionName }}</div>
<div>
{{ currentObj.patientSex }}
{{ currentObj.patientAge }}
</div>
<div>{{ currentObj.seriesDescription }}</div>
<div>{{ currentObj.accessionNumber }}</div>
</div>
<!-- <div class="dcmview-bottom">
<div>{{ currentObj.hospital }}</div>
<div>{{ currentObj.name }}</div>
<div>{{ currentObj.Ex }}</div>
<div>{{ currentObj.lm }}</div>
</div> -->
<div class="dcmview-left">
<div v-show="currentObj.kv">
KV{{ currentObj.kv }}
</div>
<div>{{ currentObj.seriesDate }}</div>
</div>
<dcmview @byValue="hanldeByValue" ref="dcmview" :currentDcm="currentDcm"
:toolType="toolType">
</dcmview>
</div>
</div>
</div>
</div>
</div>
</a-spin>
</template>
<script>
//
import {
mapMutations,
mapState
} from 'vuex';
import {
getCtInfoPath
} from 'api';
import dcmview from '@/components/yuanzhen-dcmView/dcmview.vue';
import {
screenage,
apiUrl,
proxyUrl
} from '@/config/setting.js';
export default {
//
components: {
dcmview,
},
data() {
return {
load: false,
imgurlArr: [
// {
// title: '',
// name: '',
// hospital: '',
// Basds: 'Basds',
// Ex: 'P000370691',
// se: 1,
// lm: 6,
// id: 11,
// imgArr: [
// {
// lm: 1,
// url: '/api/dicom/test1/1(1).dcm',
// },
// ],
// },
// {
// title: '',
// name: '2',
// hospital: '',
// lm: 6,
// id: 22,
// imgArr: [
// {
// lm: 1,
// url: '/api/dicom/test1/2(1).dcm',
// },
// {
// lm: 2,
// url: '/api/dicom/test1/2(2).dcm',
// },
// {
// lm: 3,
// url: '/api/dicom/test1/2(3).dcm',
// },
// {
// lm: 4,
// url: '/api/dicom/test1/2(4).dcm',
// },
// {
// lm: 5,
// url: '/api/dicom/test1/2(5).dcm',
// },
// {
// lm: 6,
// url: '/api/dicom/test1/2(6).dcm',
// },
// ],
// },
],
imgurl: '', //dcm<dcmview>
toolType: 'ScrollTool', //
currentDcm: [],
currentObj: {},
i: 0,
currentIndex: 1,
tool: [{
text: '翻图',
url: require('@/assets/images/xz.png'),
type: 'ScrollTool',
},
// {
// text: '',
// url: require('@/assets/images/xz.png'),
// type: 'eliminate',
// },
{
text: '阴影',
url: require('@/assets/images/阴影.png'),
type: 'Wwwc',
},
{
text: '角度标记',
url: require('@/assets/images/icon-design-34.png'),
type: 'Angle',
},
{
text: '矩形标记',
url: require('@/assets/images/矩形标记.png'),
type: 'RectangleRoi',
},
{
text: '拖动探针',
url: require('@/assets/images/探针.png'),
type: 'DragProbe',
},
{
text: '长度测量',
url: require('@/assets/images/长度测量直尺.png'),
type: 'Length',
},
],
highlight_id: '',
highlight: 0,
};
},
computed: {
...mapState('storm', ['spinning', 'showNav']),
...mapState('patient', ['patientData', 'timerData', 'overviewType']),
},
mounted() {
this.toolType = 'ScrollTool';
this.goCreate();
// console.log(11111111111);
},
methods: {
//
async goCreate() {
console.log('firstAidId', 2222223333333)
try {
this.load = true;
const {
firstAidId
} = this.patientData;
console.log('firstAidId', firstAidId)
const res = await getCtInfoPath({
firstAidId
});
const {
data,
code,
msg
} = res;
console.log('data: ', data);
if (code === 200) {
this.load = false;
const data1 = data[0].resultList
data1.forEach((item, index) => {
item.title = '系列' + (index + 1);
item.fileDtoList.forEach((row) => {
item.accessionNumber = row.accessionNumber;
item.institutionName = row.institutionName;
item.kv = row.kv;
item.manufacturer = row.manufacturer;
item.patientAge = row.patientAge;
item.patientSex = row.patientSex;
item.studyId = row.studyId;
row.dcmPath = apiUrl + row.dcmPath;
});
});
//
if (data1.length) {
this.currentObj = data1[0]; //
this.currentDcm = data1[0].fileDtoList; //
console.log('currentDcm', this.currentDcm)
this.highlight_id = data1[0].id;
}
this.imgurlArr = data1;
}
} catch (err) {
this.load = false;
console.log('err: ', err);
}
},
//
// -
hanldeByValue(_index) {
this.currentIndex = _index + 1;
},
// docom
handleView(_item) {
this.currentObj = _item;
this.currentDcm = _item.fileDtoList;
this.$refs.dcmview.viewDcm();
console.log('this.imgurl', this.imgurl);
},
//
handleShadow(_type, _index) {
this.toolType = _type;
this.highlight = _index;
console.log('this.highlight ', this.highlight);
},
},
};
</script>
<style scoped lang="less">
.highlight {
background: #4f8bff;
// border-radius: 10px;
}
.div-box-right {
flex: 1;
background: #000;
border-radius: 0 0 6px 6px;
}
.dcmviewBox {
background: #000;
border-radius: 4px 4px 0 0;
overflow: hidden;
height: calc(100% - 80px);
}
.dcmview {
position: relative;
color: pink;
text-align: left;
.dcmview-top {
position: absolute;
top: 10px;
left: 10px;
}
.dcmview-right {
position: absolute;
top: 10px;
right: 10px;
}
.dcmview-left {
position: absolute;
bottom: 10px;
left: 10px;
}
.dcmview-bottom {
position: absolute;
bottom: 10px;
right: 10px;
}
}
.div-box {
display: flex;
// height: 100%;
height: calc(100vh - 30vw);
}
.div-box1 {
height: 100%;
width: 100%;
background: #282828;
// padding: 10px;
border-radius: 10px;
}
.div-box-left {
flex-shrink: 0;
width: 150px;
background: #282828;
color: #fff;
padding: 0 10px 0 0;
height: 100%;
overflow: scroll;
div {
line-height: 25px;
border-radius: 4px;
}
}
.div-boxright-butbox {
display: flex;
background: #282828;
padding: 0 10px 10px 0px;
height: 72px;
box-sizing: border-box;
.butbox-li {
width: 80px;
display: flex;
justify-content: center;
color: #fff;
// background-color: #4f8bff;
flex-wrap: wrap;
font-size: 14px;
padding-bottom: 5px;
border-radius: 4px;
div {
width: 100%;
text-align: center;
}
.butbox-img {
height: 35px;
display: flex;
justify-content: center;
align-items: center;
}
.butbox-text {}
}
}
.div-boxleft-li {
display: flex;
justify-content: space-between;
padding: 5px 10px;
}
.boxleft-current {
background: #4f8bff;
}
.highlight1 {
background: #555555;
border-radius: 5px;
}
</style>
<style>
.zhezhao1 {
width: 100%;
height: 100% !important;
box-sizing: border-box;
padding-bottom: 20px;
}
</style>

82
src/views/thrombolysis/components/throm-interfere-image.vue

@ -3,7 +3,18 @@
<a-card style="width:100%" :tab-list="tabList" :active-tab-key="activeTabKey"
@tabChange="key => onTabChange(key, 'key')">
<div class="image-container">
<div class="notImg">溶栓视频安全区</div>
<throm-interfere-image-dcm></throm-interfere-image-dcm>
<!-- <div class="notImg">溶栓视频安全区</div> -->
<!-- <div v-if="tabList.length">
{{activeTabKey}}
{{tabList.find(a => a.key == activeTabKey)?.list[0].fileDtoList[0].dcmPath}}
<template v-for="it in tabList.find(a => a.key == activeTabKey)?.list">
<img :src="imgUrl+im.dcmPath" alt="" v-for="im in it.fileDtoList">
</template>
</div>
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div> -->
</div>
</a-card>
@ -19,24 +30,37 @@
mapMutations,
mapState
} from 'vuex';
import {
imgUrl
} from '@/config/setting.js';
import {
getCtInfoPath
} from 'api';
import emptyImage from '@/assets/images/slice/empty.png'
import ThromInterfereImageDcm from './throm-interfere-image-dcm.vue'
export default {
name: "throm-interfere-image",
components: {
ThromInterfereImageDcm
},
data() {
return {
activeTabKey: 'tab1',
tabList: [{
key: 'tab1',
tab: '介入1',
},
{
key: 'tab2',
tab: '介入2',
},
{
key: 'tab3',
tab: '院前CT (3张)',
},
imgUrl,
emptyImage,
activeTabKey: '0',
tabList: [
// {
// key: 'tab1',
// tab: '1',
// },
// {
// key: 'tab2',
// tab: '2',
// },
// {
// key: 'tab3',
// tab: 'CT (3)',
// },
],
}
},
@ -44,10 +68,36 @@
...mapState('storm', ['spinning', 'showNav']),
...mapState('patient', ['patientData', 'timerData', 'writeAble']),
},
created() {
this.queryVideo()
},
methods: {
onTabChange(key, type) {
this.activeTabKey = key;
},
async queryVideo() {
// type 0 1
let res = await getCtInfoPath({
firstAidId: this.patientData.firstAidId,
type: 1
});
const {
data,
code,
msg
} = res;
if (code === 200) {
// this.setVideo(data.list);
this.tabList = data.map((a, index) => {
return {
key: index + '',
tab: a.typeName,
list: a.resultList || []
}
})
// this.activeTabKey = data
}
},
onSubmit() {
this.$emit('next')
}
@ -75,7 +125,7 @@
}
.btns {
margin-top: 2rem;
// margin-top: 2rem;
}
}
</style>

340
src/views/thrombolysis/components/throm-interfere-informed - 副本.vue

@ -0,0 +1,340 @@
<template>
<div class="throm-interfere-informed">
<div class="Informed-container">
<h1 style="text-align: center;font-size: 2rem;line-height: 5rem;font-weight: bold;">急性脑梗塞静脉溶栓治疗知情同意书
</h1>
<div style="transition: all 1s; overflow: hidden; padding: 1rem 0;">
<div v-html="content" class="card-content ql-editor content-detail" style="white-space: pre-wrap"></div>
</div>
<div class="informed-list">
<div class="informed-item">
<span class="psign">患者签名: </span>
<div class="item-img" v-if="informed.patientSign" @click="lookSign(informed.patientSign)">
<img :src="apiUrl + informed.patientSign" alt="" />
</div>
<div class="item-img" v-else></div>
</div>
<div class="informed-item1">
<span>签名日期: </span>
<span>{{getPatientTime}}</span>
</div>
</div>
<div class="informed-list before">
<div class="informed-item">
<span>授权亲属签字: </span>
<div class="item-img" v-if="informed.empowerSign" @click="lookSign(informed.empowerSign)">
<img :src="apiUrl + informed.empowerSign" alt="" />
</div>
<div class="item-img" v-else></div>
</div>
<div class="informed-item1">
<span>与患者关系</span>
<span>{{informed.empowerRelation}}</span>
</div>
</div>
<template>
<div class="informed-info">
<strong> 医生陈述 </strong>
</div>
<div class="informed-info">
我已经告知患者将要进行的治疗方式此次治疗及术后可能发生的并发症和风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
<div class="informed-list">
<div class="informed-item">
<span>医生签名: </span>
<div class="item-img" v-if="informed.doctorSign" @click="lookSign(informed.doctorSign)">
<img :src="apiUrl + informed.doctorSign" alt="" />
</div>
<div class="item-img " v-else></div>
</div>
<div class="informed-item1">
<span>签名日期</span>
<span>{{getDoctorTime}}</span>
</div>
</div>
</template>
<a-modal :width="650" :destroyOnClose="true" v-model="lookVisable" title="查看签名" :footer="null">
<div class="modal-content">
<img :src="apiUrl + currentSign" alt="" style="width: 100%; height: 100%;" />
</div>
</a-modal>
</div>
<div>
<a-form-model>
<a-form-model-item label="姓名">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="性别">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="民族">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="民族">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="身份证号">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="发病时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="发病时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="是否院内卒中">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="到达急救时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="通知卒中医生时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="卒中到场时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="来源方式">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="疑似诊断">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
</a-form-model>
</div>
<div>
<a-form-model v-model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="身高(cm)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="体重(kg)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="性别">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="BMI">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="收缩压(mmHg)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="舒张压(mmHg)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="脉搏(次/分)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="本次入院mRS评分">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="本次入院NIHSS评分">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="采血开始时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="血糖(mol/L)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="心电开始时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="CT是否院外已查">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="到达CT时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="是否进行静脉溶栓">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="谈话开始时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="签署知情同意书">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="开始静脉溶栓场所">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="开始静脉溶栓时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="静脉溶栓药物">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="团注剂量(mg)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="静滴剂量(mg)">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="15min">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="30min">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="45min">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="60min">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="不良反应">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<div>血管内治疗</div>
<a-form-model-item label="是否给予血管内治疗">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="谈话开始时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="签署知情同意书时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="NIHSS评分">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="CT">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="TICI分级">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="穿刺完成时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="血管内开通方法">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="首次血管再通时间">
<a-input v-model="form.name"></a-input>
</a-form-model-item>
<a-form-model-item label="手术并发症">
<a-checkbox-group @change="onChange">
<a-row>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="支架取栓"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
<a-col :span="8"><a-checkbox value="无"></a-checkbox> </a-col>
</a-row>
</a-checkbox-group>
</a-form-model-item>
</a-form-model>
</div>
<div class="btns">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">下一步</a-button>
</div>
</div>
</template>
<script>
import {
mapState
} from 'vuex';
import {
imgUrl
} from '@/config/setting.js';
import {
uploadfile,
saveInformedConsent,
queryConsentResult,
thTime,
uploadBase64
} from 'api';
export default {
name: "throm-interfere-informed",
data() {
return {
apiUrl: imgUrl,
content: '',
informed: {
doctorSign: '',
doctorTime: '',
patientSign: '',
patientTime: '',
empowerSign: '',
empowerRelation: '',
empowerMobile: '',
legalTime: '',
},
lookVisable: false,
currentSign: '',
}
},
computed: {
...mapState('patient', ['patientData', 'book', 'video', 'writeAble']),
getDoctorTime() {
const {
informed
} = this;
if (!informed.doctorTime) return;
return informed.doctorTime.split(' ')[0];
},
getPatientTime() {
const {
informed
} = this;
if (!informed.patientTime) return;
return informed.patientTime.split(' ')[0];
},
getLegalTime() {
const {
informed
} = this;
if (!informed.legalTime) return;
return informed.legalTime.split(' ')[0];
},
},
created() {
this.content = this.book.find((item) => item.type === 1)?.content || '';
this.queryConsentResult()
},
methods: {
onSubmit() {
this.$emit('next')
},
async queryConsentResult() {
const {
firstAidId
} = this.patientData;
if (!firstAidId) return this.$message.error('缺少急救');
let res = await queryConsentResult({
firstAidId,
type: 0,
});
const {
code,
data,
msg
} = res;
if (code === 200) {
this.utils.merge(this.informed, data);
}
},
lookSign(url) {
this.currentSign = url;
this.lookVisable = true;
},
}
}
</script>
<style lang="less" scoped>
.throm-interfere-informed {
padding: 10px;
}
</style>
<style lang="less">
.throm-interfere-informed {}
</style>

632
src/views/thrombolysis/components/throm-interfere-informed.vue

@ -1,66 +1,167 @@
<template>
<div class="throm-interfere-informed">
<div class="Informed-container">
<h1 style="text-align: center;font-size: 2rem;line-height: 5rem;font-weight: bold;">急性脑梗塞静脉溶栓治疗知情同意书
</h1>
<div style="transition: all 1s; overflow: hidden; padding: 1rem 0;">
<div v-html="content" class="card-content ql-editor content-detail"
style="white-space: pre-wrap"></div>
</div>
<div class="informed-list">
<div class="informed-item">
<span class="psign">患者签名: </span>
<div class="item-img" v-if="informed.patientSign" @click="lookSign(informed.patientSign)">
<img :src="apiUrl + informed.patientSign" alt="" />
<a-card style="width:100%" :tab-list="tabList" :active-tab-key="activeTabKey" @tabChange="onTabChange">
<div class="throm-before4-container Informed-container">
<div class="video-container" v-if="activeTabKey == 'tab1'">
<h1 style="text-align: center;font-size: 2rem;line-height: 5rem;font-weight: bold;">急性脑梗塞静脉溶栓治疗知情同意书
</h1>
<div style="transition: all 1s; overflow: hidden; ">
<div v-html="content" class="card-content ql-editor content-detail"
style="white-space: pre-wrap"></div>
</div>
<div class="item-img" v-else></div>
</div>
<div class="informed-item1">
<span>签名日期: </span>
<span>{{getPatientTime}}</span>
</div>
</div>
<div class="informed-list before">
<div class="informed-item">
<span>授权亲属签字: </span>
<div class="item-img" v-if="informed.empowerSign" @click="lookSign(informed.empowerSign)">
<img :src="apiUrl + informed.empowerSign" alt="" />
<div class="informed-list">
<div class="informed-item">
<span class="psign">患者签名: </span>
<div class="item-img" v-if="informed.patientSign" @click="lookSign(informed.patientSign)">
<img :src="apiUrl + informed.patientSign" alt="" />
</div>
<div class="item-img" v-else></div>
<a-button :disabled="writeAble" shape="round" class="item-btn"
@click="patientSign = !patientSign">
{{ informed.patientSign ? '重新签名' : '点击签名' }}
</a-button>
</div>
<div class="informed-item1">
<span>签名日期: </span>
<a-input :disabled="writeAble" @focus="changeDate('patientTime')" :value="getPatientTime"
class="item-input" readOnly />
</div>
</div>
<div class="item-img" v-else></div>
</div>
<div class="informed-item1">
<span>与患者关系</span>
<span>{{informed.empowerRelation}}</span>
</div>
</div>
<template>
<div class="informed-info">
<strong> 医生陈述 </strong>
</div>
<div class="informed-info">
我已经告知患者将要进行的治疗方式此次治疗及术后可能发生的并发症和风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
<div class="informed-list">
<div class="informed-item">
<span>医生签名: </span>
<div class="item-img" v-if="informed.doctorSign" @click="lookSign(informed.doctorSign)">
<img :src="apiUrl + informed.doctorSign" alt="" />
<div>
<signature class="item-sign" ref="patientSign" @close="patientSignClose"
@reset="handeReset('patientSign')" v-if="patientSign">
</signature>
</div>
<div class="informed-info informed-info-sky">
如果患者无法签署知情同意书请其授权的亲属在此签名:
</div>
<div class="informed-list before">
<div class="informed-item">
<span>授权亲属签字: </span>
<div class="item-img" v-if="informed.empowerSign" @click="lookSign(informed.empowerSign)">
<img :src="apiUrl + informed.empowerSign" alt="" />
</div>
<div class="item-img" style="min-width: 110px;" v-else> </div>
<a-button :disabled="writeAble" type="continue" shape="round" class="item-btn"
@click="empowerSign = !empowerSign">{{
informed.empowerSign ? '重新签名' : '点击签名'
}}</a-button>
</div>
<div class="informed-item1">
<span>与患者关系</span>
<a-input :disabled="writeAble" v-model="informed.empowerRelation" class="item-input" />
</div>
<!-- <div class="informed-item">
<span>签名日期</span>
<a-input :disabled="writeAble" @focus="changeDate('legalTime')" :value="getLegalTime"
class="item-input" readOnly />
</div> -->
</div>
<div>
<signature class="item-sign" ref="empowerSign" @close="empowerSignClose"
@reset="handeReset('empowerSign')" v-if="empowerSign">
</signature>
</div>
<template v-if="source === 'normal'">
<div class="informed-info">
<strong> 医生陈述 </strong>
</div>
<div class="informed-info">
我已经告知患者将要进行的治疗方式此次治疗及术后可能发生的并发症和风险可能存在的其它治疗方法并且解答了患者关于此次治疗的相关问题
</div>
<div class="item-img " v-else></div>
<div class="informed-list">
<div class="informed-item">
<span>医生签名: </span>
<div class="item-img" v-if="informed.doctorSign" @click="lookSign(informed.doctorSign)">
<img :src="apiUrl + informed.doctorSign" alt="" />
</div>
<div class="item-img" v-else> </div>
<a-button :disabled="writeAble" type="continue" shape="round" class="item-btn"
@click="doctorSign = !doctorSign">{{
informed.doctorSign
? '重新签名'
: '点击签名'
}}</a-button>
</div>
<div class="informed-item1">
<span>签名日期</span>
<a-input :disabled="writeAble" @focus="changeDate('doctorTime')" :value="getDoctorTime"
class="item-input" readOnly />
</div>
</div>
<div>
<signature class="item-sign" ref="doctorSign" @close="doctorSignClose"
@reset="handeReset('doctorSign')" v-if="doctorSign">
</signature>
</div>
</template>
<div class="common-picker">
<van-datetime-picker v-if="picker" v-model="currentDate" type="date" @confirm="confirmPicker"
@cancel="picker = false" />
</div>
<div class="btns">
<a-button :disabled="writeAble" class="common-button" type="primary" size="large" block
@click="onSubmitSign" v-if="!disabled">提交</a-button>
</div>
<div class="informed-item1">
<span>签名日期</span>
<span>{{getDoctorTime}}</span>
</div>
<div class="video-container" v-if="activeTabKey == 'tab2'">
<div class="upload-informed-container">
<div class="upload-container">
<div class="info">知情同意图片</div>
<div class="upload-list" style="min-height: 300px;" v-if="fileList.length">
<!-- <div class="upload-list-item" v-for="(item, index) in fileList" :key="index"
@click="handlePreview(item)">
<div class="img">
<img :src="item" alt="" />
</div>
</div> -->
<div class="upload-list-item" v-for="(item, index) in fileList" :key="index"
@click="handlePreview(item)">
<div class="img">
<img :src="item" alt="" />
</div>
<div class="delete" @click="del(index)">
<a-icon type="close-circle" theme="filled" />
</div>
</div>
</div>
<div class="plus" v-if="fileList.length < 5" @click="openCamera">
<a-icon type="plus" />
</div>
<div class="emtpy" style="padding: 60px 0;" v-else>
<a-empty :image="emptyImage" description="暂无图片" />
</div>
</div>
<a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
<img style="width: 100%" :src="previewImage" />
</a-modal>
</div>
</div>
</template>
<a-modal :width="650" :destroyOnClose="true" v-model="lookVisable" title="查看签名" :footer="null">
<div class="modal-content">
<img :src="apiUrl + currentSign" alt="" style="width: 100%; height: 100%;" />
<div class="video-container" v-if="activeTabKey == 'tab3'">
<div class="info">百人中使用药物结果分布情况</div>
<div class="img">
<img src="@/assets/images/100.png" alt="" style="width: 100%;" />
</div>
<div class="image-container">
<video :src="getVideo" controls autoplay loop muted v-if="getVideo" width="100%">
您的浏览器不支持 video 标签
</video>
<!-- <div class="notImg" v-else>溶栓视频安全区</div> -->
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div>
</div>
</div>
</a-modal>
</div>
</div>
</a-card>
<a-modal :width="650" :destroyOnClose="true" v-model="lookVisable" title="查看签名" :footer="null">
<div class="modal-content">
<img :src="apiUrl + currentSign" alt="" style="width: 100%; height: 100%;" />
</div>
</a-modal>
<div class="btns">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">下一步</a-button>
@ -70,8 +171,11 @@
<script>
import {
mapState
mapState,
mapMutations
} from 'vuex';
import signature from '@/components/signature/signature';
import emptyImage from '@/assets/images/slice/empty.png'
import {
imgUrl
} from '@/config/setting.js';
@ -80,14 +184,35 @@
saveInformedConsent,
queryConsentResult,
thTime,
uploadBase64
uploadBase64,
queryVideo
} from 'api';
export default {
name: "throm-interfere-informed",
name: 'ThromBefor4',
props: {
source: {
type: String,
default: 'normal',
},
},
data() {
return {
emptyImage,
activeTabKey: 'tab1',
tabList: [{
key: 'tab1',
tab: '知情同意',
},
{
key: 'tab2',
tab: '拍照上传',
},
{
key: 'tab3',
tab: '谈话辅助工具',
}
],
apiUrl: imgUrl,
content: '',
informed: {
doctorSign: '',
doctorTime: '',
@ -98,10 +223,24 @@
empowerMobile: '',
legalTime: '',
},
content: '',
picker: false,
lookVisable: false,
currentSign: '',
currentDate: new Date(),
patientSign: '',
empowerSign: '',
doctorSign: '',
disabled: false,
previewVisible: false,
previewImage: '',
fileList: [],
}
},
components: {
signature,
},
computed: {
...mapState('patient', ['patientData', 'book', 'video', 'writeAble']),
getDoctorTime() {
@ -125,22 +264,67 @@
if (!informed.legalTime) return;
return informed.legalTime.split(' ')[0];
},
getVideo() {
let path;
this.video.forEach((item) => {
if (item.type === 1) {
path = item.path;
}
});
// console.log('path: ', path);
return this.apiUrl + path;
},
},
created() {
this.content = this.book.find((item) => item.type === 1)?.content || '';
this.queryConsentResult()
// console.log('book', this.book)
this.queryVideo()
this.content = this.book.find((item) => item.type === 0)?.content || '';
// console.log(this.content);
},
mounted() {
this.queryConsentResult();
this.thTime();
const {
recordValDict
} = this.patientData;
if (recordValDict) {
this.$nextTick(() => {
this.echo(recordValDict);
});
}
},
methods: {
...mapMutations('patient', ['setVideo']),
uploadImage() {
},
async queryVideo() {
let res = await queryVideo();
const {
data,
code,
msg
} = res;
if (code === 200) {
this.setVideo(data.list);
}
},
onSubmit() {
this.$emit('next')
},
async queryConsentResult() {
async onSubmitSign() {
const {
informed
} = this;
const {
firstAidId
} = this.patientData;
if (!firstAidId) return this.$message.error('缺少急救');
let res = await queryConsentResult({
let res = await saveInformedConsent({
...informed,
firstAidId,
templateText: this.content,
type: 0,
});
const {
@ -149,13 +333,243 @@
msg
} = res;
if (code === 200) {
this.utils.merge(this.informed, data);
this.$message.success('保存成功');
// this.$emit('next')
// if (this.source === 'first') {
// this.$emit('on-success', true);
// } else {
// // this.$router.go(-1);
// }
}
},
handleNext() {
this.$emit('next')
},
onTabChange(key, type) {
this.activeTabKey = key;
},
lookSign(url) {
this.currentSign = url;
this.lookVisable = true;
},
changeDate(type) {
this.picker = true;
this.type = type;
if (this.informed[type]) {
this.currentDate = new Date(this.informed[type]);
}
},
confirmPicker(date) {
console.log(date)
let y = date.getFullYear();
let m = date.getMonth() + 1;
m = m < 10 ? '0' + m : m;
let d = date.getDate();
d = d < 10 ? '0' + d : d;
let dateTime = y + '-' + m + '-' + d;
this.picker = false;
this.informed[this.type] = dateTime;
},
async thTime() {
if (this.writeAble) {
return;
}
const {
firstAidId
} = this.patientData;
if (!firstAidId) return this.$message.error('缺少急救');
let res = await thTime({
firstAidId,
});
const {
code,
data,
msg
} = res;
if (code === 200) {
//
}
},
async queryConsentResult() {
const {
firstAidId
} = this.patientData;
if (!firstAidId) return this.$message.error('缺少急救');
let res = await queryConsentResult({
firstAidId,
type: 0,
});
const {
code,
data,
msg
} = res;
if (code === 200) {
this.utils.merge(this.informed, data);
}
},
//
doctorSignClose(params) {
const file = params;
// 使FormData
var form = new FormData();
//
form.append('file', file);
uploadfile(form).then((res) => {
if (res.code === 200) {
this.informed.doctorSign = res.url;
this.$message.success('谈话医师签名保存成功');
this.doctorSign = false;
} else {
this.$message.error('谈话医师签名保存失败');
}
});
},
//
patientSignClose(params) {
const file = params;
// 使FormData
var form = new FormData();
//
form.append('file', file);
uploadfile(form).then((res) => {
if (res.code === 200) {
this.informed.patientSign = res.url;
this.$message.success('患者本人签名保存成功');
this.patientSign = false;
} else {
this.$message.error('患者本人签名保存失败');
}
});
},
//
empowerSignClose(params) {
const file = params;
var form = new FormData();
form.append('file', file);
uploadfile(form).then((res) => {
if (res.code === 200) {
this.informed.empowerSign = res.url;
this.$message.success('授权人签名保存成功');
this.empowerSign = false;
} else {
this.$message.error('授权人签名保存失败');
}
});
},
handeReset(value) {
this.informed[value] = null;
},
echo(data) {
if (data['JMRS-ZQTY-PIC']) {
const {
answer
} = data['JMRS-ZQTY-PIC'][0];
this.fileList = answer;
}
},
del(index) {
if (this.writeAble) {
this.$message.success('患者已审核,内容不可更改');
return;
}
this.fileList.splice(index, 1);
},
handleCancel() {
this.previewVisible = false;
},
async handlePreview(path) {
this.previewImage = path;
this.previewVisible = true;
},
openCamera() {
if (this.writeAble) {
this.$message.success('患者已审核,内容不可更改');
return;
}
const cmr = plus.camera.getCamera();
const res = cmr.supportedImageResolutions[0];
const fmt = cmr.supportedImageFormats[0];
cmr.captureImage(
(path) => {
plus.io.resolveLocalFileSystemURL(
path,
(entry) => {
//
this.compressImage(entry.toLocalURL(), entry.name);
},
(e) => {
plus.nativeUI.toast(
'读取拍照文件错误:' + e.message
);
}
);
},
(error) => {
// alert("Capture image failed: " + error.message);
}, {
resolution: res,
format: fmt,
filter: 'image',
}
);
},
//
compressImage(url, filename) {
var name = '_doc/upload/' + filename;
plus.zip.compressImage({
src: url, //src: (String )
dst: name, //
quality: 90, //quality: (Number ).1-100
overwrite: true, //overwrite: (Boolean )
width: '250',
height: '320',
},
(zip) => {
//
this.showPics(zip.target, name);
},
(error) => {
plus.nativeUI.toast('压缩图片失败,请稍候再试');
}
);
},
//
showPics(url, name) {
let _this = this;
//
plus.io.resolveLocalFileSystemURL(url, (entry) => {
entry.file((file) => {
var fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = (e) => {
var picUrl = e.target.result.toString();
this.uploadBase64(picUrl, file.name);
};
});
});
},
//
async uploadBase64(base64, fileName) {
if (!base64) return '您还未选择图片';
let res = await uploadBase64({
base64,
fileName,
});
const {
realPath,
code,
msg
} = res;
if (code === 200) {
this.fileList.push(realPath);
} else {
this.$message.error(res.msg);
}
},
}
}
</script>
@ -163,6 +577,98 @@
<style lang="less" scoped>
.throm-interfere-informed {
padding: 10px;
.video-container {
.info {
font-size: 2rem;
margin-bottom: 2rem;
}
.plus {
width: 180px;
height: 180px;
display: flex;
align-items: center;
justify-content: center;
background: #ffffff;
border: 2px dashed #a3acbf;
border-radius: 12px;
font-size: 40px;
color: #a3acbf;
}
.upload-list {
display: flex;
flex-wrap: wrap;
.upload-list-item {
width: 180px;
margin-right: 3%;
margin-bottom: 10px;
background: #f2f2f2;
display: flex;
justify-content: center;
align-items: center;
position: relative;
.img {
width: 180px;
height: 180px;
overflow: hidden;
overflow: hidden;
border-radius: 12px;
background: #f2f2f2;
img {
width: 100%;
height: auto;
}
}
.delete {
position: absolute;
right: -5px;
top: -10px;
.anticon {
font-size: 26px;
color: #7690e5;
}
}
}
}
.ant-upload-select-picture-card i {
font-size: 32px;
color: #999;
}
.ant-upload-select-picture-card .ant-upload-text {
margin-top: 8px;
color: #666;
}
}
.image-container {
margin-top: 3rem;
margin-bottom: 2rem;
.notImg {
background-color: #000000;
color: #ffffff;
text-align: center;
line-height: 50vh;
font-size: 2rem;
}
.emtpy {
height: 50vh;
display: flex;
justify-content: center;
align-items: center;
}
}
}
</style>
<style lang="less">

72
src/views/thrombolysis/components/throm-interfere-surgical.vue

@ -1,40 +1,40 @@
<template>
<div class="throm-interfere-surgical">
<div class="opera-list">
<a-table
:columns="columns"
:data-source="dataList"
:pagination="false"
bordered
key="table"
rowKey="id"
size="small"
class="throm-before-table"
>
<!-- <a-table :columns="columns" :data-source="dataList" :pagination="false" bordered key="table" rowKey="id"
size="small" class="throm-before-table">
<template slot="testResult" slot-scope="text, data">
<div>
<a-icon style="color: #f88152" type="arrow-up" v-if="data.testResultType == 's'" />
<a-icon type="arrow-down" style="color: #f88152" v-if="data.testResultType == 'x'" />
<span :style="{ paddingLeft: !data.testResultType ? '26px' : '4px', }" >{{ text }}</span>
<span :style="{ paddingLeft: !data.testResultType ? '26px' : '4px', }">{{ text }}</span>
</div>
</template>
</a-table>
</a-table> -->
<div class="Record-container">
<div class="record-content" v-html="dataInfo"></div>
<a-result class="common-result" v-if="!dataInfo" title="暂无记录"></a-result>
</div>
</div>
<div class="btns">
<a-button class="common-button" block type="primary" size="large"
@click="onSubmit">下一步</a-button>
<a-button class="common-button" block type="primary" size="large" @click="onSubmit">下一步</a-button>
</div>
</div>
</template>
<script>
import {
mapState
} from 'vuex';
import {
operationLog
} from 'api';
export default {
name: "throm-interfere-surgical",
data() {
return {
dataList: [],
columns: [
{
dataInfo: '',
columns: [{
title: '类型名', //
dataIndex: 'testItemTypeName', //
key: '0',
@ -61,7 +61,9 @@
key: '3',
// width: 150,
align: 'center',
scopedSlots: { customRender: 'testResult' },
scopedSlots: {
customRender: 'testResult'
},
},
{
title: '单位', //
@ -87,7 +89,20 @@
]
}
},
computed: {
...mapState('patient', ['patientData']),
},
created() {
this.queryData()
},
methods: {
async queryData() {
const res = await operationLog({
firstAidId: this.patientData.firstAidId
})
this.dataInfo = res.data
console.log(res)
},
onSubmit() {
this.$emit('next')
}
@ -97,10 +112,27 @@
<style lang="less" scoped>
.throm-interfere-surgical {
.opera-list{
.opera-list {
min-height: 500px;
}
.btns{
.Record-container {
height: 50vh;
color: #000;
background-color: #eee;
padding: 1rem;
.record-content {
font-size: 1.2rem;
text-indent: 2em;
line-height: 2rem;
text-align: justify;
}
}
.btns {
margin-top: 2rem;
}
}

7
src/views/thrombolysis/components/throm-interfere.vue

@ -32,7 +32,7 @@
}
},
methods: {
handleClickStep(current){
handleClickStep(current) {
this.currentIndex = current;
},
handleNext() {
@ -53,6 +53,7 @@
padding: 10px;
margin-right: .2rem;
background-color: #fff;
.ant-steps-vertical .ant-steps-item-content {
min-height: 10rem;
}
@ -82,8 +83,12 @@
}
.throm-content {
height: calc(100vh - 120px);
overflow-y: auto;
padding: 10px;
background-color: #fff;
flex: 1;
box-sizing: border-box;
.ant-form .ant-form-item-label label {
font-size: 1.5rem;

208
src/views/thrombolysis/components/throm-report.vue

@ -1,8 +1,8 @@
<template>
<div class="throm-report">
<div class="report-container">
<a-row :gutter="6">
<a-col :span="12">
<a-row :gutter="[6,6]">
<a-col :span="24">
<a-card class="report-card">
<div class="report-patient-box">
<div class="report-patient-info">
@ -22,7 +22,7 @@
</div>
<div class="report-patient-row">
<span class="report-patient-rowlabel">联系方式: </span>
<span class="report-patient-rowtext">{{patient.patientIdCardNo || '-'}}</span>
<span class="report-patient-rowtext">{{patient.patientContract || '-'}}</span>
</div>
<div class="report-patient-row">
<span class="report-patient-rowlabel">身份证: </span>
@ -31,47 +31,58 @@
</div>
</div>
</a-card>
<a-card class="report-card" style="margin-top: 6px;">
</a-col>
<a-col :span="24">
<a-card class="report-card">
<div class="report-treat-box">
<div class="report-treat-row1">
<span class="report-treat-rowlabel">入院mRS评分: </span>
<span class="report-treat-rowtext">
{{ codeForm['RYPG-MRS'] || '暂无' }}
{{ getFirstInfo['RYPG-MRS'] || '暂无' }}
</span>
</div>
<div class="report-treat-row1">
<span class="report-treat-rowlabel">入院NIHSS评分: </span>
<span class="report-treat-rowtext">
{{ codeForm['RYPG-NIHSS'] ? codeForm['RYPG-NIHSS'] : '暂无' }}
{{ getFirstInfo['RYPG-NIHSS'] || '暂无' }}
</span>
</div>
<div class="report-treat-row1">
<span class="report-treat-rowlabel">舒张压/收缩压: </span>
<span class="report-treat-rowtext">{{getPressure || '暂无'}}</span>
<span class="report-treat-rowtext">
<span>{{getFirstInfo['RYPG-DIASTOLIC-PRESSURE'] ? (getFirstInfo['RYPG-DIASTOLIC-PRESSURE'] + 'mmHg') : '暂无'}}</span>
<span> / </span>
<span>{{getFirstInfo['RYPG-SYSTOLIC-PRESSURE'] ? (getFirstInfo['RYPG-SYSTOLIC-PRESSURE'] + 'mmHg') : '暂无'}}</span>
</span>
</div>
<div class="report-treat-row2">
<span class="report-treat-rowlabel">身高: </span>
<span class="report-treat-rowtext">
{{ codeForm['RYPG-HEIGHT'] ? codeForm['RYPG-HEIGHT'] + 'CM' : '暂无' }}
{{ getFirstInfo['RYPG-HEIGHT'] ? getFirstInfo['RYPG-HEIGHT'] + 'CM' : '暂无' }}
</span>
<span class="report-treat-rowlabel">体重: </span>
<span class="report-treat-rowtext">
{{ codeForm['RYPG-WEIGHT'] ? codeForm['RYPG-WEIGHT'] + 'KG' : '暂无' }}
{{ getFirstInfo['RYPG-WEIGHT'] ? getFirstInfo['RYPG-WEIGHT'] + 'KG' : '暂无' }}
</span>
<span class="report-treat-rowlabel">BMI: </span>
<span class="report-treat-rowtext">{{ codeForm['RYPG-BMI'] || '暂无' }}</span>
<span class="report-treat-rowtext">{{ getFirstInfo['RYPG-BMI'] || '暂无' }}</span>
<span class="report-treat-rowlabel">血糖: </span>
<span class="report-treat-rowtext">
{{ codeForm['RYPG-PULSE'] ? codeForm['RYPG-PULSE'] + '次/分' : '暂无' }}
{{ getFirstInfo['RYPG-PULSE'] ? getFirstInfo['RYPG-PULSE'] + '次/分' : '暂无' }}
</span>
</div>
<div class="report-treat-row2">
<span class="report-treat-rowlabel">选用平车: </span>
<span class="report-treat-rowtext">C241101</span>
<span class="report-treat-rowtext">{{patient.carNo || '-'}}</span>
</div>
<div class="report-treat-row2">
<span class="report-treat-rowlabel">溶栓药物及计量: </span>
<span class="report-treat-rowtext" style="height: 64px;">文案文案文案文案文案文案</span>
<span class="report-treat-rowtext" style="height: 64px;">
溶栓药物: {{getFirstInfo['JMRS-RSYW'] || '暂无'}}
静滴剂量: {{getFirstInfo['JMRS-JDJL'] || '暂无'}}
团注剂量: {{getFirstInfo['JMRS-TZJL'] || '暂无'}}
</span>
</div>
<div class="report-treat-row2">
<span class="report-treat-rowlabel">绿道状态: </span>
@ -80,7 +91,7 @@
</div>
</a-card>
</a-col>
<a-col :span="12">
<a-col :span="24">
<a-card class="report-card">
<div class="report-timeline">
<a-steps progress-dot :current="currentIndex" direction="vertical">
@ -159,24 +170,56 @@
</a-card>
</a-col>
<a-col :span="24">
<a-list item-layout="horizontal" :data-source="dataList"
style="margin-top: 6px;background-color: #fff">
<a-list-item slot="renderItem" slot-scope="item, index">
<a-button slot="actions" shape="round">导出</a-button>
<a-button slot="actions" shape="round" type="primary"
@click="checkReport(item.type)">查看</a-button>
<a-list-item-meta>
<div slot="title" style="font-weight: bold; font-size: 1rem;">{{item.name}}</div>
</a-list-item-meta>
</a-list-item>
</a-list>
<a-card class="report-card" title="急诊溶栓记录">
<a slot="extra" id="exportFirst" href="JavaScript:;" @click="exportRecord">导出</a>
<div class="report-card-content">
<div class="record-content" v-html="recordData"></div>
<div class="emtpy" v-if="!recordData">
<a-empty :image="emptyImage" description="暂无溶栓记录" />
</div>
</div>
</a-card>
</a-col>
<a-col :span="24">
<a-card class="report-card" title="溶栓观察表">
<a slot="extra" href="#">导出</a>
<div class="doc-ct-content">
<div class="record-content" v-html="observeData"></div>
<div class="emtpy" v-if="!observeData">
<a-empty :image="emptyImage" description="暂无溶栓记录" />
</div>
</div>
</a-card>
</a-col>
<a-col :span="24">
<a-card class="report-card" title="DNT时间表">
<a slot="extra" href="#">导出</a>
<div class="doc-ct-content">
<div class="record-content" v-html="dntData"></div>
<div class="emtpy" v-if="!dntData">
<a-empty :image="emptyImage" description="暂无DNT时间表" />
</div>
</div>
</a-card>
</a-col>
<a-col :span="24">
<a-card class="report-card" title="介入手术记录">
<a slot="extra" href="#">导出</a>
<div class="doc-ct-content">
<div class="record-content" v-html="operaData"></div>
<div class="emtpy" v-if="!operaData">
<a-empty :image="emptyImage" description="暂无手术记录" />
</div>
</div>
</a-card>
</a-col>
</a-row>
</div>
<div class="btns">
<a-button :disabled="writeAble" class="common-button" size="large" block @click="onSubmit">打印</a-button>
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">导出</a-button>
<a-button :disabled="writeAble" class="common-button" type="primary" size="large" block
@click="onSubmit">打印</a-button>
<!-- <a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">导出</a-button> -->
</div>
<throm-report-dnt ref="dnt"></throm-report-dnt>
<throm-report-record ref="record"></throm-report-record>
@ -193,7 +236,11 @@
import {
getNextNode,
messageQuery,
queryAidRecord
queryAidRecord,
queryLog,
operationLog,
getCtInfoPath,
operationLogEx
} from 'api';
import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration';
@ -201,6 +248,7 @@
import ThromReportRecord from './throm-report-record.vue';
import ThromReportObserve from './throm-report-observe.vue';
import ThromReportOpera from './throm-report-opera.vue';
import emptyImage from '@/assets/images/slice/empty.png'
dayjs.extend(duration);
export default {
@ -213,6 +261,7 @@
},
data() {
return {
emptyImage,
currentIndex: 1,
dataList: [{
name: '急诊溶栓记录',
@ -258,7 +307,11 @@
},
request: 1,
processNodeIndex: 0,
patient: {}
patient: {},
recordData: "",
observeData: "",
dntData: "",
operaData: "",
}
},
props: {
@ -274,13 +327,13 @@
computed: {
...mapState('patient', ['patientData', 'nextNodeData', 'writeAble']),
getPatient() {
const {
firstAidId,
patientName,
patientGender,
patientAge
} = this.patient;
if (!patientName) return;
if (!firstAidId) return;
return `${patientName} ${ patientGender === 0 ? '男' : patientGender === 1 ? '女' : '' } ${patientAge || ''}`;
},
getPressure() {
@ -309,6 +362,26 @@
this.processNodeIndex = lastFinishIndex + 1
return sop.nodeList;
},
getFirstInfo() {
const {
recordValDict
} = this.patient
if (!recordValDict) return {}
else return {
'RYPG-WEIGHT': recordValDict['RYPG-WEIGHT']?.[0].answer[0], //
'RYPG-HEIGHT': recordValDict['RYPG-HEIGHT']?.[0].answer[0], //
'RYPG-MRS': recordValDict['RYPG-MRS']?.[0].answer[0], // MRS
'RYPG-NIHSS': recordValDict['RYPG-NIHSS']?.[0].answer[0], // NIHSS
'RYPG-BMI': recordValDict['RYPG-BMI']?.[0].answer[0], // BMI
'RYPG-SYSTOLIC-PRESSURE': recordValDict['RYPG-SYSTOLIC-PRESSURE']?.[0].answer[0], //
'RYPG-DIASTOLIC-PRESSURE': recordValDict['RYPG-DIASTOLIC-PRESSURE']?.[0].answer[0], //
'RYPG-BLOOD-SUGAR': recordValDict['RYPG-BLOOD-SUGAR']?.[0].answer[0], //
'RYPG-PULSE': recordValDict['RYPG-PULSE']?.[0].answer[0], //
'JMRS-RSYW': recordValDict['JMRS-RSYW']?.[0].answer[0], //
'JMRS-JDJL': recordValDict['JMRS-JDJL']?.[0].answer[0], //
'JMRS-TZJL': recordValDict['JMRS-TZJL']?.[0].answer[0], //
}
}
},
async mounted() {
//TODU
@ -323,7 +396,7 @@
firstAidId
} = this.patient;
firstAidId && this.init(firstAidId);
// await this.getMessageQuery();
await this.getMessageQuery();
},
methods: {
...mapMutations('patient', ['setNextNodeData', 'setTimerData']),
@ -343,6 +416,32 @@
onSubmit() {
// this.$emit('next')
},
async getData() {
const {
firstAidId
} = this.patientData
const resLog = await queryLog({
firstAidId
})
this.recordData = resLog.data || ''
// const resObserve = await getCtInfoPath({
// firstAidId
// })
// this.observeData = resObserve.data || []
const resOperaLog = await operationLog({
firstAidId
})
this.observeData = resOperaLog.data || ''
this.operaData = resOperaLog.data || ''
// const res = await operationLogEx({
// firstAidId
// })
},
getHMS(time) {
if (!time) return;
// ?
@ -424,6 +523,7 @@
// firstAidId
// } = this.patientData;
this.getNextNode(firstAidId);
this.getData()
},
async getNextNode(firstAidId) {
let res = await getNextNode({
@ -442,13 +542,48 @@
this.$message.error('缺少急救id信息');
}
},
async exportRecord() {
const {
firstAidId
} = this.patientData
const res = await queryLog({
firstAidId
})
const {
code,
data,
msg
} = res
if (code === 200) {
this.toDownLoad(data)
} else {
this.$message.error(msg)
}
},
toDownLoad(path) {
try {
document.getElementById('exportFirst').href = path;
document.getElementById('exportFirst').download = '.xlsx';
} catch (e) {
//TODO handle the exception
console.log(e.message)
}
}
}
}
</script>
<style lang="less" scoped>
.throm-report {
// padding-top: 1rem;
.report-container {
height: calc(100vh - 196px);
overflow-y: auto;
// padding: 10px;
}
.report-card {
border-color: rgba(0, 0, 0, 0.09);
@ -565,7 +700,10 @@
}
.btns {
padding: 2rem 15%;
padding: 12px 15% 0;
background-color: #fff;
margin-top: 6px;
}
}
</style>
@ -580,7 +718,7 @@
}
.report-timeline {
height: 424px;
// height: 424px;
overflow-y: auto;
.ant-steps-vertical .ant-steps-item-content {

451
src/views/thrombolysis/components/throm-result-baseInfo.vue

@ -0,0 +1,451 @@
<template>
<div class="BasicInfo">
<div class="basic-content">
<!-- 患者基本信息 -->
<div class='basicr-back'>
<a-form class="detail-form" :form="baseForm" labelWitch="260px" :labelCol="{span: 6}" :wrapperCol="{span: 16}">
<a-form-item label="扫描身份证">
<div class="detail-form-control">
<a-upload :disabled="writeAble" class="idcard-upload" accept=".img,.png,.jpg"
:before-upload="handleBeforeUpload" :showUploadList="false" name="file"
:multiple="false" :customRequest="handleUploadAdd">
<a-icon type="scan" class="fz24" />
</a-upload>
</div>
</a-form-item>
<a-form-item label="姓名">
<div class="detail-form-control" >
<a-input :disabled="writeAble" v-decorator="['patientName']" style="width: 448px;"
@blur="onBaseChange($event.target.value, 'patientName')" placeholder='请输入' />
</div>
</a-form-item>
<a-form-item label="性别">
<div class="detail-form-control">
<a-radio-group :disabled="writeAble" v-decorator="['patientGender']" style="width: 448px;"
@change="onBaseChange($event.target.value, 'patientGender')">
<a-radio :value='0'> </a-radio>
<a-radio :value='1'> </a-radio>
</a-radio-group>
</div>
</a-form-item>
<a-form-item label="民族">
<div class="detail-form-control">
<a-select :disabled="writeAble" ref="select" v-decorator="['patientNation']" style="display: block;width: 448px;"
@change="handleChange($event, 'patientNation', 'default')" placeholder='请选择'>
<a-select-option v-for="item in nationList" :key="item" :value="item">
{{item}}
</a-select-option>
</a-select>
</div>
</a-form-item>
<a-form-item label="身份证号">
<div class="detail-form-control">
<a-input :disabled="writeAble" v-decorator="['patientIdCardNo']" placeholder='请输入'
@blur="onBaseChange($event.target.value, 'patientIdCardNo')" style="width: 448px;" />
</div>
</a-form-item>
<a-form-item v-for="(k,v) in BASE_CODE" :key="v" :label="k.text" v-if="computeShow(v, codeForm)">
<div class="detail-form-control">
<!-- radio -->
<a-radio-group :disabled="writeAble" v-if="k.type==='radio'" style="width: 448px;" v-decorator="[
v,
{initialValue: codeForm[k] },
]" @change="handleChange($event.target.value, v)">
<a-radio v-for="(item,index) in k.range" :key="item" :value="item">
{{item}}
</a-radio>
</a-radio-group>
<!-- input -->
<a-input :disabled="writeAble" v-if="k.type==='input'" :type="k.inputType" v-decorator="[
v]" @blur="handleChange($event.target.value, v)" placeholder='请输入' style="width: 448px;">
</a-input>
<!-- datetime -->
<a-input :disabled="writeAble" v-if="k.type==='datetime'" readOnly @click="selectOption(v)" style="width: 448px;"
v-decorator="[
v,
]" placeholder='请选择'>
</a-input>
<a-select :disabled="writeAble" v-if="k.type==='select'" v-decorator="[
v]" @change="handleChange($event, v)" placeholder='请选择' style="display: block;width: 448px;">
<a-select-option v-for="item in k.range" :key="item" :value="item">
{{item}}
</a-select-option>
</a-select>
</div>
</a-form-item>
</a-form>
</div>
<!-- 疑似诊断 -->
<div class='diagnosis'>
<v-head text='疑似诊断'></v-head>
<div class='back-ff'>
<a-radio-group :disabled="writeAble" v-model:value="firstAidZlType" style="width: 448px;"
@change="onBaseChange($event.target.value, 'firstAidZlType')">
<a-radio :style="radioStyle" v-for="(k,v) in FIRSTAIDZLTYPE_DICT" :key="v"
:value="v">{{k}}</a-radio>
</a-radio-group>
</div>
</div>
<div class="common-picker">
<van-datetime-picker v-if="pickerVisable" v-model="currentDate" :formatter="formatter"
@cancel="pickerVisable = false" @confirm="onConfirm" style="width: 448px;" />
</div>
</div>
<div class="basic-footer">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">{{patientId ? '保存' : '下一步'}}</a-button>
<!-- <a-button :disabled="writeAble" type="link" size="large" @click="onSubmit">
保存<a-icon type="check" />
</a-button> -->
</div>
</div>
</template>
<script>
import head from '@/views/Patient/components/title.vue';
import {
uploadIdcard,
updateFirstAid,
queryAidRecord
} from 'api'
import {
mapMutations,
mapState
} from 'vuex'
import {
BASE_CODE
} from '@/config/code.js'
import {
FIRSTAIDZLTYPE_DICT
} from '@/config/dict.js'
export default {
name: 'BasicInfo',
data() {
return {
BASE_CODE,
FIRSTAIDZLTYPE_DICT,
//
currentDate: new Date(),
//
pickerVisable: false,
radioStyle: {
display: 'block',
height: '30px',
lineHeight: '30px',
},
baseForm: this.$form.createForm(this, {
name: 'BasicInfo'
}),
//使code
codeForm: {
'JBXX-SFXHCZ': '已知',
'JBXX-FBSJ': '',
'JBXX-ZHZC-TIME': '',
'JBXX-SFYNCZ': '是',
'JBXX-DDJZ-TIME': '',
'JBXX-TZCZYS-TIME': '',
'JBXX-CZYSDC-TIME': '',
'JBXX-LYFS': '',
},
firstAidZlType: 0, //
selectCode: '' // code
}
},
props: ['patientId'],
components: {
'v-head': head
},
computed: {
...mapState('patient', ['patientData', 'writeAble']),
...mapState('storm', ['nationList'])
},
async mounted() {
console.log('patientId', this.patientId)
if (this.patientId) {
const res = await queryAidRecord(this.patientId)
this.$nextTick(() => {
this.echo(res.data)
})
} else {
this.$nextTick(() => {
if (this.patientData) {
this.echo(this.patientData)
}
})
}
},
methods: {
echo(data) {
const {
recordValDict,
patientName,
patientGender,
patientNation,
patientIdCardNo,
firstAidZlType
} = data
this.firstAidZlType = firstAidZlType && firstAidZlType.toString() || '0'
this.baseForm.getFieldDecorator([patientName,
patientGender,
patientNation,
patientIdCardNo
], {
preserve: true, //便使
})
this.baseForm.setFieldsValue({
patientName,
patientGender,
patientNation,
patientIdCardNo
});
for (let k in recordValDict) {
if (recordValDict[k]) {
const {
answer
} = recordValDict[k][0]
if (Object.keys(this.codeForm).includes(k)) {
this.codeForm[k] = answer.toString()
}
this.baseForm.getFieldDecorator([`${k}`], {
preserve: true, //便使
})
this.baseForm.setFieldsValue({
[`${k}`]: answer.toString(),
});
}
}
},
computeShow(code, codeForm) {
return this.utils.computeShow(code, codeForm)
},
selectOption(v) {
this.selectCode = v
this.pickerVisable = true
},
//
formatter(type, val) {
if (type === 'year') {
return val + '年';
}
if (type === 'month') {
return val + '月';
}
if (type === 'day') {
return val + '日';
}
if (type === 'hour') {
return val + '时';
}
if (type === 'minute') {
return val + '分';
}
return val;
},
//
onConfirm(date) {
this.baseForm.setFieldsValue({
[`${this.selectCode}`]: this.utils.format(date),
});
this.pickerVisable = false
// this.updateAidBase(this.selectCode, this.utils.format(date))
},
handleChange(value, code, type) {
const codes = ['patientGender', 'patientIdCardNo', 'patientName', 'patientNation']
if (!codes.includes(code)) {
this.codeForm[code] = value
}
// this.updateAidBase(code, value, type)
},
async onBaseChange(value, code) {
if (code === 'patientIdCardNo') {
const reg =
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
if (!reg.test(value)) {
this.$message.error('身份证格式不正确')
return
}
}
// await this.home.updateAidCode({
// [`${code}`]: value
// }, false)
},
//
async updateAidBase(code, value, type) {
let params
let codeAndAnswerList = []
if (type) {
params = {
[`${code}`]: value
}
} else {
let answer = [value]
if (typeof value !== 'string') {
answer = value
}
codeAndAnswerList.push({
questionCode: code,
answer,
time: ''
})
}
await this.home.updateAidCode({
...params,
codeAndAnswerList
}, false)
},
//
handleBeforeUpload(file) {
this.file = file
const isLt10M = file.size / 1024 / 1024 < 10000;
//
if (!isLt10M) {
this.$message.error('上传头像图片大小不能超过 10MB!');
}
return isLt10M;
},
async onSubmit(e) {
e.preventDefault();
let firstAidId = this.patientData.firstAidId
let codeAndAnswerList = [],
params = {
firstAidId
}
const codes = ['patientGender', 'patientIdCardNo', 'patientName', 'patientNation']
this.$nextTick(async () => {
this.baseForm.validateFields(async (err, values) => {
for (var k in values) {
if (Object.keys(this.codeForm).includes(k)) {
let answer = [values[k]]
if (typeof values[k] !== 'string') {
answer = values[k]
}
if (values[k]) {
codeAndAnswerList.push({
questionCode: k,
answer,
time: ''
})
}
} else if (codes.includes(k)) {
params[`${k}`] = values[k]
}
}
var res = await updateFirstAid(params)
await this.home.updateAidCode({
codeAndAnswerList
}, false)
this.$message.success(res.msg)
this.$emit('next')
})
})
},
//
handleUploadAdd() {
// 使FormData
var form = new FormData();
//
form.append('file', this.file);
uploadIdcard(form).then((res) => {
if (res.code === 200) {
if (res.data) {
const {
name,
sex,
idCardNo,
nation
} = res.data;
this.baseForm.setFieldsValue({
['patientName']: name,
['patientGender']: sex,
['patientNation']: nation,
['patientIdCardNo']: idCardNo
});
} else {
this.$message.error('请扫描正确身份证');
}
} else {
this.$message.error(res.msg);
}
});
}
}
}
</script>
<style scoped lang="less">
p {
margin: 0;
}
.basic-content {
flex: 1;
overflow-y: auto;
}
.BasicInfo {
flex: 1;
display: flex;
flex-direction: column;
}
.basic-footer {
display: flex;
align-items: center;
justify-content: center;
margin-top: 20px;
padding: 0 10%;
}
</style>
<style scoped>
>>>.ant-btn-link {
color: #7690e5;
font-size: 24px;
font-weight: bold;
}
>>>.ant-radio-wrapper {
text-align: left;
font-size: 24px;
height: 58px !important;
line-height: 58px !important;
box-sizing: border-box;
border-bottom: 1px solid #f0f0f0 !important;
}
>>>.ant-col.ant-form-item-control-wrapper {
flex: 2;
}
>>>.ant-radio-wrapper:last-child {
border-bottom: none !important;
}
>>>.ant-radio {
font-size: 24px;
}
>>>.ant-radio-inner::after {
width: 16px;
height: 16px;
}
>>>.ant-radio-inner {
width: 24px;
height: 24px;
}
>>>.container-left-header {
padding-bottom: 0;
}
.back-ff {
box-shadow: 0 2px 12px 0 rgba(52, 52, 52, .1);
background: #fff;
padding: 10px 20px;
border-radius: 12px;
}
</style>

707
src/views/thrombolysis/components/throm-result-firstInfo.vue

@ -0,0 +1,707 @@
<template>
<div class="Overviewbasicr">
<div class="first-content">
<!-- 患者急救记录 -->
<div class="basicr-back">
<a-form class="detail-form" :form="firstForm">
<a-form-item class="jmrs-form-item" v-for="(k, v) in AID_CODE" :key="v">
<div class="jmrs-form-item-con">
<div class="content-left ant-form-item-label">
<label :for="`FirstInfo_${v}`" v-if="k.text">
{{ `${k.text}` }}
<span v-if="k.description" class="label-info">{{ k.description }}</span>
</label>
</div>
<div class="content-right">
<!-- text -->
<a-input :disabled="writeAble" v-if="k.type === 'text'" type="text" v-decorator="[v]"
readOnly />
<!-- input -->
<a-input :disabled="writeAble" v-if="k.type === 'input'" :type="k.inputType"
v-decorator="[v]" @blur="handleChange($event.target.value, v)" placeholder="请输入" />
<!-- datetime -->
<a-input :disabled="writeAble" v-if="k.type === 'datetime'" readOnly
@click="selectOption(v)" v-decorator="[v]" placeholder="请选择" />
<a-select :disabled="writeAble" v-if="k.type === 'select'" v-decorator="[v]"
@change="handleChange($event, v)" placeholder="请选择" style="display: block;">
<a-select-option v-for="(item, val) in k.range" :key="val">
{{ val }}
</a-select-option>
</a-select>
<!-- radio -->
<a-radio-group :disabled="writeAble" v-if="k.type === 'radio'" v-decorator="[v]"
@change="
handleChange($event.target.value, v)
">
<a-radio v-for="(item, index) in k.range" :key="item" :value="item">
{{ item }}
</a-radio>
</a-radio-group>
<!-- pageText -->
<a-input :disabled="writeAble" v-if="k.type === 'pageText'"
@blur="handleChange($event.target.value, v)" v-decorator="[v]" placeholder="请输入" />
</div>
</div>
</a-form-item>
</a-form>
</div>
<v-head text="主要治疗操作"></v-head>
<div class="basicr-back">
<a-form class="detail-form" :form="firstForm">
<a-form-item class="jmrs-form-item" v-for="(k, v) in JMRS_CODE" :key="v"
v-if="computeShow(v, codeForm)">
<!-- operate === collapse -->
<a-collapse class="jmrs-form-item-con" v-if="k.operate === 'collapse'" :bordered="false"
expandIconPosition="right">
<a-collapse-panel key="1" :header="k.operateData.text">
<div class="collapse-content" v-for="item in k.operateData.code" :key="item">
<div class="content-left ant-form-item-label">
<label :for="`FirstInfo_${JMRS_CODE[item]}`" v-if="JMRS_CODE[item].text">
{{ `${JMRS_CODE[item].text}` }}
<span v-if="
JMRS_CODE[item].description
" class="label-info">{{
JMRS_CODE[item].description
}}</span>
</label>
</div>
<div class="content-right">
<!-- input -->
<a-input :disabled="writeAble" v-if="
JMRS_CODE[item].type === 'input'
" :type="item.inputType" v-decorator="[item]" @blur="
handleChange(
$event.target.value,
v
)
" placeholder="请输入" />
<!-- pageText -->
<a-input :disabled="writeAble" v-if="
JMRS_CODE[item].type ===
'pageText'
" @blur="
handleChange(
$event.target.value,
item
)
" :type="item.inputType" v-decorator="[item]" placeholder="请输入" />
</div>
</div>
</a-collapse-panel>
</a-collapse>
<!-- operate === jump -->
<div v-else-if="k.operate === 'jump'" class="jmrs-form-item-con">
<div class="content-left ant-form-item-label" v-if="k.text">
<label :for="`FirstInfo_${v}`">
{{ `${k.text}` }}
<span v-if="k.description" class="label-info">{{ k.description }}</span>
</label>
</div>
<div class="content-right" @click="toMore(k.path.name)">
<div class="operate fz24">
{{ k.rightText }}
</div>
</div>
</div>
<div class="jmrs-form-item-con" v-else :class="k.type">
<div class="content-left ant-form-item-label">
<label :for="`FirstInfo_${v}`" v-if="k.text">
{{ `${k.text}` }}
<span v-if="k.description" class="label-info">{{ k.description }}</span>
</label>
</div>
<div class="content-right">
<!-- text -->
<a-input :disabled="writeAble" v-if="k.type === 'text'" type="text" v-decorator="[v]"
readOnly />
<!-- modal -->
<a-input :disabled="writeAble" v-if="k.type === 'modal'" :placeholder="k.rightText"
@click="toInform" type="text" v-decorator="[v]" readOnly />
<!-- radio -->
<a-radio-group :disabled="writeAble" v-if="k.type === 'radio'" v-decorator="[
v,
{ initialValue: k.default },
]" @change="
handleChange($event.target.value, v)
">
<a-radio v-for="(item, index) in k.range" :key="item" :value="item">
{{ item }}
</a-radio>
</a-radio-group>
<!-- checkbox -->
<a-checkbox-group :disabled="writeAble" v-if="k.type === 'checkbox'" :options="k.range"
v-decorator="[
v,
{ initialValue: k.default },
]" @change="
handleChange($event, v, null, k.type)
" />
<!-- input -->
<a-input :disabled="writeAble" v-if="k.type === 'input'" :type="k.inputType"
v-decorator="[v]" @blur="handleChange($event.target.value, v)" placeholder="请输入" />
<!-- datetime -->
<a-input :disabled="writeAble" v-if="k.type === 'datetime'" readOnly
@click="selectOption(v)" v-decorator="[
v,
{ initialValue: k.default },
]" placeholder="请选择" />
<a-select :disabled="writeAble" v-if="k.type === 'select'" v-decorator="[
v,
{ initialValue: k.default },
]" @change="handleChange($event, v)" placeholder="请选择" style="display: block;">
<a-select-option v-for="(item, v) in k.range" :key="item">
{{ item }}
</a-select-option>
</a-select>
<!-- pageText -->
<a-input :disabled="writeAble" v-if="k.type === 'pageText'"
@blur="handleChange($event.target.value, v)" v-decorator="[
v,
{ initialValue: k.default },
]" placeholder="请输入" />
</div>
</div>
</a-form-item>
<!-- 不良反应 -->
<div class="adverse">
<a-collapse class="jmrs-form-item-con" :bordered="false" expandIconPosition="right">
<a-collapse-panel key="1" header="不良反应">
<Adverse source="first" ref="adverse" />
</a-collapse-panel>
</a-collapse>
</div>
</a-form>
</div>
<v-head text="血管内治疗"></v-head>
<div class="basicr-back">
<a-form class="detail-form" :form="firstForm">
<a-form-item class="jmrs-form-item" v-for="(k, v) in XGZL_CODE" :key="v"
v-if="computeShow(v, codeForm)">
<div class="jmrs-form-item-con" :class="k.type">
<div class="content-left ant-form-item-label">
<label :for="`FirstInfo_${v}`" v-if="k.text">
{{ `${k.text}` }}
<span v-if="k.description" class="label-info">{{ k.description }}</span>
</label>
</div>
<div class="content-right">
<!-- text -->
<a-input :disabled="writeAble" v-if="k.type === 'text'" type="text" v-decorator="[v]"
readOnly />
<!-- radio -->
<a-radio-group :disabled="writeAble" v-if="k.type === 'radio'" v-decorator="[v]"
@change="
handleChange($event.target.value, v)
">
<a-radio v-for="(item, index) in k.range" :key="item" :value="item">
{{ item }}
</a-radio>
</a-radio-group>
<!-- input -->
<a-input :disabled="writeAble" v-if="k.type === 'input'" :type="k.inputType"
v-decorator="[v]" @blur="handleChange($event.target.value, v)" placeholder="请输入" />
<!-- checkbox -->
<a-checkbox-group :disabled="writeAble" v-if="k.type === 'checkbox'" :options="k.range"
v-decorator="[v]" @change="
handleChange($event, v, null, k.type)
" />
<!-- datetime -->
<a-input :disabled="writeAble" v-if="k.type === 'datetime'" readOnly
@click="selectOption(v)" v-decorator="[v]" placeholder="请选择" />
<a-select :disabled="writeAble" v-if="k.type === 'select'" v-decorator="[v]"
@change="handleChange($event, v)" placeholder="请选择">
<a-select-option v-for="(item, v) in k.range" :key="item">
{{ v }}
</a-select-option>
</a-select>
<!-- pageText -->
<a-input :disabled="writeAble" v-if="k.type === 'pageText'"
@blur="handleChange($event.target.value, v)" v-decorator="[v]" placeholder="请输入" />
</div>
</div>
</a-form-item>
</a-form>
</div>
<div class="common-picker">
<van-datetime-picker v-if="pickerVisable" v-model="currentDate" :formatter="formatter"
@cancel="pickerVisable = false" @confirm="onConfirm" />
</div>
<a-modal class="first" :width="900" wrapClassName="first-modal" :destroyOnClose="true"
v-model="modalVisable" @ok="modalVisable = false" :footer="null">
<!-- <Informed ref="informed" source="first" @on-success="successInformed" /> -->
</a-modal>
</div>
<div class="first-footer">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">{{patientId? '保存' : '下一步'}}</a-button>
<!-- <a-button :disabled="writeAble" type="link" size="large" @click="onSubmit">
保存<a-icon type="check" />
</a-button> -->
</div>
</div>
</template>
<script>
import Adverse from '@/views/ing/Adverse.vue';
import Informed from '@/views/before/Informed.vue';
import head from '@/views/Patient/components/title.vue';
// import headTitle from '@/Patient/components/title'
import {
idcardInfo,
queryAidRecord
} from 'api';
import {
mapMutations,
mapState
} from 'vuex';
import {
AID_CODE,
JMRS_CODE,
XGZL_CODE
} from '@/config/code.js';
export default {
name: 'FirstInfo',
data() {
return {
//
modalVisable: false,
AID_CODE,
JMRS_CODE,
XGZL_CODE,
//
currentDate: new Date(),
//
pickerVisable: false,
radioStyle: {
display: 'block',
height: '30px',
lineHeight: '30px',
},
firstForm: this.$form.createForm(this, {
name: 'FirstInfo',
}),
//使code
codeForm: {
'RYPG-HEIGHT': '',
'RYPG-WEIGHT': '',
'RYPG-SYSTOLIC-PRESSURE': '',
'RYPG-DIASTOLIC-PRESSURE': '',
'RYPG-PULSE': '',
'RYPG-MRS': '',
'RYPG-NIHSS': '',
'RYPG-BLOOD-TIME': '',
'RYPG-BLOOD-SUGAR': '',
'RYPG-ECG-TIME': '',
'RYPG-CT-DD-TIME': '',
'RYPG-CT-OUTSIZE': '',
'JMRS-Y': '',
'JMRS-WRSYY': '',
'JMRS-WRSYY-ELSE': '',
'JMRS-TH-TIME': '',
'JMRS-SIGN': '',
'JMRS-Q-NIHSS': '',
'JMRS-Q-SYSTOLIC-PRESSURE': '',
'JMRS-Q-DIASTOLIC-PRESSURE': '',
'JMRS-RSCS': '',
'JMRS-TIME': '',
'JMRS-RSYW': '',
'JMRS-RSYW-ZL': '',
'JMRS-TZJL': '',
'JMRS-JDJL': '',
'JMRS-15-NIHSS': '',
'JMRS-15-SYSTOLIC-PRESSURE': '',
'JMRS-15-DIASTOLIC-PRESSURE': '',
'JMRS-30-NIHSS': '',
'JMRS-30-SYSTOLIC-PRESSURE': '',
'JMRS-30-DIASTOLIC-PRESSURE': '',
'JMRS-45-NIHSS': '',
'JMRS-45-SYSTOLIC-PRESSURE': '',
'JMRS-45-DIASTOLIC-PRESSURE': '',
'JMRS-60-NIHSS': '',
'JMRS-60-SYSTOLIC-PRESSURE': '',
'JMRS-60-DIASTOLIC-PRESSURE': '',
'JMRS-BFZ': '',
'XGZL-Y': '',
'XGZL-WZLYY': '',
'XGZL-WZLYY-ELSE': '',
'XGZL-ZQTH-TIME': '',
'XGZL-ZQTH-QZ': '',
'XGZL-SQ-NIHSS': '',
'XGZL-SQ-ASPECT-CT': '',
'XGZL-SQ-ASPECT-MRI': '',
'XGZL-SQ-TICI': '',
'XGZL-CCWC-TIME': '',
'XGZL-XGKT': '',
'XGZL-SH-SCXGZTSJ': '',
'XGZL-BFZ': '',
'XGZL-BFZ-ELSE': '',
},
selectCode: '', // code
};
},
props: ['patientId'],
components: {
'v-head': head,
Adverse,
Informed,
},
computed: {
...mapState('patient', ['patientData', 'writeAble']),
...mapState('storm', ['nationList']),
},
// mounted() {
// this.$nextTick(() => {
// if (this.patientData) {
// this.echo(this.patientData);
// }
// });
// },
async mounted() {
console.log('patientId', this.patientId)
if (this.patientId) {
const res = await queryAidRecord(this.patientId)
this.$nextTick(() => {
this.echo(res.data)
})
} else {
this.$nextTick(() => {
if (this.patientData) {
this.echo(this.patientData)
}
})
}
},
methods: {
successInformed() {
this.modalVisable = false;
},
//
toInform() {
this.modalVisable = true;
this.$nextTick(() => {
this.$refs.informed.open();
});
},
echo(data) {
const {
recordValDict,
patientGender
} = data;
this.firstForm.getFieldDecorator(['RYPG-GENDER'], {
preserve: true, //便使
});
this.firstForm.setFieldsValue({
['RYPG-GENDER']: patientGender === 1 ? '女' : '男',
});
for (let k in recordValDict) {
if (recordValDict[k]) {
let answer = recordValDict[k][0].answer;
this.firstForm.getFieldDecorator([`${k}`], {
preserve: true, //便使
});
if (k === 'RYPG-WEIGHT' || k === 'RYPG-HEIGHT') {
let weight =
recordValDict['RYPG-WEIGHT'] &&
recordValDict['RYPG-WEIGHT'][0].answer.toString();
let height =
recordValDict['RYPG-HEIGHT'] &&
recordValDict['RYPG-HEIGHT'][0].answer.toString();
this.firstForm.setFieldsValue({
'RYPG-BMI': this.utils.computeBMI(weight, height),
});
}
if (Object.keys(this.codeForm).includes(k)) {
this.codeForm[k] = answer.toString() || '';
//
if (
k !== 'JMRS-WRSYY' &&
k !== 'JMRS-BFZ' &&
k !== 'XGZL-WZLYY' &&
k !== 'XGZL-BFZ' &&
k !== 'XGZL-XGKT'
) {
answer = answer.toString() || '';
}
this.firstForm.setFieldsValue({
[`${k}`]: answer,
});
}
}
}
},
toMore(name) {
if (!name) return;
this.$router.push({
name,
});
},
computeShow(code, codeForm) {
return this.utils.computeShow(code, codeForm);
},
selectOption(v) {
this.selectCode = v;
this.pickerVisable = true;
},
//
onConfirm(date) {
this.firstForm.setFieldsValue({
[`${this.selectCode}`]: this.utils.format(date),
});
this.pickerVisable = false;
// this.updateAidBase(this.selectCode, this.utils.format(date))
},
//
formatter(type, val) {
if (type === 'year') {
return val + '年';
}
if (type === 'month') {
return val + '月';
}
if (type === 'day') {
return val + '日';
}
if (type === 'hour') {
return val + '时';
}
if (type === 'minute') {
return val + '分';
}
return val;
},
handleChange(value, code, type, show) {
this.codeForm[code] = value;
if (show === 'checkbox') {
this.utils.computeShow(code, this.codeForm);
}
if (code === 'RYPG-WEIGHT' || code === 'RYPG-HEIGHT') {
this.codeForm['RYPG-BMI'] = this.utils.computeBMI(
this.codeForm['RYPG-WEIGHT'],
this.codeForm['RYPG-HEIGHT']
);
this.firstForm.setFieldsValue({
['RYPG-BMI']: this.codeForm['RYPG-BMI'],
});
}
// this.updateAidBase(code, value, type)
},
async onSubmit(e) {
e.preventDefault();
let codeAndAnswerList = [],
params = {};
this.$nextTick(async () => {
let adverseSubmit = this.$refs.adverse;
if (adverseSubmit) {
let res = await adverseSubmit.onAdverseSubmit(e, 'first');
if (res.length > 0) {
codeAndAnswerList = codeAndAnswerList.concat(res);
}
}
this.firstForm.validateFields(async (err, values) => {
for (var k in values) {
if (Object.keys(this.codeForm).includes(k)) {
let answer = [values[k]];
if (typeof values[k] !== 'string') {
answer = values[k];
}
if (values[k]) {
codeAndAnswerList.push({
questionCode: k,
answer,
time: '',
});
}
} else if (
values[k] &&
k !== 'RYPG-BMI' &&
k !== 'RYPG-GENDER'
) {
params[`${k}`] = values[k];
}
}
await this.home.updateAidCode({
...params,
codeAndAnswerList,
},
false
);
this.$message.success("操作成功")
this.$emit('next')
});
});
},
//
async updateAidBase(code, value, type) {
let params;
let codeAndAnswerList = [];
if (type) {
params = {
[`${code}`]: value,
};
} else {
let answer = [value];
if (typeof value !== 'string') {
answer = value;
}
codeAndAnswerList.push({
questionCode: code,
answer,
time: '',
});
}
await this.home.updateAidCode({
...params,
codeAndAnswerList,
},
false
);
},
},
};
</script>
<style scoped lang="less">
p {
margin: 0;
}
.Overviewbasicr {
display: flex;
margin-bottom: 0;
.first-content {
flex: 1;
overflow-y: auto;
}
.first-footer {
display: flex;
align-items: center;
justify-content: center;
margin-top: 20px;
padding: 0 10%;
}
.jmrs-form-item-con{
display: flex;
.content-left,
.content-right{
flex: 1;
}
}
}
.first {
/deep/ .ant-modal {
max-height: 500px;
overflow-y: auto;
}
}
.adverse {
padding: 15px 0;
}
</style>
<style scoped>
>>>.adverse .ant-form-item {
display: flex;
justify-content: space-between;
}
>>>.adverse .ant-form-item-label {
width: 25%;
}
>>>.adverse .ant-form-item-control-wrapper {
flex: 1;
display: flex;
justify-content: flex-end;
}
>>>.adverse .ant-form-item-label label {
font-size: 22px !important;
}
>>>.adverse .ant-input {
width: 100% !important;
background: none;
}
>>>.adverse .ant-form-item-control {
margin-left: 0;
}
>>>.ant-btn-link {
color: #7690e5;
font-size: 24px;
font-weight: bold;
}
>>>.ant-radio-wrapper {
text-align: left;
font-size: 24px;
height: 58px !important;
line-height: 58px !important;
box-sizing: border-box;
border-bottom: 1px solid #f0f0f0 !important;
}
>>>.ant-collapse {
border: none;
background: none;
}
>>>.ant-collapse-header {
font-size: 24px;
padding: 10px 0 !important;
font-weight: bold;
text-align: left;
}
>>>.ant-collapse-item {
flex: 1;
border-bottom: 0px;
}
>>>.ant-collapse-content-box {
padding: 0 10px;
}
>>>.detail-form .jmrs-form-item .ant-form-item-control-wrapper {
flex: 1;
display: flex;
justify-content: space-between;
}
>>>.detail-form .jmrs-form-item .ant-form-item-control {
flex: 1;
margin-left: 0;
}
>>>.ant-radio-wrapper:last-child {
border-bottom: none !important;
}
>>>.ant-radio {
font-size: 24px;
}
>>>.ant-radio-inner::after {
width: 16px;
height: 16px;
}
>>>.ant-radio-inner {
width: 24px;
height: 24px;
}
.back-ff {
box-shadow: 0 2px 12px 0 rgba(52, 52, 52, 0.1);
background: #fff;
padding: 10px 20px;
border-radius: 12px;
}
</style>

169
src/views/thrombolysis/components/throm-result.vue

@ -0,0 +1,169 @@
<template>
<div class="throm-result">
<div class="throm-step">
<a-steps progress-dot :current="currentIndex" direction="vertical" @change="handleClickStep">
<a-step :status="currentIndex == 0 ? 'process' : currentIndex > 0 ? 'finish' : 'wait'" title="患者基本信息" />
<a-step :status="currentIndex == 1 ? 'process' : currentIndex > 1 ? 'finish' : 'wait'" title="急救信息记录" />
</a-steps>
</div>
<div class="throm-content">
<div v-if="currentIndex == 0">
<throm-result-baseInfo @next="handleNext"></throm-result-baseInfo>
</div>
<div v-else-if="currentIndex == 1">
<throm-result-firstInfo @next="handleNextStep"></throm-result-firstInfo>
</div>
</div>
</div>
</template>
<script>
import ThromResultBaseInfo from './throm-result-baseInfo.vue';
import ThromResultFirstInfo from './throm-result-firstInfo.vue';
export default {
name: "ThromResult",
components: {
ThromResultBaseInfo,
ThromResultFirstInfo
},
data() {
return {
currentIndex: 0,
labelCol: {
span: 4
},
wrapperCol: {
span: 18
},
form: {}
}
},
created() {
},
methods: {
handleClickStep(current) {
this.currentIndex = current;
},
handleNext() {
this.currentIndex++
},
handleNextStep() {
this.$emit('next')
}
}
}
</script>
<style lang="less" scoped>
.throm-result {
display: flex;
.throm-step {
padding: 10px;
margin-right: .2rem;
background-color: #fff;
.ant-steps-vertical .ant-steps-item-content {
min-height: 6rem;
}
.ant-steps-item-title {
padding: 0;
}
.ant-steps-item-finish {
.ant-steps-item-title {
color: #000000;
}
}
.ant-steps-item-process {
.ant-steps-item-title {
color: #007AFF;
// border-bottom: 1px solid #007AFF;
border-bottom: 3px solid transparent;
/* 设置透明的底部边框 */
border-image: linear-gradient(to right, #fff, #007AFF) 1;
/* 使用渐变色填充边框 */
border-radius: 10px;
/* 设置圆角 */
}
}
}
.throm-content {
height: calc(100vh - 120px);
overflow-y: auto;
padding: 10px;
box-sizing: border-box;
flex: 1;
background-color: #fff;
.ant-form .ant-form-item-label label {
font-size: 0.85rem;
font-weight: bold;
}
.ant-form-item {
background: #f9f9f9;
margin-bottom: .5rem;
padding: 12px;
border-radius: 4px;
}
.ant-radio-button-wrapper {
padding: 0 1.64vw;
height: 3.64vw;
line-height: 3.64vw;
font-size: 0.75rem !important;
margin-right: 1.82vw;
margin-bottom: 0.91vw;
border: 0.5px solid #a3acbf;
border-radius: 0.55vw;
vertical-align: middle;
&:before,
.ant-radio-button-wrapper-checked:before {
display: none !important;
}
&:first-child,
&:last-child {
border-radius: 6px !important;
}
&:last-child {
margin-right: 0;
}
}
.solid {
.ant-checkbox-wrapper {
background: #f9f9f9;
border: 0.5px solid #a3acbf;
border-radius: 6px;
vertical-align: middle;
margin-right: 20px;
margin-bottom: 10px;
font-size: 0.75vw !important;
line-height: 40px;
padding: 0 6px;
height: 40px;
min-width: 0 !important;
&.ant-checkbox-wrapper-checked {
background: #007AFF;
color: #fff;
}
.ant-checkbox {
display: none;
}
}
}
}
}
</style>

66
src/views/thrombolysis/index.vue

@ -1,20 +1,58 @@
<template>
<div class="thrombolysis-container">
<div class="thrombolysis-box">
<a-steps v-model="current" type="navigation" size="small" :style="stepStyle">
<a-step status="finish" title="创建患者" disabled />
<a-step :status="current == 1 ? 'process' : current > 1 ? 'finish' : 'wait'" title="溶栓前">
<!-- <div slot="icon" style="font-size: 1.7rem;">1.</div> -->
</a-step>
<a-step :status="current == 2 ? 'process' : current > 2 ? 'finish' : 'wait'" title="溶栓中" />
<a-step :status="current == 3 ? 'process' : current > 3 ? 'finish' : 'wait'" title="介入" />
<a-step :status="current == 4 ? 'process' : current > 4 ? 'finish' : 'wait'" title="报告" />
<template v-if="isrs && !isjr">
<a-step :status="current == 2 ? 'process' : current > 2 ? 'finish' : 'wait'" title="溶栓中" />
<a-step :status="current == 3 ? 'process' : current > 3 ? 'finish' : 'wait'" title="查看结果" />
<a-step :status="current == 4 ? 'process' : current > 4 ? 'finish' : 'wait'" title="报告" />
</template>
<template v-else-if="!isrs && isjr">
<a-step :status="current == 2 ? 'process' : current > 2 ? 'finish' : 'wait'" title="介入" />
<a-step :status="current == 3 ? 'process' : current > 3 ? 'finish' : 'wait'" title="查看结果" />
<a-step :status="current == 4 ? 'process' : current > 4 ? 'finish' : 'wait'" title="报告" />
</template>
<template v-else-if="!isrs && !isjr">
<a-step :status="current == 2 ? 'process' : current > 2 ? 'finish' : 'wait'" title="查看结果" />
<a-step :status="current == 3 ? 'process' : current > 3 ? 'finish' : 'wait'" title="报告" />
</template>
<template v-else>
<a-step :status="current == 2 ? 'process' : current > 2 ? 'finish' : 'wait'" title="溶栓中" />
<a-step :status="current == 3 ? 'process' : current > 3 ? 'finish' : 'wait'" title="介入" />
<a-step :status="current == 4 ? 'process' : current > 4 ? 'finish' : 'wait'" title="查看结果" />
<a-step :status="current == 5 ? 'process' : current > 5 ? 'finish' : 'wait'" title="报告" />
</template>
</a-steps>
<throm-before v-if="current == 1" @next="handleNext"></throm-before>
<throm-ing v-else-if="current == 2" @next="handleNext"></throm-ing>
<throm-interfere v-else-if="current == 3" @next="handleNext"></throm-interfere>
<throm-report v-else-if="current == 4" @next="handleNext"></throm-report>
<template v-if="isrs && !isjr">
<throm-ing v-if="current == 2" @next="handleNext"></throm-ing>
<throm-result v-if="current == 3" @next="handleNext"></throm-result>
<throm-report v-else-if="current == 4" @next="handleNext"></throm-report>
</template>
<template v-else-if="!isrs && isjr">
<throm-interfere v-if="current == 2" @next="handleNext"></throm-interfere>
<throm-result v-if="current == 3" @next="handleNext"></throm-result>
<throm-report v-else-if="current == 4" @next="handleNext"></throm-report>
</template>
<template v-else-if="!isrs && !isjr">
<throm-result v-if="current == 2" @next="handleNext"></throm-result>
<throm-report v-else-if="current == 3" @next="handleNext"></throm-report>
</template>
<template v-else>
<throm-ing v-if="current == 2" @next="handleNext"></throm-ing>
<throm-interfere v-else-if="current == 3" @next="handleNext"></throm-interfere>
<throm-result v-else-if="current == 4" @next="handleNext"></throm-result>
<throm-report v-else-if="current == 5" @next="handleNext"></throm-report>
</template>
</div>
</div>
</template>
@ -28,16 +66,26 @@
import ThromIng from './components/throm-ing.vue';
import ThromInterfere from './components/throm-interfere.vue';
import ThromReport from './components/throm-report.vue';
import ThromResult from './components/throm-result.vue';
export default {
name: "",
components: {
ThromBefore,
ThromIng,
ThromInterfere,
ThromReport
ThromReport,
ThromResult
},
computed: {
...mapState('patient', ['patientData']),
isrs() {
console.log('isrs', this.patientData?.recordValDict?.['JBXX-ISRS']?.[0]?.answer[0])
return !(this.patientData?.recordValDict?.['JBXX-ISRS']?.[0]?.answer[0] == '否')
},
isjr() {
console.log('isjr', this.patientData?.recordValDict?.['JBXX-ISJR']?.[0]?.answer[0])
return !(this.patientData?.recordValDict?.['JBXX-ISJR']?.[0]?.answer[0] == '否')
}
},
data() {
return {
@ -60,7 +108,7 @@
.thrombolysis-container {
// padding: 10px;
}
</style>
<style lang="less">

Loading…
Cancel
Save