fix:修改问题

This commit is contained in:
大黑 2025-12-22 16:10:36 +08:00
parent 3e4253d9a9
commit 8e35ac314b
17 changed files with 278307 additions and 1893 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,146 @@
{
"entry": "index.js",
"copyAssets": ["public/custom/apaas-custom-mydemo"],
"router": {
"apaas-custom-modalContorl":{
"name": "apaas-custom-modalContorl",
"path": "apaas-custom-modalContorl",
"meta": {
"title": "模板管理"
}
},
"apaas-custom-selfEnginedata":{
"name": "apaas-custom-selfEnginedata",
"path": "apaas-custom-selfEnginedata",
"meta": {
"title": "玉柴发动机数据"
}
},
"apaas-custom-otherEnginedata":{
"name": "apaas-custom-otherEnginedata",
"path": "apaas-custom-otherEnginedata",
"meta": {
"title": "竞品发动机数据"
}
},
"apaas-custom-checkData":{
"name": "apaas-custom-checkData",
"path": "apaas-custom-checkData",
"meta": {
"title": "数据检查"
}
},
"apaas-custom-report":{
"name": "apaas-custom-report",
"path": "apaas-custom-report",
"meta": {
"title": "对标报告"
}
},
"apaas-custom-reportList":{
"name": "apaas-custom-reportList",
"path": "apaas-custom-reportList",
"meta": {
"title": "报告列表"
}
},
"apaas-custom-reportDetail":{
"name": "apaas-custom-reportDetail",
"path": "apaas-custom-reportDetail",
"meta": {
"title": "报告详情"
}
},
"apaas-custom-reportCheck":{
"name": "apaas-custom-reportCheck",
"path": "apaas-custom-reportCheck",
"meta": {
"title": "报告检查"
}
},
"apaas-custom-modelDetail":{
"name": "apaas-custom-modelDetail",
"path": "apaas-custom-modelDetail",
"meta": {
"title": "系统参数管理"
}
},
"apaas-custom-engineDetail":{
"name": "apaas-custom-engineDetail",
"path": "apaas-custom-engineDetail",
"meta": {
"title": "发动机参数详情"
}
},
"apaas-custom-approvalManagement":{
"name": "apaas-custom-approvalManagement",
"path": "apaas-custom-approvalManagement",
"meta": {
"title": "模板审批管理"
}
},
"apaas-custom-toDoList":{
"name": "apaas-custom-toDoList",
"path": "apaas-custom-toDoList",
"meta": {
"title": "数据待办"
}
},
"apaas-custom-myDone":{
"name": "apaas-custom-myDone",
"path": "apaas-custom-myDone",
"meta": {
"title": "我的已办"
}
},
"apaas-custom-mySend":{
"name": "apaas-custom-mySend",
"path": "apaas-custom-mySend",
"meta": {
"title": "我发起的"
}
},
"apaas-custom-selfEngineCheck":{
"name": "apaas-custom-selfEngineCheck",
"path": "apaas-custom-selfEngineCheck",
"meta": {
"title": "玉柴发动机审核"
}
},
"apaas-custom-otherEngineCheck":{
"name": "apaas-custom-otherEngineCheck",
"path": "apaas-custom-otherEngineCheck",
"meta": {
"title": "竞品发动机审核"
}
},
"apaas-custom-managerData":{
"name": "apaas-custom-managerData",
"path": "apaas-custom-managerData",
"meta": {
"title": "责任人管理"
}
},
"apaas-custom-fillerData":{
"name": "apaas-custom-fillerData",
"path": "apaas-custom-fillerData",
"meta": {
"title": "填写人管理"
}
},
"apaas-custom-permissionManagement":{
"name": "apaas-custom-permissionManagement",
"path": "apaas-custom-permissionManagement",
"meta": {
"title": "权限管理"
}
}
},
"customWidgetList": [
{
"code": "mydemo",
"text": "mydemo"
}
],
"outputName": "apaas-custom-mydemo"
}

View File

