| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-row :gutter="16" class="mb-16"> |
| | | <el-col :span="12"> |
| | | <el-card shadow="hover"> |
| | | <div class="section-title">ç»ä¸ä¼è®¡ç§ç®ä½ç³»</div> |
| | | <el-tree |
| | | :data="accountTree" |
| | | node-key="code" |
| | | :props="{ label: 'label', children: 'children' }" |
| | | highlight-current |
| | | default-expand-all |
| | | /> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-card shadow="hover"> |
| | | <div class="section-title">åè¯æ¨¡æ¿</div> |
| | | <el-table :data="voucherTemplates" border size="small"> |
| | | <el-table-column prop="name" label="模æ¿åç§°" min-width="140" /> |
| | | <el-table-column prop="bizScene" label="ä¸å¡åºæ¯" min-width="140" /> |
| | | <el-table-column prop="debit" label="åæ¹ç§ç®" min-width="160" /> |
| | | <el-table-column prop="credit" label="è´·æ¹ç§ç®" min-width="160" /> |
| | | <el-table-column prop="auxDims" label="è¾
婿 ¸ç®ç»´åº¦" min-width="180"> |
| | | <template #default="scope"> |
| | | <el-space wrap> |
| | | <el-tag v-for="dim in scope.row.auxDims" :key="dim" size="small" type="info">{{ dim }}</el-tag> |
| | | </el-space> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="16" class="mb-16"> |
| | | <el-col :span="12"> |
| | | <el-card shadow="hover"> |
| | | <div class="section-title">ä¸å¡æµç¨ â åè¯èªå¨çæ</div> |
| | | <div class="toolbar"> |
| | | <el-text type="info">æ¼ç¤ºæ°æ®ä»
ç¨äºå±ç¤ºç»æä¸å段</el-text> |
| | | </div> |
| | | <el-table :data="generatedVouchers" border size="small"> |
| | | <el-table-column prop="date" label="æ¥æ" width="110" /> |
| | | <el-table-column prop="bizScene" label="ä¸å¡åºæ¯" min-width="120" /> |
| | | <el-table-column prop="summary" label="æè¦" min-width="160" /> |
| | | <el-table-column prop="amount" label="éé¢(Â¥)" width="110" /> |
| | | <el-table-column prop="status" label="ç¶æ" width="100"> |
| | | <template #default="scope"> |
| | | <el-tag :type="scope.row.status === 'å·²çæ' ? 'success' : 'warning'">{{ scope.row.status }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-card shadow="hover"> |
| | | <div class="section-title">å¤ç»´è¾
婿 ¸ç®</div> |
| | | <div class="dims"> |
| | | <el-tag type="success">客æ·</el-tag> |
| | | <el-tag type="warning">项ç®</el-tag> |
| | | <el-tag type="info">é¨é¨</el-tag> |
| | | <el-tag type="primary">管çå</el-tag> |
| | | </div> |
| | | <el-table :data="auxSummary" size="small" border> |
| | | <el-table-column prop="dimension" label="维度" width="100" /> |
| | | <el-table-column prop="category" label="ç±»å«" min-width="140" /> |
| | | <el-table-column prop="debit" label="åæ¹(æ¬æ)" width="110" /> |
| | | <el-table-column prop="credit" label="è´·æ¹(æ¬æ)" width="110" /> |
| | | <el-table-column prop="balance" label="ä½é¢" width="100" /> |
| | | </el-table> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="16" class="mb-16"> |
| | | <el-col :span="12"> |
| | | <el-card shadow="hover"> |
| | | <div class="section-title">ç»è´¦ä»»å¡ï¼æ/å£/å¹´ï¼</div> |
| | | <div class="toolbar"> |
| | | <el-space> |
| | | <el-button size="small" @click="runClose('æç»')">æ§è¡æç»</el-button> |
| | | <el-button size="small" @click="runClose('壿¥')">æ§è¡å£æ¥</el-button> |
| | | <el-button size="small" @click="runClose('年度ç»è´¦')">æ§è¡å¹´åº¦ç»è´¦</el-button> |
| | | </el-space> |
| | | </div> |
| | | <el-timeline style="margin-top: 6px;"> |
| | | <el-timeline-item |
| | | v-for="item in closingTasks" |
| | | :key="item.id" |
| | | :type="item.type" |
| | | :timestamp="item.time" |
| | | placement="top" |
| | | > |
| | | <div class="close-item"> |
| | | <div class="title">{{ item.name }}</div> |
| | | <el-tag :type="item.status === '宿' ? 'success' : 'info'" size="small">{{ item.status }}</el-tag> |
| | | </div> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-card shadow="hover"> |
| | | <div class="section-title">审计ççä¸å®¡æ¹æé</div> |
| | | <el-table :data="auditTrail" border size="small"> |
| | | <el-table-column prop="time" label="æ¶é´" width="160" /> |
| | | <el-table-column prop="action" label="å¨ä½" min-width="160" /> |
| | | <el-table-column prop="bizScene" label="å
³èä¸å¡" min-width="140" /> |
| | | <el-table-column prop="role" label="æ§è¡è§è²" width="120" /> |
| | | <el-table-column prop="result" label="ç»æ" width="100"> |
| | | <template #default="scope"> |
| | | <el-tag :type="scope.row.result === 'éè¿' ? 'success' : (scope.row.result === '驳å' ? 'danger' : 'info')"> |
| | | {{ scope.row.result }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref } from 'vue' |
| | | |
| | | // ç§ç®æ ï¼ç¤ºä¾ï¼ |
| | | const accountTree = ref([ |
| | | { code: '1001', label: 'èµäº§', children: [ |
| | | { code: '100101', label: 'åºåç°é' }, |
| | | { code: '100102', label: 'é¶è¡å款' }, |
| | | { code: '1122', label: 'åºæ¶è´¦æ¬¾' }, |
| | | { code: '1601', label: 'åºå®èµäº§' }, |
| | | ]}, |
| | | { code: '2001', label: 'è´åº', children: [ |
| | | { code: '2202', label: 'åºä»è´¦æ¬¾' }, |
| | | { code: '2241', label: 'å
¶ä»åºä»æ¬¾' }, |
| | | ]}, |
| | | { code: '3001', label: 'ææè
æç', children: [ |
| | | { code: '3103', label: 'æ¬å¹´å©æ¶¦' }, |
| | | ]}, |
| | | { code: '4001', label: 'ææ¬è´¹ç¨', children: [ |
| | | { code: '5601', label: 'å¶é è´¹ç¨' }, |
| | | { code: '6602', label: '管çè´¹ç¨' }, |
| | | ]}, |
| | | ]) |
| | | |
| | | // åè¯æ¨¡æ¿ï¼ç¤ºä¾ï¼ |
| | | const voucherTemplates = ref([ |
| | | { name: 'é宿¶å
¥ç¡®è®¤', bizScene: 'éå®åºåº', debit: '1122 åºæ¶è´¦æ¬¾', credit: '6001 主è¥ä¸å¡æ¶å
¥', auxDims: ['客æ·','项ç®'] }, |
| | | { name: 'éè´åºä»ç¡®è®¤', bizScene: 'éè´å
¥åº', debit: '1403 å¨éç©èµ', credit: '2202 åºä»è´¦æ¬¾', auxDims: ['项ç®','é¨é¨'] }, |
| | | { name: 'è´¹ç¨æ¥é', bizScene: 'è´¹ç¨å', debit: '6602 管çè´¹ç¨', credit: '1002 é¶è¡å款', auxDims: ['é¨é¨'] }, |
| | | { name: 'åºå®èµäº§ææ§', bizScene: 'ææ«ææ§', debit: '6602 管çè´¹ç¨', credit: '1602 ç´¯è®¡ææ§', auxDims: ['é¨é¨'] }, |
| | | ]) |
| | | |
| | | // èªå¨çæçåè¯ï¼ç¤ºä¾ï¼ |
| | | const generatedVouchers = ref([ |
| | | { date: '2025-10-01', bizScene: 'éå®åºåº', summary: 'ç¡®è®¤åºæ¶ä¸æ¶å
¥', amount: 128000, status: 'å·²çæ' }, |
| | | { date: '2025-10-03', bizScene: 'éè´å
¥åº', summary: '确认å°è´§åºä»', amount: 56000, status: 'å·²çæ' }, |
| | | { date: '2025-10-05', bizScene: 'è´¹ç¨å', summary: 'åå
¬è´¹ç¨æ¥é', amount: 3200, status: 'å·²çæ' }, |
| | | ]) |
| | | |
| | | // æ æ¨¡æçææä½ï¼ä»
å±ç¤ºéæç¤ºä¾æ°æ® |
| | | |
| | | // è¾
婿 ¸ç®ç¤ºä¾æ±æ»ï¼æ 个人å§åï¼ä»
维度类å«ï¼ |
| | | const auxSummary = ref([ |
| | | { dimension: '客æ·', category: 'éç¹å®¢æ·éå', debit: 320000, credit: 210000, balance: 110000 }, |
| | | { dimension: '项ç®', category: '项ç®A', debit: 150000, credit: 120000, balance: 30000 }, |
| | | { dimension: 'é¨é¨', category: 'è¿è¥ä¸å¿', debit: 42000, credit: 18000, balance: 24000 }, |
| | | { dimension: '管çå', category: 'ç³»ç»è§è²', debit: 0, credit: 0, balance: 0 }, |
| | | ]) |
| | | |
| | | // ç»è´¦ä»»å¡ |
| | | const closingTasks = ref([ |
| | | { id: 1, name: '2025å¹´10æ æç»', time: '2025-10-31 18:00', status: '宿', type: 'success' }, |
| | | { id: 2, name: '2025å¹´Q4 壿¥', time: '2025-12-31 18:00', status: '计å', type: 'info' }, |
| | | { id: 3, name: '2025年度 年度ç»è´¦', time: '2025-12-31 23:00', status: '计å', type: 'info' }, |
| | | ]) |
| | | |
| | | function runClose(kind) { |
| | | closingTasks.value.unshift({ |
| | | id: Date.now(), |
| | | name: `${new Date().getFullYear()}å¹´${kind}`, |
| | | time: new Date().toISOString().replace('T',' ').slice(0,16), |
| | | status: '宿', |
| | | type: 'success', |
| | | }) |
| | | } |
| | | |
| | | // 审计ççï¼ä¸å«ä¸ªäººå§åï¼ä»
è§è²/æºå¶ï¼ |
| | | const auditTrail = ref([ |
| | | { time: '2025-10-01 09:12', action: 'éå®åºåºè§¦ååè¯çæ', bizScene: 'éå®åºåº', role: 'ç³»ç»èªå¨å', result: 'éè¿' }, |
| | | { time: '2025-10-03 14:20', action: 'éè´å
¥åºè§¦ååºä»ç¡®è®¤', bizScene: 'éè´å
¥åº', role: 'ç³»ç»èªå¨å', result: 'éè¿' }, |
| | | { time: '2025-10-05 10:03', action: 'è´¹ç¨å审æ¹', bizScene: 'è´¹ç¨å', role: 'è´¢å¡å®¡æ¹', result: 'éè¿' }, |
| | | { time: '2025-10-08 16:45', action: 'åè¯è¿è´¦', bizScene: 'æ»è´¦', role: 'ä¼è®¡å®¡æ ¸', result: 'éè¿' }, |
| | | { time: '2025-10-31 18:05', action: 'æç»å®æå¹¶éè´¦', bizScene: 'æ»è´¦', role: 'ç³»ç»èªå¨å', result: 'éè¿' }, |
| | | ]) |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .app-container { |
| | | padding: 16px; |
| | | } |
| | | .page-header { |
| | | margin-bottom: 12px; |
| | | h2 { margin: 0 0 6px 0; font-weight: 600; } |
| | | p { margin: 0; color: #666; } |
| | | } |
| | | .section-title { |
| | | position: relative; |
| | | padding-left: 10px; |
| | | margin-bottom: 10px; |
| | | font-weight: 700; |
| | | } |
| | | .section-title::before { |
| | | content: ''; |
| | | position: absolute; |
| | | left: 0; top: 0.2em; |
| | | width: 4px; height: 1.2em; |
| | | background: #002FA7; |
| | | border-radius: 2px; |
| | | } |
| | | .mb-16 { margin-bottom: 16px; } |
| | | .toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; } |
| | | .dims { display: flex; gap: 8px; margin-bottom: 10px; } |
| | | .close-item { display: flex; align-items: center; gap: 8px; } |
| | | </style> |
| | | |
| | | |