医疗预览页完事

This commit is contained in:
Teng 2026-01-14 14:31:43 +08:00
parent f7f979669d
commit 89bee2ba9f
55 changed files with 387 additions and 126 deletions

View File

@ -1138,7 +1138,7 @@
}) })
const filteredMenu = (index : number) => { const filteredMenu = (index : number) => {
console.log(leftMenuArray.value.filter(item => Number(item.areaFlag) - 1 == index)) // console.log(leftMenuArray.value.filter(item => Number(item.areaFlag) - 1 == index))
return leftMenuArray.value.filter(item => Number(item.areaFlag) - 1 == index); return leftMenuArray.value.filter(item => Number(item.areaFlag) - 1 == index);
} }
const getmenu = () => { const getmenu = () => {

View File

@ -531,9 +531,43 @@
height: 100%; height: 100%;
margin-left: 14%; margin-left: 14%;
background-color: #F7F8F9; background-color: #F7F8F9;
border-radius: 15rpx; border-radius: 25rpx;
padding-top: 10rpx; padding-top: 10rpx;
padding-left: 20rpx; padding-left: 20rpx;
/* position: relative; */
.history-left-jiao{
position: absolute;
right: 0;
top: 0;
width: 85rpx;
height: 45rpx;
background-color: #D9E5FF;
display: flex;
align-items: center;
justify-content: center;
border-top-right-radius: 25rpx;
border-bottom-left-radius: 25rpx;
color: #3C9CFD;
font-size: 19rpx;
font-weight: 600;
}
.history-left-jiao-error{
position: absolute;
right: 0;
top: 0;
width: 85rpx;
height: 45rpx;
background-color: #FFEBEB;
display: flex;
align-items: center;
justify-content: center;
border-top-right-radius: 25rpx;
border-bottom-left-radius: 25rpx;
color: #F76E6E;
font-size: 19rpx;
font-weight: 600;
}
} }
/* background-color: red; */ /* background-color: red; */
@ -579,6 +613,7 @@
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
transition: height 0.3s ease;
.history-left { .history-left {
/* margin-left: 58rpx; */ /* margin-left: 58rpx; */
@ -630,10 +665,12 @@
.history-shu-up { .history-shu-up {
position: absolute; position: absolute;
left: 32rpx; left: 32rpx;
top: -53.5%; bottom: calc(50% + 13rpx);
width: 3rpx; width: 3rpx;
height: 93%; height: 110rpx;
background-color: #E5E5E5; background-color: #E5E5E5;
transition: height 0.3s ease;
} }
.history-shu-circle { .history-shu-circle {
@ -668,7 +705,7 @@
.future-item-target { .future-item-target {
width: 90%; width: 90%;
margin-left: 5%; margin-left: 5%;
min-height: 152rpx; height: 152rpx;
margin-bottom: 10rpx; margin-bottom: 10rpx;
background-color: #F7F8F9; background-color: #F7F8F9;
border-radius: 30rpx; border-radius: 30rpx;
@ -679,14 +716,14 @@
color: #555555; color: #555555;
position: relative; position: relative;
border: 2rpx solid #4690FF; border: 2rpx solid #4690FF;
transition: height 0.3s ease;
} }
.future-item { .future-item {
width: 90%; width: 90%;
margin-left: 5%; margin-left: 5%;
min-height: 152rpx; height: 152rpx;
margin-bottom: 10rpx; margin-bottom: 10rpx;
background-color: #F7F8F9; background-color: #F7F8F9;
border-radius: 30rpx; border-radius: 30rpx;
@ -697,7 +734,7 @@
color: #555555; color: #555555;
position: relative; position: relative;
border: 2rpx solid #F7F8F9; border: 2rpx solid #F7F8F9;
transition: height 0.3s ease; /* transition: height 0.3s ease; */
} }
@ -733,6 +770,7 @@
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.future-info { .future-info {
position: absolute; position: absolute;
left: 23rpx; left: 23rpx;
@ -741,14 +779,24 @@
color: #555555; color: #555555;
display: flex; display: flex;
} }
.info{ .future-info-second {
position: absolute;
left:80rpx;
bottom: 12rpx;
font-size: 25rpx;
color: #555555;
display: flex; display: flex;
.info-img{ }
.info {
display: flex;
.info-img {
width: 30rpx; width: 30rpx;
height: 30rpx; height: 30rpx;
margin-right: 3rpx; margin-right: 3rpx;
} }
} }
.calendar-father { .calendar-father {
position: fixed; position: fixed;
top: 150rpx; top: 150rpx;
@ -788,6 +836,13 @@
font-size: 22rpx; font-size: 22rpx;
} }
.small-font-target {
margin-top: 3rpx;
width: 310rpx;
color: #999999;
font-size: 22rpx;
}
.card-bao { .card-bao {
position: absolute; position: absolute;
right: 30rpx; right: 30rpx;
@ -847,7 +902,7 @@
top: 20rpx; top: 20rpx;
display: flex; display: flex;
gap: 5rpx; gap: 5rpx;
/* height: 28px; */ /* height: 28px; */
/* 点的高度 + 跳起空间 */ /* 点的高度 + 跳起空间 */
@ -860,7 +915,7 @@
background: #4690FF; background: #4690FF;
border-radius: 50%; border-radius: 50%;
animation: jump 1.5s ease-in-out infinite; animation: jump 1.5s ease-in-out infinite;
} }
@ -883,19 +938,23 @@
animation: none; animation: none;
} }
} }
.open-img-father{
.open-img-father {
position: absolute; position: absolute;
right: 35rpx; right: 35rpx;
bottom: 28rpx; bottom: 28rpx;
width: 22rpx; width: 22rpx;
height: 22rpx; height: 22rpx;
transition: transform 0.3s ease;
.open-img{
.open-img {
width: 100%; width: 100%;
height: 100%; height: 100%;
transition: transform 0.3s ease;
} }
} }
.serviceContent{
.serviceContent {
color: #999999; color: #999999;
margin-top: 20rpx; margin-top: 20rpx;
} }

