| src/api/managementMeetings/sealManagement.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/managementMeetings/knowledgeBase/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/managementMeetings/sealManagement/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/managementMeetings/sealManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/managementMeetings/sealManagement.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ 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, }); } src/pages.json
@@ -380,6 +380,20 @@ } }, { "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": "ç¥è¯åºè¯¦æ ", src/pages/index.vue
@@ -343,13 +343,17 @@ 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/xietongshenpi@2x.png", // label: "åå审æ¹", // }, // { // icon: "/static/images/icon/kehubaifang@2x.png", // label: "å®¢æ·æè®¿", // }, ]); // ç产管æ§åè½æ°æ® @@ -565,6 +569,11 @@ url: "/pages/managementMeetings/knowledgeBase/index", }); break; case "ç¨å°ç®¡ç": uni.navigateTo({ url: "/pages/managementMeetings/sealManagement/index", }); break; case "åå审æ¹": uni.navigateTo({ url: "/pages/cooperativeOffice/collaborativeApproval/index", src/pages/managementMeetings/knowledgeBase/detail.vue
@@ -156,7 +156,6 @@ import { addKnowledgeBase, updateKnowledgeBase, getKnowledgeBaseDetail, } from "@/api/managementMeetings/knowledgeBase"; const userStore = useUserStore(); @@ -284,37 +283,19 @@ 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); // 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 || ""; } // æ¥ç模å¼è®¾ç½®åªè¯» @@ -335,6 +316,21 @@ 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 = src/pages/managementMeetings/sealManagement/detail.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,330 @@ <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> src/pages/managementMeetings/sealManagement/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,342 @@ <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>