weizong song 5 months ago
parent 0eb8338e43
commit 992157c5ec

@ -176,3 +176,5 @@ budget_template_elements (元素表)

@ -326,3 +326,5 @@ const formatDefaultValue = (value) => {

@ -111,9 +111,9 @@
{{ formatUserNames(row.handler_admin_ids) }}
</template>
</el-table-column>
<el-table-column prop="apply_handler_id" label="申请科室经办人" width="150" show-overflow-tooltip>
<el-table-column prop="apply_handler_id" label="申请科室经办人" width="180" show-overflow-tooltip>
<template #default="{ row }">
{{ getUserName(row.apply_handler_id) }}
{{ formatUserNames(row.apply_handler_id) }}
</template>
</el-table-column>
<el-table-column prop="purchase_handler_id" label="采购科室经办人" width="150" show-overflow-tooltip>
@ -319,8 +319,8 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="申请科室经办人">
<el-select v-model="form.apply_handler_id" placeholder="请选择" filterable clearable style="width: 100%">
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id" />
<el-select v-model="form.apply_handler_id_array" placeholder="请选择" filterable multiple clearable style="width: 100%">
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="String(user.id)" />
</el-select>
</el-form-item>
</el-col>
@ -595,10 +595,10 @@
<div v-if="row._warnings?.handler_admin_ids" class="warning-text">{{ row._warnings.handler_admin_ids }}</div>
</template>
</el-table-column>
<el-table-column prop="apply_handler_id" label="申请科室经办人" width="150">
<el-table-column prop="apply_handler_id" label="申请科室经办人" width="180">
<template #default="{ row }">
<el-select v-model="row.apply_handler_id" filterable clearable size="small" style="width: 100%">
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id" />
<el-select v-model="row.apply_handler_id_array" filterable multiple clearable size="small" style="width: 100%">
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="String(user.id)" />
</el-select>
<div v-if="row._warnings?.apply_handler_id" class="warning-text">{{ row._warnings.apply_handler_id }}</div>
</template>
@ -974,7 +974,8 @@ function getEmptyForm() {
purchase_category: '',
handler_admin_ids: '',
handler_admin_ids_array: [],
apply_handler_id: null,
apply_handler_id: '',
apply_handler_id_array: [],
purchase_handler_id: null,
owner_department_id: null,
owner_department_ids: '',
@ -1057,6 +1058,13 @@ async function loadDetail(id) {
} else {
data.handler_admin_ids_array = []
}
//
if (data.apply_handler_id) {
data.apply_handler_id_array = String(data.apply_handler_id).split(',').map(id => id.trim()).filter(id => id)
} else {
data.apply_handler_id_array = []
}
//
if (data.attachment_id && data.attachment) {
@ -1109,6 +1117,11 @@ function collectPayload() {
const handlerAdminIds = Array.isArray(form.handler_admin_ids_array)
? form.handler_admin_ids_array.join(',')
: (form.handler_admin_ids || '')
//
const applyHandlerIds = Array.isArray(form.apply_handler_id_array)
? form.apply_handler_id_array.filter(id => id).join(',')
: (form.apply_handler_id || '')
const base = {
contract_no: form.contract_no,
@ -1131,7 +1144,7 @@ function collectPayload() {
is_accepted: form.is_accepted || false,
purchase_category: form.purchase_category,
handler_admin_ids: handlerAdminIds,
apply_handler_id: form.apply_handler_id,
apply_handler_id: applyHandlerIds,
purchase_handler_id: form.purchase_handler_id,
owner_department_id: form.owner_department_id,
owner_department_ids: ownerDepartmentIds,
@ -1572,12 +1585,15 @@ async function processExcelDataWithProgress(jsonData) {
departmentList.value.forEach(dept => {
if (dept.name) {
departmentMap.set(dept.name, dept.id)
// /key
departmentMap.set(normalizeLookupKey(dept.name), dept.id)
}
// short_name
if (dept.short_name && dept.short_name.trim()) {
// short_namename
if (dept.short_name !== dept.name) {
departmentMap.set(dept.short_name, dept.id)
departmentMap.set(normalizeLookupKey(dept.short_name), dept.id)
}
}
})
@ -1586,6 +1602,8 @@ async function processExcelDataWithProgress(jsonData) {
userList.value.forEach(user => {
if (user.name) {
userMap.set(user.name, user.id)
// /key
userMap.set(normalizeLookupKey(user.name), user.id)
}
})
@ -1862,12 +1880,13 @@ function processDepartmentAndUserIds(processed, row, index, departmentMap, userM
const departmentNames = row['科室'] || ''
if (departmentNames) {
// ,
const names = departmentNames.split(/[、,]/).map(n => n.trim()).filter(n => n)
const names = String(departmentNames).split(/[、,]/).map(n => n.trim()).filter(n => n)
const matchedIds = []
const warnings = []
for (const name of names) {
const matched = matchDepartment(name, departmentMap)
const cleaned = normalizeLookupKey(name)
const matched = matchDepartment(cleaned, departmentMap, name)
if (matched.exact) {
matchedIds.push(String(matched.exact))
} else if (matched.fuzzy && matched.fuzzy.length === 1) {
@ -1897,12 +1916,13 @@ function processDepartmentAndUserIds(processed, row, index, departmentMap, userM
const handlerNames = row['合同签订/变更经办人'] || row['合同签订/合同变更经办人'] || ''
if (handlerNames) {
// ,
const names = handlerNames.split(/[、,]/).map(n => n.trim()).filter(n => n)
const names = String(handlerNames).split(/[、,]/).map(n => n.trim()).filter(n => n)
const matchedIds = []
const warnings = []
for (const name of names) {
const matched = matchUser(name, userMap)
const cleaned = normalizeLookupKey(name)
const matched = matchUser(cleaned, userMap, name)
if (matched.exact) {
matchedIds.push(String(matched.exact))
} else if (matched.fuzzy && matched.fuzzy.length === 1 && matched.fuzzy[0] && matched.fuzzy[0].id) {
@ -1926,22 +1946,41 @@ function processDepartmentAndUserIds(processed, row, index, departmentMap, userM
}
// apply_handler_id
// ,
const applyHandlerName = row['申请科室经办人'] || ''
if (applyHandlerName) {
const matched = matchUser(applyHandlerName, userMap)
if (matched.exact) {
processed.apply_handler_id = matched.exact
} else if (matched.fuzzy && matched.fuzzy.length === 1 && matched.fuzzy[0] && matched.fuzzy[0].id) {
processed.apply_handler_id = matched.fuzzy[0].id
const names = String(applyHandlerName).split(/[、,]/).map(n => n.trim()).filter(n => n)
const matchedIds = []
const warnings = []
for (const name of names) {
const cleaned = normalizeLookupKey(name)
const matched = matchUser(cleaned, userMap, name)
if (matched.exact) {
matchedIds.push(String(matched.exact))
} else if (matched.fuzzy && matched.fuzzy.length === 1 && matched.fuzzy[0] && matched.fuzzy[0].id) {
matchedIds.push(String(matched.fuzzy[0].id))
} else {
warnings.push(`申请科室经办人"${name}"匹配不精确`)
}
}
if (matchedIds.length > 0) {
processed.apply_handler_id = matchedIds.join(',')
processed.apply_handler_id_array = matchedIds
} else {
processed._warnings.apply_handler_id = `申请科室经办人"${applyHandlerName}"匹配不精确,请手动选择`
processed.apply_handler_id_array = []
}
if (warnings.length > 0) {
processed._warnings.apply_handler_id = warnings.join('') + ',请手动选择'
}
} else {
processed.apply_handler_id_array = []
}
// purchase_handler_id
const purchaseHandlerName = row['采购科室经办人'] || ''
if (purchaseHandlerName) {
const matched = matchUser(purchaseHandlerName, userMap)
const cleaned = normalizeLookupKey(purchaseHandlerName)
const matched = matchUser(cleaned, userMap, purchaseHandlerName)
if (matched.exact) {
processed.purchase_handler_id = matched.exact
} else if (matched.fuzzy && matched.fuzzy.length === 1 && matched.fuzzy[0] && matched.fuzzy[0].id) {
@ -1952,14 +1991,24 @@ function processDepartmentAndUserIds(processed, row, index, departmentMap, userM
}
}
function matchDepartment(name, departmentMap) {
if (!name) {
// /tab/
function normalizeLookupKey(value) {
if (value === null || value === undefined) return ''
return String(value)
.replace(/[\r\n\t]/g, '')
.replace(/[\u00A0\u3000]/g, '') // /
.replace(/\s+/g, '') //
.trim()
}
function matchDepartment(cleanedName, departmentMap, rawName = '') {
if (!cleanedName) {
return { exact: null, fuzzy: [] }
}
// 使MapO(1)
// Mapnameshort_name
const exactId = departmentMap.get(name)
const exactId = departmentMap.get(cleanedName) || departmentMap.get(rawName)
if (exactId) {
return { exact: exactId, fuzzy: [] }
}
@ -1967,7 +2016,7 @@ function matchDepartment(name, departmentMap) {
//
// 10
const fuzzy = []
const nameLower = name.toLowerCase()
const nameLower = String(cleanedName).toLowerCase()
let matchCount = 0
const maxFuzzyMatches = 10
@ -1977,7 +2026,7 @@ function matchDepartment(name, departmentMap) {
// nameshort_name
let matched = false
if (dept.name) {
const deptNameLower = dept.name.toLowerCase()
const deptNameLower = normalizeLookupKey(dept.name).toLowerCase()
//
if (deptNameLower.includes(nameLower)) {
fuzzy.push({ id: dept.id, name: dept.name, short_name: dept.short_name || '' })
@ -1988,7 +2037,7 @@ function matchDepartment(name, departmentMap) {
// nameshort_name
if (!matched && dept.short_name && dept.short_name.trim()) {
const deptShortNameLower = dept.short_name.toLowerCase()
const deptShortNameLower = normalizeLookupKey(dept.short_name).toLowerCase()
if (deptShortNameLower.includes(nameLower)) {
fuzzy.push({ id: dept.id, name: dept.name, short_name: dept.short_name })
matchCount++
@ -1999,13 +2048,13 @@ function matchDepartment(name, departmentMap) {
return { exact: null, fuzzy }
}
function matchUser(name, userMap) {
if (!name) {
function matchUser(cleanedName, userMap, rawName = '') {
if (!cleanedName) {
return { exact: null, fuzzy: [] }
}
// 使MapO(1)
const exactId = userMap.get(name)
const exactId = userMap.get(cleanedName) || userMap.get(rawName)
if (exactId) {
return { exact: exactId, fuzzy: [] }
}
@ -2013,7 +2062,7 @@ function matchUser(name, userMap) {
//
// 10
const fuzzy = []
const nameLower = name.toLowerCase()
const nameLower = String(cleanedName).toLowerCase()
let matchCount = 0
const maxFuzzyMatches = 10
@ -2021,7 +2070,7 @@ function matchUser(name, userMap) {
if (matchCount >= maxFuzzyMatches) break
if (user.name) {
const userNameLower = user.name.toLowerCase()
const userNameLower = normalizeLookupKey(user.name).toLowerCase()
//
if (userNameLower.includes(nameLower)) {
fuzzy.push({ id: user.id, name: user.name })
@ -2083,12 +2132,20 @@ async function submitImport() {
} else if (!contract.owner_department_ids) {
contract.owner_department_ids = ''
}
// apply_handler_id_arrayapply_handler_id
if (contract.apply_handler_id_array && Array.isArray(contract.apply_handler_id_array)) {
contract.apply_handler_id = contract.apply_handler_id_array.filter(id => id).join(',')
} else if (!contract.apply_handler_id) {
contract.apply_handler_id = ''
}
//
delete contract._errors
delete contract._warnings
delete contract.handler_admin_ids_array
delete contract.owner_department_ids_array
delete contract.apply_handler_id_array
delete contract._attachment_match
return contract

@ -2483,8 +2483,7 @@ const handleOaFlowMessage = (event) => {
extraInfo: event.data.extraInfo || null
}
ElMessage.success('主审批流程创建成功')
//
showOaDrawer.value = false
// OA
} else {
ElMessage.error(event.data.message || '创建OA流程失败')
}

@ -5570,8 +5570,7 @@ const handlePaymentOaFlowMessage = (event) => {
extraInfo: event.data.extraInfo || null
}
ElMessage.success('主审批流程创建成功')
//
showPaymentOaDrawer.value = false
// OA
} else {
ElMessage.error(event.data.message || '创建OA流程失败')
}

Loading…
Cancel
Save