Browse Source

20250223

master
nicky 5 months ago
parent
commit
738878270c
  1. 4
      package-lock.json
  2. 15
      src/App.vue
  3. 34
      src/layouts/BasicLayout.vue
  4. 8
      src/main.js
  5. 2
      src/views/document/index.vue
  6. 54
      src/views/statistics/index.vue
  7. 40
      src/views/thrombolysis/components/throm-before3.vue
  8. 5
      src/views/thrombolysis/components/throm-interfere-image-dcm.vue
  9. 123
      src/views/thrombolysis/components/throm-report-observe.vue
  10. 129
      src/views/thrombolysis/components/throm-report.vue
  11. 25
      src/views/thrombolysis/components/throm-result-baseInfo.vue

4
package-lock.json

@ -18023,7 +18023,7 @@
},
"node_modules/vuex-persistedstate": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
"resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
"integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
"dependencies": {
@ -33360,7 +33360,7 @@
},
"vuex-persistedstate": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
"resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
"integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
"requires": {
"deepmerge": "^4.2.2",

15
src/App.vue

@ -136,7 +136,7 @@
},
},
methods: {
...mapMutations('patient', ['setTimerData']),
...mapMutations('patient', ['setTimerData', 'setPatientData', 'setPatientDataCur']),
padTo2Digits(num) {
return num.toString().padStart(2, '0');
},
@ -147,7 +147,7 @@
if (!firstAidId) return;
// this.queryMessage();
await this.handMessageQuery();
console.log('init', this.$route.name);
this.request = 0;
this.utils.AnimationFrame.create(
'timerTask',
@ -207,9 +207,16 @@
this.setTimerData(res.data);
const {
map,
haveFlagInspect
haveFlagInspect,
finishStatus,
} = res.data;
console.log('firstAidInspectDataDtos: ', haveFlagInspect);
// if(finishStatus == 1){
// this.setTimerData({})
// this.request = 0
// this.setPatientData({})
// this.setPatientDataCur({})
// }
for (let k in map) {
if (map[k]) {
this.taskList = {
@ -234,7 +241,7 @@
}
}
}
// 1 , 0
// 1 , 0 Thrombolysis
if (haveFlagInspect) {
if (
this.$route.name !== 'Inspect' &&

34
src/layouts/BasicLayout.vue

@ -107,7 +107,8 @@
} from 'vuex';
import store from '@/store';
import {
loginInfo
loginInfo,
messageQuery
} from 'api';
import icon01 from '@/assets/images/slice/icon01.png'
import icon01H from '@/assets/images/slice/icon01H.png'
@ -180,13 +181,38 @@
if (item.path == 'person') {
if (this.visible) this.onClose()
else this.showPersion()
} else {
} else if(item.path == '/firstaid/patientList'){
this.visible = false;
this.onClickPat()
}else {
this.visible = false;
this.$router.push(item.path)
}
},
onClickPat() {
this.$router.push('/firstaid/thrombolysis')
async onClickPat() {
const {firstAidId} = this.patientData
if(firstAidId){
const res = await messageQuery(firstAidId);
const {
code,
msg,
data
} = res;
if (code === 200) {
const {
finishStatus,
} = res.data;
if(finishStatus == 0){
if(this.$route.name != 'Thrombolysis') this.$router.push('/firstaid/thrombolysis')
}else{
this.setPatientData({});
if(this.$route.name != 'PatientList') this.$router.replace('/firstaid/patientList')
}
}
}
},
async showPersion() {
this.visible = true;

8
src/main.js

@ -73,10 +73,10 @@ router.beforeEach(async (to, from, next) => {
}
});
router.afterEach(async (to, from) => {
if(to.path == '/firstaid/patientList' && store.state?.patient?.patientData?.firstAidId){
router.replace('/firstaid/thrombolysis')
return;
}
// if(to.path == '/firstaid/patientList' && store.state?.patient?.patientData?.firstAidId){
// router.replace('/firstaid/thrombolysis')
// return;
// }
})
document.addEventListener('UniAppJSBridgeReady', function() {
uni.getEnv(function(res) {

2
src/views/document/index.vue

@ -112,7 +112,7 @@
title: '身份证号',
dataIndex: 'patientIdCardNo',
key: '1',
width: 200
width: 238
},
{
title: '联系方式',

54
src/views/statistics/index.vue

@ -375,7 +375,11 @@
value: a[filed],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}
item.data.push(itemdata)
})
@ -430,7 +434,11 @@
value: a['decimal'],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}))
}];
@ -487,7 +495,11 @@
value: a[filed],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}
item.data.push(itemdata)
})
@ -539,7 +551,11 @@
value: a['decimal'],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}))
}];
@ -598,7 +614,11 @@
value: a[filed],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}
item.data.push(itemdata)
})
@ -650,7 +670,11 @@
value: a['bfNum'],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}))
}];
@ -725,7 +749,11 @@
value: a[filed],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}
item.data.push(itemdata)
})
@ -787,7 +815,11 @@
value: a[filed],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}
item.data.push(itemdata)
})
@ -850,7 +882,11 @@
value: a[filed],
itemStyle: {
borderRadius: [20, 20, 0, 0]
}
},
label: {
show: true,
position: 'top'
},
}
item.data.push(itemdata)
})

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

