Browse Source

init

master
nicky 1 year ago
parent
commit
3aa3d55ead
  1. 24927
      package-lock.json
  2. 5
      package.json
  3. 6
      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. 50
      src/config/axios.js
  23. 648
      src/config/code.js
  24. 4
      src/layouts/BasicLayout.less
  25. 35
      src/layouts/BasicLayout.vue
  26. 25
      src/main.js
  27. 14
      src/store/index.js
  28. 17
      src/store/modules/storm/actions.js
  29. 315
      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. 53
      src/views/document/index.vue
  35. 67
      src/views/login/index.vue
  36. 195
      src/views/statistics/index.vue
  37. 94
      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. 7
      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. 47
      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. 41
      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. 542
      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. 56
      src/views/thrombolysis/index.vue

24927
package-lock.json

File diff suppressed because it is too large

5
package.json

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

6
src/App.vue

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

25
src/api/index.js

@ -25,6 +25,17 @@ export const queryTriageList = (params) =>
export const create = (params) => export const create = (params) =>
axios.post(`${proxyUrl1}/firstAid/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) => export const queryAidRecord = (firstAidId, codeList) =>
axios.post(`${proxyUrl1}/firstAid/queryAidRecord`, { axios.post(`${proxyUrl1}/firstAid/queryAidRecord`, {
@ -301,6 +312,12 @@ export const operationLog = (params) =>
axios.post(`${proxyUrl1}/interfere/operationLog`, { axios.post(`${proxyUrl1}/interfere/operationLog`, {
...params ...params
}); });
// 介入手术记录/总报告/DNT时间表
export const operationLogEx = (params) =>
axios.post(`${proxyUrl1}//export/operationLog`, {
...params
});
// 创建急救 // 创建急救
export const createFirstAid = (params) => export const createFirstAid = (params) =>
axios.post(`${proxyUrl1}/firstAid/createFirstAid`, { axios.post(`${proxyUrl1}/firstAid/createFirstAid`, {
@ -310,7 +327,7 @@ export const createPatient = (params) =>
axios.post(`${proxyUrl1}/firstAid/createPatient`, { axios.post(`${proxyUrl1}/firstAid/createPatient`, {
...params ...params
}); });
export const eduitPatient = (params) => // export const eduitPatient = (params) =>
axios.post(`${proxyUrl1}/firstAid/eduitPatient`, { // axios.post(`${proxyUrl1}/firstAid/eduitPatient`, {
...params // ...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"
}

50
src/config/axios.js

@ -4,8 +4,12 @@ import Vue from 'vue';
import axios from 'axios'; import axios from 'axios';
import router from '../router/index'; import router from '../router/index';
import store from '../store/index'; import store from '../store/index';
import { message } from 'ant-design-vue'; import {
let { proxyUrl } = require('@/config/setting'); message
} from 'ant-design-vue';
let {
proxyUrl
} = require('@/config/setting');
let config = { let config = {
timeout: 10000, // Timeout timeout: 10000, // Timeout
}; };
@ -38,26 +42,32 @@ axios.interceptors.request.use(
axios.interceptors.response.use( axios.interceptors.response.use(
async (res) => { async (res) => {
store.commit('storm/setSpinning', false); store.commit('storm/setSpinning', false);
const { code, msg, data } = res.data; const {
code,
msg,
data
} = res.data;
if (code === 200) { if (code === 200) {
return res.data; return res.data;
} else if (code === 401) { } else if (code === 401) {
localStorage.setItem('anyringToken', null); router.replace('/login')
let [err, data] = await store.dispatch('storm/toLogin', { return Promise.resolve(res.data);
padNo: store.state.storm.padNo, // localStorage.setItem('anyringToken', null);
}); // let [err, data] = await store.dispatch('storm/toLogin', {
let token = data.access_token; // padNo: store.state.storm.padNo,
const config = res.config; // });
let reTry = config.reTry + 1; // let token = data.access_token;
let cfg = Object.assign({}, config); // const config = res.config;
cfg.reTry = reTry; // let reTry = config.reTry + 1;
cfg.headers['Authorization'] = `Bearer ${token}`; // let cfg = Object.assign({}, config);
// console.log('token222: ', token); // cfg.reTry = reTry;
let resNew; // cfg.headers['Authorization'] = `Bearer ${token}`;
if (reTry < 3 && token) { // // console.log('token222: ', token);
resNew = await axios(cfg); // let resNew;
} // if (reTry < 3 && token) {
return Promise.resolve(resNew || res.data); // resNew = await axios(cfg);
// }
// return Promise.resolve(resNew || res.data);
} else { } else {
message.error(msg || '请求发生错误'); message.error(msg || '请求发生错误');
return Promise.resolve(res.data); return Promise.resolve(res.data);
@ -117,7 +127,7 @@ axios.interceptors.response.use(
} }
); );
Plugin.install = function (Vue) { Plugin.install = function(Vue) {
Vue.axios = _axios; Vue.axios = _axios;
window.axios = _axios; window.axios = _axios;
Object.defineProperties(Vue.prototype, { Object.defineProperties(Vue.prototype, {

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

4
src/layouts/BasicLayout.less

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

35
src/layouts/BasicLayout.vue

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

25
src/main.js

@ -40,7 +40,16 @@ Vue.prototype.home = home;
Vue.prototype.utils = util; Vue.prototype.utils = util;
router.beforeEach(async (to, from, next) => { 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/setShowBack', back);
store.commit('storm/setShowMore', more); store.commit('storm/setShowMore', more);
//患者列表清楚定时器 //患者列表清楚定时器
@ -48,7 +57,9 @@ router.beforeEach(async (to, from, next) => {
util.AnimationFrame.done('timerTask'); util.AnimationFrame.done('timerTask');
util.AnimationFrame.done('countTask'); util.AnimationFrame.done('countTask');
} }
const { deviceNo } = to.query; const {
deviceNo
} = to.query;
if (deviceNo) { if (deviceNo) {
if (deviceNo !== localStorage.getItem('APP_DEVICE_NO')) { if (deviceNo !== localStorage.getItem('APP_DEVICE_NO')) {
localStorage.setItem('anyringToken', null); localStorage.setItem('anyringToken', null);
@ -61,8 +72,14 @@ router.beforeEach(async (to, from, next) => {
next(); next();
} }
}); });
document.addEventListener('UniAppJSBridgeReady', function () { router.afterEach(async (to, from) => {
uni.getEnv(function (res) { 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)); console.log('当前环境:' + JSON.stringify(res));
}); });
new Vue({ new Vue({

14
src/store/index.js

@ -2,6 +2,18 @@ import Vue from 'vue';
import Vuex from 'vuex'; import Vuex from 'vuex';
import storm from './modules/storm/index'; import storm from './modules/storm/index';
import patient from './modules/patient/index'; import patient from './modules/patient/index';
import createPersistedState from "vuex-persistedstate"
Vue.use(Vuex); 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({ toLogin({
commit, commit,
state state
}, { }, loginForm) {
no
}) {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
console.log('state', state.APP_DEVICE_NO)
console.log('no', no)
let padNo = state.APP_DEVICE_NO; let padNo = state.APP_DEVICE_NO;
// if (!padNo) return; const res = await Loginnew(loginForm);
const res = await Loginnew({
...no,
// param: {
// // padNo: '3333',
// ...no
// },
});
const { const {
code, code,
data, data,
@ -34,7 +23,7 @@ const actions = {
message.error(msg); message.error(msg);
} }
} catch (error) { } catch (error) {
throw new Error(error); // throw new Error(error);
} }
}) })
.then((res) => [null, res]) .then((res) => [null, res])

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

@ -1,56 +1,28 @@
<!--
* @desc: 创建患者
* @Author: gaowenya
* @Date: 2023-06-20 14:27
* @LastEditors:
* @LastEditTime:
-->
<template> <template>
<a-modal <a-modal class="patient-form" :width="600" :maskClosable="false" :confirmLoading="confirmLoading" :closable="false"
class="patient-form" :destroyOnClose="true" v-model="createVisible" :title="title" @ok="handleSubmit" :footer="null">
:width="600" <a-form-model ref="form" :model="form" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }" labelAlign="left"
:maskClosable="false" class="create-form" :rules="rules">
: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-row :gutter="20"> <a-row :gutter="20">
<a-col :span="12"> <a-col :span="12">
<a-form-model-item label="姓名"> <a-form-model-item label="姓名">
<a-input v-model="form.patientName" placeholder="请输入姓名" /> <a-input v-model="form.name" placeholder="请输入姓名" />
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
<a-form-model-item label="民族"> <a-form-model-item label="民族">
<a-select v-model="form.patientNation" placeholder="请选择民族"> <a-select v-model="form.nation" placeholder="请选择民族">
<a-select-option <a-select-option v-for="item in nationList" :key="item" :value="item">
v-for="item in nationList"
:key="item"
:value="item"
>
{{ item }} {{ item }}
</a-select-option> </a-select-option>
</a-select> </a-select>
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
<a-form-model-item label="性别" > <a-form-model-item label="性别">
<a-select v-model="form.patientGender" placeholder="请选择性别"> <a-select v-model="form.gender" placeholder="请选择性别">
<a-select-option :value="0" ></a-select-option> <a-select-option :value="0"></a-select-option>
<a-select-option :value="1" ></a-select-option> <a-select-option :value="1"></a-select-option>
</a-select> </a-select>
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
@ -65,13 +37,10 @@
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
<a-col :span="16"> <a-col :span="16">
<a-form-model-item label="身份证号" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" placeholder="请输入身份证号"> <a-form-model-item label="身份证号" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }"
<keyboard placeholder="请输入身份证号">
placeHolder="请输入手机号" <keyboard placeHolder="请输入身份证号" :index-num="indexNum" @keyboard-input="handleKeyBoard"
:index-num="indexNum" :old-value="idcard" />
@keyboard-input="handleKeyBoard"
:old-value="patientIdCardNo"
/>
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
@ -79,7 +48,8 @@
<a-button type="primary" class="idcard" @click="openCamera">扫描身份证</a-button> <a-button type="primary" class="idcard" @click="openCamera">扫描身份证</a-button>
</a-col> </a-col>
<a-col :span="16"> <a-col :span="16">
<a-form-model-item label="联系方式" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" placeholder="请输入联系方式"> <a-form-model-item label="联系方式" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }"
placeholder="请输入联系方式">
<a-input v-model="form.contract" placeholder="请输入联系方式" /> <a-input v-model="form.contract" placeholder="请输入联系方式" />
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
@ -89,24 +59,20 @@
<a-col :span="12"> <a-col :span="12">
<a-form-model-item label="急救类型" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"> <a-form-model-item label="急救类型" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
<a-select v-model="form.type" placeholder="请选择类型"> <a-select v-model="form.type" placeholder="请选择类型">
<a-select-option :value="0" >卒中急救</a-select-option> <a-select-option :value="0">卒中急救</a-select-option>
<a-select-option :value="1" >胸痛</a-select-option> <a-select-option :value="1">胸痛</a-select-option>
<a-select-option :value="2" >创伤</a-select-option> <a-select-option :value="2">创伤</a-select-option>
</a-select> </a-select>
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
<a-form-model-item label="平车" > <a-form-model-item label="平车">
<!-- <a-select v-model="form.carNo" placeholder="请选择平车号"> <!-- <a-select v-model="form.carNo" placeholder="请选择平车号">
<a-select-option :value="0" ></a-select-option> <a-select-option :value="0" ></a-select-option>
<a-select-option :value="1" ></a-select-option> <a-select-option :value="1" ></a-select-option>
</a-select> --> </a-select> -->
<a-select v-model="form.carNo" placeholder="请选择平车号"> <a-select v-model="form.carNo" placeholder="请选择平车号">
<a-select-option <a-select-option v-for="item in carList" :key="item.id" :value="item.deviceNo">
v-for="item in carList"
:key="item.id"
:value="item.deviceNo"
>
{{ item.deviceNo }} {{ item.deviceNo }}
</a-select-option> </a-select-option>
</a-select> </a-select>
@ -117,10 +83,10 @@
<a-switch v-model="form.greenRoadFlag" /> <a-switch v-model="form.greenRoadFlag" />
</a-form-model-item> </a-form-model-item>
</a-col> </a-col>
<a-col :span="24" class="footer-btns" > <a-col :span="24" class="footer-btns">
<a-button class="footer-btn" type="primary" block @click="handleSubmit">新建</a-button> <a-button class="footer-btn" type="primary" block @click="handleSubmit">提交</a-button>
</a-col> </a-col>
<a-col :span="24" class="footer-btns" > <a-col :span="24" class="footer-btns">
<a-button class="footer-btn cencelBtn" block @click="close">取消</a-button> <a-button class="footer-btn cencelBtn" block @click="close">取消</a-button>
</a-col> </a-col>
</a-row> </a-row>
@ -128,19 +94,29 @@
</a-modal> </a-modal>
</template> </template>
<script> <script>
import keyboard from '@/components/keyboard.vue'; import keyboard from '@/components/keyboard.vue';
import { create, uploadIdcard, idcardInfo, idcardInfoBase64 } from 'api'; import {
import { mapState } from 'vuex'; createPatient,
export default { uploadIdcard,
idcardInfo,
idcardInfoBase64,
queryById,
eduitPatient
} from 'api';
import {
mapState
} from 'vuex';
export default {
name: 'create', name: 'create',
components: { components: {
keyboard, keyboard,
}, },
props: ['firstAidData', 'carList', 'carNo'], props: ['firstAidData', 'carList', 'carNo', 'patientId'],
data() { data() {
return { return {
title: "新建患者",
indexNum: 0, // indexNum: 0, //
patientIdCardNo: '', idcard: '',
keyboard: false, keyboard: false,
createVisible: false, createVisible: false,
inputFile: '', inputFile: '',
@ -152,27 +128,41 @@ export default {
}, },
computed: { computed: {
...mapState('storm', ['nationList', 'anyringToken']), ...mapState('storm', ['nationList', 'anyringToken']),
},
create() {
}, },
methods: { methods: {
handleKeyBoard(value) { handleKeyBoard(value) {
//value //value
this.patientIdCardNo = value; this.idcard = value;
}, },
open(data) { open(data) {
console.log('open', data)
this.createVisible = true; this.createVisible = true;
this.confirmLoading = false; this.confirmLoading = false;
this.patientIdCardNo = ''; if (data.firstAidId) {
console.log(this.form) this.title = "编辑患者";
queryById({
firstAidId: data.firstAidId,
}).then(res => {
if (res.code === 200) {
this.form = res.data;
}
})
} else {
this.idcard = '';
this.form = data || {} this.form = data || {}
// #ifdef APP-PLUS }
this.openCamera();
// #endif
}, },
close() { close() {
this.createVisible = false; this.createVisible = false;
this.confirmLoading = false; this.confirmLoading = false;
this.patientIdCardNo = ''; this.form = {}
this.idcard = '';
}, },
openCamera() { openCamera() {
const cmr = plus.camera.getCamera(); const cmr = plus.camera.getCamera();
@ -195,8 +185,7 @@ export default {
}, },
(error) => { (error) => {
// alert("Capture image failed: " + error.message); // alert("Capture image failed: " + error.message);
}, }, {
{
resolution: res, resolution: res,
format: fmt, format: fmt,
filter: 'image', filter: 'image',
@ -206,8 +195,7 @@ export default {
// //
compressImage(url, filename) { compressImage(url, filename) {
var name = '_doc/upload/' + filename; var name = '_doc/upload/' + filename;
plus.zip.compressImage( plus.zip.compressImage({
{
src: url, //src: (String ) src: url, //src: (String )
dst: name, // dst: name, //
quality: 90, //quality: (Number ).1-100 quality: 90, //quality: (Number ).1-100
@ -249,13 +237,22 @@ export default {
}, },
async idcardInfoBase64(url) { async idcardInfoBase64(url) {
let res = await idcardInfoBase64(url); let res = await idcardInfoBase64(url);
const { data, code, msg } = res; const {
data,
code,
msg
} = res;
if (code === 200) { if (code === 200) {
const { name, sex, idCardNo, nation } = data; const {
this.form.patientName = name name,
this.form.patientGender = sex sex,
this.form.patientNation = nation idCardNo,
this.patientIdCardNo = idCardNo; nation
} = data;
this.form.name = name
this.form.gender = sex
this.form.nation = nation
this.idcard = idCardNo;
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
@ -279,20 +276,25 @@ export default {
form.append('file', this.file); form.append('file', this.file);
uploadIdcard(form).then((res) => { uploadIdcard(form).then((res) => {
if (res.code === 200) { if (res.code === 200) {
const { name, sex, idCardNo, nation } = res.data; const {
name,
sex,
idCardNo,
nation
} = res.data;
this.form.setFieldsValue({ this.form.setFieldsValue({
['patientName']: name, ['name']: name,
['patientGender']: sex, ['gender']: sex,
['patientNation']: nation, ['nation']: nation,
}); });
this.patientIdCardNo = idCardNo; this.idcard = idCardNo;
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
}); });
}, },
onDelete() { onDelete() {
this.patientIdCardNo = ''; this.idcard = '';
}, },
handleSubmit(e) { handleSubmit(e) {
e.preventDefault(); e.preventDefault();
@ -301,20 +303,50 @@ export default {
const reg = 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])$)$/; /^(^[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 ) { if (!reg.test(this.idcard) && this.idcard) {
this.$message.error('身份证格式不正确'); this.$message.error('身份证格式不正确');
return; return;
} }
if (typeof this.firstAidData.greenRoadFlag == 'boolean') { // if (typeof this.firstAidData.greenRoadFlag == 'boolean') {
this.firstAidData.greenRoadFlag = 0; // 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;
} }
let res = await create({
} else {
let res = await createPatient({
param: { param: {
...this.form, ...this.form,
patientIdCardNo: this.patientIdCardNo, idcard: this.idcard,
}, },
}); });
const { data, code, msg } = res; const {
data,
code,
msg
} = res;
if (code === 200) { if (code === 200) {
this.confirmLoading = true; this.confirmLoading = true;
this.createVisible = false; this.createVisible = false;
@ -323,47 +355,58 @@ export default {
} else { } else {
this.confirmLoading = false; this.confirmLoading = false;
} }
}
} }
}); });
}, },
}, },
}; };
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.patient-form{ .patient-form {
.create-form{ .create-form {
padding: 0 .6rem 1rem .6rem; padding: 0 .6rem 1rem .6rem;
.ant-form-item{
.ant-form-item {
margin-bottom: .5rem; margin-bottom: .5rem;
.ant-form-item-label{}
.ant-input{ .ant-form-item-label {}
.ant-input {
font-size: 1rem; font-size: 1rem;
border: none; border: none;
background: #F5F5F5; background: #F5F5F5;
border-radius: .3rem; border-radius: .3rem;
.acitve { .acitve {
border: none !important; border: none !important;
} }
} }
.ant-select{
.ant-select {
font-size: 1rem; font-size: 1rem;
border:none; border: none;
background: #F5F5F5; background: #F5F5F5;
border-radius: 6px; border-radius: 6px;
.ant-select-selection{
border:none; .ant-select-selection {
border: none;
background-color: #F5F5F5; background-color: #F5F5F5;
font-size:13px; font-size: 13px;
} }
} }
} }
.footer-btns{
.footer-btns {
margin-top: 1.2rem; margin-top: 1.2rem;
padding: 0 1.5rem; padding: 0 1.5rem;
text-align:center; text-align: center;
.ant-btn.footer-btn{
width:80%; .ant-btn.footer-btn {
width: 80%;
border-radius: .8rem; border-radius: .8rem;
height: 3.64vw; height: 3.64vw;
line-height: 3.64vw; line-height: 3.64vw;
@ -372,19 +415,21 @@ export default {
} }
} }
</style> </style>
<style lang="less"> <style lang="less">
.patient-form{ .patient-form {
.ant-modal-body{ .ant-modal-body {
padding-top: 0; padding-top: 0;
} }
.ant-modal-content{
.ant-modal-content {
border-radius: 1rem; border-radius: 1rem;
overflow: hidden; overflow: hidden;
.ant-modal-header{
.ant-modal-header {
border-bottom: none; border-bottom: none;
padding-top: 2rem; padding-top: 2rem;
.ant-modal-title { .ant-modal-title {
font-size: 2rem; font-size: 2rem;
font-weight: bold; font-weight: bold;
@ -395,51 +440,61 @@ export default {
} }
} }
.ant-select{ .ant-select {
.ant-select-selection,.inputText{
.ant-select-selection,
.inputText {
background-color: #F5F5F5; background-color: #F5F5F5;
border:none; border: none;
.acitve { .acitve {
border: none !important; border: none !important;
} }
} }
.ant-input:hover{
.ant-input:hover {
border: none border: none
} }
.ant-select-arrow{
.ant-select-arrow {
position: absolute; position: absolute;
top: 36%; top: 36%;
svg{
svg {
font-size: 1rem; font-size: 1rem;
color: #ccc; color: #ccc;
} }
} }
} }
.input-container{
.input-container {
background-color: #F5F5F5; background-color: #F5F5F5;
border:none; border: none;
} }
.ant-switch{
.ant-switch {
height: 2.73vw; height: 2.73vw;
width: 4.55vw; width: 4.55vw;
color: #f5f5f5; color: #f5f5f5;
background-color: #f5f5f5; background-color: #f5f5f5;
} }
.ant-switch::after{
.ant-switch::after {
width: 2.3vw; width: 2.3vw;
height: 2.3vw; height: 2.3vw;
top: 1.5px; top: 1.5px;
} }
.ant-switch-checked{
background-color:#34C759; .ant-switch-checked {
background-color: #34C759;
} }
.cencelBtn{
background:#ddd; .cencelBtn {
background: #ddd;
} }
} }
} }
</style> </style>

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

@ -236,7 +236,9 @@
msg msg
} = res; } = res;
if (code === 200) { 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.authEdit = false
this.$message.success('更新成功'); this.$message.success('更新成功');
this.$router.push('/firstaid/thrombolysis') this.$router.push('/firstaid/thrombolysis')

2
src/views/Patient/index.vue

@ -218,7 +218,7 @@
this.queryByPadNo(); this.queryByPadNo();
this.queryVideo(); // this.queryVideo(); //
this.queryBook(); // this.queryBook(); //
this.getMessageQuery(); // this.getMessageQuery();
}, },
methods: { methods: {
...mapMutations('storm', ['setNationList']), ...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 mapState
} from 'vuex' } from 'vuex'
import { import {
queryLog queryAidRecord
} from 'api' } from 'api'
import ThromReport from '@/views/thrombolysis/components/throm-report.vue'; import ThromReport from '@/views/thrombolysis/components/throm-report.vue';
export default { export default {
@ -26,8 +26,11 @@
ThromReport ThromReport
}, },
methods: { methods: {
open(item) { async open(item) {
this.dataSource = item console.log(item)
const res = await queryAidRecord(item.firstAidId)
console.log(res)
this.dataSource = res.data
this.visible = true this.visible = true
} }
} }

53
src/views/document/index.vue

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

67
src/views/login/index.vue

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

195
src/views/statistics/index.vue

@ -121,19 +121,19 @@
data() { data() {
return { return {
queryParams1: { queryParams1: {
"timeType":"0", // 0: 1: 2: 3: "timeType": "0", // 0: 1: 2: 3:
"startTime":"2024-10-01 00:00:00", // "startTime": "2024-10-01 00:00:00", //
"endTime":"2025-01-01 00:00:00" // "endTime": "2025-01-01 00:00:00" //
}, },
queryParams2: { queryParams2: {
"timeType":"0", // 0: 1: 2: 3: "timeType": "0", // 0: 1: 2: 3:
"startTime":"2024-10-01 00:00:00", // "startTime": "2024-10-01 00:00:00", //
"endTime":"2025-01-01 00:00:00" // "endTime": "2025-01-01 00:00:00" //
}, },
queryParams3: { queryParams3: {
"timeType":"0", // 0: 1: 2: 3: "timeType": "0", // 0: 1: 2: 3:
"startTime":"2024-10-01 00:00:00", // "startTime": "2024-10-01 00:00:00", //
"endTime":"2025-01-01 00:00:00" // "endTime": "2025-01-01 00:00:00" //
} }
} }
}, },
@ -205,9 +205,8 @@
this.init() this.init()
}, },
methods: { methods: {
init(filed){ init(filed) {
switch(filed) switch (filed) {
{
case "queryParams1": case "queryParams1":
this.getData1() this.getData1()
this.getData2() this.getData2()
@ -241,11 +240,11 @@
}, },
typeChange(e, filed){ typeChange(e, filed) {
this[filed]['timeType'] = e.target.value this[filed]['timeType'] = e.target.value
this.init(filed) this.init(filed)
}, },
dateChange(dates,filed){ dateChange(dates, filed) {
const startTime = dates[0].format('YYYY-MM-DD HH:mm:ss') const startTime = dates[0].format('YYYY-MM-DD HH:mm:ss')
const endTime = dates[1].format('YYYY-MM-DD HH:mm:ss') const endTime = dates[1].format('YYYY-MM-DD HH:mm:ss')
this[filed]['startTime'] = startTime this[filed]['startTime'] = startTime
@ -254,8 +253,12 @@
}, },
// - // -
async getData1() { async getData1() {
const res = await queryPatient({param: this.queryParams1}) const res = await queryPatient({
const { onlyRs = 0, onlyXgzl = 0, both = 0, neither = 0} = res.data param: this.queryParams1
})
const {
onlyRs = 0, onlyXgzl = 0, both = 0, neither = 0
} = res.data
var series = [{ var series = [{
value: onlyRs, value: onlyRs,
name: '仅溶栓人数' name: '仅溶栓人数'
@ -289,17 +292,42 @@
series: [{ series: [{
name: '病历统计', name: '病历统计',
type: 'pie', type: 'pie',
avoidLabelOverlap: false, // avoidLabelOverlap: false,
// label: {
// show: true,
// position: 'center'
// },
label: { label: {
show: false, alignTo: 'edge',
position: 'center' 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: { itemStyle: {
borderColor: '#fff', borderColor: '#fff',
borderWidth: 2 borderWidth: 2
}, },
radius: ['5%', '70%'], radius: ['5%', '70%'],
data: series data: series,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}] }]
}; };
@ -311,8 +339,12 @@
var chartDom = this.$refs.blboxr var chartDom = this.$refs.blboxr
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
const res = await queryByDatePatient({param: this.queryParams1}) const res = await queryByDatePatient({
const {list = []} = res.data param: this.queryParams1
})
const {
list = []
} = res.data
var items = ['仅溶栓人数', '仅介入人数', '未溶栓且未介入人数', '溶栓且未介入人数'] var items = ['仅溶栓人数', '仅介入人数', '未溶栓且未介入人数', '溶栓且未介入人数']
@ -321,7 +353,10 @@
const newlist = list.map(a => { const newlist = list.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 => { items.forEach(i => {
var item = { var item = {
@ -331,10 +366,10 @@
data: [], data: [],
} }
var filed = "" var filed = ""
if(i == '仅溶栓人数') filed = "onlyRs" if (i == '仅溶栓人数') filed = "onlyRs"
else if(i == '仅介入人数') filed = "onlyXgzl" else if (i == '仅介入人数') filed = "onlyXgzl"
else if(i == '溶栓且介入人数') filed = "both" else if (i == '溶栓且介入人数') filed = "both"
else if(i == '未溶栓且未介入人数') filed = "neither" else if (i == '未溶栓且未介入人数') filed = "neither"
newlist.forEach(a => { newlist.forEach(a => {
var itemdata = { var itemdata = {
value: a[filed], value: a[filed],
@ -374,12 +409,17 @@
var chartDom = this.$refs.jmrsboxlt var chartDom = this.$refs.jmrsboxlt
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
const res = await queryJmrs({param: this.queryParams2}) const res = await queryJmrs({
param: this.queryParams2
})
var xdata = []; var xdata = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 = [{ var series = [{
@ -417,7 +457,9 @@
var chartDom = this.$refs.jmrsboxrt var chartDom = this.$refs.jmrsboxrt
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
const res = await queryJmrs({param: this.queryParams2}) const res = await queryJmrs({
param: this.queryParams2
})
const list = res.data const list = res.data
var items = ['静脉溶栓人数', '急救特征人数'] var items = ['静脉溶栓人数', '急救特征人数']
@ -426,7 +468,10 @@
const newlist = list.map(a => { const newlist = list.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 => { items.forEach(i => {
var item = { var item = {
@ -435,8 +480,8 @@
data: [], data: [],
} }
var filed = "" var filed = ""
if(i == '静脉溶栓人数') filed = "gailv" if (i == '静脉溶栓人数') filed = "gailv"
else if(i == '急救特征人数') filed = "total" else if (i == '急救特征人数') filed = "total"
newlist.forEach(a => { newlist.forEach(a => {
var itemdata = { var itemdata = {
value: a[filed], value: a[filed],
@ -474,12 +519,17 @@
async getData5() { async getData5() {
var chartDom = this.$refs.jmrsboxlb var chartDom = this.$refs.jmrsboxlb
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
const res = await querySichResult({param: this.queryParams2}) const res = await querySichResult({
param: this.queryParams2
})
var xdata = []; var xdata = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 = [{ var series = [{
@ -519,13 +569,18 @@
var chartDom = this.$refs.jmrsboxrb var chartDom = this.$refs.jmrsboxrb
var myChart = echarts.init(chartDom); 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 items = ['≤45min', '≤60min', '>60min']
var xdata = []; var xdata = [];
var series = []; var series = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 => { items.forEach(i => {
var item = { var item = {
@ -535,9 +590,9 @@
data: [], data: [],
} }
var filed = "" var filed = ""
if(i == '≤45min') filed = "dy45" if (i == '≤45min') filed = "dy45"
else if(i == '≤60min') filed = "dy60" else if (i == '≤60min') filed = "dy60"
else if(i == '>60min') filed = "other" else if (i == '>60min') filed = "other"
newlist.forEach(a => { newlist.forEach(a => {
var itemdata = { var itemdata = {
value: a[filed], value: a[filed],
@ -575,12 +630,17 @@
async getData7() { async getData7() {
var chartDom = this.$refs.xgnboxlt var chartDom = this.$refs.xgnboxlt
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
const res = await querySichResult({param: this.queryParams3}) const res = await querySichResult({
param: this.queryParams3
})
var xdata = []; var xdata = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 = [{ var series = [{
@ -636,14 +696,19 @@
var chartDom = this.$refs.xgnboxrt var chartDom = this.$refs.xgnboxrt
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
const res = await selectXgzl({param: this.queryParams3}) const res = await selectXgzl({
param: this.queryParams3
})
var items = ['桥接治疗人数', '非桥接治疗人数'] var items = ['桥接治疗人数', '非桥接治疗人数']
var xdata = []; var xdata = [];
var series = []; var series = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 => { items.forEach(i => {
var item = { var item = {
@ -653,8 +718,8 @@
data: [], data: [],
} }
var filed = "" var filed = ""
if(i == '桥接治疗人数') filed = "qiaojie" if (i == '桥接治疗人数') filed = "qiaojie"
else if(i == '非桥接治疗人数') filed = "falseQiaojie" else if (i == '非桥接治疗人数') filed = "falseQiaojie"
newlist.forEach(a => { newlist.forEach(a => {
var itemdata = { var itemdata = {
value: a[filed], value: a[filed],
@ -692,14 +757,19 @@
var chartDom = this.$refs.xgnboxlb var chartDom = this.$refs.xgnboxlb
var myChart = echarts.init(chartDom); 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 items = ['≤60min', '≤90min', '>90min']
var xdata = []; var xdata = [];
var series = []; var series = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 => { items.forEach(i => {
var item = { var item = {
@ -709,9 +779,9 @@
data: [], data: [],
} }
var filed = "" var filed = ""
if(i == '≤60min') filed = "dy60" if (i == '≤60min') filed = "dy60"
else if(i == '≤90min') filed = "dy90" else if (i == '≤90min') filed = "dy90"
else if(i == '>90min') filed = "other" else if (i == '>90min') filed = "other"
newlist.forEach(a => { newlist.forEach(a => {
var itemdata = { var itemdata = {
value: a[filed], value: a[filed],
@ -750,14 +820,19 @@
var chartDom = this.$refs.xgnboxrb var chartDom = this.$refs.xgnboxrb
var myChart = echarts.init(chartDom); 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 items = ['≤60min', '≤90min', '>90min']
var xdata = []; var xdata = [];
var series = []; var series = [];
const newlist = res.data.map(a => { const newlist = res.data.map(a => {
xdata.push(dayjs(a.time).format('YYYY-MM-DD')) 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 => { items.forEach(i => {
var item = { var item = {
@ -767,9 +842,9 @@
data: [], data: [],
} }
var filed = "" var filed = ""
if(i == '≤60min') filed = "dy60" if (i == '≤60min') filed = "dy60"
else if(i == '≤90min') filed = "dy90" else if (i == '≤90min') filed = "dy90"
else if(i == '>90min') filed = "other" else if (i == '>90min') filed = "other"
newlist.forEach(a => { newlist.forEach(a => {
var itemdata = { var itemdata = {
value: a[filed], value: a[filed],
@ -809,19 +884,22 @@
<style lang="less" scoped> <style lang="less" scoped>
.statistics { .statistics {
// padding: 10px; // padding: 10px;
.statistics-container{ .statistics-container {
.sta-row { .sta-row {
background: #fff; background: #fff;
margin-bottom: .2rem; margin-bottom: .2rem;
padding: 10px; padding: 10px;
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
.sta-row-head { .sta-row-head {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
.sta-row-title { .sta-row-title {
height: 50px; height: 50px;
line-height: 50px; line-height: 50px;
@ -875,7 +953,8 @@
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
border-left: 1px solid #d9d9d9; border-left: 1px solid #d9d9d9;
&.ant-radio-button-wrapper-checked{
&.ant-radio-button-wrapper-checked {
border-left: 1px solid #0062d9; border-left: 1px solid #0062d9;
} }
} }

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

@ -25,7 +25,7 @@
import ThromBefore2 from './throm-before2.vue'; import ThromBefore2 from './throm-before2.vue';
import ThromBefore3 from './throm-before3.vue'; import ThromBefore3 from './throm-before3.vue';
import ThromBefore4 from './throm-before4.vue'; import ThromBefore4 from './throm-before4.vue';
export default{ export default {
name: "ThromBefore", name: "ThromBefore",
components: { components: {
ThromBefore0, ThromBefore0,
@ -35,18 +35,18 @@
ThromBefore4, ThromBefore4,
}, },
data() { data() {
return{ return {
currentIndex: 0, currentIndex: 0,
} }
}, },
methods: { methods: {
handleClickStep(current){ handleClickStep(current) {
this.currentIndex = current; this.currentIndex = current;
}, },
handleNext(){ handleNext() {
this.currentIndex++ this.currentIndex++
}, },
handleNextStep(){ handleNextStep() {
this.$emit('next') this.$emit('next')
} }
}, },
@ -54,42 +54,55 @@
</script> </script>
<style lang="less"> <style lang="less">
.throm-before{ .throm-before {
display: flex; display: flex;
.throm-step{
.throm-step {
padding: 10px; padding: 10px;
margin-right: .2rem; margin-right: .2rem;
background-color: #fff; background-color: #fff;
.ant-steps-vertical .ant-steps-item-content{
.ant-steps-vertical .ant-steps-item-content {
min-height: 6.8rem; min-height: 6.8rem;
} }
.ant-steps-item-title{
.ant-steps-item-title {
padding: 0; padding: 0;
} }
.ant-steps-item-finish{
.ant-steps-item-title{ .ant-steps-item-finish {
.ant-steps-item-title {
color: #000000; color: #000000;
} }
} }
.ant-steps-item-process{
.ant-steps-item-title{ .ant-steps-item-process {
.ant-steps-item-title {
color: #007AFF; color: #007AFF;
// border-bottom: 1px solid #007AFF; // border-bottom: 1px solid #007AFF;
border-bottom: 3px solid transparent; /* 设置透明的底部边框 */ border-bottom: 3px solid transparent;
border-image: linear-gradient(to right, #fff, #007AFF) 1; /* 使用渐变色填充边框 */ /* 设置透明的底部边框 */
border-radius: 10px; /* 设置圆角 */ 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; padding: 10px;
flex: 1; flex: 1;
background-color: #fff; background-color: #fff;
.ant-form .ant-form-item-label label{
.ant-form .ant-form-item-label label {
font-size: 0.85rem; font-size: 0.85rem;
font-weight: bold; font-weight: bold;
} }
.ant-radio-button-wrapper{
.ant-radio-button-wrapper {
padding: 0 18px; padding: 0 18px;
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
@ -100,17 +113,23 @@
border: 0.5px solid #a3acbf; border: 0.5px solid #a3acbf;
border-radius: 6px; border-radius: 6px;
vertical-align: middle; 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; margin-right: 0;
} }
} }
.solid{
.solid {
.ant-checkbox-wrapper { .ant-checkbox-wrapper {
// background: #f9f9f9; // background: #f9f9f9;
border: 0.5px solid #a3acbf; border: 0.5px solid #a3acbf;
@ -122,40 +141,47 @@
line-height: 40px; line-height: 40px;
padding: 0 18px; padding: 0 18px;
height: 40px; height: 40px;
min-width: 0!important; min-width: 0 !important;
&.ant-checkbox-wrapper-checked{
&.ant-checkbox-wrapper-checked {
background: #007AFF; background: #007AFF;
color: #fff; color: #fff;
} }
.ant-checkbox{
.ant-checkbox {
display: none; display: none;
} }
} }
} }
} }
.common-picker{
.common-picker {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;
z-index: 999; z-index: 999;
} }
.btns{
.btns {
padding: 0 20% 1rem; padding: 0 20% 1rem;
} }
.ant-form-item{
.ant-form-item {
background: #f9f9f9; background: #f9f9f9;
margin-bottom: .5rem; margin-bottom: .5rem;
padding: 12px; padding: 12px;
border-radius: 4px; border-radius: 4px;
} }
.ant-card-head .ant-tabs-bar{ .ant-card-head .ant-tabs-bar {
border-bottom-width: 0; border-bottom-width: 0;
} }
.ant-card-bordered{
.ant-card-bordered {
border: none; border: none;
.ant-card-head{
.ant-card-head {
border-bottom: none; border-bottom: none;
} }
} }

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

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

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

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

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

@ -1,11 +1,5 @@
<template> <template>
<div class="throm-before2"> <div class="throm-before2">
<a-card
style="width:100%"
:tab-list="tabList"
:active-tab-key="activeTabKey"
@tabChange="key => onTabChange(key, 'key')"
>
<a-table <a-table
:columns="columns" :columns="columns"
:data-source="dataList" :data-source="dataList"
@ -25,7 +19,6 @@
</div> </div>
</template> </template>
</a-table> </a-table>
</a-card>
<div class="btns" v-if="!outside"> <div class="btns" v-if="!outside">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large" @click="onSubmit">下一步</a-button> <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')"> @tabChange="key => onTabChange(key, 'key')">
<div class="image-container"> <div class="image-container">
<!-- <div class="notImg">单次检验影像安全区域</div> --> <!-- <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="未检测到影像信息" /> <a-empty :image="emptyImage" description="未检测到影像信息" />
</div> </div>
</div> </div>
@ -22,28 +25,37 @@
import { import {
mapState mapState
} from 'vuex'; } from 'vuex';
import {
apiUrl
} from '@/config/setting.js';
import emptyImage from '@/assets/images/slice/empty.png' import emptyImage from '@/assets/images/slice/empty.png'
import {
queryFirstAidInspectData,
queryVideo
} from 'api';
export default { export default {
name: 'ThromBefore3', name: 'ThromBefore3',
data() { data() {
return { return {
apiUrl,
emptyImage, emptyImage,
activeTabKey: 'tab1', activeTabKey: 'tab1',
previewVisible: false, previewVisible: false,
previewImage: '', previewImage: '',
fileList: [], fileList: [],
list: [],
tabList: [{ tabList: [{
key: 'tab1', key: 'tab1',
tab: '影像1', tab: '影像',
},
{
key: 'tab2',
tab: '影像2',
},
{
key: 'tab3',
tab: '影像3',
}, },
// {
// key: 'tab2',
// tab: '2',
// },
// {
// key: 'tab3',
// tab: '3',
// },
{ {
key: 'ct', key: 'ct',
tab: '院前CT(0张)', tab: '院前CT(0张)',
@ -66,6 +78,9 @@
}); });
} }
}, },
created() {
this.queryVideo()
},
methods: { methods: {
echo(data) { echo(data) {
if (data['JMRS-YQ-CT']) { if (data['JMRS-YQ-CT']) {
@ -89,6 +104,24 @@
this.previewImage = path; this.previewImage = path;
this.previewVisible = true; 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() { openCamera() {
if (this.writeAble) { if (this.writeAble) {
this.$message.success('患者已审核,内容不可更改') 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%;" /> <img src="@/assets/images/100.png" alt="" style="width: 100%;" />
</div> </div>
<div class="image-container"> <div class="image-container">
<div class="notImg">溶栓视频安全区</div> <video :src="getVideo" controls autoplay loop muted v-if="getVideo" width="100%">
<!-- <div class="emtpy"> 您的浏览器不支持 video 标签
<a-empty image="@/assets/images/slice/empty.png" description="未检测到影像信息" /> </video>
</div> --> <!-- <div class="notImg" v-else>溶栓视频安全区</div> -->
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div>
</div> </div>
</div> </div>
<div class="btns"> <div class="btns">
@ -164,18 +167,21 @@
<script> <script>
import { import {
mapState mapState,
mapMutations
} from 'vuex'; } from 'vuex';
import signature from '@/components/signature/signature'; import signature from '@/components/signature/signature';
import { import {
imgUrl imgUrl
} from '@/config/setting.js'; } from '@/config/setting.js';
import emptyImage from '@/assets/images/slice/empty.png'
import { import {
uploadfile, uploadfile,
saveInformedConsent, saveInformedConsent,
queryConsentResult, queryConsentResult,
thTime, thTime,
uploadBase64 uploadBase64,
queryVideo
} from 'api'; } from 'api';
export default { export default {
name: 'ThromBefor4', name: 'ThromBefor4',
@ -188,6 +194,7 @@
data() { data() {
return { return {
activeTabKey: 'tab1', activeTabKey: 'tab1',
emptyImage,
tabList: [{ tabList: [{
key: 'tab1', key: 'tab1',
tab: '知情同意', tab: '知情同意',
@ -232,7 +239,6 @@
}, },
computed: { computed: {
...mapState('patient', ['patientData', 'book', 'video', 'writeAble']), ...mapState('patient', ['patientData', 'book', 'video', 'writeAble']),
getDoctorTime() { getDoctorTime() {
const { const {
informed informed
@ -267,6 +273,7 @@
}, },
created() { created() {
console.log('book', this.book) console.log('book', this.book)
this.queryVideo()
this.content = this.book.find((item) => item.type === 0)?.content || ''; this.content = this.book.find((item) => item.type === 0)?.content || '';
console.log(this.content); console.log(this.content);
}, },
@ -283,9 +290,22 @@
} }
}, },
methods: { methods: {
...mapMutations('patient', ['setVideo']),
uploadImage() { uploadImage() {
}, },
async queryVideo() {
let res = await queryVideo();
const {
data,
code,
msg
} = res;
if (code === 200) {
this.setVideo(data.list);
}
},
onSubmit() { onSubmit() {
this.$emit('next') 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>

47
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" <van-stepper :disabled="writeAble" :integer="true" v-model="k.value" step="1" class="one"
theme="round" /> theme="round" />
<van-slider :disabled="writeAble" class="common-slider-slider" :min="0" :max="300" step="10" <van-slider :disabled="writeAble" class="common-slider-slider" :min="0" :max="300" step="10"
v-model="k.value" > v-model="k.value">
<template #button> <template #button>
<a-input-number :disabled="writeAble" type="number" id="inputNumber" <a-input-number :disabled="writeAble" type="number" id="inputNumber"
v-model="k.value" :min="0" :max="300" /> v-model="k.value" :min="0" :max="300" />
@ -166,15 +166,27 @@
computed: { computed: {
...mapState('patient', ['patientData', 'timerData', 'writeAble']), ...mapState('patient', ['patientData', 'timerData', 'writeAble']),
}, },
props:['timercode'], props: ['timercode'],
watch: { watch: {
timercode: { timercode: {
handler(code) { handler(code) {
NIHSS_LIST.forEach((item, index) => {
item.value = null;
});
if (code) { if (code) {
this.recordDict = this.dataForm[`${code}`]; this.recordDict = this.dataForm[`${code}`];
}else { // this.recordDict[code].range.forEach(a => {
this.recordDict = EMERGENCY_CODE; // 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 { const {
recordValDict recordValDict
} = this.patientData; } = this.patientData;
@ -189,7 +201,6 @@
}, },
mounted() { mounted() {
}, },
methods: { methods: {
...mapMutations('patient', ['setPatientData']), ...mapMutations('patient', ['setPatientData']),
@ -223,6 +234,7 @@
this.$refs.inputNumber[index].blur(); this.$refs.inputNumber[index].blur();
}, },
changeInput(value, item) { changeInput(value, item) {
console.log('changeInput', value)
item.visible = false; item.visible = false;
item.value = value; item.value = value;
this.nissValue = ''; this.nissValue = '';
@ -318,6 +330,16 @@
answer: [values[k]], answer: [values[k]],
time: '', time: '',
}); });
} else if (
codesQ.includes(k) &&
values[k] !== 'undefined' &&
values[k] !== 'null'
) {
codeAndAnswerList.push({
questionCode: k,
answer: [values[k]],
time: '',
});
} }
} }
this.home.updateAidCode({ this.home.updateAidCode({
@ -330,6 +352,7 @@
}, },
beforeDestroy() { beforeDestroy() {
console.log('beforeDestroy')
NIHSS_LIST.forEach((item, index) => { NIHSS_LIST.forEach((item, index) => {
item.value = null; item.value = null;
}); });
@ -368,13 +391,15 @@
} }
} }
} }
.niss-list-item{
margin-bottom:10px; .niss-list-item {
margin-bottom: 10px;
} }
.item-icon{
color:#007AFF; .item-icon {
font-size:22px; color: #007AFF;
margin-left:8px; font-size: 22px;
margin-left: 8px;
} }
</style> </style>
<style lang="less"> <style lang="less">

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

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

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

@ -73,8 +73,8 @@
// font-size: 36px; // font-size: 36px;
// } // }
height: 50vh; height: 50vh;
color: #fff; color: #000;
background-color: #000; background-color: #eee;
padding: 1rem; padding: 1rem;
.record-content { .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" <van-stepper :disabled="writeAble" v-model="k.value" step="0.1" :min="0" :max="k.max"
:decimal-length="1" theme="round" /> :decimal-length="1" theme="round" />
<van-slider :disabled="writeAble" class="common-slider-slider" :min="0" :max="k.max" <van-slider :disabled="writeAble" class="common-slider-slider" :min="0" :max="k.max"
v-model="k.value" > v-model="k.value">
<template #button> <template #button>
<a-input-number :disabled="writeAble" v-model="k.value" :min="0" :max="k.max" /> <a-input-number :disabled="writeAble" v-model="k.value" :min="0" :max="k.max" />
<a-icon class="slider-icon" type="caret-down" /> <a-icon class="slider-icon" type="caret-down" />
@ -18,7 +18,9 @@
</van-slider> </van-slider>
</div> </div>
<!-- radio --> <!-- 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"> <a-radio-button v-for="(item, index) in k.range" :key="item" :value="item">
{{ item }} {{ item }}
</a-radio-button> </a-radio-button>
@ -26,7 +28,8 @@
</a-form-item> </a-form-item>
</a-form> </a-form>
<div class="btns"> <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>
</div> </div>
@ -60,6 +63,7 @@
...mapState('patient', ['patientData', 'writeAble']), ...mapState('patient', ['patientData', 'writeAble']),
}, },
mounted() { mounted() {
console.log('RSYW_CODE', this.RSYW_CODE)
const { const {
recordValDict recordValDict
} = this.patientData; } = this.patientData;
@ -91,6 +95,7 @@
if (j !== 'JMRS-RSYW') { if (j !== 'JMRS-RSYW') {
if (data[j]) { if (data[j]) {
let ans = data[j][0].answer; let ans = data[j][0].answer;
console.log('ans', ans.toString())
this.RSYW_CODE[`${j}`].value = Number( this.RSYW_CODE[`${j}`].value = Number(
ans.toString() ans.toString()
); );
@ -175,5 +180,4 @@
max-width: 100%; max-width: 100%;
} }
} }
</style> </style>

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

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

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" <a-card style="width:100%" :tab-list="tabList" :active-tab-key="activeTabKey"
@tabChange="key => onTabChange(key, 'key')"> @tabChange="key => onTabChange(key, 'key')">
<div class="image-container"> <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> </div>
</a-card> </a-card>
@ -19,24 +30,37 @@
mapMutations, mapMutations,
mapState mapState
} from 'vuex'; } 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 { export default {
name: "throm-interfere-image", name: "throm-interfere-image",
components: {
ThromInterfereImageDcm
},
data() { data() {
return { return {
imgUrl,
activeTabKey: 'tab1', emptyImage,
tabList: [{ activeTabKey: '0',
key: 'tab1', tabList: [
tab: '介入1', // {
}, // key: 'tab1',
{ // tab: '1',
key: 'tab2', // },
tab: '介入2', // {
}, // key: 'tab2',
{ // tab: '2',
key: 'tab3', // },
tab: '院前CT (3张)', // {
}, // key: 'tab3',
// tab: 'CT (3)',
// },
], ],
} }
}, },
@ -44,10 +68,36 @@
...mapState('storm', ['spinning', 'showNav']), ...mapState('storm', ['spinning', 'showNav']),
...mapState('patient', ['patientData', 'timerData', 'writeAble']), ...mapState('patient', ['patientData', 'timerData', 'writeAble']),
}, },
created() {
this.queryVideo()
},
methods: { methods: {
onTabChange(key, type) { onTabChange(key, type) {
this.activeTabKey = key; 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() { onSubmit() {
this.$emit('next') this.$emit('next')
} }
@ -75,7 +125,7 @@
} }
.btns { .btns {
margin-top: 2rem; // margin-top: 2rem;
} }
} }
</style> </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>

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

@ -1,9 +1,11 @@
<template> <template>
<div class="throm-interfere-informed"> <div class="throm-interfere-informed">
<div class="Informed-container"> <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 style="text-align: center;font-size: 2rem;line-height: 5rem;font-weight: bold;">急性脑梗塞静脉溶栓治疗知情同意书
</h1> </h1>
<div style="transition: all 1s; overflow: hidden; padding: 1rem 0;"> <div style="transition: all 1s; overflow: hidden; ">
<div v-html="content" class="card-content ql-editor content-detail" <div v-html="content" class="card-content ql-editor content-detail"
style="white-space: pre-wrap"></div> style="white-space: pre-wrap"></div>
</div> </div>
@ -14,26 +16,54 @@
<img :src="apiUrl + informed.patientSign" alt="" /> <img :src="apiUrl + informed.patientSign" alt="" />
</div> </div>
<div class="item-img" v-else></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>
<div class="informed-item1"> <div class="informed-item1">
<span>签名日期: </span> <span>签名日期: </span>
<span>{{getPatientTime}}</span> <a-input :disabled="writeAble" @focus="changeDate('patientTime')" :value="getPatientTime"
class="item-input" readOnly />
</div> </div>
</div> </div>
<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-list before">
<div class="informed-item"> <div class="informed-item">
<span>授权亲属签字: </span> <span>授权亲属签字: </span>
<div class="item-img" v-if="informed.empowerSign" @click="lookSign(informed.empowerSign)"> <div class="item-img" v-if="informed.empowerSign" @click="lookSign(informed.empowerSign)">
<img :src="apiUrl + informed.empowerSign" alt="" /> <img :src="apiUrl + informed.empowerSign" alt="" />
</div> </div>
<div class="item-img" v-else></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>
<div class="informed-item1"> <div class="informed-item1">
<span>与患者关系</span> <span>与患者关系</span>
<span>{{informed.empowerRelation}}</span> <a-input :disabled="writeAble" v-model="informed.empowerRelation" class="item-input" />
</div> </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> </div>
<template> <template v-if="source === 'normal'">
<div class="informed-info"> <div class="informed-info">
<strong> 医生陈述 </strong> <strong> 医生陈述 </strong>
</div> </div>
@ -46,21 +76,92 @@
<div class="item-img" v-if="informed.doctorSign" @click="lookSign(informed.doctorSign)"> <div class="item-img" v-if="informed.doctorSign" @click="lookSign(informed.doctorSign)">
<img :src="apiUrl + informed.doctorSign" alt="" /> <img :src="apiUrl + informed.doctorSign" alt="" />
</div> </div>
<div class="item-img " v-else></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>
<div class="informed-item1"> <div class="informed-item1">
<span>签名日期</span> <span>签名日期</span>
<span>{{getDoctorTime}}</span> <a-input :disabled="writeAble" @focus="changeDate('doctorTime')" :value="getDoctorTime"
class="item-input" readOnly />
</div> </div>
</div> </div>
<div>
<signature class="item-sign" ref="doctorSign" @close="doctorSignClose"
@reset="handeReset('doctorSign')" v-if="doctorSign">
</signature>
</div>
</template> </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>
<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>
<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>
</div>
</a-card>
<a-modal :width="650" :destroyOnClose="true" v-model="lookVisable" title="查看签名" :footer="null"> <a-modal :width="650" :destroyOnClose="true" v-model="lookVisable" title="查看签名" :footer="null">
<div class="modal-content"> <div class="modal-content">
<img :src="apiUrl + currentSign" alt="" style="width: 100%; height: 100%;" /> <img :src="apiUrl + currentSign" alt="" style="width: 100%; height: 100%;" />
</div> </div>
</a-modal> </a-modal>
</div>
<div class="btns"> <div class="btns">
<a-button :disabled="writeAble" class="common-button" block type="primary" size="large" <a-button :disabled="writeAble" class="common-button" block type="primary" size="large"
@click="onSubmit">下一步</a-button> @click="onSubmit">下一步</a-button>
@ -70,8 +171,11 @@
<script> <script>
import { import {
mapState mapState,
mapMutations
} from 'vuex'; } from 'vuex';
import signature from '@/components/signature/signature';
import emptyImage from '@/assets/images/slice/empty.png'
import { import {
imgUrl imgUrl
} from '@/config/setting.js'; } from '@/config/setting.js';
@ -80,14 +184,35 @@
saveInformedConsent, saveInformedConsent,
queryConsentResult, queryConsentResult,
thTime, thTime,
uploadBase64 uploadBase64,
queryVideo
} from 'api'; } from 'api';
export default { export default {
name: "throm-interfere-informed", name: 'ThromBefor4',
props: {
source: {
type: String,
default: 'normal',
},
},
data() { data() {
return { return {
emptyImage,
activeTabKey: 'tab1',
tabList: [{
key: 'tab1',
tab: '知情同意',
},
{
key: 'tab2',
tab: '拍照上传',
},
{
key: 'tab3',
tab: '谈话辅助工具',
}
],
apiUrl: imgUrl, apiUrl: imgUrl,
content: '',
informed: { informed: {
doctorSign: '', doctorSign: '',
doctorTime: '', doctorTime: '',
@ -98,10 +223,24 @@
empowerMobile: '', empowerMobile: '',
legalTime: '', legalTime: '',
}, },
content: '',
picker: false,
lookVisable: false, lookVisable: false,
currentSign: '', currentSign: '',
currentDate: new Date(),
patientSign: '',
empowerSign: '',
doctorSign: '',
disabled: false,
previewVisible: false,
previewImage: '',
fileList: [],
} }
}, },
components: {
signature,
},
computed: { computed: {
...mapState('patient', ['patientData', 'book', 'video', 'writeAble']), ...mapState('patient', ['patientData', 'book', 'video', 'writeAble']),
getDoctorTime() { getDoctorTime() {
@ -125,22 +264,67 @@
if (!informed.legalTime) return; if (!informed.legalTime) return;
return informed.legalTime.split(' ')[0]; 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() { created() {
this.content = this.book.find((item) => item.type === 1)?.content || ''; // console.log('book', this.book)
this.queryConsentResult() 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: { methods: {
...mapMutations('patient', ['setVideo']),
uploadImage() {
},
async queryVideo() {
let res = await queryVideo();
const {
data,
code,
msg
} = res;
if (code === 200) {
this.setVideo(data.list);
}
},
onSubmit() { onSubmit() {
this.$emit('next') this.$emit('next')
}, },
async queryConsentResult() { async onSubmitSign() {
const {
informed
} = this;
const { const {
firstAidId firstAidId
} = this.patientData; } = this.patientData;
if (!firstAidId) return this.$message.error('缺少急救'); if (!firstAidId) return this.$message.error('缺少急救');
let res = await queryConsentResult({ let res = await saveInformedConsent({
...informed,
firstAidId, firstAidId,
templateText: this.content,
type: 0, type: 0,
}); });
const { const {
@ -149,13 +333,243 @@
msg msg
} = res; } = res;
if (code === 200) { 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) { lookSign(url) {
this.currentSign = url; this.currentSign = url;
this.lookVisable = true; 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> </script>
@ -163,6 +577,98 @@
<style lang="less" scoped> <style lang="less" scoped>
.throm-interfere-informed { .throm-interfere-informed {
padding: 10px; 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>
<style lang="less"> <style lang="less">

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

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

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

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

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

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

56
src/views/thrombolysis/index.vue

@ -7,14 +7,52 @@
<a-step :status="current == 1 ? 'process' : current > 1 ? 'finish' : 'wait'" title="溶栓前"> <a-step :status="current == 1 ? 'process' : current > 1 ? 'finish' : 'wait'" title="溶栓前">
<!-- <div slot="icon" style="font-size: 1.7rem;">1.</div> --> <!-- <div slot="icon" style="font-size: 1.7rem;">1.</div> -->
</a-step> </a-step>
<template v-if="isrs && !isjr">
<a-step :status="current == 2 ? 'process' : current > 2 ? 'finish' : 'wait'" title="溶栓中" /> <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 == 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="报告" /> <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> </a-steps>
<throm-before v-if="current == 1" @next="handleNext"></throm-before> <throm-before v-if="current == 1" @next="handleNext"></throm-before>
<throm-ing v-else-if="current == 2" @next="handleNext"></throm-ing> <template v-if="isrs && !isjr">
<throm-interfere v-else-if="current == 3" @next="handleNext"></throm-interfere> <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> <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>
</div> </div>
</template> </template>
@ -28,16 +66,26 @@
import ThromIng from './components/throm-ing.vue'; import ThromIng from './components/throm-ing.vue';
import ThromInterfere from './components/throm-interfere.vue'; import ThromInterfere from './components/throm-interfere.vue';
import ThromReport from './components/throm-report.vue'; import ThromReport from './components/throm-report.vue';
import ThromResult from './components/throm-result.vue';
export default { export default {
name: "", name: "",
components: { components: {
ThromBefore, ThromBefore,
ThromIng, ThromIng,
ThromInterfere, ThromInterfere,
ThromReport ThromReport,
ThromResult
}, },
computed: { computed: {
...mapState('patient', ['patientData']), ...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() { data() {
return { return {

Loading…
Cancel
Save