hn-hlw-app/pages/consult/select-drug/lack-reg-popup.vue
2026-07-27 11:26:39 +08:00

242 lines
6.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<uni-popup ref="popup" type="bottom" :mask-click="false">
<view class="bg-white" :style="elderVarStyle">
<view class="border-b flex items-center justify-between px-15 py-12">
<view class="text-lg text-dark font-semibold">缺货登记</view>
<uni-icons type="closeempty" :size="elderMode ? 32 : 24" color="#999" @click="close"></uni-icons>
</view>
<scroll-view scroll-y="true" class="popup-content-scroll bg-gray">
<view class="px-15 py-12 bg-white shadow-lg">
<view>
<text class="is-required">*</text>
<text class="text-base text-dark">药品名称:</text>
</view>
<view class="px-10 py-5 mt-12 border rounded-sm">
<input v-model="form.drugName" class="w-full text-base text-dark" placeholder-class="text-base text-gray"
placeholder="请输入药品名称" :maxlength="100" />
</view>
</view>
<view class="mt-12 px-15 py-12 bg-white shadow-lg">
<view>
<text class="text-dark text-base mr-5">药品图片</text>
<text class="text-sm text-gray">务必上传图片以便我们更好地获悉你的药品需求</text>
</view>
<view class="flex flex-wrap">
<view v-for="i in form.images" :key="i.key" class="relative lack-image mt-12 mr-5"
:class="i.uploaded ? 'uploaded' : ''">
<image :src="i.tempPath || i.url" class="lack-image"></image>
<view class="remove-icon" @click="removeImage(idx)">
<uni-icons type="closeempty" size="24" color="red"></uni-icons>
</view>
</view>
<view v-if="form.images.length < 5" class="mt-12 lack-image border rounded" @click="chooseImage()">
<uni-icons type="camera" size="70" />
</view>
</view>
</view>
<view class="mt-12 px-15 py-12 bg-white shadow-lg">
<view class="text-base text-dark">需求补充描述</view>
<view class="px-10 py-5 mt-12 border rounded-sm">
<textarea v-model="form.description" class="w-full text-base text-dark min-h-100"
placeholder-class="text-base text-gray" placeholder="可以补充描述药品的规格、厂家等详细信息,以便我们更好地获悉你的药品需求"
:auto-height="true" :maxlength="500" :show-count="false" />
</view>
</view>
</scroll-view>
<view class="footer-buttons">
<footer-buttons confirmText="提交" @cancel="close()" @confirm="submit()" />
</view>
</view>
</uni-popup>
</template>
<script setup>
import { ref, watch } from 'vue';
import useElder from '@/hooks/useElder';
import { uploadUrl, getFullPath } from '@/utils/http';
import { loading, hideLoading, toast } from '@/utils/widget';
import { addLackMedicineReg } from '@/utils/api';
import FooterButtons from '@/components/footer-buttons.vue';
const emits = defineEmits(['close', 'confirm'])
const props = defineProps({
order: {
type: Object,
default: () => ({})
},
visible: {
type: Boolean,
default: false
}
})
const popup = ref();
const form = ref({
drugName: '',
images: [],
description: ''
})
const { elderMode, elderVarStyle } = useElder();
function init() {
form.value.drugName = '';
form.value.images = [];
form.value.description = '';
}
function chooseImage() {
uni.chooseImage({
count: 5 - form.value.images.length,
sizeType: ['compressed'],
sourceType: ['album'],
success: (res) => {
form.value.images = res.tempFilePaths.map((i, idx) => ({ key: `${Date.now()}-${idx}`, tempPath: i, uploaded: false, url: '' }))
}
})
}
function removeImage(idx) {
form.value.images.splice(idx, 1)
}
function close() {
emits('close')
}
async function submit() {
if (form.value.drugName.trim() === '') {
toast('请输入药品名称')
return
}
if (form.value.images.length) {
await uploadImages()
}
const data = {
accountId: props.order.accountId,
patientName: props.order.name,
patientId: props.order.patientId,
phone: props.order.mobile,
regType: 'manual',
drugName: form.value.drugName.trim(),
images: form.value.images.map(i => i.url).filter(Boolean),
description: form.value.description.trim(),
}
loading()
const res = await addLackMedicineReg(data)
hideLoading()
if (res && res.success) {
close()
toast('登记成功', { icon: 'success' })
} else {
toast(res?.message || '提交失败')
}
}
async function uploadImages() {
const tempFilePaths = form.value.images.map(i => i.uploaded ? '' : i.tempPath).filter(Boolean);
if (tempFilePaths.length === 0) {
return
}
loading('正在上传图片...')
const res = await Promise.all(tempFilePaths.map(upload));
hideLoading()
tempFilePaths.forEach((tempPath, idx) => {
const url = res[idx];
if (url) {
const index = form.value.images.findIndex(i => i.tempPath === tempPath);
if (index > -1) {
form.value.images[index].url = url;
form.value.images[index].uploaded = true;
}
}
})
const successCount = res.filter(Boolean).length;
const failedCount = tempFilePaths.length - successCount;
if (failedCount > 0) {
toast(`上传失败${failedCount}张图片`)
return Promise.reject()
}
}
function upload(path) {
return new Promise((resolve) => {
uni.uploadFile({
url: uploadUrl, // 替换为你的上传接口地址
filePath: path,
name: 'file',
fileType: 'image',
success: (res) => {
try {
const url = JSON.parse(res.data).filePath;
resolve(url ? getFullPath(url) : '')
} catch (e) {
resolve()
}
},
fail: res => {
resolve()
}
})
})
}
watch(() => props.visible, n => {
if (n) {
popup.value && popup.value.open()
init()
} else {
popup.value && popup.value.close()
}
})
</script>
<style lang="scss" scoped>
.popup-title {
font-size: var(--text-base);
font-weight: bold;
color: #333;
}
.popup-content-scroll {
max-height: 75vh;
}
.min-h-100 {
min-height: 100px;
}
.is-required {
color: red;
margin: 10rpx;
font-weight: bold;
}
.lack-image {
width: 70px;
height: 70px;
}
.uploaded::after {
content: "已上传";
position: absolute;
bottom: 0;
left: 0;
right: 0;
text-align: center;
font-size: var(--text-sm);
color: white;
line-height: 1.4;
background: rgba(0, 0, 0, 0.4);
}
.remove-icon {
position: absolute;
right: 0;
top: 0;
padding-left: 40rpx;
}
</style>