feat(platform): close AI expense value loop

Add tenant-safe value, telemetry, connector, commercial, and production-readiness foundations.
This commit is contained in:
caoxiaozhu
2026-07-17 14:14:08 +08:00
parent 242d68c36f
commit 787bc3a481
507 changed files with 82072 additions and 6344 deletions

View File

@@ -127,6 +127,14 @@ const relatedApplicationCardTemplate = readFileSync(
fileURLToPath(new URL('../src/components/travel/TravelRequestRelatedApplicationCard.vue', import.meta.url)),
'utf8'
)
const applicationFactsTemplate = readFileSync(
fileURLToPath(new URL('../src/components/travel/TravelRequestApplicationFacts.vue', import.meta.url)),
'utf8'
)
const applicationFactsStyle = readFileSync(
fileURLToPath(new URL('../src/assets/styles/components/travel-request-application-facts.css', import.meta.url)),
'utf8'
)
const progressCardTemplate = readFileSync(
fileURLToPath(new URL('../src/components/travel/TravelRequestProgressCard.vue', import.meta.url)),
'utf8'
@@ -1583,10 +1591,12 @@ test('application detail uses application labels instead of reimbursement labels
assert.match(progressCardTemplate, /isApplicationDocument \? '申请进度'/)
assert.match(detailViewTemplate, /isApplicationDocument \? '申请详情' : '费用明细'/)
assert.match(detailViewTemplate, /展示本次申请的事实信息、职级规则测算和用户预估费用/)
assert.match(detailViewTemplate, /class="application-detail-facts"/)
assert.match(detailViewTemplate, /applicationDetailFactItems/)
assert.match(detailViewTemplate, /<TravelRequestApplicationFacts/)
assert.match(detailViewTemplate, /:fact-items="applicationDetailFactItems"/)
assert.match(applicationFactsTemplate, /class="application-detail-facts"/)
assert.match(applicationFactsTemplate, /v-for="item in factItems"/)
assert.match(detailViewScript, /buildApplicationDetailFactItems/)
assert.match(detailViewStyle, /\.application-detail-fact\.highlight strong/)
assert.match(applicationFactsStyle, /\.application-detail-fact\.highlight strong/)
assert.match(detailViewTemplate, /isApplicationDocument \? '申请类型' : '报销类型'/)
assert.match(detailViewTemplate, /isApplicationDocument \? '预计金额' : '报销金额'/)
assert.match(detailViewTemplate, /isApplicationDocument \? '退回申请' : '退回单据'/)
@@ -1595,10 +1605,13 @@ test('application detail uses application labels instead of reimbursement labels
test('draft or returned application detail edits allowed facts inline', () => {
assert.doesNotMatch(detailViewTemplate, /修改申请/)
assert.match(detailViewTemplate, /canEditApplicationDetailItem\(item\)/)
assert.match(detailViewTemplate, /application-detail-edit-btn/)
assert.match(detailViewTemplate, /openApplicationDetailEditor\(item\)/)
assert.match(detailViewTemplate, /saveApplicationDetailEdit\(item\)/)
assert.match(detailViewTemplate, /:can-edit-item="canEditApplicationDetailItem"/)
assert.match(detailViewTemplate, /@open="openApplicationDetailEditor"/)
assert.match(detailViewTemplate, /@save="saveApplicationDetailEdit"/)
assert.match(applicationFactsTemplate, /canEditItem\(item\)/)
assert.match(applicationFactsTemplate, /application-detail-edit-btn/)
assert.match(applicationFactsTemplate, /emit\('open', item\)/)
assert.match(applicationFactsTemplate, /emit\('save', item\)/)
assert.doesNotMatch(detailViewScript, /handleModifyApplication/)
assert.match(
detailViewScript,