View File

@ -120,64 +120,102 @@
</view> </view>
<view class="order-future"> <view class="order-future">
<scroll-view class="future-items" scroll-with-animation scroll-y :scroll-top="firsttopmove"> <scroll-view class="future-items" scroll-with-animation scroll-y :scroll-top="firsttopmove">
<view :class="moveById===item.id? `future-item-target`: `future-item`" <view style="position: relative;" v-for="(item,index) in upmenuarray" :key="index"
:style="firstListTarget===index?{height:`304rpx`}:{height:`152rpx`}" @click="searchtable(item);">
v-for="(item,index) in upmenuarray" :key="index" @click="searchtable(item);"> <view :class="moveById===item.id? `future-item-target`: `future-item`">
<view class="future-fonts"> <view class="future-fonts">
<view class="card-over"> <view class="card-over">
{{ item.directiveName }} {{ item.directiveName }}
</view>
{{ ` | ` +item.serviceDuration + `分钟` }}
</view> </view>
{{ ` | ` +item.serviceDuration + `分钟` }} <view class="future-time">
</view> <text class="time">
<view class="future-time"> {{ extractHHMM(item.startTime) }}
<text class="time"> </text>
{{ extractHHMM(item.startTime) }} <view class="time-right-bad" v-if="item.tagtype">
</text> {{ item.tagtype=="1"?'即将开始':'指令尚未开始' }}
<view class="time-right-bad" v-if="item.tagtype"> </view>
{{ item.tagtype=="1"?'即将开始':'指令尚未开始' }} <view class="time-right-blue" v-else>
</view> 正在进行
<view class="time-right-blue" v-else> <view class="ellipsis">
正在进行 <view v-for="(n, idx) in 3" :key="idx" class="dot"
<view class="ellipsis"> :style="{ animationDelay: (idx * 0.12) + 's' }"></view>
<view v-for="(n, idx) in 3" :key="idx" class="dot" </view>
:style="{ animationDelay: (idx * 0.12) + 's' }"></view>
</view> </view>
</view> </view>
</view> <view class="future-tag">
<view class="future-tag"> {{ item.cycleType }}
{{ item.cycleType }}
</view>
<view class="future-info" v-if="firstListTarget===index">
<view class="info" v-if="item.optType == 2">
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optNames?.split(',')[0] }}
</view>
<image class="info-img" style="margin-left: 15rpx;" src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames?.split(',')[1] }}
</view>
</view> </view>
<view class="info" v-else> <view class="open-img-father" v-if="!item.tagtype"
<image class="info-img" src="/static/index/leftpeople.png" /> @click.stop="clickfirstarray(item,index);"
<view class=""> :style="firstListTarget===index?{transform: `rotate(180deg)`}:{}">
{{ item.optTypeName }} <image class="open-img" src="/static/index/down.png" />
</view>
<image class="info-img" style="margin-left: 15rpx;" src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames }}
</view>
</view> </view>
</view> </view>
<view class="open-img-father" v-if="!item.tagtype" <view
@click.stop="clickfirstarray(item,index)" style="position: absolute;top: 0;left: 0;transition: height 0.3s, top 0.3s;z-index: 9999; ;"
:style="firstListTarget===index?{transform: `rotate(180deg)`}:{}"> :class="moveById===item.id? `future-item-target`: `future-item`" :style="{
<image class="open-img" src="/static/index/down.png" /> height: firstListTarget === index ? '320rpx' : '152rpx',
left: firstListTargetShow === index ? '0' : '999rpx',
top: index === upmenuarray.length - 1 && firstListTarget === index? `-168rpx`:`0rpx`
}">
<view class="future-fonts">
<view class="card-over">
{{ item.directiveName }}
</view>
{{ ` | ` +item.serviceDuration + `分钟` }}
</view>
<view class="future-time">
<text class="time">
{{ extractHHMM(item.startTime) }}
</text>
<view class="time-right-bad" v-if="item.tagtype">
{{ item.tagtype=="1"?'即将开始':'指令尚未开始' }}
</view>
<view class="time-right-blue" v-else>
正在进行
<view class="ellipsis">
<view v-for="(n, idx) in 3" :key="idx" class="dot"
:style="{ animationDelay: (idx * 0.12) + 's' }"></view>
</view>
</view>
</view>
<view class="future-tag">
{{ item.cycleType }}
</view>
<view class="future-info" v-if="firstListTarget===index">
<view class="info" v-if="item.optType == 2">
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optNames?.split(',')[0] }}
</view>
<image class="info-img" style="margin-left: 15rpx;"
src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames?.split(',')[1] }}
</view>
</view>
<view class="info" v-else>
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optTypeName }}
</view>
<image class="info-img" style="margin-left: 15rpx;"
src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames }}
</view>
</view>
</view>
<view class="open-img-father" @click.stop="clickfirstarray(item,index)"
:style="firstListTarget===index?{transform: `rotate(180deg)`}:{}">
<image class="open-img" src="/static/index/down.png" />
</view>
<view class="serviceContent" v-if="firstListTarget===index">
{{ item.serviceContent }}
</view>
</view> </view>
<view class="serviceContent" v-if="firstListTarget===index">
{{ item.serviceContent }}
</view>
</view> </view>
</scroll-view> </scroll-view>
</view> </view>
@ -192,30 +230,129 @@
</view> </view>
<scroll-view class="history-items" scroll-with-animation scroll-y <scroll-view class="history-items" scroll-with-animation scroll-y
:scroll-top="secondtopmove"> :scroll-top="secondtopmove">
<view class="history-item" v-for="(item,index) in downmenuarray" :key="index" <view v-for="(item,index) in downmenuarray" :key="index" @click="searchtable(item);">
@click="searchtable(item);"> <view class="history-item">
<view class="history-shu-up" v-if="index"></view> <view class="history-shu-up" v-if="index"></view>
<view class="history-shu-circle"></view> <view class="history-shu-circle"></view>
<view class="history-spe" <view class="history-spe"
:style="moveById===item.id?{border:`2rpx solid #46B2F6`}:{border:`2rpx solid transparent`}"> :style="moveById===item.id?{border:`2rpx solid #46B2F6`}:{border:`2rpx solid transparent`}">
<view class="history-left"> <view class="history-left">
<view class="history-time"> <view
{{ extractHHMM(item.startTime) }} :class="item.executeStatus!==`hisOk`?`history-left-jiao-error`: `history-left-jiao`"
</view> style="top: 2rpx;right: 2rpx;"
<view style="display: flex;width: 1000rpx;"> v-show="secondListTargetShow !== index">
<image class="history-img" {{ item.rightshow }}
:src="`${serverUrl}${item.previewFileSmall}`" /> </view>
<view class="history-name"> <view class="history-time">
{{ item.directiveName+" " }}|{{" " + item.serviceDuration + `分钟` }} {{ extractHHMM(item.startTime) }}
</view>
<view style="display: flex;width: 1000rpx;">
<image class="history-img"
:src="`${serverUrl}${item.previewFileSmall}`" />
<view class="history-name">
{{ item.directiveName+" " }}|{{" " + item.serviceDuration + `分钟` }}
</view>
</view>
<view class="small-font">
{{ item.serviceContent }}
</view> </view>
</view> </view>
<view class="small-font"> <view class="history-spe"
{{ item.serviceContent }} style="position: absolute;top: 0;left: 0;transition: height 0.3s, top 0.3s;z-index: 9999; "
:style="{
height: secondListTarget === index ? '260rpx' : '120rpx',
left: secondListTargetShow === index ? '0' : '999rpx',
top: index === downmenuarray.length - 1 && secondListTarget === index ? '-140rpx' : '0rpx',
border: moveById === item.id ? '2rpx solid #46B2F6' : '2rpx solid transparent'
}">
<view class="history-left">
<view
:class="item.executeStatus!==`hisOk`?`history-left-jiao-error`: `history-left-jiao`"
v-show="secondListTargetShow === index">
{{ item.rightshow }}
</view>
<view class="history-time">
{{ extractHHMM(item.startTime) }}
</view>
<view style="display: flex;width: 1000rpx;">
<image class="history-img"
:src="`${serverUrl}${item.previewFileSmall}`" />
<view class="history-name">
{{ item.directiveName+" " }}|{{" " + item.serviceDuration + `分钟` }}
</view>
</view>
<view
:class="secondListTarget===index?`small-font-target`:`small-font`">
{{ item.serviceContent }}
</view>
</view>
<view class="future-info-second" style="left: 20rpx;"
v-if="secondListTarget===index">
<view class="info" v-if="item.optType == 2">
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optNames?.split(',')[0] }}
</view>
<image class="info-img" style="margin-left: 15rpx;"
src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames?.split(',')[1] }}
</view>
</view>
<view class="info" v-else>
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optTypeName }}
</view>
<image class="info-img" style="margin-left: 15rpx;"
src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames }}
</view>
</view>
</view>
<view class="open-img-father" style="right: 15rpx;bottom: 11.5rpx;"
@click.stop="clicksecondarray(item,index)">
<image
:style="secondListTarget===index?{transform: `rotate(180deg)`}:{}"
class="open-img" src="/static/index/down.png" />
</view>
</view> </view>
</view> </view>
<view class="future-info-second"
v-if="secondListTarget===index&& secondListTargetShow !== index">
<view class="info" v-if="item.optType == 2">
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optNames?.split(',')[0] }}
</view>
<image class="info-img" style="margin-left: 15rpx;"
src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames?.split(',')[1] }}
</view>
</view>
<view class="info" v-else>
<image class="info-img" src="/static/index/leftpeople.png" />
<view class="">
{{ item.optTypeName }}
</view>
<image class="info-img" style="margin-left: 15rpx;"
src="/static/index/rightpeople.png" />
<view class="">
{{ item.optNames }}
</view>
</view>
</view>
<view class="open-img-father" style="right: 16rpx;bottom: 12rpx;"
@click.stop="clicksecondarray(item,index)">
<image class="open-img" src="/static/index/down.png"
:style="secondListTarget===index?{transform: `rotate(180deg)`}:{}" />
</view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
</view> </view>
<view class="calendar-father" v-show="opendata"> <view class="calendar-father" v-show="opendata">
@ -252,6 +389,55 @@
const firstListTarget = ref(-1) const firstListTarget = ref(-1)
const secondListTarget = ref(-1) const secondListTarget = ref(-1)
const firstListTargetShow = ref(-1)
const secondListTargetShow = ref(-1)
let _hideTimer = null
watch(secondListTarget, (newVal) => {
//
if (_hideTimer) {
clearTimeout(_hideTimer)
_hideTimer = null
}
if (newVal === -1) {
// 0.3s -1
_hideTimer = setTimeout(() => {
secondListTargetShow.value = -1
_hideTimer = null
}, 300) // 300ms = 0.3s
} else {
// -1
secondListTargetShow.value = newVal
}
})
watch(firstListTarget, (newVal) => {
//
if (_hideTimer) {
clearTimeout(_hideTimer)
_hideTimer = null
}
if (newVal === -1) {
// 0.3s -1
_hideTimer = setTimeout(() => {
firstListTargetShow.value = -1
_hideTimer = null
}, 300) // 300ms = 0.3s
} else {
// -1
firstListTargetShow.value = newVal
}
})
onBeforeUnmount(() => {
if (_hideTimer) {
clearTimeout(_hideTimer)
_hideTimer = null
}
})
/* ---- transform ---- /* ---- transform ----
注意虽然这是响应式但我们只在 rAF 里更新它受控更新避免频繁触发 Vue 渲染 */ 注意虽然这是响应式但我们只在 rAF 里更新它受控更新避免频繁触发 Vue 渲染 */
const transformStyle = ref('translate3d(0, 0, 0)'); const transformStyle = ref('translate3d(0, 0, 0)');
@ -477,10 +663,17 @@
const clickfirstarray = (item, index) => { const clickfirstarray = (item, index) => {
if (firstListTarget.value != -1) { if (firstListTarget.value != -1) {
firstListTarget.value = -1 firstListTarget.value = -1
} else if (!item.tagtype) { } else {
firstListTarget.value = index; firstListTarget.value = index;
} }
} }
const clicksecondarray = (item, index) => {
if (secondListTarget.value != -1) {
secondListTarget.value = -1
} else if (!item.tagtype) {
secondListTarget.value = index;
}
}
// //
function genPaths(base, prefix, count, ext = 'png', startIndex = 0, pad = false) { function genPaths(base, prefix, count, ext = 'png', startIndex = 0, pad = false) {
return Array.from({ length: count }, (_, i) => { return Array.from({ length: count }, (_, i) => {
@ -637,6 +830,15 @@
} }
}) })
upmenuarray.value = [...data.result.current, ...data.result.future] upmenuarray.value = [...data.result.current, ...data.result.future]
data.result.history.forEach((element : any, index : number) => {
if (element.executeStatus === 'hisUnExe') {
element.rightshow = `未执行`
} else if (element.executeStatus === 'hisTimeOut') {
element.rightshow = `超时`
} else if (element.executeStatus === 'hisOk') {
element.rightshow = `已完成`
}
})
downmenuarray.value = [...data.result.history] downmenuarray.value = [...data.result.history]
timearr.value = Array.from({ length: 24 }, (_, hour) => ({ timearr.value = Array.from({ length: 24 }, (_, hour) => ({
positioning: hour.toString(), positioning: hour.toString(),

View File

@ -294,9 +294,9 @@
}) })
} }
if (index == 1) { if (index == 1) {
// uni.navigateTo({ uni.navigateTo({
// url: '/pages/recording/recorder' url: '/pages/recording/recorder'
// }) })
} }
// if (index == 2) { // if (index == 2) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

View File

@ -574,7 +574,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
) )
]); ]);
} }
const camera = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["styles", [_style_0]], ["__file", "D:/项目/hldy_app_mini/pages/camera.nvue"]]); const camera = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["styles", [_style_0]], ["__file", "D:/hldy_app_mini/pages/camera.nvue"]]);
export { export {
camera as default camera as default
}; };

View File

@ -578,7 +578,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
) )
]); ]);
} }
const fullcamera = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["styles", [_style_0]], ["__file", "D:/项目/hldy_app_mini/pages/fullcamera.nvue"]]); const fullcamera = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["styles", [_style_0]], ["__file", "D:/hldy_app_mini/pages/fullcamera.nvue"]]);
export { export {
fullcamera as default fullcamera as default
}; };

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B