fix:修改问题保存分支2

This commit is contained in:
大黑 2026-01-05 17:39:25 +08:00
parent c37ce897f2
commit 48d2ad9197
20 changed files with 1202 additions and 683 deletions

1
.gitignore vendored
View File

@ -26,3 +26,4 @@ yarn-error.log*
*.sw? *.sw?
node_modules.zip node_modules.zip
apaas-custom-mydemo.zip apaas-custom-mydemo.zip
apaas-custom-mydemo-1.zip

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

@ -1,8 +1,5 @@
<template> <template>
<x-app-layout <x-app-layout :layoutEngine="layoutEngine" :isCollapse="isCollapse">
:layoutEngine="layoutEngine"
:isCollapse="isCollapse"
>
<template v-slot:header> <template v-slot:header>
<x-app-header v-if="appInfo" :layoutEngine="layoutEngine" :appInfo="appInfo"></x-app-header> <x-app-header v-if="appInfo" :layoutEngine="layoutEngine" :appInfo="appInfo"></x-app-header>
</template> </template>
@ -20,18 +17,19 @@
<x-svg-icon v-if="isCollapse" name="arrow-right-icon"></x-svg-icon> <x-svg-icon v-if="isCollapse" name="arrow-right-icon"></x-svg-icon>
<x-svg-icon v-else name="arrow-left-icon"></x-svg-icon> <x-svg-icon v-else name="arrow-left-icon"></x-svg-icon>
</div> </div>
<div v-for="menu of layoutEngine.layoutConfig.keepAliveComps" :key="menu.id"> <!-- <div v-for="menu of layoutEngine.layoutConfig.keepAliveComps" :key="menu.id">
<div :style="{color: menu.id === layoutEngine.layoutConfig.currentMenu.id ? 'red' : '#000'}" @click="handlerclick(menu)"> <div :style="{color: menu.id === layoutEngine.layoutConfig.currentMenu.id ? 'red' : '#000'}" @click="handlerclick(menu)">
{{ menu.menuName }} {{ menu.menuName }}
<el-button @click.stop="closed(menu)">关闭</el-button> <el-button @click.stop="closed(menu)">关闭</el-button>
</div> </div>
</div> </div> -->
<slot name="appPage"></slot> <slot name="appPage"></slot>
</template> </template>
</x-app-layout> </x-app-layout>
</template> </template>
<script> <script>
import api from '@/api'
import { getUserId } from '@/utils'
export default { export default {
name: 'CustomLayout', name: 'CustomLayout',
props: { props: {
@ -45,25 +43,66 @@ export default {
data() { data() {
return { return {
isCollapse: false, isCollapse: false,
showMenu: true showMenu: true,
badgeNum: 0
} }
}, },
computed: { computed: {
appInfo() { appInfo() {
return (this.layoutEngine && this.layoutEngine.layoutDataControl && this.layoutEngine.layoutDataControl.appInfo) || {} return (
(this.layoutEngine &&
this.layoutEngine.layoutDataControl &&
this.layoutEngine.layoutDataControl.appInfo) ||
{}
)
}, },
menuConfig() { menuConfig() {
return (this.layoutEngine && this.layoutEngine.layoutDataControl && this.layoutEngine.layoutDataControl.menuConfig) || { // 访 $route.fullPath 使
void this.$route.fullPath
const data = (this.layoutEngine &&
this.layoutEngine.layoutDataControl &&
this.layoutEngine.layoutDataControl.menuConfig) || {
menu: [], menu: [],
defaultActive: null, defaultActive: null,
menuTreeData: [] menuTreeData: []
} }
console.log(data, 2222323232, 'data')
data.menuTreeData[0].badgeNum = this.badgeNum
return data
}
},
watch: {
$route: {
handler() {
console.log(2222323232, '2222323232')
this.setBadgeNum()
},
immediate: false
} }
}, },
mounted() { mounted() {
console.log(this.layoutEngine.layoutConfig.keepAliveComps, 545454545454545454545454) console.log(this.layoutEngine.layoutConfig.keepAliveComps, 545454545454545454545454)
}, },
methods: { methods: {
setBadgeNum() {
const request = {
...api.GET_TODO_LIST,
params: {
page: 1,
size: 10,
personId: getUserId()
},
disableSuccessMsg: true
}
this.$request(request)
.asyncThen((resp) => {
this.badgeNum = resp.data.totalCount
})
.asyncErrorCatch((err) => {
console.error('获取待办列表失败:', err)
})
},
changeCollapse() { changeCollapse() {
this.showMenu = false this.showMenu = false
this.$nextTick(() => { this.$nextTick(() => {
@ -94,7 +133,7 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
$--app-box-bgColor: #ffffff; $--app-box-bgColor: #ffffff;
$--app-box-border-color: #DCDFE6; $--app-box-border-color: #dcdfe6;
.x-app-layout { .x-app-layout {
.layout-middle { .layout-middle {

View File

@ -87,7 +87,6 @@
:disabled="!formData.department" :disabled="!formData.department"
filterable filterable
remote remote
reserve-keyword
:remote-method="handleRemoteSearch" :remote-method="handleRemoteSearch"
:loading="userLoading" :loading="userLoading"
class="handler-select" class="handler-select"

View File

@ -1151,7 +1151,7 @@ export default {
flex: 1; flex: 1;
min-height: 0; min-height: 0;
padding: 20px; padding: 20px;
background: #fff;
.x-empty-page { .x-empty-page {
top: 0; top: 0;
} }

View File

@ -37,11 +37,11 @@
基础信息 基础信息
</div> </div>
<div class="info-grid"> <div class="info-grid">
<div class="theme-info-item"> <div class="remain-info">
<div class="info-item">
<span class="label">流程主题</span> <span class="label">流程主题</span>
<span class="value">{{ progressDetail.processTitle || '--' }}</span> <span class="value">{{ progressDetail.processTitle || '--' }}</span>
</div> </div>
<div class="remain-info">
<div class="info-item"> <div class="info-item">
<span class="label">机型名称</span> <span class="label">机型名称</span>
<span class="value">{{ progressDetail.modelName || '--' }}</span> <span class="value">{{ progressDetail.modelName || '--' }}</span>

View File

@ -24,14 +24,14 @@
<el-button type="primary" size="small" :loading="dispatchLoading" @click="handleConfirmDispatch">确认分发</el-button> <el-button type="primary" size="small" :loading="dispatchLoading" @click="handleConfirmDispatch">确认分发</el-button>
</template> </template>
<template v-else> <template v-else>
<el-select <!-- <el-select
v-model="currentVersionId" v-model="currentVersionId"
size="small" size="small"
@change="onVersionChange" @change="onVersionChange"
:disabled="isEditMode" :disabled="isEditMode"
> >
<el-option v-for="ver in versions" :key="ver.id" :label="ver.label" :value="ver.id" /> <el-option v-for="ver in versions" :key="ver.id" :label="ver.label" :value="ver.id" />
</el-select> </el-select> -->
<el-button <el-button
v-if="!isEditMode && !isJustCheckMode" v-if="!isEditMode && !isJustCheckMode"
size="small" size="small"
@ -200,7 +200,6 @@
clearable clearable
filterable filterable
remote remote
reserve-keyword
:remote-method="(query) => handleFillerRemoteSearch(query, row)" :remote-method="(query) => handleFillerRemoteSearch(query, row)"
:loading="fillerUserLoading" :loading="fillerUserLoading"
@change="(value) => handleFillerChange(value, row)" @change="(value) => handleFillerChange(value, row)"
@ -333,7 +332,6 @@
multiple multiple
filterable filterable
remote remote
reserve-keyword
placeholder="请选择" placeholder="请选择"
:remote-method="(query) => handleRemoteSearch(query, index)" :remote-method="(query) => handleRemoteSearch(query, index)"
:loading="step.loading" :loading="step.loading"

View File

@ -5,13 +5,13 @@
<el-button type="primary" @click="handleAdd"> <el-button type="primary" @click="handleAdd">
新增 新增
</el-button> </el-button>
<el-button <!-- <el-button
icon="el-icon-refresh" icon="el-icon-refresh"
size="small" size="small"
@click="handleRefresh" @click="handleRefresh"
> >
刷新 刷新
</el-button> </el-button> -->
</div> </div>
<div class="table-section"> <div class="table-section">
@ -139,7 +139,6 @@
:disabled="!formData.selectDeptId" :disabled="!formData.selectDeptId"
filterable filterable
remote remote
reserve-keyword
:remote-method="handleRemoteSearch" :remote-method="handleRemoteSearch"
:loading="userLoading" :loading="userLoading"
class="handler-select" class="handler-select"

View File

@ -73,6 +73,8 @@
<table class="comparison-table"> <table class="comparison-table">
<thead> <thead>
<tr> <tr>
<th class="subsystem-column">子系统名称</th>
<th class="parts-column">零部件名称</th>
<th class="param-column">参数名称</th> <th class="param-column">参数名称</th>
<th <th
v-for="(model, index) in comparisonModels" v-for="(model, index) in comparisonModels"
@ -102,6 +104,8 @@
</thead> </thead>
<tbody> <tbody>
<tr v-for="(param, paramIndex) in displayParams" :key="paramIndex"> <tr v-for="(param, paramIndex) in displayParams" :key="paramIndex">
<td class="subsystem-column">{{ param.subsystemName }}</td>
<td class="parts-column">{{ param.displayPartsName }}</td>
<td class="param-column"> <td class="param-column">
<span class="param-name">{{ getParamDisplayName(param) }}</span> <span class="param-name">{{ getParamDisplayName(param) }}</span>
<i <i
@ -1587,26 +1591,19 @@ export default {
this.savingFavorite = true this.savingFavorite = true
const request = { const request = {
...api.ADD_USER_COMMONLY_USED, ...api.ADD_USER_COMMONLY_USED,
params: requestData, params: requestData
disableSuccessMsg: true
} }
this.$request(request) this.$request(request)
.asyncThen((resp) => { .asyncThen((resp) => {
this.$message({ // this.$message.success('')
type: 'success',
message: '新增常用成功'
})
this.handleAddFavoriteDialogClose() this.handleAddFavoriteDialogClose()
// //
this.loadFavoritesList() this.loadFavoritesList()
}) })
.asyncErrorCatch((err) => { .asyncErrorCatch((err) => {
console.error('新增常用失败:', err) console.error('新增常用失败:', err)
this.$message({ this.$message.error(err.message || '新增常用失败')
type: 'error',
message: '新增常用失败'
})
}) })
.finally(() => { .finally(() => {
this.savingFavorite = false this.savingFavorite = false

View File

@ -170,6 +170,20 @@ export default {
this.loadData() this.loadData()
}, },
methods: { methods: {
setStatusText(result) {
const statusMap = {
'PASS': '通过',
'REJECT': '驳回',
'REFUSE': '驳回',
'APPROVE': '批准',
'APPROVING': '审批中',
'PENDING': '待处理',
'WAITING': '待处理',
'STAY': '待审批',
'INITIATE': '发起审批'
}
return statusMap[result] || result || '待处理'
},
handleBack() { handleBack() {
console.log('handleBack called') console.log('handleBack called')
this.$emit('back') this.$emit('back')

View File

@ -10,7 +10,9 @@
<div class="apaas-custom-page-mydemo custom-page"> <div class="apaas-custom-page-mydemo custom-page">
<template v-if="!showModelDetail"> <template v-if="!showModelDetail">
<div class="page-header"> <div class="page-header">
<div class="operation"> </div> <div class="title">
参数模板管理
</div>
</div> </div>
<div class="page-search-panel"> <div class="page-search-panel">
<div class="search-fields"> <div class="search-fields">
@ -19,19 +21,21 @@
<el-select <el-select
v-model="searchPanelValue.templateName" v-model="searchPanelValue.templateName"
:loading="templateSelectLoading" :loading="templateSelectLoading"
placeholder="请选择模板名称" placeholder="请输入或选择模板名称"
clearable clearable
filterable filterable
:filter-method="filterTemplateOptions"
style="width: 220px" style="width: 220px"
@change="handleSearch" @change="handleSearch"
> >
<el-option <el-option
v-for="item in templateOptions" v-for="item in filteredTemplateOptions"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</div> </div>
<div class="search-actions"> <div class="search-actions">
<el-button v-if="hasTemplateManagementEditPermission()" type="primary" @click="handleDownloadImportTemplate"> <el-button v-if="hasTemplateManagementEditPermission()" type="primary" @click="handleDownloadImportTemplate">
@ -245,6 +249,7 @@ export default {
return { return {
searchPanelValue: createDefaultSearch(), searchPanelValue: createDefaultSearch(),
templateOptions: [], templateOptions: [],
filteredTemplateOptions: [],
templateSelectLoading: false, templateSelectLoading: false,
tableData: [], tableData: [],
errorList: '', errorList: '',
@ -1000,6 +1005,20 @@ export default {
console.error('查询失败:', err) console.error('查询失败:', err)
}) })
}, },
//
filterTemplateOptions(query) {
if (!query || query.trim() === '') {
//
this.filteredTemplateOptions = this.templateOptions
return
}
//
const queryLower = query.toLowerCase().trim()
this.filteredTemplateOptions = this.templateOptions.filter((option) => {
// label
return option.label && option.label.toLowerCase().includes(queryLower)
})
},
// //
loadTemplateOptions() { loadTemplateOptions() {
this.templateSelectLoading = true this.templateSelectLoading = true
@ -1029,11 +1048,14 @@ export default {
value: name value: name
})) }))
this.templateOptions = options this.templateOptions = options
//
this.filteredTemplateOptions = options
this.templateSelectLoading = false this.templateSelectLoading = false
}) })
.asyncErrorCatch((err) => { .asyncErrorCatch((err) => {
console.error('加载模板列表失败:', err) console.error('加载模板列表失败:', err)
this.templateOptions = [] this.templateOptions = []
this.filteredTemplateOptions = []
this.templateSelectLoading = false this.templateSelectLoading = false
}) })
}, },

View File

@ -289,7 +289,6 @@
multiple multiple
filterable filterable
remote remote
reserve-keyword
placeholder="请选择" placeholder="请选择"
:remote-method="(query) => handleRemoteSearch(query, index)" :remote-method="(query) => handleRemoteSearch(query, index)"
:loading="step.loading" :loading="step.loading"
@ -3102,6 +3101,7 @@ export default {
padding: 20px; padding: 20px;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
background: #fff;
&.has-footer { &.has-footer {
/* 审批模式下为底部按钮预留空间 */ /* 审批模式下为底部按钮预留空间 */

View File

@ -208,7 +208,6 @@
multiple multiple
filterable filterable
remote remote
reserve-keyword
placeholder="请输入人员姓名进行搜索" placeholder="请输入人员姓名进行搜索"
style="width: 100%" style="width: 100%"
clearable clearable
@ -1489,7 +1488,7 @@ export default {
// //
loadDepartmentList() { loadDepartmentList() {
const request = { const request = {
...api.GET_SUB_DEPT, ...api.QUERY_ORG_TREE,
disableSuccessMsg: true disableSuccessMsg: true
} }
this.$request(request) this.$request(request)

View File

@ -420,7 +420,6 @@
multiple multiple
filterable filterable
remote remote
reserve-keyword
placeholder="请选择" placeholder="请选择"
:remote-method="(query) => handleLaunchRemoteSearch(query, index)" :remote-method="(query) => handleLaunchRemoteSearch(query, index)"
:loading="step.loading" :loading="step.loading"
@ -718,7 +717,7 @@ export default {
const permissionPath = perm.permissionPath || '' const permissionPath = perm.permissionPath || ''
const parameterPer = perm.parameterPer const parameterPer = perm.parameterPer
return ( return (
permissionPath === '报告' && permissionPath === '对标报告' &&
(parameterPer === 2 || (parameterPer === 2 ||
parameterPer === '2' || parameterPer === '2' ||
parameterPer === '编辑') parameterPer === '编辑')

View File

@ -334,7 +334,6 @@
multiple multiple
filterable filterable
remote remote
reserve-keyword
placeholder="请选择" placeholder="请选择"
:remote-method="(query) => handleLaunchRemoteSearch(query, index)" :remote-method="(query) => handleLaunchRemoteSearch(query, index)"
:loading="step.loading" :loading="step.loading"
@ -984,37 +983,50 @@ export default {
) )
if (requiredStepsWithoutHandlers.length > 0) { if (requiredStepsWithoutHandlers.length > 0) {
const stepNames = requiredStepsWithoutHandlers.map((step) => step.name).join('、') const stepNames = requiredStepsWithoutHandlers.map((step) => step.name).join('、')
this.$message.warning(`请为必填环节"${stepNames}"选择处理人`) this.$message({
type: 'warning',
message: `请为必填环节"${stepNames}"选择处理人`
})
return return
} }
if (!this.reportDetail.reportId && !this.reportDetail.id) { if (!this.reportDetail.reportId && !this.reportDetail.id) {
this.$message.error('缺少报告信息') this.$message({
type: 'error',
message: '缺少报告信息'
})
return return
} }
// //
const processTitle = (this.launchProcessTitle || '').trim() const processTitle = (this.launchProcessTitle || '').trim()
if (!processTitle) { if (!processTitle) {
this.$message.warning('请填写流程主题') this.$message({
type: 'warning',
message: '请填写流程主题'
})
return return
} }
const reportId = this.reportDetail.reportId || this.reportDetail.id const reportId = this.reportDetail.reportId || this.reportDetail.id
if (!reportId) { if (!reportId) {
this.$message.error('缺少报告ID') this.$message({
type: 'error',
message: '缺少报告ID'
})
return return
} }
const nodeList = this.launchWorkflowSteps.map((step, index) => ({
nodeName: step.name,
assignees: step.handlers,
nodeOrder: index + 1
}))
// //
const submitData = { const submitData = {
processTitle: this.launchProcessTitle,
reportId: reportId, reportId: reportId,
userId: getUserId(), userId: getUserId(),
processTitle: processTitle, nodeList: nodeList
proofreadUsers: this.launchWorkflowSteps[0].handlers,
reviewUsers: this.launchWorkflowSteps[1].handlers,
countersignUsers: [],
approveUsers: this.launchWorkflowSteps[2].handlers
} }
this.launching = true this.launching = true
@ -1040,7 +1052,10 @@ export default {
.asyncErrorCatch((err) => { .asyncErrorCatch((err) => {
console.error('发起失败:', err) console.error('发起失败:', err)
this.launching = false this.launching = false
this.$message.error('发起失败,请重试') this.$message({
type: 'error',
message: '发起失败,请重试'
})
}) })
}, },
// //

View File

@ -50,7 +50,7 @@
@click.stop="handleRowView(row)" @click.stop="handleRowView(row)"
>查看</a >查看</a
> >
<span <!-- <span
v-if="row.dataType === '数据维护'" v-if="row.dataType === '数据维护'"
style="width: 6px; display: inline-block" style="width: 6px; display: inline-block"
></span> ></span>
@ -59,7 +59,7 @@
class="el-link el-link--primary" class="el-link el-link--primary"
@click.stop="handleRowBack(row)" @click.stop="handleRowBack(row)"
>退回</a >退回</a
> > -->
</div> </div>
</template> </template>

View File

@ -19,7 +19,7 @@ import ApaasCustomTodoList from './custom-page/todo.vue'
import ApaasCustomMyDone from './custom-page/myDone.vue' import ApaasCustomMyDone from './custom-page/myDone.vue'
import ApaasCustomMySend from './custom-page/mySend.vue' import ApaasCustomMySend from './custom-page/mySend.vue'
import ApaasCustomPermissionManagement from './custom-page/permissionManagement.vue' import ApaasCustomPermissionManagement from './custom-page/permissionManagement.vue'
import ApaasCustomLayout from './custom-layout/custom-layout.vue'
import { customFormComponentList } from './custom-component/form-component' import { customFormComponentList } from './custom-component/form-component'
import { widgetConfigList } from './custom-component/form-config' import { widgetConfigList } from './custom-component/form-config'
@ -46,6 +46,7 @@ const install = function(Vue, opts) {
Vue.component('apaas-custom-myDone', ApaasCustomMyDone) Vue.component('apaas-custom-myDone', ApaasCustomMyDone)
Vue.component('apaas-custom-mySend', ApaasCustomMySend) Vue.component('apaas-custom-mySend', ApaasCustomMySend)
Vue.component('apaas-custom-permissionManagement', ApaasCustomPermissionManagement) Vue.component('apaas-custom-permissionManagement', ApaasCustomPermissionManagement)
Vue.component('apaas-custom-layout', ApaasCustomLayout)
// 安装表单部件 // 安装表单部件
// 注册自开发表单组件 // 注册自开发表单组件
if ( if (
@ -55,6 +56,10 @@ const install = function(Vue, opts) {
Vue.component(comp.name, comp) Vue.component(comp.name, comp)
}) })
} }
if (Vue.LayoutEngine) {
const layoutEngine = Vue.LayoutEngine.getInstance(Vue.LayoutEngine.currentLayoutId)
layoutEngine.registerLayoutComponent(ApaasCustomLayout)
}
// 表单引擎注册自开发组件配置 // 表单引擎注册自开发组件配置
if ( if (
widgetConfigList && Array.isArray(widgetConfigList) widgetConfigList && Array.isArray(widgetConfigList)