@ -2,13 +2,22 @@
<div class="throm-before3">
<a-card style="width:100%" :tab-list="tabList" :active-tab-key="activeTabKey"
@tabChange="key => onTabChange(key, 'key')">
<div class="image-container">
<div class="image-container" v-if="activeTabKey == 'tab1'">
<!-- <div class="notImg">单次检验影像安全区域</div> -->
<div v-if="list.length">
<!-- <div v-if="list.length">
<video :src="apiUrl+ img.path" controls autoplay loop muted width="100%" v-for="img in list">
您的浏览器不支持 video 标签
</video>
<img :src="apiUrl+ img.path" :alt="img.name" v-for="img in list" style="width: 100%;" />
</div>
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div> -->
<throm-interfere-image-dcm></throm-interfere-image-dcm>
</div>
<div class="image-container" v-else-if="activeTabKey == 'ct'">
<div class="emtpy">
<a-empty :image="emptyImage" description="暂无数据" />
</div>
</div>
</a-card>
@ -29,6 +38,7 @@
apiUrl
} from '@/config/setting.js';
import emptyImage from '@/assets/images/slice/empty.png'
import ThromInterfereImageDcm from './throm-interfere-image-dcm.vue'
import {
queryFirstAidInspectData,
queryVideo
@ -64,7 +74,9 @@
}
},
props: ['outside'],
components: {},
components: {
ThromInterfereImageDcm
},
computed: {
...mapState('patient', ['patientData', 'writeAble']),
},
@ -127,9 +139,25 @@
this.$message.success('患者已审核,内容不可更改')
return
}
if (!window.plus) {
// H5 使 `plus` API
this.$message.success('当前环境不支持 plus API')
return
// console.log(' plus API');
}
const cmr = plus.camera.getCamera();
const res = cmr.supportedImageResolutions[0];
const fmt = cmr.supportedImageFormats[0];
if (!cmr) {
this.$message.success('没有可用的摄像头');
return;
}
const res = cmr.supportedImageResolutions.length > 0 ? cmr.supportedImageResolutions[0] : null;
const fmt = cmr.supportedImageFormats.length > 0 ? cmr.supportedImageFormats[0] : null;
if (!res || !fmt) {
plus.nativeUI.toast('摄像头不支持该格式或分辨率');
return;
}
// const res = cmr.supportedImageResolutions[0];
// const fmt = cmr.supportedImageFormats[0];
cmr.captureImage(
(path) => {
plus.io.resolveLocalFileSystemURL(
@ -253,7 +281,7 @@
}
.btns {
margin-top: 2rem;
// margin-top: 2rem;
}
}
</style>

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

@ -233,7 +233,8 @@
item.patientAge = row.patientAge;
item.patientSex = row.patientSex;
item.studyId = row.studyId;
row.dcmPath = apiUrl + row.dcmPath;
// row.dcmPath = apiUrl + row.dcmPath;
row.dcmPath = 'http://116.204.114.73:9300/static/1884873965911019520/2025/1/30/CT.1.2.392.200036.9116.2.5.1.37.2420784501.1738221085.722823.dcm'
});
});
//
@ -405,6 +406,6 @@
width: 100%;
height: 100% !important;
box-sizing: border-box;
padding-bottom: 20px;
/* padding-bottom: 20px; */
}
</style>

123
src/views/thrombolysis/components/throm-report-observe.vue

