feat: 新增风险图谱算法与系统仪表盘及操作反馈体系
后端新增风险图谱算法模块、风险观察与反馈服务、规则 DSL 校验器和可解释性引擎,完善系统仪表盘和财务仪表盘统计, 优化 agent 运行和编排执行链路,清理旧开发文档,前端新增 系统趋势、负载热力图等多种仪表盘图表组件,完善操作反馈 对话框和工作台日期选择器,优化报销创建和审批详情交互, 补充单元测试覆盖。
This commit is contained in:
@@ -13,10 +13,23 @@ function testReceiptFolderViewSurface() {
|
||||
|
||||
assert.match(view, /未关联票据/)
|
||||
assert.match(view, /已关联票据/)
|
||||
assert.match(view, /label: '全部'/)
|
||||
assert.match(view, /一键关联票据/)
|
||||
assert.match(view, /基本票据信息/)
|
||||
assert.match(view, /票据关键字段/)
|
||||
assert.match(view, /原始文件/)
|
||||
assert.match(view, /返回列表/)
|
||||
assert.match(view, /keyReceiptFields/)
|
||||
assert.match(view, /editableOtherFields/)
|
||||
assert.match(view, /class="receipt-key-grid"/)
|
||||
assert.match(view, /class="receipt-other-collapse"/)
|
||||
assert.match(view, /class="receipt-other-scroll"/)
|
||||
assert.match(view, /其他信息/)
|
||||
assert.match(view, /ElCollapse/)
|
||||
assert.doesNotMatch(view, /新增字段/)
|
||||
assert.match(view, /const isTrainTicket = computed/)
|
||||
assert.doesNotMatch(view, /打开源文件/)
|
||||
assert.doesNotMatch(view, /openSourceFile/)
|
||||
assert.match(view, /返回票据夹/)
|
||||
assert.doesNotMatch(view, /返回列表/)
|
||||
assert.match(view, /删除票据/)
|
||||
assert.match(view, /ElCheckboxGroup/)
|
||||
assert.match(view, /fetchReceiptFolderItems\('all'\)/)
|
||||
@@ -41,11 +54,16 @@ function testReceiptFolderServiceContract() {
|
||||
|
||||
function testAppShellWiresReceiptFolder() {
|
||||
const shell = readProjectFile('web/src/views/AppShellRouteView.vue')
|
||||
const topBar = readProjectFile('web/src/components/layout/TopBar.vue')
|
||||
|
||||
assert.match(shell, /activeView === 'receiptFolder'/)
|
||||
assert.match(shell, /ReceiptFolderView/)
|
||||
assert.match(shell, /@open-assistant="openSmartEntry"/)
|
||||
assert.match(shell, /@detail-open-change="receiptFolderDetailOpen = \$event"/)
|
||||
assert.match(shell, /@detail-topbar-change="detailTopBarPayload = \$event"/)
|
||||
assert.match(shell, /receipt-folder-workarea/)
|
||||
assert.match(topBar, /receiptFolder/)
|
||||
assert.match(topBar, /eyebrowLabel/)
|
||||
}
|
||||
|
||||
function testSharedDocumentListStyleReuse() {
|
||||
@@ -64,11 +82,61 @@ function testSharedDocumentListStyleReuse() {
|
||||
assert.doesNotMatch(receiptStyles, /\.list-foot\b/)
|
||||
}
|
||||
|
||||
function testReceiptFolderDetailLayoutAdjustments() {
|
||||
const receiptView = readProjectFile('web/src/views/ReceiptFolderView.vue')
|
||||
const receiptStyles = readProjectFile('web/src/assets/styles/views/receipt-folder-view.css')
|
||||
const fieldModel = readProjectFile('web/src/views/scripts/receiptFolderDetailFields.js')
|
||||
|
||||
assert.match(receiptView, /showStatusColumn/)
|
||||
assert.match(receiptView, /<col v-if="showStatusColumn" class="col-status">/)
|
||||
assert.match(receiptView, /<th v-if="showStatusColumn">/)
|
||||
assert.match(receiptView, /<th>票据日期<\/th>/)
|
||||
assert.match(receiptView, /<td>{{ row\.document_date \|\| '待补充' }}<\/td>/)
|
||||
assert.match(receiptView, /<td>\s*<strong class="doc-id">/)
|
||||
assert.match(receiptView, /<td v-if="showStatusColumn">\s*<span class="status-tag"/)
|
||||
assert.match(receiptView, /const activeStatus = ref\('all'\)/)
|
||||
assert.match(receiptView, /import EnterpriseDetailCard/)
|
||||
assert.match(receiptView, /import EnterpriseDetailPage/)
|
||||
assert.match(receiptView, /<EnterpriseDetailPage/)
|
||||
assert.match(receiptView, /variant="receipt-folder-detail"/)
|
||||
assert.match(receiptView, /<EnterpriseDetailCard class="receipt-basic-panel"/)
|
||||
assert.match(receiptView, /<EnterpriseDetailCard class="receipt-preview-panel"/)
|
||||
assert.match(receiptView, /createReceiptDetailFieldModel/)
|
||||
assert.match(receiptView, /buildDetailPayload\(\)/)
|
||||
assert.match(receiptView, /receiptDetailSubtitle/)
|
||||
assert.match(receiptView, /receiptDetailTopBarPayload/)
|
||||
assert.match(receiptView, /eyebrow: '票据详情'/)
|
||||
assert.match(receiptView, /detail-topbar-change/)
|
||||
assert.doesNotMatch(receiptView, /<article v-else class="receipt-folder-detail/)
|
||||
assert.doesNotMatch(receiptView, /class="back-btn"/)
|
||||
assert.doesNotMatch(receiptView, /receipt-detail-head/)
|
||||
assert.doesNotMatch(receiptView, /detail-actions receipt-detail-foot/)
|
||||
assert.match(receiptStyles, /\.receipt-folder-list th:first-child/)
|
||||
assert.match(receiptStyles, /\.receipt-folder-detail :deep\(\.detail-grid\)/)
|
||||
assert.match(receiptStyles, /\.receipt-folder-detail :deep\(\.detail-actions\)/)
|
||||
assert.match(receiptStyles, /\.receipt-folder-detail :deep\(\.enterprise-detail-card \.card-head\)/)
|
||||
assert.match(receiptStyles, /\.receipt-key-grid/)
|
||||
assert.match(receiptStyles, /\.receipt-other-collapse/)
|
||||
assert.match(receiptStyles, /\.receipt-other-scroll/)
|
||||
assert.doesNotMatch(receiptStyles, /\.receipt-detail-head\b/)
|
||||
assert.doesNotMatch(receiptStyles, /\.receipt-detail-layout\b/)
|
||||
assert.doesNotMatch(receiptStyles, /\.detail-loading\b/)
|
||||
assert.doesNotMatch(receiptStyles, /\.back-btn\b/)
|
||||
assert.doesNotMatch(receiptStyles, /\.danger-btn\b/)
|
||||
assert.match(fieldModel, /TRAIN_KEY_FIELD_DEFINITIONS/)
|
||||
assert.match(fieldModel, /label: '发票号码'/)
|
||||
assert.match(fieldModel, /label: '开票日期'/)
|
||||
assert.match(fieldModel, /label: '票价'/)
|
||||
assert.match(fieldModel, /label: '姓名'/)
|
||||
assert.match(fieldModel, /syncEditableFieldsToTopLevel/)
|
||||
}
|
||||
|
||||
function run() {
|
||||
testReceiptFolderViewSurface()
|
||||
testReceiptFolderServiceContract()
|
||||
testAppShellWiresReceiptFolder()
|
||||
testSharedDocumentListStyleReuse()
|
||||
testReceiptFolderDetailLayoutAdjustments()
|
||||
console.log('receipt folder view tests passed')
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user