| src/api/collaborativeApproval/noticeManagement.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/collaborativeApproval/rulesRegulationsManagementFile.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/Dialog/FileListDialog.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/knowledgeBase/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/noticeManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/rulesRegulationsManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/sealManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/collaborativeApproval/noticeManagement.js
@@ -50,3 +50,29 @@ method: 'get', }) } // æ¥è¯¢å ¬åç±»åå表 export function listNoticeType() { return request({ url: '/noticeType/list', method: 'get' }) } // æ°å¢å ¬åç±»å export function addNoticeType(data) { return request({ url: '/noticeType/add', method: 'post', data: data }) } // å é¤å ¬åç±»å export function delNoticeType(id) { return request({ url: '/noticeType/del', method: 'delete', data: { id } }) } src/api/collaborativeApproval/rulesRegulationsManagementFile.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ import request from "@/utils/request"; // éä»¶å表 export function listRuleFiles(query) { return request({ url: "/rulesRegulationsManagementFile/listPage", method: "get", params: query, }); } // æ°å¢éä»¶ export function addRuleFile(data) { return request({ url: "/rulesRegulationsManagementFile/add", method: "post", data, }); } // å é¤éä»¶ï¼æ¯æä¼ é id æ°ç»ï¼ export function delRuleFile(ids) { return request({ url: "/rulesRegulationsManagementFile/del", method: "delete", data: ids, }); } src/components/Dialog/FileListDialog.vue
@@ -5,6 +5,37 @@ :width="width" :before-close="handleClose" > <div class="file-list-toolbar" v-if="showToolbar"> <template v-if="useBuiltInUpload"> <el-upload v-model:file-list="uploadFileList" class="upload-demo" :action="uploadAction" :headers="uploadHeaders" :show-file-list="false" :on-success="handleDefaultUploadSuccess" :on-error="handleDefaultUploadError" > <el-button v-if="showUploadButton" type="primary" size="small" > ä¸ä¼ éä»¶ </el-button> </el-upload> </template> <template v-else> <el-button v-if="showUploadButton" type="primary" size="small" @click="handleUpload" > æ°å¢éä»¶ </el-button> </template> </div> <el-table :data="tableData" border :height="tableHeight"> <el-table-column :label="nameColumnLabel" @@ -38,6 +69,15 @@ > é¢è§ </el-button> <el-button v-if="showDeleteButton" link type="danger" size="small" @click="handleDelete(scope.row, scope.$index)" > å é¤ </el-button> <slot name="actions" :row="scope.row"></slot> </template> </el-table-column> @@ -49,7 +89,9 @@ <script setup> import { ref, computed, getCurrentInstance } from 'vue' import { ElMessage } from 'element-plus' import filePreview from '@/components/filePreview/index.vue' import { getToken } from '@/utils/auth' const props = defineProps({ modelValue: { @@ -82,7 +124,7 @@ }, actionColumnWidth: { type: [String, Number], default: 100 default: 160 }, showActions: { type: Boolean, @@ -96,6 +138,14 @@ type: Boolean, default: true }, showUploadButton: { type: Boolean, default: false }, showDeleteButton: { type: Boolean, default: false }, urlField: { type: String, default: 'url' @@ -107,13 +157,30 @@ previewMethod: { type: Function, default: null }, uploadMethod: { type: Function, default: null }, deleteMethod: { type: Function, default: null }, rulesRegulationsManagementId: { type: [String, Number], default: '' }, uploadUrl: { type: String, default: `${import.meta.env.VITE_APP_BASE_API}/file/upload` } }) const emit = defineEmits(['update:modelValue', 'close', 'download', 'preview']) const emit = defineEmits(['update:modelValue', 'close', 'download', 'preview', 'upload', 'delete']) const { proxy } = getCurrentInstance() const filePreviewRef = ref(null) const uploadFileList = ref([]) const dialogVisible = computed({ get: () => props.modelValue, @@ -121,6 +188,12 @@ }) const tableData = ref([]) const showToolbar = computed(() => props.showUploadButton) const useBuiltInUpload = computed(() => !props.uploadMethod) const uploadAction = computed(() => props.uploadUrl) const uploadHeaders = computed(() => ({ Authorization: `Bearer ${getToken()}` })) const handleClose = () => { emit('close') @@ -154,11 +227,84 @@ tableData.value = list || [] } const handleUpload = async () => { if (props.uploadMethod) { const newItem = await props.uploadMethod() if (newItem) { addAttachment(newItem) } } emit('upload') } const handleDelete = async (row, index) => { if (props.deleteMethod) { const result = await props.deleteMethod(row, index) if (result === false) { return } // 妿æä¾äº deleteMethodï¼ç±ç¶ç»ä»¶è´è´£å·æ°å表ï¼ä¸å¨è¿éå é¤ } else { // å¦ææ²¡ææä¾ deleteMethodï¼æå¨ç»ä»¶å é¨å é¤ removeAttachment(index) } emit('delete', row) } const addAttachment = (item) => { tableData.value = [...tableData.value, item] } const handleDefaultUploadSuccess = async (res, file) => { if (res?.code !== 200) { ElMessage.error(res?.msg || 'æä»¶ä¸ä¼ 失败') return } if (!props.rulesRegulationsManagementId) { ElMessage.error('缺å°è§ç« å¶åº¦IDï¼æ æ³ä¿åéä»¶') return } const fileName = res?.data?.originalName || file?.name const fileUrl = res?.data?.tempPath || res?.data?.url const payload = { fileName, fileUrl, rulesRegulationsManagementId: props.rulesRegulationsManagementId, raw: res?.data || {} } emit('upload', payload) } const handleDefaultUploadError = () => { ElMessage.error('æä»¶ä¸ä¼ 失败') } const removeAttachment = (index) => { if (index > -1 && index < tableData.value.length) { const newList = [...tableData.value] newList.splice(index, 1) tableData.value = newList } } const setList = (list) => { tableData.value = list || [] } defineExpose({ open open, addAttachment, removeAttachment, setList, handleUpload, handleDelete }) </script> <style scoped> .file-list-toolbar { margin-bottom: 8px; text-align: right; } </style> src/views/collaborativeApproval/knowledgeBase/index.vue
@@ -13,11 +13,12 @@ /> <span class="search_title ml10">ç¥è¯ç±»åï¼</span> <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px"> <el-option label="ååç¹æ¹" :value="'contract'" /> <el-option label="å®¡æ¹æ¡ä¾" :value="'approval'" /> <el-option label="è§£å³æ¹æ¡" :value="'solution'" /> <el-option label="ç»éªæ»ç»" :value="'experience'" /> <el-option label="æä½æå" :value="'guide'" /> <el-option v-for="item in knowledgeTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> <el-button type="primary" @click="handleQuery" style="margin-left: 10px"> æç´¢ @@ -61,11 +62,12 @@ <el-col :span="12"> <el-form-item label="ç¥è¯ç±»å" prop="type"> <el-select v-model="form.type" placeholder="è¯·éæ©ç¥è¯ç±»å" style="width: 100%"> <el-option label="ååç¹æ¹" value="contract" /> <el-option label="å®¡æ¹æ¡ä¾" value="approval" /> <el-option label="è§£å³æ¹æ¡" value="solution" /> <el-option label="ç»éªæ»ç»" value="experience" /> <el-option label="æä½æå" value="guide" /> <el-option v-for="item in knowledgeTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> @@ -231,7 +233,7 @@ <script setup> import { Search } from "@element-plus/icons-vue"; import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue"; import { onMounted, ref, reactive, toRefs, getCurrentInstance, computed } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; import PIMTable from "@/components/PIMTable/PIMTable.vue"; import { listKnowledgeBase, delKnowledgeBase,addKnowledgeBase,updateKnowledgeBase } from "@/api/collaborativeApproval/knowledgeBase.js"; @@ -313,24 +315,10 @@ prop: "type", dataType: "tag", formatData: (params) => { const typeMap = { contract: "ååç¹æ¹", approval: "å®¡æ¹æ¡ä¾", solution: "è§£å³æ¹æ¡", experience: "ç»éªæ»ç»", guide: "æä½æå" }; return typeMap[params] || params; return getKnowledgeTypeLabel(params); }, formatType: (params) => { const typeMap = { contract: "success", approval: "warning", solution: "primary", experience: "info", guide: "danger" }; return typeMap[params] || "info"; return getKnowledgeTypeTagType(params); } }, { @@ -401,111 +389,6 @@ } ]); // æ¨¡ææ°æ® // let mockData = [ // { // id: "1", // title: "ç¹æ®ååå®¡æ¹æµç¨ä¼åæ¹æ¡", // type: "contract", // scenario: "大é¢ååå¿«é审æ¹", // efficiency: "high", // problem: "大é¢ååå®¡æ¹æµç¨å¤æï¼å®¡æ¹æ¶é´é¿ï¼å½±åä¸å¡è¿å±", // solution: "建ç«ç»¿è²ééï¼å¯¹ç¬¦åæ¡ä»¶çååéç¨ç®åå®¡æ¹æµç¨ï¼ç±é¨é¨è´è´£äººç´æ¥å®¡æ¹ï¼å¹³åå®¡æ¹æ¶é´ä»3天缩çè³1天", // keyPoints: "绿è²é鿡件,ç®åæµç¨,å®¡æ¹æé,æ¶é´æ§å¶", // creator: "å¼ ç»ç", // usageCount: 15, // createTime: "2024-01-15 10:30:00" // }, // { // id: "2", // title: "è·¨é¨é¨åä½å®¡æ¹ç»éªæ»ç»", // type: "experience", // scenario: "å¤é¨é¨åä½é¡¹ç®", // efficiency: "medium", // problem: "è·¨é¨é¨é¡¹ç®å®¡æ¹æ¶ï¼åé¨é¨æè§ä¸ç»ä¸ï¼å®¡æ¹è¿åº¦ç¼æ ¢", // solution: "建ç«é¡¹ç®åè°æºå¶ï¼æå®é¡¹ç®è´è´£äººï¼å®æå¬å¼åè°ä¼è®®ï¼ç»ä¸åæ¹æè§ååè¿è¡å®¡æ¹", // keyPoints: "项ç®åè°,宿ä¼è®®,ç»ä¸æè§,è´è´£äººå¶åº¦", // creator: "æä¸»ç®¡", // usageCount: 8, // createTime: "2024-01-14 15:20:00" // }, // { // id: "3", // title: "ç´§æ¥éè´å®¡æ¹æä½æå", // type: "guide", // scenario: "ç´§æ¥éè´éæ±", // efficiency: "high", // problem: "ç´§æ¥éè´æ¶å®¡æ¹æµç¨å¤æï¼æ æ³æ»¡è¶³ç´§æ¥éæ±", // solution: "å¶å®ç´§æ¥éè´å®¡æ¹æ åï¼æç¡®ç´§æ¥ç¨åº¦å级ï¼ä¸å级å«éç¨ä¸åå®¡æ¹æµç¨ï¼ç¡®ä¿ç´§æ¥éæ±å¾å°åæ¶å¤ç", // keyPoints: "ç´§æ¥å级,æ åå¶å®,æµç¨ç®å,åæ¶å¤ç", // creator: "çä¸å", // usageCount: 12, // createTime: "2024-01-13 09:15:00" // } // ]; // ç¥è¯æ 颿¨¡æ¿ const titleTemplates = [ "{type}å®¡æ¹æµç¨ä¼åæ¹æ¡", "{scenario}å¤çç»éªæ»ç»", "{type}ç¹æ®æ åµå¤çæå", "{scenario}å¿«éå®¡æ¹æ¹æ¡", "{type}æ ååæä½æµç¨", "{scenario}é®é¢è§£å³æ¹æ¡", "{type}æä½³å®è·µæ»ç»", "{scenario}æçæåæ¹æ¡" ]; // ç¥è¯ç±»åé ç½® const knowledgeTypes = [ { type: "contract", label: "ååç¹æ¹", efficiency: "high" }, { type: "approval", label: "å®¡æ¹æ¡ä¾", efficiency: "medium" }, { type: "solution", label: "è§£å³æ¹æ¡", efficiency: "high" }, { type: "experience", label: "ç»éªæ»ç»", efficiency: "medium" }, { type: "guide", label: "æä½æå", efficiency: "low" } ]; // åºæ¯å表 const scenarios = ["大é¢åå审æ¹", "è·¨é¨é¨åä½", "ç´§æ¥éè´", "ç¹æ®ç³è¯·", "æµç¨ä¼å", "é®é¢å¤ç", "æ åå建设", "æçæå"]; // èªå¨çææ°æ°æ® const generateNewData = () => { const newId = (mockData.length + 1).toString(); const now = new Date(); const randomType = knowledgeTypes[Math.floor(Math.random() * knowledgeTypes.length)]; const randomScenario = scenarios[Math.floor(Math.random() * scenarios.length)]; // çæéæºæ é¢ let title = titleTemplates[Math.floor(Math.random() * titleTemplates.length)]; title = title .replace('{type}', randomType.label) .replace('{scenario}', randomScenario); const newKnowledge = { id: newId, title: title, type: randomType.type, scenario: randomScenario, efficiency: randomType.efficiency, problem: `å¨${randomScenario}è¿ç¨ä¸éå°çé®é¢æè¿°...`, solution: `é对${randomScenario}çè§£å³æ¹æ¡åæä½æ¥éª¤...`, keyPoints: "å ³é®è¦ç¹1,å ³é®è¦ç¹2,å ³é®è¦ç¹3,å ³é®è¦ç¹4", creator: ["å¼ ç»ç", "æä¸»ç®¡", "çä¸å", "åæ»ç"][Math.floor(Math.random() * 4)], usageCount: Math.floor(Math.random() * 20) + 1, createTime: now.toLocaleString() }; // æ·»å å°æ°æ®å¼å¤´ mockData.unshift(newKnowledge); // ä¿ææ°æ®éå¨åçèå´å ï¼æå¤ä¿ç30æ¡ï¼ if (mockData.length > 30) { mockData = mockData.slice(0, 30); } console.log(`[${new Date().toLocaleString()}] èªå¨çææ°ç¥è¯: ${title}`); }; // çå½å¨æ onMounted(() => { getList(); @@ -515,7 +398,6 @@ // å¼å§èªå¨å·æ° const startAutoRefresh = () => { setInterval(() => { generateNewData(); getList(); }, 600000); // 10åéå·æ°ä¸æ¬¡ (10 * 60 * 1000 = 600000ms) }; @@ -605,14 +487,7 @@ // è·åç±»åæ ç¾ææ¬ const getTypeLabel = (type) => { const typeMap = { contract: "ååç¹æ¹", approval: "å®¡æ¹æ¡ä¾", solution: "è§£å³æ¹æ¡", experience: "ç»éªæ»ç»", guide: "æä½æå" }; return typeMap[type] || type; return getKnowledgeTypeLabel(type); }; // è·åæçæ ç¾ç±»å @@ -675,18 +550,6 @@ }); }; // æ¶èç¥è¯ const markAsFavorite = () => { // å¢å ä½¿ç¨æ¬¡æ° const index = mockData.findIndex(item => item.id === currentKnowledge.value.id); if (index !== -1) { mockData[index].usageCount += 1; currentKnowledge.value.usageCount += 1; } ElMessage.success("å·²æ¶èï¼ä½¿ç¨æ¬¡æ°+1"); }; // æäº¤ç¥è¯è¡¨å const submitForm = async () => { try { @@ -745,6 +608,18 @@ // å¯¼åº const { proxy } = getCurrentInstance() const { knowledge_type } = proxy.useDict("knowledge_type") // åå ¸å·¥å · const knowledgeTypeOptions = computed(() => knowledge_type?.value || []) const getKnowledgeTypeLabel = (val) => { const item = knowledgeTypeOptions.value.find(i => String(i.value) === String(val)) return item ? item.label : val } const getKnowledgeTypeTagType = (val) => { const item = knowledgeTypeOptions.value.find(i => String(i.value) === String(val)) return item?.elTagType || "info" } const handleExport = () => { proxy.download('/knowledgeBase/export', { ...searchForm.value }, 'ç¥è¯åº.xlsx') } src/views/collaborativeApproval/noticeManagement/index.vue
@@ -4,136 +4,89 @@ <div class="search_form"> <div> <el-button type="primary" @click="openForm('add')">æ°å¢å ¬å</el-button> <el-button type="danger" plain @click="handleDelete" :disabled="!selectedIds.length">å é¤</el-button> <el-button type="info" @click="openNoticeTypeDialog">å ¬åç±»åé ç½®</el-button> </div> </div> <!-- éç¥å ¬åæ¿ --> <div class="notice-board"> <!-- æ¾åéç¥åºå --> <div class="notice-section" v-if="holidayNoticeCount > 0"> <div class="section-header"> <h3>ð æ¾åéç¥</h3> <span class="section-count">{{ holidayNoticeCount }}æ¡</span> </div> <div class="notice-cards"> <div v-for="notice in holidayNotices" :key="notice.id" class="notice-card holiday-card" :class="{ 'urgent': notice.priority === '3' }" > <div class="card-header"> <div class="card-title"> <el-icon class="holiday-icon"> <Calendar/> </el-icon> {{ notice.title }} </div> <div class="card-actions"> <el-button link type="primary" @click="handleEdit(notice)" :disabled="isNoticeExpired(notice)">ç¼è¾</el-button> <el-button link type="danger" @click="handleDelete(notice.id)">å é¤</el-button> <el-tabs v-model="activeNoticeTypeTab" @tab-change="handleNoticeTypeTabChange"> <el-tab-pane v-for="noticeType in noticeTypeList" :key="noticeType.id" :label="noticeType.noticeType" :name="String(noticeType.id)" > <template #label> <span>{{ noticeType.noticeType }} <span class="tab-count" v-if="getNoticeCountByType(noticeType.id) > 0"> ({{ getNoticeCountByType(noticeType.id) }}) </span> </span> </template> <div class="notice-section"> <div class="notice-cards"> <div v-for="notice in getNoticesByType(noticeType.id)" :key="notice.id" class="notice-card" :class="{ 'urgent': notice.priority === '3' }" > <div class="card-header"> <div class="card-title"> <el-icon class="notice-icon"> <Calendar/> </el-icon> {{ notice.title }} </div> <div class="card-actions"> <el-button link type="primary" @click="handleEdit(notice)" :disabled="isNoticeExpired(notice)" v-if="notice.status !== 1">ç¼è¾</el-button> <el-button link type="success" @click="handlePublish(notice)" v-if="notice.status === 0">åå¸</el-button> <el-button link type="danger" @click="handleDelete(notice.id)" v-if="notice.status !== 1">å é¤</el-button> </div> </div> <div class="card-content"> <p>{{ notice.content }}</p> </div> <div class="card-footer"> <div class="card-meta"> <span class="priority" :class="'priority-' + notice.priority"> {{ getPriorityText(notice.priority) }} </span> <span class="status" :class="'status-' + getNoticeStatus(notice)"> {{ getStatusText(getNoticeStatus(notice)) }} </span> </div> <div class="card-info"> <span class="creator">{{ notice.createUserName }}</span> <span class="expiration" v-if="notice.expirationDate">æªæ¢æ¥æï¼{{ notice.expirationDate }}</span> </div> </div> <div class="card-remark" v-if="notice.remark"> <el-icon> <InfoFilled/> </el-icon> <span>{{ notice.remark }}</span> </div> </div> </div> <div class="card-content"> <p>{{ notice.content }}</p> </div> <div class="card-footer"> <div class="card-meta"> <span class="priority" :class="'priority-' + notice.priority"> {{ getPriorityText(notice.priority) }} </span> <span class="status" :class="'status-' + getNoticeStatus(notice)"> {{ getStatusText(getNoticeStatus(notice)) }} </span> </div> <div class="card-info"> <span class="creator">{{ notice.createUserName }}</span> <span class="expiration" v-if="notice.expirationDate">æªæ¢æ¥æï¼{{ notice.expirationDate }}</span> </div> </div> <div class="card-remark" v-if="notice.remark"> <el-icon> <InfoFilled/> </el-icon> <span>{{ notice.remark }}</span> <pagination v-if="getNoticePageByType(noticeType.id).total > 0" :total="getNoticePageByType(noticeType.id).total" :page="getNoticePageByType(noticeType.id).current" :limit="getNoticePageByType(noticeType.id).size" @pagination="(val) => handleNoticeCurrentChange(noticeType.id, val)" /> <!-- ç©ºç¶æ --> <div class="empty-state" v-if="getNoticesByType(noticeType.id).length === 0"> <el-empty description="ææ éç¥å ¬å"/> </div> </div> </div> </div> <pagination v-if="holidayNoticePage.total > 0" :total="holidayNoticePage.total" :page="holidayNoticePage.current" :limit="holidayNoticePage.size" @pagination="handleHolidayNoticeCurrentChange" /> <!-- 设å¤ç»´ä¿®éç¥åºå --> <div class="notice-section" v-if="maintenanceNoticeCount > 0"> <div class="section-header"> <h3>ð§ 设å¤ç»´ä¿®éç¥</h3> <span class="section-count">{{ maintenanceNoticeCount }}æ¡</span> </div> <div class="notice-cards"> <div v-for="notice in maintenanceNotices" :key="notice.id" class="notice-card maintenance-card" :class="{ 'urgent': notice.priority === '3' }" > <div class="card-header"> <div class="card-title"> <el-icon class="maintenance-icon"> <Tools/> </el-icon> {{ notice.title }} </div> <div class="card-actions"> <el-button link type="primary" @click="handleEdit(notice)" :disabled="isNoticeExpired(notice)">ç¼è¾</el-button> <el-button link type="danger" @click="handleDelete(notice.id)">å é¤</el-button> </div> </div> <div class="card-content"> <p>{{ notice.content }}</p> </div> <div class="card-footer"> <div class="card-meta"> <span class="priority" :class="'priority-' + notice.priority"> {{ getPriorityText(notice.priority) }} </span> <span class="status" :class="'status-' + getNoticeStatus(notice)"> {{ getStatusText(getNoticeStatus(notice)) }} </span> </div> <div class="card-info"> <span class="creator">{{ notice.createUserName }}</span> <span class="expiration" v-if="notice.expirationDate">æªæ¢æ¥æï¼{{ notice.expirationDate }}</span> </div> </div> <div class="card-remark" v-if="notice.remark"> <el-icon> <InfoFilled/> </el-icon> <span>{{ notice.remark }}</span> </div> </div> </div> </div> <pagination v-if="maintenanceNoticePage.total > 0" :total="maintenanceNoticePage.total" :page="maintenanceNoticePage.current" :limit="maintenanceNoticePage.size" @pagination="handleMaintenanceNoticeCurrentChange" /> <!-- ç©ºç¶æ --> <div class="empty-state" v-if="holidayNotices.length === 0 && maintenanceNotices.length === 0"> <el-empty description="ææ éç¥å ¬å"/> </div> </el-tab-pane> </el-tabs> </div> <!-- æ°å¢/ç¼è¾å¯¹è¯æ¡ --> @@ -154,8 +107,12 @@ <el-col :span="12"> <el-form-item label="å ¬åç±»å" prop="type"> <el-select v-model="form.type" placeholder="è¯·éæ©å ¬åç±»å" style="width: 100%"> <el-option label="æ¾åéç¥" :value="1"/> <el-option label="设å¤ç»´ä¿®éç¥" :value="2"/> <el-option v-for="item in noticeTypeList" :key="item.id" :label="item.noticeType" :value="item.id" /> </el-select> </el-form-item> </el-col> @@ -223,24 +180,96 @@ </div> </template> </el-dialog> <!-- å ¬åç±»åé ç½®å¼¹æ¡ --> <el-dialog v-model="noticeTypeDialogVisible" title="å ¬åç±»åé ç½®" width="800px" @close="handleNoticeTypeDialogClose" > <div class="notice-type-container"> <div class="notice-type-header"> <el-button type="primary" @click="handleAddNoticeType">æ°å¢ç±»å</el-button> </div> <el-table :data="noticeTypeList" border style="width: 100%"> <el-table-column prop="id" label="ID" width="80" align="center"/> <el-table-column prop="noticeType" label="å ¬åç±»å" align="center"> <template #default="scope"> <el-input v-if="scope.row.editing" v-model="scope.row.noticeType" placeholder="请è¾å ¥å ¬åç±»å" /> <span v-else>{{ scope.row.noticeType }}</span> </template> </el-table-column> <el-table-column label="æä½" width="200" align="center"> <template #default="scope"> <el-button v-if="scope.row.editing" link type="primary" size="small" @click="handleSaveNoticeType(scope.row)" > ä¿å </el-button> <el-button v-if="scope.row.editing" link type="info" size="small" @click="handleCancelEdit(scope.row)" > åæ¶ </el-button> <el-button v-if="!scope.row.editing" link type="primary" size="small" @click="handleEditNoticeType(scope.row)" > ç¼è¾ </el-button> <el-button v-if="!scope.row.editing" link type="danger" size="small" @click="handleDeleteNoticeType(scope.row)" > å é¤ </el-button> </template> </el-table-column> </el-table> </div> </el-dialog> </div> </template> <script setup> import {Search, Calendar, Tools, InfoFilled} from "@element-plus/icons-vue"; import {Calendar, InfoFilled} from "@element-plus/icons-vue"; import {onMounted, ref, reactive, toRefs, computed} from "vue"; import {ElMessage, ElMessageBox} from "element-plus"; import {useRoute} from "vue-router"; import useUserStore from "@/store/modules/user"; import { addNotice, delNotice, getCount, listNotice, updateNotice updateNotice, listNoticeType, addNoticeType, delNoticeType } from "../../../api/collaborativeApproval/noticeManagement.js"; import pagination from "../../../components/PIMTable/Pagination.vue"; const userStore = useUserStore(); const route = useRoute(); // ååºå¼æ°æ® const data = reactive({ @@ -280,8 +309,16 @@ // 页é¢ç¶æ const dialogVisible = ref(false); const dialogTitle = ref(""); const selectedIds = ref([]); const formRef = ref(); // å ¬åç±»åé ç½®ç¸å ³ const noticeTypeDialogVisible = ref(false); const noticeTypeList = ref([]); const activeNoticeTypeTab = ref(''); // éç¥æ°æ® - ä½¿ç¨ Map åå¨ï¼key 为类å id const noticesMap = ref({}); const noticePagesMap = ref({}); // 计ç®å±æ§ @@ -398,6 +435,28 @@ }); }; const handlePublish = (notice) => { ElMessageBox.confirm( "确认åå¸è¿æ¡å ¬ååï¼", "æç¤º", { confirmButtonText: "ç¡®å®", cancelButtonText: "åæ¶", type: "info" } ).then(() => { updateNotice({ ...notice, status: 1 }).then(res => { if (res.code === 200) { ElMessage.success("å叿å"); resetTable() } }) }); }; const submitForm = () => { formRef.value.validate((valid) => { if (valid) { @@ -419,78 +478,257 @@ }); }; const holidayNoticeCount = ref() const maintenanceNoticeCount = ref() const fetchCount = () => { getCount().then(res => { holidayNoticeCount.value = res.data.filter(item => { return item.type === 1 })[0].count; maintenanceNoticeCount.value = res.data.filter(item => { return item.type === 2 })[0].count; }); } // åå§åæä¸ªç±»åçåé¡µæ°æ® const initNoticePage = (typeId) => { if (!noticePagesMap.value[typeId]) { noticePagesMap.value[typeId] = { total: 0, current: 1, size: 10 }; } if (!noticesMap.value[typeId]) { noticesMap.value[typeId] = []; } }; const holidayNotices = ref([]) const maintenanceNotices = ref([]) const holidayNoticePage = ref({ total: 0, current: 1, size: 9 }) // è·åæä¸ªç±»åçéç¥å表 const getNoticesByType = (typeId) => { return noticesMap.value[typeId] || []; }; const maintenanceNoticePage = ref({ total: 0, current: 1, size: 9 }) // è·åæä¸ªç±»åçåé¡µæ°æ® const getNoticePageByType = (typeId) => { return noticePagesMap.value[typeId] || { total: 0, current: 1, size: 10 }; }; const fetchHolidayNotices = () => { listNotice({...holidayNoticePage.value, type: 1}).then(res => { holidayNotices.value = res.data.records holidayNoticePage.value.total = res.data.total // è·åæä¸ªç±»åçæ°é const getNoticeCountByType = (typeId) => { return getNoticePageByType(typeId).total || 0; }; // è·åæä¸ªç±»åçéç¥æ°æ® const fetchNoticesByType = (typeId) => { initNoticePage(typeId); const pageData = noticePagesMap.value[typeId]; listNotice({...pageData, type: typeId}).then(res => { if (res.code === 200) { noticesMap.value[typeId] = res.data.records || []; noticePagesMap.value[typeId].total = res.data.total || 0; } }); }; const fetchMaintenanceNotices = () => { listNotice({...holidayNoticePage.value, type: 2}).then(res => { maintenanceNotices.value = res.data.records maintenanceNoticePage.value.total = res.data.total }); // å¤çå页åå const handleNoticeCurrentChange = (typeId, val) => { initNoticePage(typeId); noticePagesMap.value[typeId].size = val.limit; noticePagesMap.value[typeId].current = val.page; fetchNoticesByType(typeId); }; const handleHolidayNoticeCurrentChange = (val) => { holidayNoticePage.value.size = val.limit holidayNoticePage.value.current = val.page fetchHolidayNotices() }; const handleMaintenanceNoticeCurrentChange = (val) => { maintenanceNoticePage.value.size = val.limit maintenanceNoticePage.value.current = val.page fetchMaintenanceNotices() // å¤ç tab 忢 const handleNoticeTypeTabChange = (tabName) => { activeNoticeTypeTab.value = tabName; const typeId = Number(tabName); fetchNoticesByType(typeId); }; const resetTable = () => { holidayNoticePage.value.current = 1 holidayNoticePage.value.size = 9 maintenanceNoticePage.value.current = 1 maintenanceNoticePage.value.size = 9 fetchHolidayNotices() fetchMaintenanceNotices() fetchCount() // éç½®ææç±»åçå页并鿰è·åæ°æ® noticeTypeList.value.forEach(type => { initNoticePage(type.id); noticePagesMap.value[type.id].current = 1; noticePagesMap.value[type.id].size = 10; fetchNoticesByType(type.id); }); }; const resetForm = () => { formRef.value?.resetFields(); }; // å ¬åç±»åé ç½®ç¸å ³æ¹æ³ const openNoticeTypeDialog = () => { noticeTypeDialogVisible.value = true; fetchNoticeTypeList(); }; const fetchNoticeTypeList = () => { return listNoticeType().then(res => { if (res.code === 200) { noticeTypeList.value = res.data.map(item => ({ ...item, editing: false })); // æ£æ¥è·¯ç±åæ°ä¸ç type const routeType = route.query.type; let targetTypeId = null; if (routeType) { // å¦æè·¯ç±åæ°ä¸æ typeï¼æ¥æ¾å¯¹åºçç±»å const typeId = Number(routeType); const foundType = noticeTypeList.value.find(item => item.id === typeId); if (foundType) { targetTypeId = typeId; } } // 妿æç±»åæ°æ® if (noticeTypeList.value.length > 0) { // å¦æè·¯ç±åæ°æå®äºç±»åä¸åå¨ï¼ä½¿ç¨è·¯ç±åæ°çç±»å // å¦åå¦ææ²¡æéä¸ tabï¼é»è®¤éä¸ç¬¬ä¸ä¸ª if (targetTypeId !== null) { activeNoticeTypeTab.value = String(targetTypeId); fetchNoticesByType(targetTypeId); } else if (!activeNoticeTypeTab.value) { activeNoticeTypeTab.value = String(noticeTypeList.value[0].id); fetchNoticesByType(noticeTypeList.value[0].id); } } } }); }; const handleAddNoticeType = () => { const newItem = { id: undefined, noticeType: '', editing: true }; noticeTypeList.value.push(newItem); }; const handleEditNoticeType = (row) => { // ä¿ååå§å¼ row.originalNoticeType = row.noticeType; row.editing = true; }; const handleSaveNoticeType = (row) => { if (!row.noticeType || row.noticeType.trim() === '') { ElMessage.warning('å ¬åç±»åä¸è½ä¸ºç©º'); return; } const data = { noticeType: row.noticeType.trim() }; if (row.id) { // ç¼è¾æ¨¡å¼ - å å é¤åæ·»å ï¼å ä¸ºåªæ add å del æ¥å£ï¼ delNoticeType(row.id).then(res => { if (res.code === 200) { addNoticeType(data).then(addRes => { if (addRes.code === 200) { ElMessage.success('ç¼è¾æå'); row.editing = false; delete row.originalNoticeType; fetchNoticeTypeList().then(() => { // 妿å½åéä¸çç±»å被ç¼è¾ï¼éè¦éæ°è·åæ°æ® if (activeNoticeTypeTab.value === String(row.id)) { fetchNoticesByType(addRes.data?.id || row.id); } }); } }); } }); } else { // æ°å¢æ¨¡å¼ addNoticeType(data).then(res => { if (res.code === 200) { ElMessage.success('æ°å¢æå'); row.editing = false; fetchNoticeTypeList(); } }); } }; const handleDeleteNoticeType = (row) => { // å¦ææ²¡æidï¼è¯´ææ¯æ°å¢ä½æªä¿åçè¡ï¼ç´æ¥ä»å端å é¤ if (!row.id) { const index = noticeTypeList.value.indexOf(row); if (index > -1) { noticeTypeList.value.splice(index, 1); } return; } // 妿æidï¼è°ç¨å端æ¥å£å é¤ ElMessageBox.confirm( "确认å é¤è¿ä¸ªå ¬åç±»ååï¼", "æç¤º", { confirmButtonText: "ç¡®å®", cancelButtonText: "åæ¶", type: "warning" } ).then(() => { delNoticeType(row.id).then(res => { if (res.code === 200) { ElMessage.success("å 餿å"); // 妿å é¤çæ¯å½åéä¸çç±»åï¼åæ¢å°ç¬¬ä¸ä¸ªç±»å if (activeNoticeTypeTab.value === String(row.id)) { fetchNoticeTypeList().then(() => { if (noticeTypeList.value.length > 0) { activeNoticeTypeTab.value = String(noticeTypeList.value[0].id); fetchNoticesByType(noticeTypeList.value[0].id); } else { activeNoticeTypeTab.value = ''; } }); } else { fetchNoticeTypeList(); } } }); }); }; const handleCancelEdit = (row) => { if (!row.id) { // å¦ææ¯æ°å¢ä½æªä¿åçè¡ï¼ç§»é¤å® const index = noticeTypeList.value.indexOf(row); if (index > -1) { noticeTypeList.value.splice(index, 1); } } else { // 妿æ¯ç¼è¾ä¸çè¡ï¼åæ¶ç¼è¾ç¶æå¹¶æ¢å¤åå¼ row.editing = false; if (row.originalNoticeType !== undefined) { row.noticeType = row.originalNoticeType; delete row.originalNoticeType; } } }; const handleNoticeTypeDialogClose = () => { // å ³éå¼¹æ¡æ¶ï¼åæ¶ææç¼è¾ç¶æ noticeTypeList.value.forEach(item => { if (item.editing && !item.id) { // å¦ææ¯æ°å¢ä½æªä¿åçè¡ï¼ç§»é¤å® const index = noticeTypeList.value.indexOf(item); if (index > -1) { noticeTypeList.value.splice(index, 1); } } else if (item.editing) { // 妿æ¯ç¼è¾ä¸çè¡ï¼åæ¶ç¼è¾ç¶æå¹¶æ¢å¤åå¼ item.editing = false; if (item.originalNoticeType !== undefined) { item.noticeType = item.originalNoticeType; delete item.originalNoticeType; } } }); }; // çå½å¨æ onMounted(() => { fetchCount() fetchHolidayNotices() fetchMaintenanceNotices() // å è·åå ¬åç±»åå表ï¼ç¶åæ ¹æ®ç±»åè·åéç¥æ°æ® fetchNoticeTypeList(); }); </script> @@ -569,12 +807,16 @@ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); } .holiday-card { border-left-color: #67c23a; .notice-icon { color: #409eff; margin-right: 8px; font-size: 18px; } .maintenance-card { border-left-color: #e6a23c; .tab-count { color: #909399; font-size: 12px; margin-left: 4px; } .urgent { @@ -598,17 +840,6 @@ flex: 1; } .holiday-icon { color: #67c23a; margin-right: 8px; font-size: 18px; } .maintenance-icon { color: #e6a23c; margin-right: 8px; font-size: 18px; } .card-actions { display: flex; @@ -713,6 +944,16 @@ text-align: right; } .notice-type-container { padding: 10px 0; } .notice-type-header { margin-bottom: 15px; display: flex; justify-content: flex-end; } /* ååºå¼è®¾è®¡ */ @media (max-width: 768px) { .notice-cards { src/views/collaborativeApproval/rulesRegulationsManagement/index.vue
@@ -52,54 +52,21 @@ </template> </el-table-column> <el-table-column prop="readCount" label="已读人æ°" width="100" /> <el-table-column label="æä½" width="250" fixed="right"> <el-table-column label="æä½" width="320" fixed="right"> <template #default="scope"> <el-button link @click="viewRegulation(scope.row)">æ¥ç</el-button> <el-button link type="primary" @click="handleEdit(scope.row)">ç¼è¾</el-button> <el-button link type="danger" @click="repealEdit(scope.row)">åºå¼</el-button> <el-button link type="success" @click="viewVersionHistory(scope.row)">çæ¬åå²</el-button> <el-button link type="warning" @click="viewReadStatus(scope.row)">é è¯»ç¶æ</el-button> <el-button link type="primary" @click="openFileDialog(scope.row)">éä»¶</el-button> </template> </el-table-column> </el-table> </div> </el-card> <!-- ç¨å°ç³è¯·å¯¹è¯æ¡ --> <!-- <el-dialog v-model="showSealApplyDialog" title="ç³è¯·ç¨å°" width="600px"> <el-form :model="sealForm" :rules="sealRules" ref="sealFormRef" label-width="100px"> <el-form-item label="ç³è¯·ç¼å·" prop="applicationNum"> <el-input v-model="sealForm.applicationNum" placeholder="请è¾å ¥ç³è¯·ç¼å·" /> </el-form-item> <el-form-item label="ç³è¯·æ é¢" prop="title"> <el-input v-model="sealForm.title" placeholder="请è¾å ¥ç³è¯·æ é¢" /> </el-form-item> <el-form-item label="ç¨å°ç±»å" prop="sealType"> <el-select v-model="sealForm.sealType" placeholder="è¯·éæ©ç¨å°ç±»å" style="width: 100%"> <el-option label="å ¬ç« " value="official" /> <el-option label="ååä¸ç¨ç« " value="contract" /> <el-option label="è´¢å¡ä¸ç¨ç« " value="finance" /> <el-option label="æ³äººç« " value="legal" /> </el-select> </el-form-item> <el-form-item label="ç³è¯·åå " prop="reason"> <el-input v-model="sealForm.reason" type="textarea" :rows="4" placeholder="请详ç»è¯´æç¨å°åå " /> </el-form-item> <el-form-item label="ç´§æ¥ç¨åº¦" prop="urgency"> <el-radio-group v-model="sealForm.urgency"> <el-radio label="normal">æ®é</el-radio> <el-radio label="urgent">ç´§æ¥</el-radio> <el-radio label="very-urgent">ç¹æ¥</el-radio> </el-radio-group> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="showSealApplyDialog = false">åæ¶</el-button> <el-button type="primary" @click="submitSealApplication">æäº¤ç³è¯·</el-button> </span> </template> </el-dialog> --> <!-- ç¨å°ç³è¯·å¯¹è¯æ¡ï¼å·²ç§»é¤ï¼ --> <!-- è§ç« å¶åº¦åå¸å¯¹è¯æ¡ --> <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? 'åå¸å¶åº¦' : 'ç¼è¾å¶åº¦'" width="800px"> @@ -150,25 +117,7 @@ </template> </el-dialog> <!-- ç¨å°è¯¦æ å¯¹è¯æ¡ --> <!-- <el-dialog v-model="showSealDetailDialog" title="ç¨å°ç³è¯·è¯¦æ " width="700px"> <div v-if="currentSealDetail" class="mb10"> <el-descriptions :column="2" border> <el-descriptions-item label="ç³è¯·ç¼å·">{{ currentSealDetail.id }}</el-descriptions-item> <el-descriptions-item label="ç³è¯·æ é¢">{{ currentSealDetail.title }}</el-descriptions-item> <el-descriptions-item label="ç³è¯·äºº">{{ currentSealDetail.createUserName }}</el-descriptions-item> <el-descriptions-item label="æå±é¨é¨">{{ currentSealDetail.department }}</el-descriptions-item> <el-descriptions-item label="ç¨å°ç±»å">{{ getSealTypeText(currentSealDetail.sealType) }}</el-descriptions-item> <el-descriptions-item label="ç³è¯·æ¶é´">{{ currentSealDetail.createTime }}</el-descriptions-item> <el-descriptions-item label="ç¶æ"> <el-tag :type="getStatusType(currentSealDetail.status)"> {{ getStatusText(currentSealDetail.status) }} </el-tag> </el-descriptions-item> <el-descriptions-item label="ç³è¯·åå " :span="2">{{ currentSealDetail.reason }}</el-descriptions-item> </el-descriptions> </div> </el-dialog> --> <!-- ç¨å°è¯¦æ å¯¹è¯æ¡ï¼å·²ç§»é¤ï¼ --> <!-- è§ç« å¶åº¦è¯¦æ å¯¹è¯æ¡ --> <el-dialog v-model="showRegulationDetailDialog" title="è§ç« å¶åº¦è¯¦æ " width="800px"> @@ -224,54 +173,42 @@ </el-table-column> </el-table> </el-dialog> <FileListDialog ref="fileListDialogRef" v-model="fileDialogVisible" :show-upload-button="true" :show-delete-button="true" :delete-method="handleAttachmentDelete" :rules-regulations-management-id="currentFileRuleId" :name-column-label="'éä»¶åç§°'" @upload="handleAttachmentUpload" /> </div> </template> <script setup> import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { Plus } from '@element-plus/icons-vue' import { listSealApplication, addSealApplication, updateSealApplication,listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,getReadingStatusList,addReadingStatus,updateReadingStatus } from '@/api/collaborativeApproval/sealManagement.js' import { el } from 'element-plus/es/locales.mjs' import { getUserProfile } from '@/api/system/user.js' import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js"; import useUserStore from '@/store/modules/user' import { userLoginFacotryList } from "@/api/system/user.js" import { listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,addReadingStatus,updateReadingStatus } from '@/api/collaborativeApproval/sealManagement.js' import FileListDialog from '@/components/Dialog/FileListDialog.vue' import { listRuleFiles, delRuleFile, addRuleFile } from '@/api/collaborativeApproval/rulesRegulationsManagementFile.js' // ååºå¼æ°æ® const currentUser = ref(null) const activeTab = ref('seal') const operationType = ref('add') const tableData = ref([]) // ç¨å°ç³è¯·ç¸å ³ const userStore = useUserStore() const showSealApplyDialog = ref(false) const tableLoading = ref(false) const showSealDetailDialog = ref(false) const currentSealDetail = ref(null) const sealFormRef = ref() const sealForm = reactive({ applicationNum: '', title: '', sealType: '', reason: '', urgency: 'normal', status: 'pending' }) const sealRules = { applicationNum: [{ required: true, message: '请è¾å ¥ç³è¯·ç¼å·', trigger: 'blur' }], title: [{ required: true, message: '请è¾å ¥ç³è¯·æ é¢', trigger: 'blur' }], sealType: [{ required: true, message: 'è¯·éæ©ç¨å°ç±»å', trigger: 'change' }], reason: [{ required: true, message: '请è¾å ¥ç³è¯·åå ', trigger: 'blur' }] } const sealSearchForm = reactive({ title: '', status: '' }) // å页忰 const page = reactive({ current: 1, size: 10, total: 0 }) // éä»¶å¼¹çª const fileDialogVisible = ref(false) const fileListDialogRef = ref(null) const currentFileRuleId = ref(null) const filePage = reactive({ current: 1, size: 10, total: 0 @@ -320,9 +257,6 @@ category: '' }) // åæ°æ® const sealApplications = ref([]) const regulations = ref([]) const versionHistory = ref([]) @@ -332,34 +266,6 @@ // { employee: 'åé å©·', department: 'ææ¯é¨', readTime: '2025-01-11 14:20:00', confirmTime: '', status: 'unconfirmed' }, // { employee: 'ç建å½', department: 'è´¢å¡é¨', readTime: '2025-01-12 09:15:00', confirmTime: '2025-01-12 09:20:00', status: 'confirmed' } // ç¨å°ç³è¯·ç¶æ const getStatusType = (status) => { const statusMap = { pending: 'warning', approved: 'success', rejected: 'danger' } return statusMap[status] || 'info' } // å¶åº¦ç¶æ const getStatusText = (status) => { const statusMap = { pending: 'å¾ å®¡æ¹', approved: 'å·²éè¿', rejected: 'å·²æç»' } return statusMap[status] || 'æªç¥' } // ç¨å°ç±»å const getSealTypeText = (sealType) => { const sealTypeMap = { official: 'å ¬ç« ', contract: 'ååä¸ç¨ç« ', finance: 'è´¢å¡ä¸ç¨ç« ', tegal: 'ææ¯ä¸ç¨ç« ' } return sealTypeMap[sealType] || 'æªç¥' } // å¶åº¦åç±» const getCategoryText = (category) => { const categoryMap = { @@ -369,19 +275,6 @@ tech: 'ææ¯å¶åº¦' } return categoryMap[category] || 'æªç¥' } // æç´¢å°ç« ç³è¯· const searchSealApplications = () => { page.current=1 getSealApplicationList() // ElMessage.success('æç´¢å®æ') } // éç½®å°ç« ç³è¯·æç´¢ const resetSealSearch = () => { sealSearchForm.title = '' sealSearchForm.status = '' searchSealApplications() } // æç´¢å¶åº¦ const searchRegulations = () => { @@ -393,32 +286,6 @@ regulationSearchForm.title = '' regulationSearchForm.category = '' searchRegulations() } // æäº¤ç¨å°ç³è¯· const submitSealApplication = async () => { try { await sealFormRef.value.validate() addSealApplication(sealForm).then(res => { if(res.code == 200){ ElMessage.success('ç³è¯·æäº¤æå') showSealApplyDialog.value = false getSealApplicationList() Object.assign(sealForm, { applicationNum: '', title: '', sealType: '', reason: '', urgency: 'normal', status: 'pending' }) } }).catch(err => { ElMessage.error(err.msg) }) } catch (error) { ElMessage.error('请å®åç³è¯·ä¿¡æ¯') } } // æ°å¢ const handleAdd = () => { @@ -501,72 +368,6 @@ } // æ¥çç¨å°ç³è¯·è¯¦æ const viewSealDetail = (row) => { currentSealDetail.value = row showSealDetailDialog.value = true } // 审æ¹ç¨å°ç³è¯· const approveSeal = (row) => { console.log(row) ElMessageBox.confirm('确认éè¿è¯¥ç¨å°ç³è¯·ï¼', 'æç¤º', { confirmButtonText: 'ç¡®å®', cancelButtonText: 'åæ¶', type: 'warning' }).then(() => { row.status = 'approved' updateSealApplication(row).then(res => { if(res.code == 200){ ElMessage.success('审æ¹éè¿') } }) }) } // æç»ç¨å°ç³è¯· const rejectSeal = (row) => { ElMessageBox.prompt('请è¾å ¥æç»åå ', 'æç¤º', { confirmButtonText: 'ç¡®å®', cancelButtonText: 'åæ¶', inputPattern: /\S+/, inputErrorMessage: 'æç»åå ä¸è½ä¸ºç©º' }).then(({ value }) => { row.status = 'rejected' updateSealApplication(row).then(res => { if(res.code == 200){ ElMessage.success('å®¡æ¹æç»') } }) ElMessage.success('å·²æç»ç³è¯·') }) } // è·åå¨èåå·¥å表 const getList = () => { tableLoading.value = true; //è·åå½åç»å½ç¨æ·ä¿¡æ¯ getUserProfile().then(res => { if(res.code == 200){ console.log(res.data.userName) currentUser.value = res.data.userName } }) staffJoinListPage({staffState: 1}).then(res => { tableLoading.value = false; // tableData.value = res.data.records // //çéåºåcurrentUserååç人å tableData.value = res.data.records.filter(item => item.staffName === currentUser.value) console.log("tableData",tableData.value) page.total = res.data.total; if(tableData.value.length == 0){ ElMessage.error('å½åç¨æ·æªå å ¥ä»»ä½é¨é¨') } }).catch(err => { tableLoading.value = false; }) }; // æ¥çå¶åº¦çæ¬åå² const viewVersionHistory = (row) => { showVersionHistoryDialog.value = true @@ -582,7 +383,6 @@ } // æ¥çå¶åº¦è¯¦æ const viewRegulation = (row) => { getList() currentRegulationDetail.value = row showRegulationDetailDialog.value = true getReadingStatusByRuleId(row.id).then(res => { @@ -659,32 +459,64 @@ proxy.download('/rulesRegulationsManagement/export', { ...regulationSearchForm }, 'è§ç« å¶åº¦.xlsx') } // è·åå°ç« ç³è¯·åè¡¨æ°æ® const getSealApplicationList = async () => { tableLoading.value = true listSealApplication(page,sealSearchForm) .then(res => { //è·åå½åç»å½çé¨é¨ä¿¡æ¯ // è·åå½åç»å½çé¨é¨ä¿¡æ¯å¹¶è¿æ»¤æ°æ® const currentFactoryName = userStore.currentFactoryName if (currentFactoryName) { // æ ¹æ®currentFactoryNameè¿æ»¤åºdepartmentç¸åçæ°æ® sealApplications.value = res.data.records.filter(item => item.department === currentFactoryName) // æ´æ°è¿æ»¤åçæ»æ° page.value.total = sealApplications.value.length } else { // å¦ææ²¡æcurrentFactoryNameï¼åæ¾ç¤ºæææ°æ® sealApplications.value = res.data.records page.value.total = res.data.total } // sealApplications.value = res.data.records // page.value.total = res.data.total; tableLoading.value = false; }).catch(err => { tableLoading.value = false; }) // éä»¶ï¼æ¥è¯¢ const fetchRuleFiles = async (rulesRegulationsManagementId) => { const params = { current: filePage.current, size: filePage.size, rulesRegulationsManagementId } const res = await listRuleFiles(params) const records = res?.data?.records || [] filePage.total = res?.data?.total || records.length const mapped = records.map(item => ({ id: item.id, name: item.fileName || item.name, url: item.fileUrl || item.url, raw: item })) fileListDialogRef.value?.setList(mapped) } // æå¼éä»¶å¼¹çª const openFileDialog = async (row) => { currentFileRuleId.value = row.id fileDialogVisible.value = true await fetchRuleFiles(row.id) } // å·æ°éä»¶å表 const refreshFileList = async () => { if (!currentFileRuleId.value) return await fetchRuleFiles(currentFileRuleId.value) } // ä¸ä¼ éä»¶ï¼ç±åç»ä»¶è§¦åï¼ const handleAttachmentUpload = async (filePayload) => { if (!currentFileRuleId.value) return const payload = { name: filePayload?.fileName || filePayload?.name, url: filePayload?.fileUrl || filePayload?.url, rulesRegulationsManagementId: currentFileRuleId.value } await addRuleFile(payload) ElMessage.success('æä»¶ä¸ä¼ æå') await refreshFileList() } // å é¤éä»¶ const handleAttachmentDelete = async (row) => { if (!row?.id) return false try { await ElMessageBox.confirm('确认å é¤è¯¥éä»¶ï¼', 'æç¤º', { type: 'warning' }) } catch { return false } await delRuleFile([row.id]) ElMessage.success('å 餿å') await refreshFileList() } // è·åè§ç« å¶åº¦åè¡¨æ°æ® const getRegulationList = async () => { tableLoading.value = true @@ -704,7 +536,6 @@ onMounted(() => { // åå§å getSealApplicationList() getRegulationList() }) </script> src/views/collaborativeApproval/sealManagement/index.vue
@@ -12,11 +12,15 @@ <div class="tab-content"> <el-row :gutter="20" class="mb-20 "> <span class="ml-10">ç¨å°æ é¢ï¼</span> <el-col :span="6"> <el-col :span="4"> <el-input v-model="sealSearchForm.title" placeholder="请è¾å ¥ç³è¯·æ é¢" clearable /> </el-col> <span class="ml-10">ç¨å°ç¼å·ï¼</span> <el-col :span="4"> <el-input v-model="sealSearchForm.applicationNum" placeholder="请è¾å ¥ç¨å°ç¼å·" clearable /> </el-col> <span class="search_title">审æ¹ç¶æï¼</span> <el-col :span="6"> <el-col :span="4"> <el-select v-model="sealSearchForm.status" placeholder="审æ¹ç¶æ" clearable> <el-option label="å¾ å®¡æ¹" value="pending" /> <el-option label="å·²éè¿" value="approved" /> @@ -96,6 +100,16 @@ </el-form-item> <el-form-item label="ç³è¯·åå " prop="reason"> <el-input v-model="sealForm.reason" type="textarea" :rows="4" placeholder="请详ç»è¯´æç¨å°åå " /> </el-form-item> <el-form-item label="审æ¹äºº" prop="approveUserId"> <el-select v-model="sealForm.approveUserId" placeholder="è¯·éæ©å®¡æ¹äºº" style="width: 100%" filterable> <el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" /> </el-select> </el-form-item> <el-form-item label="ç´§æ¥ç¨åº¦" prop="urgency"> <el-radio-group v-model="sealForm.urgency"> @@ -240,12 +254,13 @@ </template> <script setup> import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import { ref, reactive, onMounted, getCurrentInstance, watch } from 'vue' import { useRoute } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { Plus } from '@element-plus/icons-vue' import { listSealApplication, addSealApplication, updateSealApplication,listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,getReadingStatusList,addReadingStatus,updateReadingStatus } from '@/api/collaborativeApproval/sealManagement.js' import { el } from 'element-plus/es/locales.mjs' import { getUserProfile } from '@/api/system/user.js' import { getUserProfile, userListNoPageByTenantId } from '@/api/system/user.js' import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js"; import useUserStore from '@/store/modules/user' import { userLoginFacotryList } from "@/api/system/user.js" @@ -257,16 +272,19 @@ const tableData = ref([]) // ç¨å°ç³è¯·ç¸å ³ const userStore = useUserStore() const route = useRoute() const showSealApplyDialog = ref(false) const tableLoading = ref(false) const showSealDetailDialog = ref(false) const currentSealDetail = ref(null) const sealFormRef = ref() const userList = ref([]) const sealForm = reactive({ applicationNum: '', title: '', sealType: '', reason: '', approveUserId: '', urgency: 'normal', status: 'pending' }) @@ -275,12 +293,14 @@ applicationNum: [{ required: true, message: '请è¾å ¥ç³è¯·ç¼å·', trigger: 'blur' }], title: [{ required: true, message: '请è¾å ¥ç³è¯·æ é¢', trigger: 'blur' }], sealType: [{ required: true, message: 'è¯·éæ©ç¨å°ç±»å', trigger: 'change' }], reason: [{ required: true, message: '请è¾å ¥ç³è¯·åå ', trigger: 'blur' }] reason: [{ required: true, message: '请è¾å ¥ç³è¯·åå ', trigger: 'blur' }], approveUserId: [{ required: true, message: 'è¯·éæ©å®¡æ¹äºº', trigger: 'change' }] } const sealSearchForm = reactive({ title: '', status: '' status: '', applicationNum: '' }) // å页忰 const page = reactive({ @@ -393,6 +413,7 @@ const resetSealSearch = () => { sealSearchForm.title = '' sealSearchForm.status = '' sealSearchForm.applicationNum = '' searchSealApplications() } // æç´¢å¶åº¦ @@ -420,6 +441,7 @@ title: '', sealType: '', reason: '', approveUserId: '', urgency: 'normal', status: 'pending' }) @@ -713,9 +735,24 @@ }) } // çå¬å¯¹è¯æ¡æå¼ï¼è·åç¨æ·å表 watch(showSealApplyDialog, (newVal) => { if (newVal) { userListNoPageByTenantId().then((res) => { userList.value = res.data; }); } }); onMounted(() => { // åå§å getSealApplicationList() // è·¯ç±æºå¸¦ applicationNum æ¶ï¼é¢å¡«å¹¶æ¥è¯¢ if (route.query.applicationNum) { sealSearchForm.applicationNum = String(route.query.applicationNum) page.current = 1 getSealApplicationList() } else { getSealApplicationList() } getRegulationList() }) </script>