| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="client-visit-detail"> |
| | | <PageHeader :title="detailType === 1 ? 'æ°å¢ç¥è¯åº' : 'ç¥è¯åºè¯¦æ
'" |
| | | @back="goBack" /> |
| | | <u-form ref="formRef" |
| | | label-width="90"> |
| | | <!-- 客æ·ä¿¡æ¯ --> |
| | | <!-- <u-cell-group title="ç¥è¯ä¿¡æ¯"> --> |
| | | <u-form-item label="ç¥è¯æ é¢" |
| | | prop="title" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.title" |
| | | :readonly="readonly" |
| | | placeholder="请è¾å
¥ç¥è¯æ é¢" /> |
| | | </u-form-item> |
| | | <u-form-item label="ç¥è¯ç±»å" |
| | | prop="type" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="equipmentname" |
| | | readonly |
| | | placeholder="è¯·éæ©ç¥è¯ç±»å" |
| | | @click="showEquipmentSheet = true" /> |
| | | <template v-if="!readonly" |
| | | #right> |
| | | <up-icon name="arrow-right" |
| | | @click="openEquipmentSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="éç¨åºæ¯" |
| | | prop="scenario" |
| | | border-bottom> |
| | | <u-input v-model="form.scenario" |
| | | readonly="readonly" |
| | | placeholder="请è¾å
¥éç¨åºæ¯" /> |
| | | </u-form-item> |
| | | <u-form-item label="è§£å³æç" |
| | | prop="status" |
| | | border-bottom> |
| | | <u-input v-model="statusname" |
| | | readonly |
| | | placeholder="è¯·éæ©è§£å³æç" |
| | | @click="showStatusSheet = true" /> |
| | | <template v-if="!readonly" |
| | | #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showStatusSheet = true"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="é®é¢æè¿°" |
| | | required |
| | | prop="remark" |
| | | border-bottom> |
| | | <u-textarea v-model="form.problem" |
| | | type="textarea" |
| | | rows="4" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥é®é¢æè¿°" /> |
| | | </u-form-item> |
| | | <u-form-item label="è§£å³æ¹æ¡" |
| | | prop="solution" |
| | | required |
| | | border-bottom> |
| | | <u-textarea v-model="form.solution" |
| | | type="textarea" |
| | | rows="4" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥è§£å³æ¹æ¡" /> |
| | | </u-form-item> |
| | | <u-form-item label="å
³é®è¦ç¹" |
| | | prop="keyPoints" |
| | | border-bottom> |
| | | <u-textarea v-model="form.keyPoints" |
| | | type="textarea" |
| | | rows="4" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥å
³é®è¦ç¹ï¼ç¨éå·åé" /> |
| | | </u-form-item> |
| | | <u-form-item label="å建人" |
| | | prop="creator" |
| | | border-bottom> |
| | | <u-input v-model="form.creator" |
| | | :readonly="readonly" |
| | | placeholder="请è¾å
¥å建人" /> |
| | | </u-form-item> |
| | | <u-form-item label="ä½¿ç¨æ¬¡æ°" |
| | | prop="usageCount" |
| | | border-bottom> |
| | | <uni-number-box v-model="form.usageCount" |
| | | :min="0" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥ä½¿ç¨æ¬¡æ°" /> |
| | | </u-form-item> |
| | | <!-- </u-cell-group> --> |
| | | <!-- æäº¤æé® --> |
| | | <view v-if="!readonly" |
| | | class="footer-btns"> |
| | | <u-button class="cancel-btn" |
| | | @click="goBack">åæ¶</u-button> |
| | | <u-button class="sign-btn" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | :loading="loading">ä¿å</u-button> |
| | | </view> |
| | | </u-form> |
| | | <!-- 设å¤é
ç½®éæ©å¨ --> |
| | | <up-action-sheet :show="showEquipmentSheet" |
| | | :actions="equipmentOptions" |
| | | @select="handleEquipmentChange" |
| | | @close="showEquipmentSheet = false" /> |
| | | <!-- <u-popup :show="showEquipmentSheet" |
| | | mode="bottom" |
| | | @close="showEquipmentSheet = false" |
| | | height="200px"> |
| | | <view class="popup-content"> |
| | | <view class="popup-body"> |
| | | <u-checkbox-group v-model="form.equipment" |
| | | @change="handleEquipmentChange" |
| | | icon-placement="right" |
| | | placement="row"> |
| | | <view style="width:100%;padding:10px;margin-top:20px;"> |
| | | <u-checkbox v-for="option in equipmentOptions" |
| | | :key="option.value" |
| | | :name="option.value" |
| | | :label="option.name" |
| | | class="checkbox-item"></u-checkbox> |
| | | </view> |
| | | </u-checkbox-group> |
| | | </view> |
| | | </view> |
| | | </u-popup> --> |
| | | <!-- ç¶æéæ©å¨ --> |
| | | <up-action-sheet :show="showStatusSheet" |
| | | :actions="statusOptions" |
| | | @select="onStatusSelect" |
| | | @close="showStatusSheet = false" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "meeting-settings-detail" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted, computed } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { useDict } from "@/utils/dict"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | import { |
| | | addKnowledgeBase, |
| | | updateKnowledgeBase, |
| | | getKnowledgeBaseDetail, |
| | | } from "@/api/managementMeetings/knowledgeBase"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | title: "", |
| | | type: "", |
| | | scenario: "", |
| | | efficiency: "", |
| | | problem: "", |
| | | solution: "", |
| | | keyPoints: "", |
| | | creator: "", |
| | | usageCount: 0, |
| | | }); |
| | | const { knowledge_type } = useDict("knowledge_type"); |
| | | const knowledgeTypeOptions = computed(() => knowledge_type?.value || []); |
| | | const equipmentOptions = ref([]); |
| | | const statusOptions = ref([ |
| | | { value: "high", name: "æ¾èæå" }, |
| | | { value: "medium", name: "ä¸è¬æå" }, |
| | | { value: "low", name: "轻微æå" }, |
| | | ]); |
| | | //// 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | const showEquipmentSheet = ref(false); |
| | | const showStatusSheet = ref(false); |
| | | const openEquipmentSheet = () => { |
| | | showEquipmentSheet.value = true; |
| | | }; |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | const statusname = ref(""); |
| | | // ç¶æéæ© |
| | | const onStatusSelect = action => { |
| | | form.value.efficiency = action.value; |
| | | statusname.value = action.name; |
| | | showStatusSheet.value = false; |
| | | }; |
| | | const equipmentname = ref(""); |
| | | // 设å¤é
ç½®éæ© |
| | | const handleEquipmentChange = val => { |
| | | form.value.type = val.value; |
| | | equipmentname.value = val.name; |
| | | showEquipmentSheet.value = false; |
| | | }; |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.title) { |
| | | showToast("请è¾å
¥æ é¢"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.scenario) { |
| | | showToast("请è¾å
¥éç¨åºæ¯"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.problem) { |
| | | showToast("请è¾å
¥é®é¢æè¿°"); |
| | | return; |
| | | } |
| | | if (!form.value.solution) { |
| | | showToast("请è¾å
¥è§£å³æ¹æ¡"); |
| | | return; |
| | | } |
| | | try { |
| | | loading.value = true; |
| | | if (detailType.value === 1) { |
| | | addKnowledgeBase(form.value).then(res => { |
| | | if (res.code !== 200) { |
| | | showToast("ä¿å失败ï¼è¯·éè¯"); |
| | | return; |
| | | } |
| | | loading.value = false; |
| | | showToast("ä¿åæå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | }); |
| | | } else if (detailType.value === 2) { |
| | | updateKnowledgeBase(form.value).then(res => { |
| | | if (res.code !== 200) { |
| | | showToast("ä¿å失败ï¼è¯·éè¯"); |
| | | return; |
| | | } |
| | | loading.value = false; |
| | | showToast("ä¿åæå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | }); |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("ä¿å失败:", e); |
| | | showToast("ä¿å失败ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 仿¬å°åå¨ä¸è·åä¼è®® room æ°æ® |
| | | const meetingRoom = uni.getStorageSync("meetingRoom"); |
| | | if (meetingRoom) { |
| | | form.value = JSON.parse(JSON.stringify(meetingRoom)); |
| | | if (meetingRoom.equipment) { |
| | | if (Array.isArray(meetingRoom.equipment)) { |
| | | form.value.equipment = meetingRoom.equipment; |
| | | } else { |
| | | form.value.equipment = meetingRoom.equipment.split(","); |
| | | } |
| | | } |
| | | statusname.value = meetingRoom.status === 1 ? "å¯ç¨" : "ç¦ç¨"; |
| | | |
| | | // æ¸
餿¬å°åå¨ä¸çæ°æ®ï¼é¿å
䏿¬¡æå¼æ¶ä»ç¶æ¾ç¤º |
| | | uni.removeStorageSync("meetingRoom"); |
| | | } |
| | | }; |
| | | const readonly = ref(false); |
| | | const detailType = ref(1); |
| | | const knowledgeId = ref(""); |
| | | |
| | | // è·åç¥è¯è¯¦æ
|
| | | const getKnowledgeDetail = id => { |
| | | loading.value = true; |
| | | getKnowledgeBaseDetail(id) |
| | | .then(res => { |
| | | loading.value = false; |
| | | if (res.code === 200) { |
| | | form.value = res.data; |
| | | equipmentname.value = |
| | | equipmentOptions.value.find(item => item.value === form.value.type) |
| | | ?.name || ""; |
| | | statusname.value = |
| | | statusOptions.value.find(item => item.value === form.value.efficiency) |
| | | ?.name || ""; |
| | | } else { |
| | | showToast("è·åç¥è¯è¯¦æ
失败"); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | loading.value = false; |
| | | showToast("è·åç¥è¯è¯¦æ
失败"); |
| | | }); |
| | | }; |
| | | |
| | | onLoad(options => { |
| | | detailType.value = Number(options.detailType); |
| | | knowledgeId.value = options.id || ""; |
| | | |
| | | // 妿æ¯ç¼è¾ææ¥ç模å¼ï¼è·åç¥è¯è¯¦æ
|
| | | if (knowledgeId.value && (detailType.value === 2 || detailType.value === 3)) { |
| | | getKnowledgeDetail(knowledgeId.value); |
| | | } |
| | | |
| | | // æ¥ç模å¼è®¾ç½®åªè¯» |
| | | if (detailType.value === 3) { |
| | | readonly.value = true; |
| | | } |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | // 仿¬å°åå¨ä¸è·åç¥è¯æ°æ® |
| | | const knowledgeBase = uni.getStorageSync("knowledgeBase"); |
| | | if (knowledgeBase) { |
| | | form.value = JSON.parse(JSON.stringify(knowledgeBase)); |
| | | } |
| | | |
| | | initPageData(); |
| | | equipmentOptions.value = knowledgeTypeOptions.value.map(item => ({ |
| | | value: item.value, |
| | | name: item.label, |
| | | })); |
| | | |
| | | if (detailType.value != 1) { |
| | | equipmentname.value = |
| | | equipmentOptions.value.find(item => item.value === form.value.type) |
| | | ?.name || ""; |
| | | statusname.value = |
| | | statusOptions.value.find(item => item.value === form.value.efficiency) |
| | | ?.name || ""; |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | .client-visit { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | padding-bottom: 5rem; |
| | | } |
| | | |
| | | .footer-btns { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: #fff; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 0.75rem 0; |
| | | box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #666; |
| | | background: #f5f5f5; |
| | | border: 1px solid #ddd; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .sign-btn { |
| | | font-weight: 500; |
| | | font-size: 1rem; |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | border: none; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .location-icon { |
| | | color: #1989fa; |
| | | font-size: 1.2rem; |
| | | } |
| | | |
| | | .selector-container { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | .selector-text { |
| | | font-size: 14px; |
| | | color: #333; |
| | | } |
| | | |
| | | .popup-content { |
| | | padding: 20rpx; |
| | | } |
| | | |
| | | .popup-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 20rpx; |
| | | } |
| | | |
| | | .popup-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | |
| | | .close-icon { |
| | | font-size: 20px; |
| | | color: #999; |
| | | } |
| | | |
| | | .popup-body { |
| | | max-height: 60vh; |
| | | overflow-y: auto; |
| | | margin-bottom: 20rpx; |
| | | } |
| | | |
| | | .checkbox-item { |
| | | margin-bottom: 15rpx; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .popup-footer { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | gap: 15rpx; |
| | | } |
| | | |
| | | .cancel-btn-popup { |
| | | flex: 1; |
| | | border-radius: 8rpx; |
| | | } |
| | | |
| | | .confirm-btn-popup { |
| | | flex: 1; |
| | | border-radius: 8rpx; |
| | | } |
| | | .checkbox-item { |
| | | margin-top: 40rpx; |
| | | } |
| | | </style> |