@ -0,0 +1,10 @@
<meta charset="utf-8">
<title>apaas-custom-mydemo demo</title>
<script src="./apaas-custom-mydemo.umd.js"></script>
<link rel="stylesheet" href="./apaas-custom-mydemo.css">
<script>
console.log(apaas-custom-mydemo)
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -165,39 +165,43 @@ export default {
method: 'get'
},
GET_REPORT_LIST: {
url: '/custom/benchmark/getReportAndTodoByCondition',
url: 'http://10.26.81.22:9091/custom/benchmark/getReportAndTodoByCondition',
method: 'post'
},
GET_REPORT_LIST_BY_CONDITION: {
url: 'http://10.26.81.22:9091/custom/benchmark/getApprovalList',
method: 'post'
},
ADD_REPORT: {
url: '/custom/benchmark/startReportApproval',
url: 'http://10.26.81.22:9091/custom/benchmark/startReportApproval',
method: 'post'
},
SAVE_REPORT: {
url: '/custom/benchmark/insertReport',
url: 'http://10.26.81.22:9091/custom/benchmark/insertReport',
method: 'post'
},
EDIT_REPORT: {
url: '/custom/benchmark/updateReport',
url: 'http://10.26.81.22:9091/custom/benchmark/updateReport',
method: 'post'
},
RESTART_REPORT_APPROVAL: {
url: '/custom/benchmark/restartReportApproval',
url: 'http://10.26.81.22:9091/custom/benchmark/restartReportApproval',
method: 'post'
},
START_REPORT_APPROVAL: {
url: '/custom/benchmark/handleReportApproval',
url: 'http://10.26.81.22:9091/custom/benchmark/handleReportApproval',
method: 'post'
},
GET_REPORT_DETAIL: {
url: '/custom/benchmark/getReportDetail',
url: 'http://10.26.81.22:9091/custom/benchmark/getReportDetail',
method: 'get'
},
GET_REPORT_DETAIL_PROCESS: {
url: '/custom/benchmark/getReportProcess',
url: 'http://10.26.81.22:9091/custom/benchmark/getReportProcess',
method: 'get'
},
DOWNLOAD_REPORT: {
url: '/custom/benchmark/downloadReport',
url: 'http://10.26.81.22:9091/custom/benchmark/downloadReport',
method: 'get'
},
//权限管理相关接口

View File

