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,41 +387,72 @@ 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()
const currentVersionData = this.versionData[this.currentVersionId] || {}
// partsName
Object.keys(currentVersionData).forEach((dataPartsName) => {
const params = currentVersionData[dataPartsName] || []
//
params.forEach((param) => {
//
const paramPartsName = param.partsName || dataPartsName
if (
param.subsystemName === this.formData.subsystem &&
paramPartsName === partsName &&
param.department
) {
departmentSet.add(param.department)
}
})
})
//
this.availableDepartments = Array.from(departmentSet).map((dept) => ({
department: dept
}))
this.findCurrentFiller()
} else {
this.availableDepartments = []
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) => {
const params = currentVersionData[dataPartsName] || []
//
params.forEach((param) => {
//
const paramPartsName = param.partsName || dataPartsName
if (
param.subsystemName === this.formData.subsystem &&
paramPartsName === this.formData.partsName &&
param.filledByUserId
) {
// 使
if (!foundFiller) {
foundFiller = {
userId: param.filledByUserId,
username: param.filledBy || ''
}
}
}
})
})
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.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,201 +13,210 @@
@click.native="handleRefresh()"
></x-svg-icon>
</div>
</div>
</div> -->
<div class="page-search-panel">
<div class="searched-fields">
<div class="searched-field">
<span class="fielded-label">厂家</span>
<el-input v-model="searchPanelValue.manufacturerName" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">型号</span>
<el-input v-model="searchPanelValue.modelName" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">产品编号</span>
<el-input v-model="searchPanelValue.productNumber" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">板块</span>
<el-input v-model="searchPanelValue.plate" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">平台</span>
<el-input v-model="searchPanelValue.platform" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">系列</span>
<el-input v-model="searchPanelValue.series" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">细分市场</span>
<el-input v-model="searchPanelValue.marketSegment" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">项目名称</span>
<el-input v-model="searchPanelValue.projectName" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">项目编号</span>
<el-input v-model="searchPanelValue.projectNumber" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">领域/模块</span>
<el-input v-model="searchPanelValue.module" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">状态</span>
<el-select
v-model="searchPanelValue.status"
clearable
filterable
placeholder="请选择"
>
<div class="page-search-panel">
<div class="searched-fields">
<div class="searched-field">
<span class="fielded-label">厂家</span>
<el-input v-model="searchPanelValue.manufacturerName" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">型号</span>
<el-input v-model="searchPanelValue.modelName" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">产品编号</span>
<el-input v-model="searchPanelValue.productNumber" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">板块</span>
<el-input v-model="searchPanelValue.plate" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">平台</span>
<el-input v-model="searchPanelValue.platform" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">系列</span>
<el-input v-model="searchPanelValue.series" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">细分市场</span>
<el-input v-model="searchPanelValue.marketSegment" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">项目名称</span>
<el-input v-model="searchPanelValue.projectName" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">项目编号</span>
<el-input v-model="searchPanelValue.projectNumber" placeholder="请输入" />
</div>
<div class="searched-field">
<span class="fielded-label">领域/模块</span>
<el-input v-model="searchPanelValue.module" placeholder="请输入" />
</div>
<div class="searched-field">
<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.id"
/>
/>
</el-select>
</div>
<div class="searched-field">
<span class="fielded-label">标题</span>
<el-input v-model="searchPanelValue.title" placeholder="请输入" />
</div>
<div class="search-actions">
<el-button type="primary" @click="handleSearch">
查询
</el-button>
<el-button @click="resetSearch">
重置
</el-button>
</div>
<div class="searched-field">
<span class="fielded-label">标题</span>
<el-input v-model="searchPanelValue.title" placeholder="请输入" />
</div>
<div class="search-actions">
<el-button type="primary" @click="handleSearch">
查询
</el-button>
<el-button @click="resetSearch">
重置
</el-button>
</div>
</div>
</div>
</div>
<div class="toolbar">
<el-button type="primary" @click="handleCreate">新增</el-button>
<!-- <el-button @click="handleDownloadTemplate">下载模板</el-button> -->
</div>
<div class="page-data-list">
<x-vxe-table
ref="vxeTable"
:border="true"
:seqWidth="40"
:colConfigs="tableConfig.colConfigs"
:tableData="tableData"
:rowDraggable="tableConfig.rowDraggable"
:seqType="tableConfig.seqType"
:pagination="pagination"
:layout="tableConfig.layout"
:seqConfig="tableConfig.seqConfig"
:autoSize="tableConfig.autoSize"
:pageConfig="tableConfig.pageConfig"
class="block-table"
@table-row-click="rowClickEvent"
@size-change="pageSizeChange"
@current-page-change="currentChange"
@select-data-change="selectDataChange"
>
<template
v-for="(colConfig, index) in tableConfig.colConfigs"
v-slot:[colConfig.customHeadSlot]="{ column }"
<div class="toolbar">
<el-button type="primary" @click="handleCreate">新增</el-button>
<!-- <el-button @click="handleDownloadTemplate">下载模板</el-button> -->
</div>
<div class="page-data-list">
<x-vxe-table
ref="vxeTable"
:border="true"
:seqWidth="40"
:colConfigs="tableConfig.colConfigs"
:tableData="tableData"
:rowDraggable="tableConfig.rowDraggable"
:seqType="tableConfig.seqType"
:pagination="pagination"
:layout="tableConfig.layout"
:seqConfig="tableConfig.seqConfig"
:autoSize="tableConfig.autoSize"
:pageConfig="tableConfig.pageConfig"
class="block-table"
@table-row-click="rowClickEvent"
@size-change="pageSizeChange"
@current-page-change="currentChange"
@select-data-change="selectDataChange"
>
<div v-if="colConfig.customHeadSlot" :key="index"> {{ column }} {{ colConfig }} </div>
</template>
<template
v-for="(colConfig, index) in tableConfig.colConfigs"
v-slot:[colConfig.customHeadSlot]="{ column }"
>
<div v-if="colConfig.customHeadSlot" :key="index"> {{ column }} {{ colConfig }} </div>
</template>
<template
v-for="(colConfig, index) in tableConfig.colConfigs"
v-slot:[colConfig.customSlot]="{ row, rowIndex }"
>
<div v-if="colConfig.customSlot === 'status'" :key="index + '' + rowIndex">
<span
v-if="row[colConfig.prop] === 'APPROVING'"
style="background: #E6A23C; padding: 4px 8px; color: white; border-radius: 20px;"
>审核中</span
>
<span
v-else-if="row[colConfig.prop] === 'COMPLETE'"
style="background: #67C23A; padding: 4px 8px; color: white; border-radius: 20px;"
>已完成</span
>
<span
v-else-if="row[colConfig.prop] === 'DRAFT'"
style="background: #909399; padding: 4px 8px; color: white; border-radius: 20px;"
>草稿</span
>
<span
v-else-if="row[colConfig.prop] === 'REJECTED'"
style="background: #F56C6C; padding: 4px 8px; color: white; border-radius: 20px;"
>已拒绝</span
>
<span
v-else
style="background: #909399; padding: 4px 8px; color: white; border-radius: 20px;"
>-</span
>
</div>
<div v-if="colConfig.customSlot === 'options'" :key="'op' + index + '' + rowIndex">
<a
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleRowView(row)"
>查看</a
>
<span style="width: 6px; display: inline-block"></span>
<a
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleEdit(row)"
>修改</a
>
<span style="width: 6px; display: inline-block"></span>
<a
v-if="row.status === 'APPROVING'"
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleApprove(row)"
>审批</a
>
<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)"
class="el-link el-link--primary"
@click.stop="handleLaunch(row)"
>发起</a
>
<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)"
class="el-link el-link--primary"
@click.stop="handleRestart(row)"
>重新发起</a
>
<span v-if="row.status === 'REJECTED'" style="width: 6px; display: inline-block"></span>
<a
v-if="row.filePath"
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleDownload(row)"
>下载</a
>
</div>
</template>
<template
v-for="(colConfig, index) in tableConfig.colConfigs"
v-slot:[colConfig.customSlot]="{ row, rowIndex }"
>
<div v-if="colConfig.customSlot === 'status'" :key="index + '' + rowIndex">
<span
v-if="row[colConfig.prop] === 'APPROVING'"
style="background: #E6A23C; padding: 4px 8px; color: white; border-radius: 20px;"
>审核中</span
>
<span
v-else-if="row[colConfig.prop] === 'COMPLETE'"
style="background: #67C23A; padding: 4px 8px; color: white; border-radius: 20px;"
>已完成</span
>
<span
v-else-if="row[colConfig.prop] === 'DRAFT'"
style="background: #909399; padding: 4px 8px; color: white; border-radius: 20px;"
>草稿</span
>
<span
v-else-if="row[colConfig.prop] === 'REJECTED'"
style="background: #F56C6C; padding: 4px 8px; color: white; border-radius: 20px;"
>已拒绝</span
>
<span
v-else
style="background: #909399; padding: 4px 8px; color: white; border-radius: 20px;"
>-</span
>
</div>
<div v-if="colConfig.customSlot === 'options'" :key="'op' + index + '' + rowIndex">
<a
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleRowView(row)"
>查看</a
>
<span style="width: 6px; display: inline-block"></span>
<a
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleEdit(row)"
>修改</a
>
<span style="width: 6px; display: inline-block"></span>
<a
v-if="row.status === 'APPROVING'"
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleApprove(row)"
>审批</a
>
<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)"
class="el-link el-link--primary"
@click.stop="handleLaunch(row)"
>发起</a
>
<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)"
class="el-link el-link--primary"
@click.stop="handleRestart(row)"
>重新发起</a
>
<span
v-if="row.status === 'REJECTED'"
style="width: 6px; display: inline-block"
></span>
<a
v-if="row.filePath"
href="javascript:void(0)"
class="el-link el-link--primary"
@click.stop="handleDownload(row)"
>下载</a
>
</div>
</template>
<template slot="empty">
<div class="table-empty">
<x-empty-page></x-empty-page>
</div>
</template>
</x-vxe-table>
</div>
<template slot="empty">
<div class="table-empty">
<x-empty-page></x-empty-page>
</div>
</template>
</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
@ -228,81 +237,81 @@
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="标题名称" prop="title">
<el-form-item label="标题名称" prop="title">
<el-input v-model="createFormData.title" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="厂家名称(全称)" prop="manufacturerName">
<el-input v-model="createFormData.manufacturerName" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="产品型号(全称)" prop="modelName">
<el-input v-model="createFormData.modelName" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="厂家简称" prop="manufacturerAbbreviation">
<el-input v-model="createFormData.manufacturerAbbreviation" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="产品型号简称" prop="modelAbbreviation">
<el-input v-model="createFormData.modelAbbreviation" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品编号" prop="productNumber">
<el-input v-model="createFormData.productNumber" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="领域/模块" prop="module">
<el-input v-model="createFormData.module" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="板块" prop="plate">
<el-input v-model="createFormData.plate" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="平台" prop="platform">
<el-form-item label="平台" prop="platform">
<el-input v-model="createFormData.platform" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="系列" prop="series">
<el-form-item label="系列" prop="series">
<el-input v-model="createFormData.series" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="细分市场" prop="marketSegment">
<el-input v-model="createFormData.marketSegment" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目名称" prop="projectName">
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="createFormData.projectName" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="项目编号" prop="projectNumber">
<el-input v-model="createFormData.projectNumber" placeholder="请输入" />
</el-form-item>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="附件上传" prop="attachments">
@ -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 = [{
name: row.title || '文件',
url: row.fileUrl || row.filePath
}]
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]
}
@ -1404,112 +1405,112 @@ export default {
<style lang="scss">
.custom-page {
width: 100%;
height: 100%;
overflow-y: auto;
width: 100%;
height: 100%;
overflow-y: auto;
display: flex;
flex-direction: column;
.page-header {
display: flex;
flex-direction: column;
align-items: center;
height: 56px;
position: relative;
width: 100%;
min-height: 56px;
background: #fff;
border-bottom: 1px solid #ebeef5;
flex-shrink: 0;
.page-header {
display: flex;
align-items: center;
height: 56px;
position: relative;
width: 100%;
min-height: 56px;
background: #fff;
border-bottom: 1px solid #ebeef5;
flex-shrink: 0;
.title {
color: #303133;
font-weight: 700;
margin-left: 20px;
flex: 1;
font-size: 12px;
}
.operation {
display: flex;
min-width: 330px;
justify-content: flex-end;
margin-right: 20px;
}
}
.toolbar {
background: #fff;
padding: 0 20px 12px 20px;
flex-shrink: 0;
}
.page-data-list {
display: flex;
.title {
color: #303133;
font-weight: 700;
margin-left: 20px;
flex: 1;
min-height: 0;
padding: 20px;
.x-empty-page {
top: 0;
}
font-size: 12px;
}
}
.file-list {
margin-top: 10px;
.file-item {
.operation {
display: flex;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid #ebeef5;
.el-icon-document {
color: #909399;
font-size: 16px;
margin-right: 8px;
}
.file-name {
flex: 1;
font-size: 12px;
color: #606266;
}
.file-remove {
cursor: pointer;
color: #909399;
margin-left: 10px;
&:hover {
color: #409eff;
}
}
min-width: 330px;
justify-content: flex-end;
margin-right: 20px;
}
}
.dialog-body-wrapper {
.toolbar {
background: #fff;
padding: 0 20px 12px 20px;
flex-shrink: 0;
}
.page-data-list {
display: flex;
flex: 1;
min-height: 0;
padding: 20px;
.x-empty-page {
top: 0;
}
}
}
.file-list {
margin-top: 10px;
.file-item {
display: flex;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid #ebeef5;
.el-icon-document {
color: #909399;
font-size: 16px;
margin-right: 8px;
}
.file-name {
flex: 1;
font-size: 12px;
color: #606266;
}
.file-remove {
cursor: pointer;
color: #909399;
margin-left: 10px;
&:hover {
color: #409eff;
}
}
}
}
.dialog-body-wrapper {
max-height: 70vh;
overflow-y: auto;
padding-right: 10px;
}
::v-deep .create-report-dialog {
.el-dialog__body {
padding: 20px 20px 10px 20px;
max-height: 70vh;
overflow-y: auto;
padding-right: 10px;
}
}
::v-deep .create-report-dialog {
.el-dialog__body {
padding: 20px 20px 10px 20px;
max-height: 70vh;
overflow-y: auto;
}
}
::v-deep .el-upload-dragger {
width: 100%;
height: 180px;
}
::v-deep .el-upload-dragger {
width: 100%;
height: 180px;
}
::v-deep .el-form-item {
margin-bottom: 18px;
}
::v-deep .el-form-item {
margin-bottom: 18px;
}
.approval-workflow {
display: flex;
@ -1598,66 +1599,66 @@ export default {
}
}
.page-search-panel {
background: white;
padding: 16px 24px !important;
border-bottom: 1px solid #ebeef5 !important;
flex-shrink: 0;
background: white;
padding: 16px 24px !important;
border-bottom: 1px solid #ebeef5 !important;
flex-shrink: 0;
display: flex;
flex-direction: column !important;
gap: 16px;
.search-actions {
display: flex;
flex-direction: column !important;
gap: 16px;
align-items: center;
justify-content: flex-end;
gap: 12px;
.search-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
::v-deep .el-button {
padding: 0 16px;
font-size: 14px;
border-radius: 4px;
height: 32px;
line-height: 32px;
}
::v-deep .el-button {
padding: 0 16px;
font-size: 14px;
border-radius: 4px;
height: 32px;
line-height: 32px;
}
}
}
.searched-fields {
max-height: 200px !important;
display: flex !important;
flex-wrap: wrap !important;
flex-direction: row !important;
gap: 16px 32px !important;
width: 100% !important;
}
max-height: 200px !important;
display: flex !important;
flex-wrap: wrap !important;
flex-direction: row !important;
gap: 16px 32px !important;
width: 100% !important;
}
.searched-field {
display: flex !important;
align-items: center !important;
gap: 12px !important;
flex: 1 1 calc((100% - 96px) / 4) !important;
// min-width: 160px !important;
max-width: calc(25% - 32px) !important;
.fielded-label {
font-size: 14px;
font-weight: 600;
color: #303133;
white-space: nowrap;
min-width: 80px !important;
text-align: right;
text-align-last: right;
text-justify: inter-ideograph;
}
display: flex !important;
align-items: center !important;
gap: 12px !important;
flex: 1 1 calc((100% - 96px) / 4) !important;
// min-width: 160px !important;
max-width: calc(25% - 32px) !important;
.fielded-label {
font-size: 14px;
font-weight: 600;
color: #303133;
white-space: nowrap;
min-width: 80px !important;
text-align: right;
text-align-last: right;
text-justify: inter-ideograph;
}
.el-input,
.el-select {
width: 170px;
}
.el-input,
.el-select {
width: 170px;
}
::v-deep .el-input__inner,
::v-deep .el-select .el-input__inner {
height: 32px;
line-height: 32px;
}
}
::v-deep .el-input__inner,
::v-deep .el-select .el-input__inner {
height: 32px;
line-height: 32px;
}
}
.el-select-dropdown__item {
display: flex !important;
justify-content: space-between !important;

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
this.getApprovalSpet(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) => {

File diff suppressed because it is too large Load Diff

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;
}
}
}