@ -1,21 +1,132 @@
<template>
<a-modal class="doc-ct" width="85%" destroyOnClose :footer="null" v-model="visible" title="溶栓观察表">
<div class="doc-ct-content">
<div v-if="dataSource.length">
<!-- <div v-if="dataSource.length">
<div v-for="item in dataSource">
{{item.seriesTime}}
</div>
</div>
<div class="emtpy" v-else>
<a-empty :image="emptyImage" description="未检测到影像信息" />
</div> -->
<div>
<table>
<tr>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>诊断</td>
<td>观察者</td>
</tr>
<tr>
<td>发病时间</td>
<td>用药时间</td>
</tr>
<tr>
<td>溶栓药物</td>
<td>剂量</td>
<td>用法用量</td>
</tr>
<tr>
<td></td>
<td>血压(BP)</td>
<td>心率(HR)</td>
<td>血样饱和度(HR)</td>
<td>格拉斯评分</td>
<td>NIHSS</td>
</tr>
<tr>
<td>时间点</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>用药前</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>15min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>30min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>45min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>60min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>75min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>90min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>105min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>120min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</div>
</div>
</a-modal>
</template>
<script>
import emptyImage from '@/assets/images/slice/empty.png'
import {getCtInfoPath} from 'api'
import {
getCtInfoPath
} from 'api'
export default {
name: 'DocCt',
data() {
@ -26,9 +137,13 @@
}
},
methods: {
async open({firstAidId}) {
async open({
firstAidId
}) {
this.visible = true
const res = await getCtInfoPath({firstAidId})
const res = await getCtInfoPath({
firstAidId
})
this.dataSource = res.data || []
}
}

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

@ -18,7 +18,8 @@
</div>
<div class="report-patient-tags">
<div class="report-patient-tag">{{patient.firstAidZlTypeString || '-'}}</div>
<div class="report-patient-tag">发病时间</div>
<div class="report-patient-tag">发病时间{{queryItemInfo('XGZL-CCWC-TIME').toString() ||
'-'}}</div>
</div>
<div class="report-patient-row">
<span class="report-patient-rowlabel">联系方式: </span>
@ -184,9 +185,117 @@
<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="record-content" v-html="observeData"></div>
<div class="emtpy" v-if="!observeData">
<a-empty :image="emptyImage" description="暂无溶栓记录" />
</div> -->
<div>
<table border class="report-rsgcb">
<tr>
<td>姓名{{patient.patientName}}</td>
<td>性别{{patient.patientGenderString}}</td>
<td>年龄{{patient.patientAge}}</td>
<td>诊断{{patient.firstAidZlTypeString}}</td>
<td>观察者</td>
</tr>
<tr>
<td colspan="3">发病时间{{queryItemInfo('XGZL-CCWC-TIME').toString()}}</td>
<td colspan="3">用药时间{{}}</td>
</tr>
<tr>
<td colspan="2">溶栓药物{{queryItemInfo('JMRS-RSYW').toString()}}</td>
<td colspan="2">剂量</td>
<td colspan="2">用法用量</td>
</tr>
<tr>
<td></td>
<td>血压(BP)</td>
<td>心率(HR)</td>
<td>血样饱和度(HR)</td>
<td>格拉斯评分</td>
<td>NIHSS</td>
</tr>
<tr>
<td>时间点</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>用药前</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>15min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>30min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>45min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>60min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>75min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>90min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>105min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>120min</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</div>
</div>
</a-card>
@ -413,6 +522,14 @@
this.setTimerData(res.data);
}
},
queryItemInfo(type) {
const dict = this.patient?.recordValDict?.[type]
if (dict) {
return dict[0].answer
} else {
return '-'
}
},
onSubmit() {
// this.$emit('next')
},
@ -546,7 +663,7 @@
const {
firstAidId
} = this.patientData
const res = await queryLog({
firstAidId
})
@ -694,7 +811,13 @@
}
.report-rsgcb {
width: 100%;
td {
padding: 12px;
}
}
}

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

@ -3,7 +3,8 @@
<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 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"
@ -14,14 +15,14 @@
</div>
</a-form-item>
<a-form-item label="姓名">
<div class="detail-form-control" >
<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;"
<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>
@ -30,7 +31,8 @@
</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;"
<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}}
@ -41,13 +43,14 @@
<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;" />
@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="[
<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)">
@ -57,11 +60,11 @@
</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;">
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="[
<a-input :disabled="writeAble" v-if="k.type==='datetime'" readOnly @click="selectOption(v)"
style="width: 448px;" v-decorator="[
v,
]" placeholder='请选择'>
</a-input>
@ -79,7 +82,7 @@
<div class='diagnosis'>
<v-head text='疑似诊断'></v-head>
<div class='back-ff'>
<a-radio-group :disabled="writeAble" v-model:value="firstAidZlType" style="width: 448px;"
<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>
@ -88,7 +91,7 @@
</div>
<div class="common-picker">
<van-datetime-picker v-if="pickerVisable" v-model="currentDate" :formatter="formatter"
@cancel="pickerVisable = false" @confirm="onConfirm" style="width: 448px;" />
@cancel="pickerVisable = false" @confirm="onConfirm" />
</div>
</div>
<div class="basic-footer">

Loading…
Cancel
Save