| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <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> | 
 |  |  |  | 
 |  |  |  |