242 lines
6.5 KiB
Vue
242 lines
6.5 KiB
Vue
<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> |