@ -51,13 +51,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="部门:" prop="department">
<el-form-item v-if="dispatchType !== 'update_param'" label="部门:" prop="department">
<el-select
v-model="formData.department"
placeholder="请选择部门"
clearable
style="width: 100%"
:disabled="!formData.subsystem || (dispatchType === 'update_param' && !formData.partsName)"
:disabled="!formData.subsystem"
@change="handleDepartmentChange"
>
<el-option
@ -77,13 +77,22 @@
style="width: 100%"
/>
</el-form-item>
<el-form-item v-if="dispatchType === 'update_param'" label="现填写人:">
<el-input
v-model="formData.currentFillerName"
disabled
placeholder="暂无填写人"
readonly
style="width: 100%"
/>
</el-form-item>
<el-form-item :label="dispatchType === 'update_param' ? '填写人:' : '责任人:'" prop="userId">
<el-select
v-model="formData.userId"
:placeholder="dispatchType === 'update_param' ? '请输入填写人姓名进行搜索' : '请输入责任人姓名进行搜索'"
style="width: 100%"
clearable
:disabled="!formData.department || (dispatchType === 'update_param' && !formData.partsName)"
:disabled="dispatchType === 'update_param' ? !formData.partsName : !formData.department"
filterable
remote
reserve-keyword
@ -155,6 +164,8 @@ export default {
department: '',
currentResponsibleId: '', // ID
currentResponsibleName: '', //
currentFillerId: '', // ID
currentFillerName: '', //
userId: '', // userId el-select v-model
userNumber: '', // userNumber
username: '', // username
@ -178,9 +189,6 @@ export default {
subsystem: [
{ required: true, message: '请选择子系统', trigger: 'change' }
],
department: [
{ required: true, message: '请选择部门', trigger: 'change' }
],
userId: [
{ required: true, message: this.dispatchType === 'update_param' ? '请选择填写人' : '请选择责任人', trigger: 'change' }
]
@ -190,6 +198,11 @@ export default {
rules.partsName = [
{ required: true, message: '请选择零部件名称', trigger: 'change' }
]
} else {
//
rules.department = [
{ required: true, message: '请选择部门', trigger: 'change' }
]
}
return rules
}
@ -219,6 +232,8 @@ export default {
department: '',
currentResponsibleId: '',
currentResponsibleName: '',
currentFillerId: '',
currentFillerName: '',
userId: '',
userNumber: '',
username: '',
@ -250,6 +265,8 @@ export default {
department: '',
currentResponsibleId: '',
currentResponsibleName: '',
currentFillerId: '',
currentFillerName: '',
userId: '',
userNumber: '',
username: '',
@ -304,11 +321,13 @@ export default {
},
//
handleSubsystemChange(subsystem) {
//
// /
this.formData.partsName = ''
this.formData.department = ''
this.formData.currentResponsibleId = ''
this.formData.currentResponsibleName = ''
this.formData.currentFillerId = ''
this.formData.currentFillerName = ''
this.formData.rowId = ''
this.formData.userId = ''
this.formData.userNumber = ''
@ -329,24 +348,29 @@ export default {
params.forEach((param) => {
//
if (param.subsystemName === subsystem) {
//
// /
if (this.dispatchType === 'update_param') {
const paramPartsName = param.partsName || partsName
if (paramPartsName && paramPartsName !== '/') {
if (paramPartsName) {
partsNameSet.add(paramPartsName)
}
}
//
if (param.department) {
//
if (this.dispatchType !== 'update_param' && param.department) {
departmentSet.add(param.department)
}
}
})
})
//
// /
if (this.dispatchType === 'update_param') {
this.availablePartsNames = Array.from(partsNameSet).sort()
const partsNamesArray = Array.from(partsNameSet).sort()
// /
if (!partsNamesArray.includes('/')) {
partsNamesArray.unshift('/')
}
this.availablePartsNames = partsNamesArray
}
//
@ -363,17 +387,32 @@ export default {
},
//
handlePartsNameChange(partsName) {
//
this.formData.department = ''
//
this.formData.currentFillerId = ''
this.formData.currentFillerName = ''
this.formData.userId = ''
this.formData.userNumber = ''
this.formData.username = ''
this.availableDepartments = []
this.userOptions = []
//
//
if (partsName && this.formData.subsystem) {
const departmentSet = new Set()
this.findCurrentFiller()
} else {
this.formData.currentFillerId = ''
this.formData.currentFillerName = ''
}
},
//
findCurrentFiller() {
if (!this.formData.subsystem || !this.formData.partsName) {
this.formData.currentFillerId = ''
this.formData.currentFillerName = ''
return
}
// versionData
const currentVersionData = this.versionData[this.currentVersionId] || {}
let foundFiller = null
// partsName
Object.keys(currentVersionData).forEach((dataPartsName) => {
@ -384,20 +423,36 @@ export default {
const paramPartsName = param.partsName || dataPartsName
if (
param.subsystemName === this.formData.subsystem &&
paramPartsName === partsName &&
param.department
paramPartsName === this.formData.partsName &&
param.filledByUserId
) {
departmentSet.add(param.department)
// 使
if (!foundFiller) {
foundFiller = {
userId: param.filledByUserId,
username: param.filledBy || ''
}
}
}
})
})
//
this.availableDepartments = Array.from(departmentSet).map((dept) => ({
department: dept
}))
if (foundFiller) {
// fillerPersons
const fillerPerson = this.fillerPersons.find(
(p) => p.userId === foundFiller.userId || p.id === foundFiller.userId
)
if (fillerPerson) {
this.formData.currentFillerId = fillerPerson.userId || fillerPerson.id || ''
this.formData.currentFillerName = fillerPerson.userName || foundFiller.username || ''
} else {
this.availableDepartments = []
this.formData.currentFillerId = foundFiller.userId || ''
this.formData.currentFillerName = foundFiller.username || ''
}
} else {
//
this.formData.currentFillerId = ''
this.formData.currentFillerName = ''
}
},
//
@ -437,16 +492,16 @@ export default {
}
}
},
//
// /
handleRemoteSearch(query) {
//
//
if (this.dispatchType === 'update_param') {
if (!this.formData.partsName || !this.formData.department) {
if (!this.formData.partsName) {
this.userOptions = []
return
}
} else {
//
//
if (!this.formData.department) {
this.userOptions = []
return
@ -571,7 +626,6 @@ export default {
const confirmData = {
subsystem: this.formData.subsystem,
partsName: this.formData.partsName,
department: this.formData.department,
userId: this.formData.userId, // userId
userNumber: this.formData.userNumber || this.formData.userId, // userNumber使 userId
username: this.formData.username || ''

View File

@ -19,7 +19,7 @@
</div>
</div>
<div class="header-right">
<el-button type="primary" v-if="detail.statusDescription === '审批中'" size="small" @click="handleApprove">
<el-button type="primary" size="small" @click="handleApprove">
审批
</el-button>
</div>

View File

@ -1450,9 +1450,9 @@ export default {
//
if (this.dispatchType === 'update_param') {
const { subsystem, partsName, department, userId, userNumber, username } = change
console.log(change, 'change', subsystem, partsName, department, userId, userNumber, username)
if (!subsystem || !partsName || !department || !userId) {
const { subsystem, partsName, userId, userNumber, username } = change
console.log(change, 'change', subsystem, partsName, userId, userNumber, username)
if (!subsystem || !partsName || !userId) {
this.$message({
type: 'warning',
message: '缺少必要参数'
@ -1460,9 +1460,6 @@ export default {
return
}
// · -
const normalizedDepartment = department.replace(/·/g, '-')
//
const currentData = this.versionData[this.currentVersionId] || {}
let updateCount = 0
@ -1480,22 +1477,17 @@ export default {
const params = currentData[dataPartsName] || []
//
params.forEach((param, index) => {
// · -
const normalizedParamDept = (param.department || '').replace(/·/g, '-')
// 使param.partsName使dataPartsName
const paramPartsName = param.partsName || dataPartsName
// 使
//
if (
param.subsystemName === subsystem &&
paramPartsName === partsName &&
normalizedParamDept === normalizedDepartment
paramPartsName === partsName
) {
//
param.filledBy = userId // IDuserId
param.filledByUserId = userId // userId el-select v-model
//
param.department = department
// 使 Vue.set
this.$set(currentData[dataPartsName], index, param)

View File

@ -49,14 +49,14 @@
下载导入模板
</el-button>
<el-button
v-if="shouldShowMaintainButton"
class="right-button"
@click="handleMaintainParams"
>
维护参数
</el-button>
<el-button
v-if="shouldShowMaintainButton"
class="right-button-primary"
type="primary"
@click="handleInitiateApproval"
@ -179,8 +179,8 @@
:pageConfig="approvalTableConfig.pageConfig"
:pagination="pagination"
class="approval-table"
@size-change="pageSizeChange"
@current-page-change="currentChange"
@size-change="approvalPageSizeChange"
@current-page-change="approvalCurrentPageChange"
>
</x-vxe-table>
</div>
@ -1300,6 +1300,14 @@ export default {
this.$set(this.pagination, 'currentPage', currentPage)
this.loadData()
},
approvalPageSizeChange(size) {
this.$set(this.pagination, 'pageSize', size)
this.getApprovalChange()
},
approvalCurrentPageChange(currentPage) {
this.$set(this.pagination, 'currentPage', currentPage)
this.getApprovalChange()
},
selectDataChange(data) {
this.$emit('select-data-change', data)
},

View File

@ -1,7 +1,7 @@
<template>
<div class="apaas-custom-page-mydemo custom-page">
<template v-if="!showReportDetail">
<div class="page-header">
<!-- <div class="page-header">
<div class="title">
报告管理
</div>
@ -13,7 +13,7 @@
@click.native="handleRefresh()"
></x-svg-icon>
</div>
</div>
</div> -->
<div class="page-search-panel">
<div class="searched-fields">
@ -59,12 +59,7 @@
</div>
<div class="searched-field">
<span class="fielded-label">状态</span>
<el-select
v-model="searchPanelValue.status"
clearable
filterable
placeholder="请选择"
>
<el-select v-model="searchPanelValue.status" clearable filterable placeholder="请选择">
<el-option
v-for="item in statusOptions"
:key="item.id"
@ -172,7 +167,10 @@
@click.stop="handleApprove(row)"
>审批</a
>
<span v-if="row.status === 'APPROVING'" style="width: 6px; display: inline-block"></span>
<span
v-if="row.status === 'APPROVING'"
style="width: 6px; display: inline-block"
></span>
<a
v-if="!row.status || row.status === '' || row.status === 'DRAFT'"
href="javascript:void(0)"
@ -180,7 +178,10 @@
@click.stop="handleLaunch(row)"
>发起</a
>
<span v-if="!row.status || row.status === '' || row.status === 'DRAFT'" style="width: 6px; display: inline-block"></span>
<span
v-if="!row.status || row.status === '' || row.status === 'DRAFT'"
style="width: 6px; display: inline-block"
></span>
<a
v-if="row.status === 'REJECTED'"
href="javascript:void(0)"
@ -188,7 +189,10 @@
@click.stop="handleRestart(row)"
>重新发起</a
>
<span v-if="row.status === 'REJECTED'" style="width: 6px; display: inline-block"></span>
<span
v-if="row.status === 'REJECTED'"
style="width: 6px; display: inline-block"
></span>
<a
v-if="row.filePath"
href="javascript:void(0)"
@ -207,7 +211,12 @@
</x-vxe-table>
</div>
</template>
<report-detail v-else :detail="currentReportDetail" @close="closeReportDetail" @refresh="handleReportDetailRefresh" />
<report-detail
v-else
:detail="currentReportDetail"
@close="closeReportDetail"
@refresh="handleReportDetailRefresh"
/>
<!-- 新增/修改报告弹窗 -->
<el-dialog
@ -318,9 +327,9 @@
<el-button type="primary" icon="el-icon-upload">
选择文件
</el-button>
<div slot="tip" class="el-upload__tip"
>支持扩展名: .doc .pdf .xls .xlsx .ppt .pptx仅支持上传一个文件</div
>
<div slot="tip" class="el-upload__tip">
支持扩展名: .doc .pdf .xls .xlsx .ppt .pptx仅支持上传一个文件
</div>
</el-upload>
</el-form-item>
<el-form-item label="说明" prop="explanation">
@ -366,11 +375,7 @@
</tr>
</thead>
<tbody>
<tr
v-for="(step, index) in launchWorkflowSteps"
:key="index"
class="workflow-row"
>
<tr v-for="(step, index) in launchWorkflowSteps" :key="index" class="workflow-row">
<td class="step-name-cell">
<span class="step-name">
{{ step.name }}
@ -481,6 +486,7 @@ export default {
status: ''
},
statusOptions: [
{ id: 'DRAFT', label: '草稿' },
{ id: 'APPROVING', label: '审批中' },
{ id: 'COMPLETE', label: '已完成' },
{ id: 'REJECTED', label: '已拒绝' }
@ -690,10 +696,12 @@ export default {
}
//
if (row.fileUrl || row.filePath) {
this.fileList = [{
this.fileList = [
{
name: row.title || '文件',
url: row.fileUrl || row.filePath
}]
}
]
} else {
this.fileList = []
}
@ -787,6 +795,7 @@ export default {
//
const submitData = {
reportId: reportId,
userId: getUserId(),
proofreadUsers: this.launchWorkflowSteps[0].handlers,
reviewUsers: this.launchWorkflowSteps[1].handlers,
countersignUsers: [],
@ -821,9 +830,7 @@ export default {
if (!query || query.trim() === '') {
//
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
step.options = selectedOptions
} else {
step.options = []
@ -854,24 +861,24 @@ export default {
}
//
const users = result
.map(user => ({
.map((user) => ({
userId: user.userId || user.id,
username: user.username || user.name,
userNumber: user.userNumber || user.userId || user.id
}))
.filter(user => user.userId && user.userNumber)
.filter((user) => user.userId && user.userNumber)
const existingIds = new Set(step.handlers || [])
const filteredUsers = users.filter(user => !existingIds.has(user.userId))
const selectedOptions = (step.options || []).filter(opt =>
opt.userId && step.handlers && step.handlers.includes(opt.userId)
const filteredUsers = users.filter((user) => !existingIds.has(user.userId))
const selectedOptions = (step.options || []).filter(
(opt) => opt.userId && step.handlers && step.handlers.includes(opt.userId)
)
const optionsMap = new Map()
selectedOptions.forEach(opt => {
selectedOptions.forEach((opt) => {
if (opt.userNumber) {
optionsMap.set(opt.userNumber, opt)
}
})
filteredUsers.forEach(user => {
filteredUsers.forEach((user) => {
if (user.userNumber && !optionsMap.has(user.userNumber)) {
optionsMap.set(user.userNumber, user)
}
@ -882,9 +889,7 @@ export default {
.asyncErrorCatch((err) => {
console.error('搜索人员失败:', err)
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
step.options = selectedOptions
} else {
step.options = []
@ -1118,11 +1123,9 @@ export default {
if (!query || query.trim() === '') {
//
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const missingIds = step.handlers.filter(id =>
!selectedOptions.some(opt => opt.userId === id)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
const missingIds = step.handlers.filter(
(id) => !selectedOptions.some((opt) => opt.userId === id)
)
if (missingIds.length > 0) {
step.options = selectedOptions
@ -1158,30 +1161,30 @@ export default {
}
// {userId: user.userId, username: user.username, userNumber: user.userNumber}
const users = result
.map(user => ({
.map((user) => ({
userId: user.userId || user.id,
username: user.username || user.name,
userNumber: user.userNumber || user.userId || user.id
}))
.filter(user => user.userId && user.userNumber) // userId userNumber
.filter((user) => user.userId && user.userNumber) // userId userNumber
// step.handlers userId el-option value userId
const existingIds = new Set(step.handlers || [])
//
const filteredUsers = users.filter(user => !existingIds.has(user.userId))
const filteredUsers = users.filter((user) => !existingIds.has(user.userId))
// options +
const selectedOptions = (step.options || []).filter(opt =>
opt.userId && step.handlers && step.handlers.includes(opt.userId)
const selectedOptions = (step.options || []).filter(
(opt) => opt.userId && step.handlers && step.handlers.includes(opt.userId)
)
// 使 Map userNumber 使 userNumber key
const optionsMap = new Map()
//
selectedOptions.forEach(opt => {
selectedOptions.forEach((opt) => {
if (opt.userNumber) {
optionsMap.set(opt.userNumber, opt)
}
})
//
filteredUsers.forEach(user => {
filteredUsers.forEach((user) => {
if (user.userNumber && !optionsMap.has(user.userNumber)) {
optionsMap.set(user.userNumber, user)
}
@ -1193,9 +1196,7 @@ export default {
console.error('搜索人员失败:', err)
//
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
step.options = selectedOptions
} else {
step.options = []
@ -1373,7 +1374,7 @@ export default {
}
//
Object.keys(searchParams).forEach(key => {
Object.keys(searchParams).forEach((key) => {
if (this.searchPanelValue[key] !== undefined && this.searchPanelValue[key] !== null) {
searchParams[key] = this.searchPanelValue[key]
}

View File

@ -108,7 +108,7 @@
</section>
<!-- 审批流程 -->
<section class="block-section">
<section v-if="reportDetail.status && reportDetail.status !== 'DRAFT'" class="block-section">
<div class="section-title">
审批流程
</div>
@ -350,9 +350,9 @@ export default {
} else {
// 使
this.reportDetail = this.detail
// flowId
if (this.detail.flowId) {
this.getApprovalSpet()
// flowId稿
if (this.detail.flowId && this.reportDetail.status && this.reportDetail.status !== 'DRAFT') {
this.getApprovalSpet(this.detail.flowId)
}
}
}
@ -374,8 +374,10 @@ export default {
this.$request(request)
.asyncThen((resp) => {
this.reportDetail = resp.data || resp
// flowId
// flowId稿
if (flowId && this.reportDetail.status && this.reportDetail.status !== 'DRAFT') {
this.getApprovalSpet(flowId)
}
})
.asyncErrorCatch((err) => {
console.error('获取报告详情失败:', err)
@ -529,12 +531,10 @@ export default {
}
//
if (approvalResult === 'PASS') {
this.$emit('refresh')
this.handleBack()
} else {
// 退
}
})
.asyncErrorCatch((err) => {

View File

@ -22,25 +22,32 @@
<el-input v-model="searchPanelValue.manufacturerName" placeholder="请输入" />
</div> -->
<div class="searched-field">
<span class="fielded-label">型号</span>
<el-input v-model="searchPanelValue.modelName" placeholder="请输入" />
<span class="fielded-label">标题</span>
<el-input v-model="searchPanelValue.template" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">产品编号</span>
<el-input v-model="searchPanelValue.productNumber" placeholder="请输入" />
<span class="fielded-label">状态</span>
<el-select v-model="searchPanelValue.status" clearable filterable placeholder="请选择">
<el-option
v-for="item in statusOptions"
:key="item.id"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="searched-field">
<span class="fielded-label">申请人</span>
<el-input v-model="searchPanelValue.applicant" placeholder="请输入" />
<el-input v-model="searchPanelValue.username" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">申请时间</span>
<el-date-picker
v-model="searchPanelValue.applyTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
v-model="searchPanelValue.createDate"
type="date"
placeholder="请选择"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
/>
</div>
<!-- <div class="searched-field">
@ -190,7 +197,12 @@
</x-vxe-table>
</div>
</template>
<report-detail v-else :detail="currentReportDetail" @close="closeReportDetail" @refresh="handleReportDetailRefresh" />
<report-detail
v-else
:detail="currentReportDetail"
@close="closeReportDetail"
@refresh="handleReportDetailRefresh"
/>
<!-- 新增/修改报告弹窗 -->
<el-dialog
@ -348,11 +360,7 @@
</tr>
</thead>
<tbody>
<tr
v-for="(step, index) in launchWorkflowSteps"
:key="index"
class="workflow-row"
>
<tr v-for="(step, index) in launchWorkflowSteps" :key="index" class="workflow-row">
<td class="step-name-cell">
<span class="step-name">
{{ step.name }}
@ -463,6 +471,7 @@
status: ''
},
statusOptions: [
{ id: 'DRAFT', label: '草稿' },
{ id: 'APPROVING', label: '审批中' },
{ id: 'COMPLETE', label: '已完成' },
{ id: 'REJECTED', label: '已拒绝' }
@ -672,10 +681,12 @@
}
//
if (row.fileUrl || row.filePath) {
this.fileList = [{
this.fileList = [
{
name: row.title || '文件',
url: row.fileUrl || row.filePath
}]
}
]
} else {
this.fileList = []
}
@ -803,9 +814,7 @@
if (!query || query.trim() === '') {
//
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
step.options = selectedOptions
} else {
step.options = []
@ -836,24 +845,24 @@
}
//
const users = result
.map(user => ({
.map((user) => ({
userId: user.userId || user.id,
username: user.username || user.name,
userNumber: user.userNumber || user.userId || user.id
}))
.filter(user => user.userId && user.userNumber)
.filter((user) => user.userId && user.userNumber)
const existingIds = new Set(step.handlers || [])
const filteredUsers = users.filter(user => !existingIds.has(user.userId))
const selectedOptions = (step.options || []).filter(opt =>
opt.userId && step.handlers && step.handlers.includes(opt.userId)
const filteredUsers = users.filter((user) => !existingIds.has(user.userId))
const selectedOptions = (step.options || []).filter(
(opt) => opt.userId && step.handlers && step.handlers.includes(opt.userId)
)
const optionsMap = new Map()
selectedOptions.forEach(opt => {
selectedOptions.forEach((opt) => {
if (opt.userNumber) {
optionsMap.set(opt.userNumber, opt)
}
})
filteredUsers.forEach(user => {
filteredUsers.forEach((user) => {
if (user.userNumber && !optionsMap.has(user.userNumber)) {
optionsMap.set(user.userNumber, user)
}
@ -864,9 +873,7 @@
.asyncErrorCatch((err) => {
console.error('搜索人员失败:', err)
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
step.options = selectedOptions
} else {
step.options = []
@ -1100,11 +1107,9 @@
if (!query || query.trim() === '') {
//
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const missingIds = step.handlers.filter(id =>
!selectedOptions.some(opt => opt.userId === id)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
const missingIds = step.handlers.filter(
(id) => !selectedOptions.some((opt) => opt.userId === id)
)
if (missingIds.length > 0) {
step.options = selectedOptions
@ -1140,30 +1145,30 @@
}
// {userId: user.userId, username: user.username, userNumber: user.userNumber}
const users = result
.map(user => ({
.map((user) => ({
userId: user.userId || user.id,
username: user.username || user.name,
userNumber: user.userNumber || user.userId || user.id
}))
.filter(user => user.userId && user.userNumber) // userId userNumber
.filter((user) => user.userId && user.userNumber) // userId userNumber
// step.handlers userId el-option value userId
const existingIds = new Set(step.handlers || [])
//
const filteredUsers = users.filter(user => !existingIds.has(user.userId))
const filteredUsers = users.filter((user) => !existingIds.has(user.userId))
// options +
const selectedOptions = (step.options || []).filter(opt =>
opt.userId && step.handlers && step.handlers.includes(opt.userId)
const selectedOptions = (step.options || []).filter(
(opt) => opt.userId && step.handlers && step.handlers.includes(opt.userId)
)
// 使 Map userNumber 使 userNumber key
const optionsMap = new Map()
//
selectedOptions.forEach(opt => {
selectedOptions.forEach((opt) => {
if (opt.userNumber) {
optionsMap.set(opt.userNumber, opt)
}
})
//
filteredUsers.forEach(user => {
filteredUsers.forEach((user) => {
if (user.userNumber && !optionsMap.has(user.userNumber)) {
optionsMap.set(user.userNumber, user)
}
@ -1175,9 +1180,7 @@
console.error('搜索人员失败:', err)
//
if (step.handlers && step.handlers.length > 0) {
const selectedOptions = step.options.filter(opt =>
step.handlers.includes(opt.userId)
)
const selectedOptions = step.options.filter((opt) => step.handlers.includes(opt.userId))
step.options = selectedOptions
} else {
step.options = []
@ -1340,33 +1343,25 @@
loadData() {
// 使
const searchParams = {
title: '',
manufacturerName: '',
modelName: '',
productNumber: '',
module: '',
plate: '',
platform: '',
series: '',
marketSegment: '',
projectName: '',
projectNumber: '',
templateName: '',
username: '',
createDate: '',
status: ''
}
//
Object.keys(searchParams).forEach(key => {
Object.keys(searchParams).forEach((key) => {
if (this.searchPanelValue[key] !== undefined && this.searchPanelValue[key] !== null) {
searchParams[key] = this.searchPanelValue[key]
}
})
const request = {
...api.GET_REPORT_LIST,
...api.GET_REPORT_LIST_BY_CONDITION,
params: {
pageNumber: this.pagination.currentPage,
pageSize: this.pagination.pageSize,
createBy: getUserId(),
userId: getUserId(),
...searchParams
},
disableSuccessMsg: true
@ -1657,4 +1652,3 @@
text-align: right !important;
}
</style>

View File

@ -104,8 +104,8 @@
<span v-else-if="row[colConfig.prop] === '已通过'" class="status-tag status-approved"
>已通过</span
>
<span v-else-if="row[colConfig.prop] === '撤回'" class="status-tag status-withdrawn"
>撤回</span
<span v-else-if="row[colConfig.prop] === '拒绝'" class="status-tag status-withdrawn"
>拒绝</span
>
<span v-else class="status-tag status-default">{{ row[colConfig.prop] }}</span>
</div>
@ -508,7 +508,10 @@ export default {
// API
const flowId = row.flowId || row.id
if (!flowId) {
this.$message.error('缺少审批ID无法查看详情')
this.$message({
type: 'error',
message: '缺少审批ID无法查看详情'
})
return
}
this.showEngineCheck = true
@ -773,8 +776,8 @@ export default {
}
&.status-withdrawn {
background: #f5f7fa;
color: #606266;
background: #f56c6c;
color: white;
}
}
}