173 lines
5.8 KiB
Vue
173 lines
5.8 KiB
Vue
|
|
<template>
|
|||
|
|
<uni-popup ref="popup" type="bottom" :mask-click="false">
|
|||
|
|
<view class="bg-white" :style="elderVarStyle">
|
|||
|
|
<view class="popup-header flex items-center justify-between px-15 py-12">
|
|||
|
|
<view class="popup-title">提示</view>
|
|||
|
|
<uni-icons type="closeempty" :size="elderMode ? 32 : 24" color="#999" @click="close"></uni-icons>
|
|||
|
|
</view>
|
|||
|
|
<view class="px-15 py-12">
|
|||
|
|
<text class="text-base text-dark">您共提交{{ drugs.length }}种药品</text>
|
|||
|
|
<template v-if="list.length">
|
|||
|
|
<text class="text-base text-dark">,</text>
|
|||
|
|
<text class="text-base text-primary">{{ list.length }}</text>
|
|||
|
|
<text class="text-base text-dark">种有库存</text>
|
|||
|
|
</template>
|
|||
|
|
<template v-if="lackList.length || noStockList.length">
|
|||
|
|
<text class="text-base text-dark">,</text>
|
|||
|
|
<text class="text-base text-primary">{{ lackList.length + noStockList.length }}</text>
|
|||
|
|
<text class="text-base text-dark">种库存不足</text>
|
|||
|
|
</template>
|
|||
|
|
</view>
|
|||
|
|
<scroll-view scroll-y="true" class="popup-content-scroll">
|
|||
|
|
<view class="px-15 py-12">
|
|||
|
|
<view v-if="noStockList.length" class="bg-white rounded mt-12 px-15 py-12">
|
|||
|
|
<view class="text-base text-danger">暂时缺货({{ noStockList.length }})</view>
|
|||
|
|
<view v-for="i in noStockList" :key="i.insurance_code" class="flex py-5">
|
|||
|
|
<!-- <image class="flex-shrink-0 drug-checked-icon" :class="elderClass" src="/static/icons/unchecked.svg">
|
|||
|
|
</image> -->
|
|||
|
|
<view class="flex-grow">
|
|||
|
|
<text class="text-base text-drak">{{ i.name }} x {{ i.quantity }}</text>
|
|||
|
|
<text class="text-base text-gray"> (暂不支持购买)</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="lackList.length" class="bg-white rounded mt-12 px-15 py-12">
|
|||
|
|
<view class="text-base text-danger">库存不足({{ lackList.length }})</view>
|
|||
|
|
<view v-for="i in lackList" :key="i.insurance_code" class="flex py-5" @click="toggle(i)">
|
|||
|
|
<image class="flex-shrink-0 drug-checked-icon" :class="elderClass"
|
|||
|
|
:src="`/static/icons/${selectMap[i.insurance_code] === i.insurance_code ? 'checked' : 'unchecked'}.svg`">
|
|||
|
|
</image>
|
|||
|
|
<view class="flex-grow">
|
|||
|
|
<text class="text-base text-drak">{{ i.name }} x{{ i.stock }}</text>
|
|||
|
|
<text class="text-base text-gray"> (当前为最大可开数)</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="list.length" class="bg-white rounded mt-12 px-15 py-12">
|
|||
|
|
<view class="text-base text-success">库存充足({{ list.length }})</view>
|
|||
|
|
<view v-for="i in list" :key="i.insurance_code" class="flex py-5" @click="toggle(i)">
|
|||
|
|
<image class="flex-shrink-0 drug-checked-icon" :class="elderClass"
|
|||
|
|
:src="`/static/icons/${selectMap[i.insurance_code] === i.insurance_code ? 'checked' : 'unchecked'}.svg`">
|
|||
|
|
</image>
|
|||
|
|
<view class="flex-grow">
|
|||
|
|
<view class="text-base text-drak">{{ i.name }} x{{ i.quantity }}</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</scroll-view>
|
|||
|
|
<view class="footer-buttons">
|
|||
|
|
<footer-buttons :showConfirm="hasValidDrugs" cancelText="重新选药" confirmText="提交勾选药品" @cancel="close"
|
|||
|
|
@confirm="confirm" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</uni-popup>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup>
|
|||
|
|
import { computed, ref, watch } from 'vue';
|
|||
|
|
import useElder from '@/hooks/useElder';
|
|||
|
|
import FooterButtons from '@/components/footer-buttons.vue';
|
|||
|
|
const emits = defineEmits(['close', 'confirm'])
|
|||
|
|
const props = defineProps({
|
|||
|
|
drugs: {
|
|||
|
|
type: Array,
|
|||
|
|
default: () => []
|
|||
|
|
},
|
|||
|
|
visible: {
|
|||
|
|
type: Boolean,
|
|||
|
|
default: false
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
const selectMap = ref({});
|
|||
|
|
const popup = ref()
|
|||
|
|
const { elderClass, elderVarStyle, elderMode } = useElder();
|
|||
|
|
const list = computed(() => props.drugs.filter(i => i.stock >= i.quantity))
|
|||
|
|
const noStockList = computed(() => props.drugs.filter(i => i.stock === 0))
|
|||
|
|
const lackList = computed(() => props.drugs.filter(i => i.stock > 0 && i.stock < i.quantity))
|
|||
|
|
const hasValidDrugs = computed(() => list.value.length > 0 || lackList.value.length > 0)
|
|||
|
|
|
|||
|
|
function close() {
|
|||
|
|
emits('close')
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function confirm() {
|
|||
|
|
const data = props.drugs.map(i => {
|
|||
|
|
if (selectMap.value[i.insurance_code] !== i.insurance_code) return null;
|
|||
|
|
const item = { ...i };
|
|||
|
|
item.quantity = Math.min(i.stock, i.quantity);
|
|||
|
|
return item
|
|||
|
|
}).filter(Boolean);
|
|||
|
|
if (data.length === 0) {
|
|||
|
|
return toast('请勾选药品')
|
|||
|
|
}
|
|||
|
|
emits('confirm', data)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function initSelect() {
|
|||
|
|
selectMap.value = {};
|
|||
|
|
props.drugs.forEach(i => {
|
|||
|
|
selectMap.value[i.insurance_code] = i.stock > 0 ? i.insurance_code : '';
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toggle(med) {
|
|||
|
|
if (selectMap.value[med.insurance_code] === med.insurance_code) {
|
|||
|
|
selectMap.value[med.insurance_code] = '';
|
|||
|
|
} else {
|
|||
|
|
selectMap.value[med.insurance_code] = med.insurance_code;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
watch(() => props.visible, n => {
|
|||
|
|
if (n) {
|
|||
|
|
popup.value && popup.value.open()
|
|||
|
|
initSelect()
|
|||
|
|
} else {
|
|||
|
|
popup.value && popup.value.close()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.popup-header {
|
|||
|
|
border-bottom: 1px solid #eee;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.popup-title {
|
|||
|
|
font-size: var(--text-base);
|
|||
|
|
font-weight: bold;
|
|||
|
|
color: #333;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.popup-content-scroll {
|
|||
|
|
max-height: 55vh;
|
|||
|
|
background-color: #f5f5f5;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.text-base {
|
|||
|
|
font-size: var(--text-base);
|
|||
|
|
line-height: 1.5;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.pl-15 {
|
|||
|
|
padding-left: 30rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.py-5 {
|
|||
|
|
padding-top: 10rpx;
|
|||
|
|
padding-bottom: 10rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.drug-checked-icon {
|
|||
|
|
width: 36rpx;
|
|||
|
|
height: 36rpx;
|
|||
|
|
transform: translateY(2rpx);
|
|||
|
|
|
|||
|
|
@at-root &.caring-mode-active {
|
|||
|
|
width: 54rpx;
|
|||
|
|
height: 54rpx;
|
|||
|
|
transform: translateY(4rpx);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|