<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>
|