| | |
| | | data: query, |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹å®¡æ¹æµç¨ |
| | | export function approveProcessUpdate(query) { |
| | | return request({ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ç¥è¯åºç¸å
³ API |
| | | import request from '@/utils/request'; |
| | | |
| | | |
| | | export function listKnowledgeBase(params) { |
| | | return request({ |
| | | url: '/knowledgeBase/getList', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | // æ°å¢ç¥è¯åº |
| | | export function addKnowledgeBase(data) { |
| | | return request({ |
| | | url: "/knowledgeBase/add", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | | |
| | | // ä¿®æ¹ç¥è¯åº |
| | | export function updateKnowledgeBase(data) { |
| | | return request({ |
| | | url: "/knowledgeBase/update", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | | // å é¤ç¥è¯åº |
| | | export function delKnowledgeBase(query) { |
| | | return request({ |
| | | url: "/knowledgeBase/delete", |
| | | method: "delete", |
| | | data: query, |
| | | }); |
| | | } |
| | |
| | | data: data, |
| | | }); |
| | | } |
| | | export function getMeetSummary(){ |
| | | return request({ |
| | | url: "/meeting/getMeetSummary", |
| | | method: "get", |
| | | }); |
| | | } |
| | | |
| | | export function getMeetSummaryItems(){ |
| | | return request({ |
| | | url: "/meeting/getMeetSummaryItems", |
| | | method: "get", |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | // æ¥è¯¢å°ç« ç³è¯·å表 |
| | | export function listSealApplication(page,query) { |
| | | return request({ |
| | | url: "/sealApplicationManagement/getList", |
| | | method: "get", |
| | | params: { |
| | | ...page, |
| | | ...query}, |
| | | }); |
| | | } |
| | | |
| | | // ä¿®æ¹å°ç« ç³è¯· |
| | | export function updateSealApplication(data) { |
| | | return request({ |
| | | url: "/sealApplicationManagement/update", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | | export function addSealApplication(data) { |
| | | return request({ |
| | | url: "/sealApplicationManagement/add", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/managementMeetings/meetingBoard/index", |
| | | "style": { |
| | | "navigationBarTitleText": "ä¼è®®çæ¿", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/managementMeetings/meetSummary/approve", |
| | | "style": { |
| | | "navigationBarTitleText": "æ»ç»", |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/managementMeetings/knowledgeBase/index", |
| | | "style": { |
| | | "navigationBarTitleText": "ç¥è¯åº", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/managementMeetings/sealManagement/index", |
| | | "style": { |
| | | "navigationBarTitleText": "ç¨å°ç®¡ç", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/managementMeetings/sealManagement/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "ç¨å°è¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/managementMeetings/knowledgeBase/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "ç¥è¯åºè¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/cooperativeOffice/collaborativeApproval/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "å®¡æ¹æµç¨", |
| | |
| | | readonly |
| | | placeholder="è¯·éæ©" |
| | | @click="showDatePicker" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showDatePicker"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <!-- approveType=2 请åç¸å
³å段 --> |
| | | <template v-if="approveType === 2"> |
| | | <u-form-item prop="startDate" |
| | | label="请åå¼å§æ¶é´" |
| | | label="å¼å§æ¶é´" |
| | | required> |
| | | <u-input v-model="form.startDate" |
| | | readonly |
| | | placeholder="è¯·éæ©å¼å§æ¶é´" |
| | | placeholder="请åå¼å§æ¶é´" |
| | | @click="showStartDatePicker" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showStartDatePicker"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item prop="endDate" |
| | | label="请åç»ææ¶é´" |
| | | label="ç»ææ¶é´" |
| | | required> |
| | | <u-input v-model="form.endDate" |
| | | readonly |
| | | placeholder="è¯·éæ©ç»ææ¶é´" |
| | | placeholder="请åç»ææ¶é´" |
| | | @click="showEndDatePicker" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showEndDatePicker"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | </template> |
| | | <!-- approveType=3 åºå·®ç¸å
³å段 --> |
| | |
| | | .map(node => node.userId) |
| | | .join(","); |
| | | form.value.approveType = approveType.value; |
| | | console.log("form.value---", form.value); |
| | | form.value.approveDeptId = Number(form.value.approveDeptId); |
| | | // const submitForm = { |
| | | // approveDeptId: form.value.approveDeptId, |
| | | // approveDeptName: form.value.approveDeptName, |
| | | // approveReason: form.value.approveReason, |
| | | // approveTime: form.value.approveTime, |
| | | // approveType: form.value.approveType, |
| | | // approveUser: form.value.approveUser, |
| | | // approveUserIds: form.value.approveUserIds, |
| | | // endDate: form.value.endDate, |
| | | // startDate: form.value.startDate, |
| | | // }; |
| | | // console.log("form.value---", form.value); |
| | | // console.log("submitForm", submitForm); |
| | | |
| | | if (operationType.value === "add" || currentApproveStatus.value == 3) { |
| | | approveProcessAdd(form.value).then(res => { |
| | | showToast("æäº¤æå"); |
| | |
| | | label: "ä¼è®®æ»ç»", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/xietongshenpi@2x.png", |
| | | label: "åå审æ¹", |
| | | icon: "/static/images/icon/qingjiaguanli@2x.png", |
| | | label: "ä¼è®®çæ¿", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/kehubaifang@2x.png", |
| | | label: "å®¢æ·æè®¿", |
| | | icon: "/static/images/icon/qingjiaguanli@2x.png", |
| | | label: "éç¥å
Œ", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/qingjiaguanli@2x.png", |
| | | label: "ç¥è¯åº", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/qingjiaguanli@2x.png", |
| | | label: "ç¨å°ç®¡ç", |
| | | }, |
| | | // { |
| | | // icon: "/static/images/icon/xietongshenpi@2x.png", |
| | | // label: "åå审æ¹", |
| | | // }, |
| | | // { |
| | | // icon: "/static/images/icon/kehubaifang@2x.png", |
| | | // label: "å®¢æ·æè®¿", |
| | | // }, |
| | | ]); |
| | | |
| | | // ç产管æ§åè½æ°æ® |
| | |
| | | url: "/pages/managementMeetings/meetSummary/index", |
| | | }); |
| | | break; |
| | | case "ä¼è®®çæ¿": |
| | | uni.navigateTo({ |
| | | url: "/pages/managementMeetings/meetingBoard/index", |
| | | }); |
| | | break; |
| | | case "éç¥å
Œ": |
| | | uni.navigateTo({ |
| | | url: "/pages/cooperativeOffice/noticeManagement/index", |
| | | }); |
| | | break; |
| | | case "ç¥è¯åº": |
| | | uni.navigateTo({ |
| | | url: "/pages/managementMeetings/knowledgeBase/index", |
| | | }); |
| | | break; |
| | | case "ç¨å°ç®¡ç": |
| | | uni.navigateTo({ |
| | | url: "/pages/managementMeetings/sealManagement/index", |
| | | }); |
| | | break; |
| | | case "åå审æ¹": |
| | | uni.navigateTo({ |
| | | url: "/pages/cooperativeOffice/collaborativeApproval/index", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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, |
| | | } 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(""); |
| | | |
| | | onLoad(options => { |
| | | detailType.value = Number(options.detailType); |
| | | knowledgeId.value = options.id || ""; |
| | | |
| | | // 妿æ¯ç¼è¾ææ¥ç模å¼ï¼è·åç¥è¯è¯¦æ
|
| | | if (knowledgeId.value && (detailType.value === 2 || detailType.value === 3)) { |
| | | // getKnowledgeDetail(knowledgeId.value); |
| | | equipmentname.value = |
| | | equipmentOptions.value.find(item => item.value === form.value.type) |
| | | ?.name || ""; |
| | | statusname.value = |
| | | statusOptions.value.find(item => item.value === form.value.efficiency) |
| | | ?.name || ""; |
| | | } |
| | | |
| | | // æ¥ç模å¼è®¾ç½®åªè¯» |
| | | 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) { |
| | | form.value = { |
| | | title: "", |
| | | type: "", |
| | | scenario: "", |
| | | efficiency: "", |
| | | problem: "", |
| | | solution: "", |
| | | keyPoints: "", |
| | | creator: "", |
| | | usageCount: 0, |
| | | }; |
| | | equipmentname.value = ""; |
| | | statusname.value = ""; |
| | | } |
| | | |
| | | 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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="sales-accoun"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="ç¥è¯åº" |
| | | @back="goBack" /> |
| | | <!-- æç´¢åçéåºå --> |
| | | <view class="search-section"> |
| | | <view class="search-bar"> |
| | | <view class="search-input"> |
| | | <up-input class="search-text" |
| | | placeholder="请è¾å
¥ç¥è¯æ é¢" |
| | | v-model="name" |
| | | @blur="getList" |
| | | clearable /> |
| | | </view> |
| | | <view class="filter-button" |
| | | @click="getList"> |
| | | <u-icon name="search" |
| | | size="24" |
| | | color="#999"></u-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- æè®¿è®°å½å表 --> |
| | | <view class="ledger-list" |
| | | v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" |
| | | :key="index"> |
| | | <view class="ledger-item"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <up-icon name="file-text" |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">ç¥è¯æ é¢ï¼{{ item.title || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç¥è¯ç±»å</text> |
| | | <text class="detail-value">{{ formatReceiptType(item.type) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">éç¨åºæ¯</text> |
| | | <text class="detail-value">{{ item.scenario || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">è§£å³æç</text> |
| | | <u-tag size="mini" |
| | | :type="getTagClass(item.efficiency)">{{ formatReceiptType1(item.efficiency) }}</u-tag> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ä½¿ç¨æ¬¡æ°</text> |
| | | <text class="detail-value">{{ item.usageCount }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å建人</text> |
| | | <text class="detail-value">{{ item.creator }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å建æ¶é´</text> |
| | | <text class="detail-value">{{ item.createTime }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- æé®åºå --> |
| | | <view class="action-buttons"> |
| | | <u-button type="info" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewDetail(item,3)"> |
| | | æ¥ç |
| | | </u-button> |
| | | <u-button type="error" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="confirmDelete(item)"> |
| | | å é¤ |
| | | </u-button> |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewDetail(item,2)"> |
| | | ç¼è¾ |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ ä¼è®®å®¤è®°å½</text> |
| | | </view> |
| | | <!-- æµ®å¨æ°å¢æé® --> |
| | | <view class="fab-button" |
| | | @click="addVisit"> |
| | | <up-icon name="plus" |
| | | size="24" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, computed } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import { useDict } from "@/utils/dict"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | listKnowledgeBase, |
| | | delKnowledgeBase, |
| | | } from "@/api/managementMeetings/knowledgeBase"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "client-visit-index" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import dayjs from "dayjs"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // æç´¢å
³é®è¯ |
| | | const name = ref(""); |
| | | |
| | | // æè®¿è®°å½æ°æ® |
| | | const visitList = ref([]); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | const { knowledge_type } = useDict("knowledge_type"); |
| | | // æ ¼å¼å忬¾æ¹å¼ |
| | | const formatReceiptType = params => { |
| | | return getKnowledgeTypeLabel(params); |
| | | }; |
| | | const formatReceiptType1 = params => { |
| | | if (params == "high") { |
| | | return "æ¾èæå"; |
| | | } else if (params == "medium") { |
| | | return "ä¸è¬æå"; |
| | | } else if (params == "low") { |
| | | return "轻微æå"; |
| | | } else { |
| | | return "æªç¥"; |
| | | } |
| | | }; |
| | | const getTagClass = type => { |
| | | if (type == "high") { |
| | | return "success"; |
| | | } else if (type == "medium") { |
| | | return "warning"; |
| | | } else if (type == "low") { |
| | | return "info"; |
| | | } else { |
| | | return "info"; |
| | | } |
| | | }; |
| | | const knowledgeTypeOptions = computed(() => knowledge_type?.value || []); |
| | | // è·åç¥è¯ç±»åæ ç¾ |
| | | const getKnowledgeTypeLabel = val => { |
| | | console.log(knowledgeTypeOptions, "knowledgeTypeOptions"); |
| | | const item = knowledgeTypeOptions.value.find( |
| | | i => String(i.value) === String(val) |
| | | ); |
| | | return item ? item.label : val; |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | title: name.value, |
| | | }; |
| | | listKnowledgeBase(params) |
| | | .then(res => { |
| | | visitList.value = res.data.records; |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // æ¾ç¤ºå è½½æç¤º |
| | | const showLoadingToast = message => { |
| | | uni.showLoading({ |
| | | title: message, |
| | | mask: true, |
| | | }); |
| | | }; |
| | | |
| | | // å
³éæç¤º |
| | | const closeToast = () => { |
| | | uni.hideLoading(); |
| | | }; |
| | | |
| | | // æ°å¢æè®¿ - 跳转å°ç»è®°é¡µé¢ |
| | | const addVisit = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/managementMeetings/knowledgeBase/detail?detailType=1", |
| | | }); |
| | | }; |
| | | |
| | | // ç¼è¾ |
| | | const viewDetail = (item, detailType) => { |
| | | uni.setStorageSync("knowledgeBase", item); |
| | | uni.navigateTo({ |
| | | url: |
| | | "/pages/managementMeetings/knowledgeBase/detail?detailType=" + |
| | | detailType + |
| | | "&id=" + |
| | | item.id, |
| | | }); |
| | | }; |
| | | |
| | | // å é¤ç¡®è®¤ |
| | | const confirmDelete = item => { |
| | | uni.showModal({ |
| | | title: "å é¤ç¡®è®¤", |
| | | content: `ç¡®å®è¦å é¤ç¥è¯ "${item.title}" åï¼`, |
| | | success: res => { |
| | | if (res.confirm) { |
| | | deleteKnowledge(item.id); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // æ§è¡å é¤ |
| | | const deleteKnowledge = id => { |
| | | showLoadingToast("å é¤ä¸..."); |
| | | delKnowledgeBase([id]) |
| | | .then(res => { |
| | | closeToast(); |
| | | if (res.code === 200) { |
| | | showToast("å 餿å"); |
| | | getList(); // éæ°è·åå表 |
| | | } else { |
| | | showToast("å é¤å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("å é¤å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | // 页é¢ç¹å®çæ ·å¼è¦ç |
| | | .sales-accoun { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | position: relative; |
| | | padding-bottom: 80px; |
| | | } |
| | | |
| | | // ç¹å®ç徿 æ ·å¼ |
| | | .document-icon { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | } |
| | | |
| | | // ç¹ææ ·å¼ |
| | | .visit-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .detail-value { |
| | | word-break: break-all; // ä¿ç页é¢ç¹æçææ¬æ¢è¡æ ·å¼ |
| | | color: #333; // ä¿æé¡µé¢ç¹æçææ¬é¢è² |
| | | } |
| | | |
| | | // ç¶ææ ·å¼ |
| | | .status-enabled { |
| | | color: #28a745; // ä¿æé¡µé¢ç¹æçæåé¢è² |
| | | } |
| | | |
| | | .status-disabled { |
| | | color: #dc3545; // ä¿æé¡µé¢ç¹æçé误é¢è² |
| | | } |
| | | |
| | | // ç¹å®çæµ®å¨æé®æ ·å¼ |
| | | .fab-button { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // ä¿æé¡µé¢ç¹æçé´å½±ææ |
| | | } |
| | | </style> |
| | | |
| | |
| | | const approvalData = ref({}); |
| | | const approvalSteps = ref([]); |
| | | const isEdit = ref(false); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | onLoad(options => { |
| | | console.log(options, "options"); |
| | | if (options.item) { |
| | |
| | | minutesContentId.value = res.data.id; |
| | | } else { |
| | | minutesContent.value = `<h2>${approvalData.value.title}ä¼è®®çºªè¦</h2> |
| | | <p><strong>ä¼è®®æ¶é´ï¼</strong>${ |
| | | approvalData |
| | | .value |
| | | .meetingTime |
| | | }</p> |
| | | <p><strong>ä¼è®®å°ç¹ï¼</strong>${ |
| | | approvalData |
| | | .value |
| | | .location |
| | | }</p> |
| | | <p><strong>主æäººï¼</strong>${ |
| | | approvalData |
| | | .value |
| | | .host |
| | | }</p> |
| | | <p><strong>åä¼äººåï¼</strong></p> |
| | | <ol> |
| | | ${approvalData.value.participants |
| | | .map( |
| | | p => |
| | | `<li>${p.name}</li>` |
| | | ) |
| | | .join( |
| | | "" |
| | | )} |
| | | </ol> |
| | | <p><strong>ä¼è®®å
容ï¼</strong></p> |
| | | <ol> |
| | | <li>è®®é¢ä¸ï¼ |
| | | <ul> |
| | | <li>讨论å
容ï¼</li> |
| | | <li>å³è®®äºé¡¹ï¼</li> |
| | | </ul> |
| | | </li> |
| | | <li>è®®é¢äºï¼ |
| | | <ul> |
| | | <li>讨论å
容ï¼</li> |
| | | <li>å³è®®äºé¡¹ï¼</li> |
| | | </ul> |
| | | </li> |
| | | </ol> |
| | | <p><strong>夿³¨ï¼</strong></p>`; |
| | | <p><strong>ä¼è®®æ¶é´ï¼</strong>${ |
| | | approvalData |
| | | .value |
| | | .meetingTime |
| | | }</p> |
| | | <p><strong>ä¼è®®å°ç¹ï¼</strong>${ |
| | | approvalData |
| | | .value |
| | | .location |
| | | }</p> |
| | | <p><strong>主æäººï¼</strong>${ |
| | | approvalData |
| | | .value |
| | | .host |
| | | }</p> |
| | | <p><strong>åä¼äººåï¼</strong></p> |
| | | <ol> |
| | | ${approvalData.value.participants |
| | | .map( |
| | | p => |
| | | `<li>${p.name}</li>` |
| | | ) |
| | | .join( |
| | | "" |
| | | )} |
| | | </ol> |
| | | <p><strong>ä¼è®®å
容ï¼</strong></p> |
| | | <ol> |
| | | <li>è®®é¢ä¸ï¼ |
| | | <ul> |
| | | <li>讨论å
容ï¼</li> |
| | | <li>å³è®®äºé¡¹ï¼</li> |
| | | </ul> |
| | | </li> |
| | | <li>è®®é¢äºï¼ |
| | | <ul> |
| | | <li>讨论å
容ï¼</li> |
| | | <li>å³è®®äºé¡¹ï¼</li> |
| | | </ul> |
| | | </li> |
| | | </ol> |
| | | <p><strong>夿³¨ï¼</strong></p>`; |
| | | } |
| | | }) |
| | | .catch(error => { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // 审æ¹ç®¡çä¸»é¡µé¢ |
| | | <template> |
| | | <view class="sales-account"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="ä¼è®®çæ¿" |
| | | @back="goBack" /> |
| | | <!-- 审æ¹å表 --> |
| | | <view class="topbox"> |
| | | <view class="boxItem"> |
| | | <view class="boxItem-num"> |
| | | {{stats.total}} |
| | | </view> |
| | | <view class="boxItem-title"> |
| | | æ»ä¼è®®æ° |
| | | </view> |
| | | </view> |
| | | <view class="boxItem"> |
| | | <view class="boxItem-num"> |
| | | {{stats.underWay}} |
| | | </view> |
| | | <view class="boxItem-title"> |
| | | è¿è¡ä¸ |
| | | </view> |
| | | </view> |
| | | <view class="boxItem"> |
| | | <view class="boxItem-num"> |
| | | {{stats.completed}} |
| | | </view> |
| | | <view class="boxItem-title"> |
| | | 已宿 |
| | | </view> |
| | | </view> |
| | | <view class="boxItem"> |
| | | <view class="boxItem-num"> |
| | | {{stats.toStart}} |
| | | </view> |
| | | <view class="boxItem-title"> |
| | | å³å°å¼å§ |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="ledger-list" |
| | | v-if="ledgerList.length > 0"> |
| | | <view v-for="(item, index) in ledgerList" |
| | | :key="index"> |
| | | <view class="ledger-item"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <up-icon name="file-text" |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">{{ item.title }}</text> |
| | | </view> |
| | | <view class="item-tag"> |
| | | <u-tag :type="getTagClass(item.status)">{{ formatReceiptType(item.status) }}</u-tag> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">主æäºº</text> |
| | | <text class="detail-value">{{ item.host }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åä¼äººæ°</text> |
| | | <text class="detail-value">{{ item.participants.length }}</text> |
| | | </view> |
| | | <view class="detail-row-approveReason"> |
| | | <text class="detail-label">ä¼è®®æ¶é´</text> |
| | | <text class="detail-value highlightBlue">{{dayjs(item.startTime).format("YYYY-MM-DD")}} |
| | | {{ formatTime(item.startTime) }} - {{ formatTime(item.endTime) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ä¼è®®å°ç¹</text> |
| | | <text class="detail-value">{{ item.location }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åä¼äººæ°</text> |
| | | <text class="detail-value">{{ item.participants.length }}</text> |
| | | </view> |
| | | <!-- <up-divider></up-divider> --> |
| | | <u-collapse @change="change" |
| | | @close="close" |
| | | @open="open" |
| | | accordion |
| | | border |
| | | :duration="300"> |
| | | <u-collapse-item :title="`ä¼è®®çºªè¦ ${item.content ? '' : '(æ )'}`" |
| | | :name="`meeting-${index}`"> |
| | | <view class="meeting-content"> |
| | | <view v-if="item.content" |
| | | class="content-html"><rich-text :nodes="item.content"></rich-text></view> |
| | | <view v-else |
| | | class="no-content"> |
| | | <text>ææ ä¼è®®çºªè¦å
容</text> |
| | | </view> |
| | | </view> |
| | | </u-collapse-item> |
| | | </u-collapse> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ æ°æ®</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, toRefs, reactive } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | getMeetSummaryItems, |
| | | getMeetSummary, |
| | | } from "@/api/managementMeetings/meetExamine"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import dayjs from "dayjs"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | // æ°æ® |
| | | const ledgerList = ref([]); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | title: "", |
| | | }, |
| | | }); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | // ç»è®¡æ°æ® |
| | | const stats = ref({}); |
| | | const getnum = () => { |
| | | getMeetSummary().then(res => { |
| | | stats.value = res.data; |
| | | }); |
| | | }; |
| | | // æ ¼å¼åæ¶é´ |
| | | const formatTime = timeStr => { |
| | | const date = new Date(timeStr); |
| | | return date.toLocaleTimeString("zh-CN", { |
| | | hour: "2-digit", |
| | | minute: "2-digit", |
| | | }); |
| | | }; |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | |
| | | getMeetSummaryItems() |
| | | .then(res => { |
| | | ledgerList.value = res.data.map(item => { |
| | | return { |
| | | ...item, |
| | | participants: JSON.parse(item.participants), |
| | | }; |
| | | }); |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | }); |
| | | }; |
| | | // æ¾ç¤ºå è½½æç¤º |
| | | const showLoadingToast = message => { |
| | | uni.showLoading({ |
| | | title: message, |
| | | mask: true, |
| | | }); |
| | | }; |
| | | const formatDateTime = dateTime => { |
| | | if (!dateTime) return ""; |
| | | return dateTime.replace(" ", "\n"); |
| | | }; |
| | | |
| | | // å
³éæç¤º |
| | | const closeToast = () => { |
| | | uni.hideLoading(); |
| | | }; |
| | | |
| | | // æ ¼å¼å忬¾æ¹å¼ |
| | | const formatReceiptType = params => { |
| | | if (params == 0) { |
| | | return "已宿"; |
| | | } else if (params == 1) { |
| | | return "å³å°å¼å§"; |
| | | } else if (params == 2) { |
| | | return "è¿è¡ä¸"; |
| | | } else { |
| | | return "æªç¥"; |
| | | } |
| | | }; |
| | | // è·åæ ç¾æ ·å¼ç±» |
| | | const getTagClass = type => { |
| | | if (type == 0) { |
| | | return "info"; |
| | | } else if (type == 1) { |
| | | return "warning"; |
| | | } else if (type == 2) { |
| | | return "success"; |
| | | } else { |
| | | return "info"; |
| | | } |
| | | }; |
| | | |
| | | // u-collapse äºä»¶å¤ç彿° |
| | | const change = name => { |
| | | console.log("å±å¼ç颿¿å:", name); |
| | | }; |
| | | |
| | | const close = name => { |
| | | console.log("å
³éç颿¿å:", name); |
| | | }; |
| | | |
| | | const open = name => { |
| | | console.log("æå¼ç颿¿å:", name); |
| | | }; |
| | | |
| | | onShow(async () => { |
| | | // 页é¢å è½½å®æåçåå§åé»è¾ |
| | | try { |
| | | // ä¸¤ä¸ªæ¹æ³æ§è¡å®æååæ§è¡ getList() |
| | | getList(); |
| | | getnum(); |
| | | } catch (error) { |
| | | console.error("åå§åæ°æ®å¤±è´¥:", error); |
| | | // å³ä½¿åºé乿§è¡ getList()ï¼ç¡®ä¿é¡µé¢è½æ£å¸¸å è½½ |
| | | getList(); |
| | | getnum(); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | .u-divider { |
| | | margin: 0 !important; |
| | | } |
| | | |
| | | // ææ¡£å¾æ æ ·å¼ - è¦çå
Œ
±æ ·å¼ä¸çèæ¯è² |
| | | .document-icon { |
| | | background: #ed8d05; |
| | | } |
| | | |
| | | // æµ®å¨æé®æ ·å¼ - è¦çå
Œ
±æ ·å¼ä¸çèæ¯è² |
| | | .fab-button { |
| | | background: #ed8d05; |
| | | } |
| | | |
| | | // ç¹ææ ·å¼ |
| | | .detail-row-user { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | .detail-row-approveReason { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .detail-value.highlightBlue { |
| | | color: #2979ff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .detail-value.highlightYellow { |
| | | color: #ed8d05; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .approver-value { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | .approver-chip { |
| | | display: inline-flex; |
| | | align-items: center; |
| | | gap: 6px; |
| | | background: #f0f6ff; |
| | | color: #2b7cff; |
| | | border: 1px solid #e0efff; |
| | | border-radius: 999px; |
| | | padding: 4px 10px; |
| | | max-width: 100%; |
| | | } |
| | | |
| | | .approver-name { |
| | | font-size: 12px; |
| | | color: #2b7cff; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .actions { |
| | | display: flex; |
| | | gap: 10px; |
| | | align-items: center; |
| | | justify-content: flex-end; |
| | | margin-top: 18rpx; |
| | | } |
| | | |
| | | .action-btn { |
| | | border-radius: 16px; |
| | | height: 28px; |
| | | line-height: 28px; |
| | | padding: 0 12px; |
| | | } |
| | | .topbox { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-left: 20px; |
| | | margin-right: 20px; |
| | | margin-top: 10px; |
| | | } |
| | | .boxItem { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: #fff; |
| | | width: 24%; |
| | | padding-top: 10px; |
| | | padding-bottom: 10px; |
| | | border-radius: 6px; |
| | | box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05); |
| | | } |
| | | .boxItem-num { |
| | | margin-bottom: 5px; |
| | | font-weight: 500; |
| | | color: #2979ff; |
| | | } |
| | | |
| | | // ä¼è®®çºªè¦æ ·å¼ |
| | | .meeting-content { |
| | | padding: 15px; |
| | | line-height: 1.6; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .content-html { |
| | | color: #333; |
| | | word-break: break-word; |
| | | } |
| | | |
| | | .content-html :deep(p) { |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .content-html :deep(ul), |
| | | .content-html :deep(ol) { |
| | | margin-bottom: 10px; |
| | | padding-left: 20px; |
| | | } |
| | | |
| | | .content-html :deep(li) { |
| | | margin-bottom: 5px; |
| | | } |
| | | |
| | | .no-content { |
| | | color: #999; |
| | | text-align: center; |
| | | padding: 20px 0; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | // u-collapse æ ·å¼ä¼å |
| | | :deep(.u-collapse) { |
| | | margin-top: 10px; |
| | | border-radius: 6px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | :deep(.u-collapse-item__header) { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | :deep(.u-collapse-item__content) { |
| | | background-color: #fafafa; |
| | | border-top: 1px solid #f0f0f0; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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="applicationNum" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.applicationNum" |
| | | :readonly="readonly" |
| | | placeholder="请è¾å
¥ç³è¯·ç¼å·" /> |
| | | </u-form-item> |
| | | <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="sealType" |
| | | 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="reason" |
| | | border-bottom> |
| | | <u-textarea v-model="form.reason" |
| | | type="textarea" |
| | | rows="4" |
| | | :disabled="readonly" |
| | | placeholder="请è¾å
¥ç³è¯·åå " /> |
| | | </u-form-item> |
| | | <u-form-item label="审æ¹äºº" |
| | | prop="sealType" |
| | | required |
| | | 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="ç´§æ¥ç¨åº¦" |
| | | prop="urgency" |
| | | required |
| | | border-bottom> |
| | | <u-radio-group v-model="form.urgency" |
| | | :disabled="readonly"> |
| | | <u-radio name="normal" |
| | | label="æ®é" |
| | | size="16" /> |
| | | <u-radio name="urgent" |
| | | label="ç´§æ¥" |
| | | size="16" /> |
| | | <u-radio name="very-urgent" |
| | | label="ç¹æ¥" |
| | | size="16" /> |
| | | </u-radio-group> |
| | | </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" /> |
| | | <!-- ç¶æéæ©å¨ --> |
| | | <up-action-sheet :show="showStatusSheet" |
| | | :actions="userList" |
| | | @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 { userListNoPageByTenantId } from "@/api/system/user"; |
| | | |
| | | import { addSealApplication } from "@/api/managementMeetings/sealManagement"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | applicationNum: "", |
| | | title: "", |
| | | sealType: "", |
| | | reason: "", |
| | | approveUserId: "", |
| | | urgency: "normal", |
| | | status: "pending", |
| | | }); |
| | | const { knowledge_type } = useDict("knowledge_type"); |
| | | const knowledgeTypeOptions = computed(() => knowledge_type?.value || []); |
| | | const equipmentOptions = ref([ |
| | | { value: "official", name: "å
¬ç« " }, |
| | | { value: "contract", name: "ååä¸ç¨ç« " }, |
| | | { value: "finance", name: "è´¢å¡ä¸ç¨ç« " }, |
| | | { value: "legal", name: "æ³äººç« " }, |
| | | ]); |
| | | 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.approveUserId = action.value; |
| | | statusname.value = action.name; |
| | | showStatusSheet.value = false; |
| | | }; |
| | | const equipmentname = ref(""); |
| | | // 设å¤é
ç½®éæ© |
| | | const handleEquipmentChange = val => { |
| | | form.value.sealType = val.value; |
| | | equipmentname.value = val.name; |
| | | showEquipmentSheet.value = false; |
| | | }; |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.applicationNum) { |
| | | showToast("请è¾å
¥ç³è¯·ç¼å·"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.title) { |
| | | showToast("请è¾å
¥æ é¢"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.sealType) { |
| | | showToast("è¯·éæ©ç¨å°ç±»å"); |
| | | return; |
| | | } |
| | | if (!form.value.reason) { |
| | | showToast("请è¾å
¥ç³è¯·çç±"); |
| | | return; |
| | | } |
| | | if (!statusname.value) { |
| | | showToast("è¯·éæ©å®¡æ¹äºº"); |
| | | return; |
| | | } |
| | | try { |
| | | loading.value = true; |
| | | addSealApplication(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 readonly = ref(false); |
| | | const detailType = ref(1); |
| | | const knowledgeId = ref(""); |
| | | const userList = ref([]); |
| | | onLoad(options => { |
| | | detailType.value = Number(options.detailType); |
| | | knowledgeId.value = options.id || ""; |
| | | |
| | | // æ¥ç模å¼è®¾ç½®åªè¯» |
| | | if (detailType.value === 3) { |
| | | readonly.value = true; |
| | | } |
| | | userListNoPageByTenantId().then(res => { |
| | | userList.value = res.data.map(item => ({ |
| | | value: item.userId, |
| | | name: item.nickName, |
| | | })); |
| | | }); |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | // 仿¬å°åå¨ä¸è·åç¥è¯æ°æ® |
| | | const knowledgeBase = uni.getStorageSync("knowledgeBase"); |
| | | if (knowledgeBase) { |
| | | form.value = JSON.parse(JSON.stringify(knowledgeBase)); |
| | | } |
| | | |
| | | if (detailType.value === 1) { |
| | | form.value = { |
| | | applicationNum: "", |
| | | title: "", |
| | | sealType: "", |
| | | reason: "", |
| | | approveUserId: "", |
| | | urgency: "normal", |
| | | status: "pending", |
| | | }; |
| | | statusname.value = ""; |
| | | equipmentname.value = ""; |
| | | } |
| | | console.log(form.value, "userList.value"); |
| | | |
| | | if (detailType.value != 1) { |
| | | equipmentname.value = |
| | | equipmentOptions.value.find(item => item.value === form.value.sealType) |
| | | ?.name || ""; |
| | | statusname.value = form.value.approveUserName || ""; |
| | | } |
| | | }); |
| | | </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; |
| | | } |
| | | |
| | | /* ç´§æ¥ç¨åº¦åéæ¡æ ·å¼ */ |
| | | :deep(.u-radio-group) { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 40rpx; |
| | | } |
| | | |
| | | :deep(.u-radio) { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="sales-accoun"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="ç¨å°ç®¡ç" |
| | | @back="goBack" /> |
| | | <!-- æç´¢åçéåºå --> |
| | | <view class="search-section"> |
| | | <view class="search-bar"> |
| | | <view class="search-input"> |
| | | <up-input class="search-text" |
| | | placeholder="请è¾å
¥ç³è¯·æ é¢" |
| | | v-model="name" |
| | | @blur="getList" |
| | | clearable /> |
| | | </view> |
| | | <view class="filter-button" |
| | | @click="getList"> |
| | | <u-icon name="search" |
| | | size="24" |
| | | color="#999"></u-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- æè®¿è®°å½å表 --> |
| | | <view class="ledger-list" |
| | | v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" |
| | | :key="index"> |
| | | <view class="ledger-item"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <up-icon name="file-text" |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">ç³è¯·æ é¢ï¼{{ item.title || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç³è¯·ç¼å·</text> |
| | | <text class="detail-value">{{ item.applicationNum || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç³è¯·äºº</text> |
| | | <text class="detail-value">{{ item.createUserName || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">æå±é¨é¨</text> |
| | | <text class="detail-value">{{ item.department || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç¨å°ç±»å</text> |
| | | <text class="detail-value">{{ formatReceiptType(item.sealType) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç³è¯·æ¶é´</text> |
| | | <text class="detail-value">{{ item.createTime || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç¶æ</text> |
| | | <u-tag size="mini" |
| | | :type="getTagClass(item.status)">{{ formatReceiptType1(item.status) }}</u-tag> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ç³è¯·åå </text> |
| | | <text class="detail-value"><span style="display: block;height: auto;word-break: break-word;">{{ item.reason || '-' }}</span></text> |
| | | </view> |
| | | </view> |
| | | <!-- æé®åºå --> |
| | | <view class="action-buttons"> |
| | | <u-button type="info" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewDetail(item,3)"> |
| | | æ¥ç |
| | | </u-button> |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | v-if="item.status === 'pending'" |
| | | @click="confirmApprove(item,true)"> |
| | | å®¡æ¹ |
| | | </u-button> |
| | | <u-button type="error" |
| | | size="small" |
| | | class="action-btn" |
| | | v-if="item.status === 'pending'" |
| | | @click="confirmApprove(item,false)"> |
| | | æç» |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ ä¼è®®å®¤è®°å½</text> |
| | | </view> |
| | | <!-- æµ®å¨æ°å¢æé® --> |
| | | <view class="fab-button" |
| | | @click="addVisit"> |
| | | <up-icon name="plus" |
| | | size="24" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, computed } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import { useDict } from "@/utils/dict"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | listSealApplication, |
| | | updateSealApplication, |
| | | } from "@/api/managementMeetings/sealManagement"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "client-visit-index" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import dayjs from "dayjs"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // æç´¢å
³é®è¯ |
| | | const name = ref(""); |
| | | |
| | | // æè®¿è®°å½æ°æ® |
| | | const visitList = ref([]); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | const { knowledge_type } = useDict("knowledge_type"); |
| | | // æ ¼å¼å忬¾æ¹å¼ |
| | | const formatReceiptType = params => { |
| | | if (params == "official") { |
| | | return "å
¬ç« "; |
| | | } else if (params == "contract") { |
| | | return "ååä¸ç¨ç« "; |
| | | } else if (params == "finance") { |
| | | return "è´¢å¡ä¸ç¨ç« "; |
| | | } else if (params == "tegal") { |
| | | return "æ³äººç« "; |
| | | } else { |
| | | return "æªç¥"; |
| | | } |
| | | }; |
| | | const formatReceiptType1 = params => { |
| | | if (params == "pending") { |
| | | return "å¾
审æ¹"; |
| | | } else if (params == "approved") { |
| | | return "å·²éè¿"; |
| | | } else if (params == "rejected") { |
| | | return "å·²æç»"; |
| | | } else { |
| | | return "æªç¥"; |
| | | } |
| | | }; |
| | | const getTagClass = type => { |
| | | if (type == "pending") { |
| | | return "warning"; |
| | | } else if (type == "approved") { |
| | | return "success"; |
| | | } else if (type == "rejected") { |
| | | return "danger"; |
| | | } else { |
| | | return "info"; |
| | | } |
| | | }; |
| | | const knowledgeTypeOptions = computed(() => knowledge_type?.value || []); |
| | | // è·åç¥è¯ç±»åæ ç¾ |
| | | const getKnowledgeTypeLabel = val => { |
| | | console.log(knowledgeTypeOptions, "knowledgeTypeOptions"); |
| | | const item = knowledgeTypeOptions.value.find( |
| | | i => String(i.value) === String(val) |
| | | ); |
| | | return item ? item.label : val; |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | title: name.value, |
| | | }; |
| | | listSealApplication(params) |
| | | .then(res => { |
| | | const currentFactoryName = userStore.currentFactoryName; |
| | | if (currentFactoryName) { |
| | | visitList.value = res.data.records.filter( |
| | | item => item.department === currentFactoryName |
| | | ); |
| | | } else { |
| | | visitList.value = res.data.records; |
| | | } |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // æ¾ç¤ºå è½½æç¤º |
| | | const showLoadingToast = message => { |
| | | uni.showLoading({ |
| | | title: message, |
| | | mask: true, |
| | | }); |
| | | }; |
| | | |
| | | // å
³éæç¤º |
| | | const closeToast = () => { |
| | | uni.hideLoading(); |
| | | }; |
| | | |
| | | // æ°å¢æè®¿ - 跳转å°ç»è®°é¡µé¢ |
| | | const addVisit = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/managementMeetings/sealManagement/detail?detailType=1", |
| | | }); |
| | | }; |
| | | const confirmApprove = (item, isApprove) => { |
| | | if (isApprove) { |
| | | uni.showModal({ |
| | | title: "审æ¹ç¡®è®¤", |
| | | content: `ç¡®å®è¦å®¡æ¹è¯¥ç¨å°ç³è¯·åï¼`, |
| | | success: res => { |
| | | item.status = "approved"; |
| | | updateSealApplication(item).then(res => { |
| | | if (res.code == 200) { |
| | | showToast("审æ¹éè¿"); |
| | | } |
| | | }); |
| | | }, |
| | | }); |
| | | } else { |
| | | uni.showModal({ |
| | | title: "审æ¹ç¡®è®¤", |
| | | content: `ç¡®å®è¦æç»è¯¥ç¨å°ç³è¯·åï¼`, |
| | | success: res => { |
| | | item.status = "rejected"; |
| | | updateSealApplication(item).then(res => { |
| | | if (res.code == 200) { |
| | | showToast("å®¡æ¹æç»"); |
| | | } |
| | | }); |
| | | }, |
| | | }); |
| | | } |
| | | }; |
| | | // ç¼è¾ |
| | | const viewDetail = (item, detailType) => { |
| | | uni.setStorageSync("knowledgeBase", item); |
| | | uni.navigateTo({ |
| | | url: |
| | | "/pages/managementMeetings/sealManagement/detail?detailType=" + |
| | | detailType + |
| | | "&id=" + |
| | | item.id, |
| | | }); |
| | | }; |
| | | |
| | | // å é¤ç¡®è®¤ |
| | | const confirmDelete = item => { |
| | | uni.showModal({ |
| | | title: "å é¤ç¡®è®¤", |
| | | content: `ç¡®å®è¦å é¤ç¥è¯ "${item.title}" åï¼`, |
| | | success: res => { |
| | | if (res.confirm) { |
| | | // deleteKnowledge(item.id); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | // 页é¢ç¹å®çæ ·å¼è¦ç |
| | | .sales-accoun { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | position: relative; |
| | | padding-bottom: 80px; |
| | | } |
| | | |
| | | // ç¹å®ç徿 æ ·å¼ |
| | | .document-icon { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | } |
| | | |
| | | // ç¹ææ ·å¼ |
| | | .visit-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .detail-value { |
| | | word-break: break-all; // ä¿ç页é¢ç¹æçææ¬æ¢è¡æ ·å¼ |
| | | color: #333; // ä¿æé¡µé¢ç¹æçææ¬é¢è² |
| | | } |
| | | |
| | | // ç¶ææ ·å¼ |
| | | .status-enabled { |
| | | color: #28a745; // ä¿æé¡µé¢ç¹æçæåé¢è² |
| | | } |
| | | |
| | | .status-disabled { |
| | | color: #dc3545; // ä¿æé¡µé¢ç¹æçé误é¢è² |
| | | } |
| | | |
| | | // ç¹å®çæµ®å¨æé®æ ·å¼ |
| | | .fab-button { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // ä¿æé¡µé¢ç¹æçé´å½±ææ |
| | | } |
| | | </style> |
| | | |