Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
zrch-risk-39
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Administrator
zrch-risk-39
Commits
8b5818ac
提交
8b5818ac
authored
3月 31, 2026
作者:
kxjia
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
问题管理
上级
354e0b80
隐藏空白字符变更
内嵌
并排
正在显示
23 个修改的文件
包含
1744 行增加
和
988 行删除
+1744
-988
ApprovalPanel.vue
zrch-risk-client-39/src/views/common/ApprovalPanel.vue
+4
-2
CurrentFormPanel.vue
zrch-risk-client-39/src/views/common/CurrentFormPanel.vue
+11
-4
HistoryPanel.vue
zrch-risk-client-39/src/views/common/HistoryPanel.vue
+192
-68
TaskAssigneeDrawer.vue
zrch-risk-client-39/src/views/common/TaskAssigneeDrawer.vue
+369
-83
TaskAssigneeSelector.vue
...-risk-client-39/src/views/common/TaskAssigneeSelector.vue
+112
-286
WorkFlowFormApprovalDrawer.vue
...client-39/src/views/common/WorkFlowFormApprovalDrawer.vue
+0
-425
WorkFlowFormDrawer.vue
zrch-risk-client-39/src/views/common/WorkFlowFormDrawer.vue
+15
-1
StProblemCheckArchive.api.ts
...views/project/problemArchive/StProblemCheckArchive.api.ts
+64
-0
StProblemCheckArchive.data.ts
...iews/project/problemArchive/StProblemCheckArchive.data.ts
+353
-0
StProblemCheckArchiveList.vue
...iews/project/problemArchive/StProblemCheckArchiveList.vue
+245
-0
StProblemCheckArchiveForm.vue
...t/problemArchive/components/StProblemCheckArchiveForm.vue
+71
-0
StProblemCheckArchiveModal.vue
.../problemArchive/components/StProblemCheckArchiveModal.vue
+101
-0
StProblemArchiveList.vue
...9/src/views/project/problemCheck/StProblemArchiveList.vue
+2
-10
StProblemCheck.api.ts
...t-39/src/views/project/problemCheck/StProblemCheck.api.ts
+11
-0
StProblemCheckList.vue
...-39/src/views/project/problemCheck/StProblemCheckList.vue
+7
-7
StProblemExecApprovalList.vue
.../views/project/problemCheck/StProblemExecApprovalList.vue
+26
-12
StProblemExecList.vue
...t-39/src/views/project/problemCheck/StProblemExecList.vue
+26
-11
StProblemIndex.vue
...ient-39/src/views/project/problemCheck/StProblemIndex.vue
+73
-37
StProblemPlanApprovalList.vue
.../views/project/problemCheck/StProblemPlanApprovalList.vue
+23
-10
StProblemPlanList.vue
...t-39/src/views/project/problemCheck/StProblemPlanList.vue
+14
-9
StProblemCheckExecuteForm.vue
...ect/problemCheck/components/StProblemCheckExecuteForm.vue
+10
-12
StProblemCheckForm.vue
...ws/project/problemCheck/components/StProblemCheckForm.vue
+7
-8
StProblemCheckPlanForm.vue
...roject/problemCheck/components/StProblemCheckPlanForm.vue
+8
-3
没有找到文件。
zrch-risk-client-39/src/views/common/ApprovalPanel.vue
浏览文件 @
8b5818ac
...
...
@@ -70,8 +70,6 @@
</div>
<a-divider
v-if=
"showSummary"
/>
<!-- 信息摘要区域 -->
<div
class=
"approval-summary"
v-if=
"showSummary"
>
<div
v-for=
"item in summaryItems"
...
...
@@ -83,6 +81,10 @@
</div>
</div>
</a-form>
<a-space
direction=
""
style=
"width:100%"
>
<a-button
type=
"primary"
ghost
block
@
click=
"handleSubmit"
>
保存
</a-button>
<a-button
type=
"primary"
ghost
block
@
click=
"handleSubmit"
>
保存并发送
</a-button>
</a-space>
</div>
</div>
</template>
...
...
zrch-risk-client-39/src/views/common/CurrentFormPanel.vue
浏览文件 @
8b5818ac
<!-- CurrentFormPanel.vue -->
<
template
>
<div
class=
"form-panel"
>
<div
class=
"form-header"
>
...
...
@@ -11,11 +10,11 @@
<a-tag
color=
"processing"
>
待处理
</a-tag>
</
template
>
<component
:is=
"getComponent(editableNode.formUrl
|| editableNode.formListUrl
)"
:is=
"getComponent(editableNode.formUrl)"
:ref=
"(el) => setFormRef(el, editableNode.id)"
:disabled=
"
false
"
:disabled=
"
props.disabled
"
:readonly=
"false"
:form-data=
"formData"
:form-data=
"
props.
formData"
:current-flow-node=
"editableNode"
@
update:form-data=
"handleFormDataUpdate"
/>
...
...
@@ -59,6 +58,14 @@ const props = defineProps({
externalFormData
:
{
type
:
Object
as
()
=>
Record
<
string
,
any
>
,
default
:
()
=>
({})
},
formData
:
{
type
:
Object
as
()
=>
Record
<
string
,
any
>
,
default
:
()
=>
({})
},
disabled
:
{
type
:
Boolean
,
default
:
false
}
})
...
...
zrch-risk-client-39/src/views/common/HistoryPanel.vue
浏览文件 @
8b5818ac
<!-- HistoryPanel.vue -->
<
template
>
<div
class=
"history-panel"
:class=
"
{ 'empty-history': readonlyNodes.length === 0 }">
<div
class=
"history-header"
>
...
...
@@ -42,16 +41,8 @@
<span
class=
"node-label"
>
处理时间:
</span>
<span
class=
"node-value"
>
{{ node.processTime || '--' }}
</span>
</div>
<div
class=
"node-info"
>
<span
class=
"node-label"
>
处理人:
</span>
<span
class=
"node-value"
>
{{ node.processor || '--' }}
</span>
</div>
<div
class=
"node-info"
>
<span
class=
"node-label"
>
审批意见:
</span>
<span
class=
"node-value"
>
{{ node.comment || '无' }}
</span>
</div>
</div>
<!--
如果需要显示历史表单数据,可以展开
-->
<!--
显示历史表单数据
-->
<
template
v-if=
"showHistoryFormData"
>
<a-divider
style=
"margin: 12px 0"
/>
<div
class=
"history-form-preview"
>
...
...
@@ -61,19 +52,18 @@
{{
expandedPreviewId
===
node
.
id
?
'收起'
:
'展开'
}}
</a-button>
</div>
<a-collapse
v-model:activeKey=
"expandedPreviewId"
:bordered=
"false"
ghost
>
<a-collapse-panel
:key=
"node.id"
:showArrow=
"false"
>
<component
:is=
"getComponent(node.formUrl)"
:disabled=
"true"
:readonly=
"true"
:form-data=
"
{ dataId: dataId }"
:formId="Number(dataId) || 2035539989"
:current-flow-node="node"
class="history-form-component"
/>
</a-collapse-panel>
</a-collapse>
<div
v-show=
"expandedPreviewId === node.id"
class=
"form-preview-content"
>
<component
:is=
"getComponent(node)"
:ref=
"(el) => setFormRef(el, node.id)"
:disabled=
"true"
:readonly=
"true"
:form-data=
"
{ dataId: props.dataId, nodeId: node.id }"
:dataId="props.dataId"
:current-flow-node="node"
class="history-form-component"
/>
</div>
</div>
</
template
>
</a-card>
...
...
@@ -84,7 +74,7 @@
</template>
<
script
lang=
"ts"
setup
>
import
{
ref
,
defineAsyncComponent
,
h
}
from
'vue'
import
{
ref
,
defineAsyncComponent
,
h
,
markRaw
,
watch
,
nextTick
,
ComponentPublicInstance
}
from
'vue'
import
{
CheckCircleOutlined
,
ClockCircleOutlined
}
from
'@ant-design/icons-vue'
import
{
Empty
}
from
'ant-design-vue'
...
...
@@ -102,6 +92,15 @@ interface WorkflowNode {
[
key
:
string
]:
any
}
// 表单组件实例类型
interface
FormComponentInstance
extends
ComponentPublicInstance
{
validate
?:
()
=>
Promise
<
any
>
getFormData
?:
()
=>
any
initFormData
?:
(
dataId
:
string
)
=>
Promise
<
void
>
|
void
formData
?:
any
[
key
:
string
]:
any
}
const
props
=
defineProps
({
readonlyNodes
:
{
type
:
Array
as
()
=>
WorkflowNode
[],
...
...
@@ -114,7 +113,7 @@ const props = defineProps({
},
showHistoryFormData
:
{
type
:
Boolean
,
default
:
fals
e
default
:
tru
e
}
})
...
...
@@ -122,7 +121,11 @@ const props = defineProps({
const
simpleImage
=
Empty
.
PRESENTED_IMAGE_SIMPLE
// 组件缓存
const
componentCache
=
new
Map
()
const
componentCache
=
new
Map
<
string
,
any
>
()
// 表单实例缓存,用于调用 initFormData
const
formInstanceCache
=
new
Map
<
string
,
FormComponentInstance
>
()
// 动态导入所有表单组件
const
modules
=
import
.
meta
.
glob
(
'@/views/**/*.vue'
)
// 历史表单预览展开状态
...
...
@@ -133,62 +136,181 @@ function togglePreview(nodeId: string) {
expandedPreviewId
.
value
=
expandedPreviewId
.
value
===
nodeId
?
''
:
nodeId
}
function
getComponent
(
url
:
string
)
{
if
(
!
url
)
{
return
createEmptyComponent
()
// 设置表单组件 ref
function
setFormRef
(
el
:
any
,
nodeId
:
string
)
{
if
(
el
)
{
formInstanceCache
.
set
(
nodeId
,
el
)
// 组件挂载后调用 initFormData 加载数据
callInitFormData
(
el
,
nodeId
)
}
}
if
(
componentCache
.
has
(
url
))
{
return
componentCache
.
get
(
url
)
// 调用 initFormData 加载表单数据
async
function
callInitFormData
(
formComponent
:
FormComponentInstance
,
nodeId
:
string
)
{
if
(
!
props
.
dataId
)
{
console
.
warn
(
'dataId 为空,无法加载表单数据'
)
return
}
if
(
!
formComponent
)
return
// 等待一下确保组件完全挂载
await
nextTick
()
// 调用表单组件的 initFormData 方法
if
(
typeof
formComponent
.
initFormData
===
'function'
)
{
try
{
console
.
log
(
`加载历史表单数据: nodeId=
${
nodeId
}
, dataId=
${
props
.
dataId
}
`
)
await
formComponent
.
initFormData
(
props
.
dataId
)
}
catch
(
error
)
{
console
.
error
(
'initFormData 调用失败:'
,
error
)
}
}
else
{
console
.
warn
(
'表单组件没有 initFormData 方法'
,
formComponent
)
}
}
// 解析组件路径
function
resolveComponentPath
(
node
:
WorkflowNode
):
string
|
null
{
// 优先使用 formUrl
let
url
=
node
.
formUrl
if
(
!
url
)
{
// 如果没有 formUrl,尝试从 formListUrl 推断
url
=
node
.
formListUrl
}
if
(
!
url
)
{
return
null
}
// 处理不同的路径格式
let
componentPath
=
''
if
(
url
.
includes
(
'/views'
))
{
// 如果已经是完整路径
if
(
url
.
includes
(
'/src/'
))
{
componentPath
=
url
}
// 如果以 /views 开头
else
if
(
url
.
startsWith
(
'/views'
))
{
componentPath
=
`/src
${
url
}
`
}
else
{
componentPath
=
`/src/views
${
url
}
`
}
// 如果是相对路径
else
if
(
url
.
startsWith
(
'./'
)
||
url
.
startsWith
(
'../'
))
{
componentPath
=
`/src/views/
${
url
.
replace
(
/^
\.\.?\/
/
,
''
)}
`
}
// 如果只是文件名或简单路径
else
{
componentPath
=
`/src/views/
${
url
}
`
}
// 确保有 .vue 后缀
if
(
!
componentPath
.
match
(
/
\.(
vue|js|ts|jsx|tsx
)
$/
))
{
componentPath
+=
'.vue'
}
return
componentPath
}
const
loader
=
modules
[
componentPath
]
// 根据节点获取组件
function
getComponent
(
node
:
WorkflowNode
)
{
const
cacheKey
=
node
.
formUrl
||
node
.
formListUrl
||
node
.
id
if
(
componentCache
.
has
(
cacheKey
))
{
return
componentCache
.
get
(
cacheKey
)
}
const
componentPath
=
resolveComponentPath
(
node
)
if
(
!
componentPath
)
{
const
EmptyComponent
=
createEmptyComponent
()
componentCache
.
set
(
cacheKey
,
markRaw
(
EmptyComponent
))
return
EmptyComponent
}
// 尝试在所有模块中查找
let
loader
=
null
// 精确匹配
for
(
const
[
path
,
moduleLoader
]
of
Object
.
entries
(
modules
))
{
if
(
path
===
componentPath
||
path
.
endsWith
(
componentPath
.
split
(
'/'
).
pop
()
||
''
))
{
loader
=
moduleLoader
break
}
}
// 如果没找到,尝试模糊匹配(去掉路径前缀)
if
(
!
loader
)
{
console
.
error
(
'未找到组件:'
,
componentPath
)
const
ErrorComponent
=
createErrorComponent
(
`组件未找到:
${
componentPath
}
`
)
componentCache
.
set
(
url
,
ErrorComponent
)
return
ErrorComponent
const
fileName
=
componentPath
.
split
(
'/'
).
pop
()?.
replace
(
/
\.
vue$/
,
''
)
||
''
for
(
const
[
path
,
moduleLoader
]
of
Object
.
entries
(
modules
))
{
if
(
path
.
includes
(
fileName
))
{
loader
=
moduleLoader
break
}
}
}
if
(
!
loader
)
{
console
.
warn
(
'未找到表单组件:'
,
componentPath
,
'节点:'
,
node
.
name
)
const
NotFoundComponent
=
createNotFoundComponent
(
`表单组件未找到:
${
componentPath
}
`
)
componentCache
.
set
(
cacheKey
,
markRaw
(
NotFoundComponent
))
return
NotFoundComponent
}
const
AsyncComponent
=
defineAsyncComponent
({
loader
:
()
=>
loader
()
as
Promise
<
{
default
:
any
}
>
,
loadingComponent
:
{
render
:
()
=>
h
(
'div'
,
{
style
:
'text-align: center; padding: 20px;
'
},
'加载中...'
)
render
:
()
=>
h
(
'div'
,
{
class
:
'component-loading
'
},
'加载中...'
)
},
errorComponent
:
{
render
:
()
=>
h
(
'div'
,
{
style
:
'color: red; padding: 20px;'
},
'组件加载失败'
)
render
:
(
props
:
any
)
=>
h
(
'div'
,
{
class
:
'component-error'
},
props
.
error
?.
message
||
'组件加载失败'
)
},
delay
:
200
,
timeout
:
3
000
timeout
:
10
000
})
componentCache
.
set
(
url
,
AsyncComponent
)
componentCache
.
set
(
cacheKey
,
markRaw
(
AsyncComponent
)
)
return
AsyncComponent
}
// 创建空组件(未配置表单)
function
createEmptyComponent
()
{
return
{
render
:
()
=>
h
(
'div'
,
{
style
:
'color: #999; padding: 20px; text-align: center;'
},
'该节点未配置表单'
)
name
:
'EmptyFormComponent'
,
render
:
()
=>
h
(
'div'
,
{
class
:
'empty-form-message'
},
'该节点未配置表单'
)
}
}
function
createErrorComponent
(
msg
:
string
)
{
// 创建未找到组件
function
createNotFoundComponent
(
msg
:
string
)
{
return
{
render
:
()
=>
h
(
'div'
,
{
style
:
'color: red; padding: 20px;'
},
msg
)
name
:
'NotFoundComponent'
,
render
:
()
=>
h
(
'div'
,
{
class
:
'not-found-message'
},
msg
)
}
}
// 监听 dataId 变化,重新加载所有已展开的历史表单数据
watch
(()
=>
props
.
dataId
,
async
()
=>
{
if
(
expandedPreviewId
.
value
&&
formInstanceCache
.
has
(
expandedPreviewId
.
value
))
{
const
formComponent
=
formInstanceCache
.
get
(
expandedPreviewId
.
value
)
if
(
formComponent
&&
typeof
formComponent
.
initFormData
===
'function'
)
{
await
nextTick
()
await
formComponent
.
initFormData
(
props
.
dataId
)
}
}
})
// 监听展开状态变化,当展开时重新加载数据
watch
(
expandedPreviewId
,
async
(
newId
,
oldId
)
=>
{
if
(
newId
&&
formInstanceCache
.
has
(
newId
))
{
const
formComponent
=
formInstanceCache
.
get
(
newId
)
if
(
formComponent
&&
typeof
formComponent
.
initFormData
===
'function'
)
{
await
nextTick
()
await
formComponent
.
initFormData
(
props
.
dataId
)
}
}
})
</
script
>
<
style
scoped
lang=
"scss"
>
...
...
@@ -355,24 +477,11 @@ function createErrorComponent(msg: string) {
color
:
#8c8c8c
;
}
:deep
(
.ant-collapse
)
{
background
:
transparent
;
.ant-collapse-item
{
border
:
none
;
}
.ant-collapse-content
{
border
:
none
;
background
:
#fafafa
;
border-radius
:
4px
;
margin-top
:
8px
;
}
.ant-collapse-content-box
{
padding
:
12px
;
font-size
:
12px
;
}
.form-preview-content
{
margin-top
:
12px
;
background
:
#fafafa
;
border-radius
:
4px
;
padding
:
12px
;
}
}
...
...
@@ -381,5 +490,19 @@ function createErrorComponent(msg: string) {
font-size
:
12px
;
}
}
.component-loading
,
.component-error
,
.empty-form-message
,
.not-found-message
{
text-align
:
center
;
padding
:
20px
;
color
:
#999
;
}
.component-error
,
.not-found-message
{
color
:
#ff4d4f
;
}
}
</
style
>
\ No newline at end of file
zrch-risk-client-39/src/views/common/TaskAssigneeDrawer.vue
浏览文件 @
8b5818ac
...
...
@@ -12,39 +12,142 @@
class=
"task-assignee-drawer"
>
<div
class=
"drawer-content"
>
<!-- 任务分配组件 -->
<div
class=
"assignee-section"
>
<TaskAssigneeSelector
ref=
"assigneeSelectorRef"
:title=
"assigneeTitle"
:proc-def-id=
"procDefId"
:task-id=
"taskId"
:form-data=
"formData"
:initial-assignee=
"initialAssignee"
:user-type-options=
"userTypeOptions"
:required=
"required"
:next-api=
"customNextApi"
@
confirm=
"handleAssigneeConfirm"
@
success=
"handleTaskSuccess"
@
error=
"handleTaskError"
@
cancel=
"handleCancel"
/>
<a-card
:title=
"assigneeTitle"
:bordered=
"false"
class=
"assignee-card"
>
<a-form
layout=
"vertical"
ref=
"formRef"
>
<a-form-item
label=
"用户类型"
required
>
<a-radio-group
v-model:value=
"localUserType"
@
change=
"handleUserTypeChange"
disabled
>
<a-radio
value=
"user"
>
<user-outlined
/>
用户
</a-radio>
<a-radio
value=
"role"
>
<team-outlined
/>
角色
</a-radio>
</a-radio-group>
</a-form-item>
<!-- 用户选择区域 -->
<a-form-item
v-if=
"localUserType === 'user' && !userAssigneeId"
label=
"选择用户"
:required=
"required"
:validate-status=
"userValidateStatus"
:help=
"userValidateHelp"
:key=
"'user-form-item-' + userAssigneeId"
>
<div
class=
"assignee-selector"
>
<a-input
:value=
"userName"
placeholder=
"点击'选择'按钮选择用户"
readonly
class=
"assignee-input"
>
<template
#
suffix
>
<a-button
type=
"link"
size=
"small"
@
click=
"handleSelectUser"
>
选择
</a-button>
</
template
>
</a-input>
<a-button
v-if=
"userAssigneeId"
type=
"text"
size=
"small"
@
click=
"clearAssignee"
class=
"clear-btn"
>
<close-circle-outlined
/>
</a-button>
</div>
</a-form-item>
已经指定用户:
<div
v-if=
"localUserType === 'user' && userAssigneeId"
class=
"assignee-info"
>
<a-descriptions
:column=
"1"
size=
"small"
bordered
>
<a-descriptions-item
label=
"ID"
>
{{ userAssigneeId }}
</a-descriptions-item>
<a-descriptions-item
label=
"名称"
>
{{ userName }}
</a-descriptions-item>
</a-descriptions>
</div>
<!-- 角色选择区域 -->
<a-form-item
v-if=
"localUserType === 'role'"
label=
"选择角色"
:required=
"required"
:validate-status=
"roleValidateStatus"
:help=
"roleValidateHelp"
:key=
"'role-form-item-' + roleAssigneeId"
>
<div
class=
"assignee-selector"
>
<a-input
:value=
"roleName"
placeholder=
"点击'选择'按钮选择角色"
readonly
class=
"assignee-input"
>
<
template
#
suffix
>
<a-button
type=
"link"
size=
"small"
@
click=
"handleSelectRole"
>
选择
</a-button>
</
template
>
</a-input>
<a-button
v-if=
"roleAssigneeId"
type=
"text"
size=
"small"
@
click=
"clearAssignee"
class=
"clear-btn"
>
<close-circle-outlined
/>
</a-button>
</div>
</a-form-item>
<div
v-if=
"localUserType === 'role' && roleAssigneeId"
class=
"assignee-info"
>
<a-descriptions
:column=
"1"
size=
"small"
bordered
>
<a-descriptions-item
label=
"角色ID"
>
{{ roleAssigneeId }}
</a-descriptions-item>
<a-descriptions-item
label=
"角色名称"
>
{{ roleName }}
</a-descriptions-item>
</a-descriptions>
</div>
</a-form>
<div
class=
"assignee-actions"
>
<a-space>
<a-button
@
click=
"handleCancel"
>
取消
</a-button>
<a-button
type=
"primary"
:loading=
"confirmLoading"
@
click=
"handleConfirm"
>
确认
</a-button>
</a-space>
</div>
</a-card>
</div>
</div>
<RoleSelectModal
rowKey=
"id"
@
register=
"registerSelRoleModal"
@
getSelectResult=
"onSelectRoleOk"
isRadioSelection
:showButton=
"false"
labelKey=
"roleName"
/>
<UserSelectModal
rowKey=
"id"
@
register=
"registerSelUserModal"
@
getSelectResult=
"onSelectUserOk"
isRadioSelection
:showButton=
"false"
labelKey=
"realname"
/>
</a-drawer>
</template>
<
script
lang=
"ts"
setup
>
import
{
ref
,
computed
,
watch
}
from
'vue'
import
{
message
}
from
'ant-design-vue'
import
TaskAssigneeSelector
from
'./TaskAssigneeSelector.vue'
import
{
useModal
}
from
'/@/components/Modal'
import
{
UserOutlined
,
TeamOutlined
,
CloseCircleOutlined
}
from
'@ant-design/icons-vue'
import
UserSelectModal
from
'/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue'
import
RoleSelectModal
from
'/@/components/Form/src/jeecg/components/modal/RoleSelectModal.vue'
import
{
complete
,
getMyTaskFlow
}
from
'/@/components/Process/api/todo'
;
interface
AssigneeData
{
userType
:
'user'
|
'role'
assignee
:
string
name
?:
string
remark
?:
string
}
const
props
=
defineProps
({
// 抽屉基础配置
...
...
@@ -69,25 +172,14 @@ const props = defineProps({
default
:
true
},
// 任务信息
taskId
:
{
type
:
String
,
required
:
true
},
procDefId
:
{
type
:
String
,
required
:
true
},
// 表单数据
formData
:
{
type
:
Object
,
default
:
()
=>
({})
},
// 初始分配数据
initialA
ssignee
:
{
type
:
Object
as
()
=>
AssigneeData
|
null
,
a
ssignee
:
{
type
:
String
,
default
:
null
},
...
...
@@ -96,22 +188,17 @@ const props = defineProps({
type
:
String
,
default
:
'选择处理人'
},
userTypeOptions
:
{
type
:
Array
as
()
=>
Array
<
{
value
:
string
;
label
:
string
}
>
,
default
:
()
=>
[
{
value
:
'user'
,
label
:
'用户'
},
{
value
:
'role'
,
label
:
'角色'
}
]
deployId
:
{
type
:
String
,
default
:
''
},
userType
:
{
type
:
String
,
default
:
'user'
},
required
:
{
type
:
Boolean
,
default
:
true
},
// 自定义API
customNextApi
:
{
type
:
Function
,
default
:
null
}
})
...
...
@@ -123,58 +210,205 @@ const emit = defineEmits([
'assignee-confirm'
])
// 状态
const
assigneeSelectorRef
=
ref
<
InstanceType
<
typeof
TaskAssigneeSelector
>
|
null
>
(
null
)
const
[
registerSelUserModal
,
{
openModal
:
userOpenModal
}]
=
useModal
()
const
[
registerSelRoleModal
,
{
openModal
:
roleOpenModal
}]
=
useModal
()
// 独立的状态变量
const
localUserType
=
ref
<
'user'
|
'role'
>
(
'user'
)
const
userAssigneeId
=
ref
(
''
)
const
userName
=
ref
(
''
)
const
roleAssigneeId
=
ref
(
''
)
const
roleName
=
ref
(
''
)
const
confirmLoading
=
ref
(
false
)
// 初始化数据
const
initData
=
()
=>
{
if
(
props
.
assignee
)
{
if
(
props
.
userType
===
'role'
)
{
localUserType
.
value
=
'role'
userAssigneeId
.
value
=
''
userName
.
value
=
''
}
else
{
localUserType
.
value
=
'user'
userAssigneeId
.
value
=
props
.
assignee
roleName
.
value
=
''
}
}
else
{
localUserType
.
value
=
props
.
userType
===
'role'
?
'role'
:
'user'
userAssigneeId
.
value
=
''
userName
.
value
=
''
roleAssigneeId
.
value
=
''
roleName
.
value
=
''
}
}
const
userValidateStatus
=
computed
(()
=>
{
if
(
!
props
.
required
)
return
''
if
(
localUserType
.
value
!==
'user'
)
return
''
return
!
userAssigneeId
.
value
?
'error'
:
''
})
const
userValidateHelp
=
computed
(()
=>
userValidateStatus
.
value
===
'error'
?
'请选择用户'
:
''
)
const
roleValidateStatus
=
computed
(()
=>
{
if
(
!
props
.
required
)
return
''
if
(
localUserType
.
value
!==
'role'
)
return
''
return
!
roleAssigneeId
.
value
?
'error'
:
''
})
const
roleValidateHelp
=
computed
(()
=>
roleValidateStatus
.
value
===
'error'
?
'请选择角色'
:
''
)
function
handleUserTypeChange
()
{
clearAssignee
()
}
function
handleSelectUser
()
{
userOpenModal
()
}
function
handleSelectRole
()
{
roleOpenModal
()
}
// 处理分配确认
function
handleAssigneeConfirm
(
assigneeData
:
AssigneeData
)
{
emit
(
'assignee-confirm'
,
assigneeData
)
// 选择用户回调
function
onSelectUserOk
(
options
:
any
[],
values
:
any
[])
{
if
(
!
values
||
values
.
length
===
0
)
return
userAssigneeId
.
value
=
values
[
0
]
userName
.
value
=
options
[
0
].
label
localUserType
.
value
=
'user'
}
// 处理任务成功
function
handleTaskSuccess
(
response
:
any
)
{
emit
(
'success'
,
response
)
// 成功后自动关闭抽屉
setTimeout
(()
=>
{
handleClose
()
},
500
)
// 选择角色回调
function
onSelectRoleOk
(
options
:
any
[],
values
:
any
[])
{
if
(
!
values
||
values
.
length
===
0
)
return
roleAssigneeId
.
value
=
values
[
0
]
roleName
.
value
=
options
[
0
].
label
localUserType
.
value
=
'role'
}
// 处理任务失败
function
handleTaskError
(
error
:
any
)
{
emit
(
'error'
,
error
)
function
clearAssignee
()
{
userAssigneeId
.
value
=
''
userName
.
value
=
''
roleAssigneeId
.
value
=
''
roleName
.
value
=
''
}
// 处理取消
function
handleCancel
()
{
handleClose
()
}
// 关闭抽屉
async
function
handleConfirm
()
{
// 验证
if
(
props
.
required
)
{
if
(
localUserType
.
value
===
'user'
&&
!
userAssigneeId
.
value
)
{
message
.
error
(
'请选择用户'
)
return
}
if
(
localUserType
.
value
===
'role'
&&
!
roleAssigneeId
.
value
)
{
message
.
error
(
'请选择角色'
)
return
}
}
confirmLoading
.
value
=
true
try
{
await
handleSendTask
()
setTimeout
(()
=>
{
handleClose
()
},
500
)
}
catch
(
error
:
any
)
{
message
.
error
(
error
?.
message
||
'提交失败,请重试'
)
emit
(
'error'
,
error
)
}
finally
{
confirmLoading
.
value
=
false
}
}
function
handleClose
()
{
emit
(
'update:visible'
,
false
)
emit
(
'close'
)
}
// 重置状态
function
resetDrawer
()
{
if
(
assigneeSelectorRef
.
value
)
{
assigneeSelectorRef
.
value
.
resetForm
()
localUserType
.
value
=
props
.
userType
===
'role'
?
'role'
:
'user'
userAssigneeId
.
value
=
''
userName
.
value
=
''
roleAssigneeId
.
value
=
''
roleName
.
value
=
''
}
function
getAssigneeData
()
{
return
{
userType
:
localUserType
.
value
,
assignee
:
localUserType
.
value
===
'user'
?
userAssigneeId
.
value
:
roleAssigneeId
.
value
,
name
:
localUserType
.
value
===
'user'
?
userName
.
value
:
roleName
.
value
,
remark
:
''
}
}
// 监听抽屉打开/关闭
watch
(()
=>
props
.
visible
,
(
newVal
)
=>
{
if
(
!
newVal
)
{
if
(
newVal
)
{
initData
()
}
else
{
resetDrawer
()
}
})
// 暴露方法
watch
(()
=>
props
.
assignee
,
()
=>
{
if
(
props
.
visible
)
{
initData
()
}
},
{
deep
:
true
})
const
handleSendTask
=
async
()
=>
{
try
{
const
submitData
=
{
instanceId
:
""
,
deployId
:
""
,
taskId
:
""
,
comment
:
''
,
values
:
{},
approval
:
''
,
approvalType
:
''
,
};
submitData
.
values
[
'approval'
]
=
localUserType
.
value
===
'user'
?
userAssigneeId
.
value
:
roleAssigneeId
.
value
;
submitData
.
values
[
'approvalType'
]
=
localUserType
.
value
===
'user'
?
'user'
:
'role'
;
const
dataId
=
props
.
formData
.
id
||
''
;
if
(
dataId
)
{
try
{
const
myTaskFlow
=
await
getMyTaskFlow
({
deploymentId
:
props
.
deployId
,
dataId
:
dataId
});
console
.
log
(
'获取流程任务信息:'
,
myTaskFlow
);
if
(
myTaskFlow
?.
taskId
)
{
submitData
.
taskId
=
myTaskFlow
.
taskId
;
submitData
.
deployId
=
myTaskFlow
.
deployId
;
submitData
.
instanceId
=
myTaskFlow
.
instanceId
;
}
//await complete(submitData);
emit
(
'success'
,
dataId
)
message
.
success
(
'任务发送成功'
);
}
catch
(
e
)
{
console
.
warn
(
'flowTaskInfo 获取 taskId 失败'
,
e
);
}
}
}
catch
(
error
:
any
)
{
message
.
error
(
error
.
message
||
'发送任务失败'
);
}
finally
{
}
};
defineExpose
({
resetDrawer
,
getAssigneeData
:
()
=>
assigneeSelectorRef
.
value
?.
getAssigneeData
()
,
submit
:
()
=>
assigneeSelectorRef
.
value
?.
handleConfirm
()
getAssigneeData
,
submit
:
handleConfirm
})
</
script
>
...
...
@@ -231,26 +465,77 @@ defineExpose({
}
}
// 分配区域
.assignee-section
{
height
:
100%
;
:deep
(
.task-assignee-selector
)
{
.assignee-card
{
height
:
100%
;
border-radius
:
8px
;
box-shadow
:
0
2px
8px
rgba
(
0
,
0
,
0
,
0
.06
);
.assignee-card
{
height
:
100%
;
bo
x-shadow
:
0
1px
2px
rgba
(
0
,
0
,
0
,
0
.03
)
;
:deep
(
.ant-card-head
)
{
background-color
:
#fafbfc
;
bo
rder-bottom
:
1px
solid
#e8eef2
;
:deep
(
.ant-card-head
)
{
background-color
:
#fff
;
border-bottom
:
1px
solid
#f0f0f
0
;
.ant-card-head-title
{
font-size
:
16px
;
font-weight
:
50
0
;
}
}
:deep
(
.ant-card-body
)
{
padding
:
24px
;
height
:
calc
(
100%
-
57px
);
overflow-y
:
auto
;
display
:
flex
;
flex-direction
:
column
;
}
}
.assignee-selector
{
display
:
flex
;
align-items
:
center
;
gap
:
8px
;
.assignee-input
{
flex
:
1
;
:deep
(
.ant-input
)
{
background-color
:
#fafafa
;
cursor
:
pointer
;
&
:hover
{
background-color
:
#fff
;
}
}
}
.clear-btn
{
color
:
#999
;
font-size
:
14px
;
:deep
(
.ant-card-body
)
{
height
:
calc
(
100%
-
57px
)
;
&
:hover
{
color
:
#ff4d4f
;
}
}
}
.assignee-info
{
margin-top
:
12px
;
:deep
(
.ant-descriptions
)
{
.ant-descriptions-item-label
{
background-color
:
#fafbfc
;
width
:
80px
;
}
}
}
.assignee-actions
{
margin-top
:
auto
;
padding-top
:
24px
;
text-align
:
center
;
border-top
:
1px
solid
#f0f0f0
;
}
}
</
style
>
\ No newline at end of file
zrch-risk-client-39/src/views/common/TaskAssigneeSelector.vue
浏览文件 @
8b5818ac
<!-- TaskAssigneeSelector.vue -->
<
template
>
<div
class=
"task-assignee-selector"
>
<a-card
:title=
"title"
:bordered=
"false"
class=
"assignee-card"
>
...
...
@@ -6,7 +5,7 @@
<a-tag
:color=
"assigneeStatus.color"
>
{{
assigneeStatus
.
text
}}
</a-tag>
</
template
>
<a-form
:model=
"formData"
layout=
"vertical"
>
<a-form
layout=
"vertical"
>
<!-- 分配类型选择 -->
<a-form-item
label=
"分配类型"
required
>
<a-radio-group
v-model:value=
"formData.userType"
@
change=
"handleUserTypeChange"
>
...
...
@@ -23,26 +22,19 @@
<div
v-if=
"formData.userType === 'user'"
class=
"assignee-section"
>
<a-form-item
label=
"选择用户"
:required=
"true"
required
:validate-status=
"userValidateStatus"
:help=
"userValidateHelp"
>
<div
class=
"assignee-selector"
>
<a-input
v-model
:value=
"formData.userName"
:placeholder=
"userPlaceholder
"
:readonly=
"true"
:value=
"formData.userName"
placeholder=
"点击'选择'按钮选择用户
"
readonly
class=
"assignee-input"
>
<
template
#
suffix
>
<a-button
type=
"link"
size=
"small"
@
click=
"handleSelectUser"
class=
"select-btn"
>
选择
</a-button>
<a-button
type=
"link"
size=
"small"
@
click=
"handleSelectUser"
>
选择
</a-button>
</
template
>
</a-input>
<a-button
...
...
@@ -57,18 +49,11 @@
</div>
</a-form-item>
<!-- 用户信息展示 -->
<div
v-if=
"formData.assignee"
class=
"assignee-info"
>
<a-descriptions
:column=
"1"
size=
"small"
bordered
>
<a-descriptions-item
label=
"用户ID"
>
{{ formData.assignee }}
</a-descriptions-item>
<a-descriptions-item
label=
"用户名称"
>
{{ formData.userName }}
</a-descriptions-item>
<a-descriptions-item
label=
"用户类型"
>
<a-tag
color=
"blue"
>
系统用户
</a-tag>
</a-descriptions-item>
<a-descriptions-item
label=
"用户ID"
>
{{ formData.assignee }}
</a-descriptions-item>
<a-descriptions-item
label=
"用户名称"
>
{{ formData.userName }}
</a-descriptions-item>
<a-descriptions-item
label=
"用户类型"
><a-tag
color=
"blue"
>
系统用户
</a-tag></a-descriptions-item>
</a-descriptions>
</div>
</div>
...
...
@@ -77,26 +62,19 @@
<div
v-if=
"formData.userType === 'role'"
class=
"assignee-section"
>
<a-form-item
label=
"选择角色"
:required=
"true"
required
:validate-status=
"roleValidateStatus"
:help=
"roleValidateHelp"
>
<div
class=
"assignee-selector"
>
<a-input
v-model
:value=
"formData.roleName"
:placeholder=
"rolePlaceholder
"
:readonly=
"true"
:value=
"formData.roleName"
placeholder=
"点击'选择'按钮选择角色
"
readonly
class=
"assignee-input"
>
<
template
#
suffix
>
<a-button
type=
"link"
size=
"small"
@
click=
"handleSelectRole"
class=
"select-btn"
>
选择
</a-button>
<a-button
type=
"link"
size=
"small"
@
click=
"handleSelectRole"
>
选择
</a-button>
</
template
>
</a-input>
<a-button
...
...
@@ -111,23 +89,11 @@
</div>
</a-form-item>
<!-- 角色信息展示 -->
<div
v-if=
"formData.assignee"
class=
"assignee-info"
>
<a-descriptions
:column=
"1"
size=
"small"
bordered
>
<a-descriptions-item
label=
"角色ID"
>
{{ formData.assignee }}
</a-descriptions-item>
<a-descriptions-item
label=
"角色名称"
>
{{ formData.roleName }}
</a-descriptions-item>
<a-descriptions-item
label=
"角色类型"
>
<a-tag
color=
"purple"
>
系统角色
</a-tag>
</a-descriptions-item>
<a-descriptions-item
v-if=
"roleMembers.length"
label=
"角色成员"
>
<a-tooltip
:title=
"roleMembers.join(', ')"
>
<span>
{{ roleMembers.length }}人
</span>
</a-tooltip>
</a-descriptions-item>
<a-descriptions-item
label=
"角色ID"
>
{{ formData.assignee }}
</a-descriptions-item>
<a-descriptions-item
label=
"角色名称"
>
{{ formData.roleName }}
</a-descriptions-item>
<a-descriptions-item
label=
"角色类型"
><a-tag
color=
"purple"
>
系统角色
</a-tag></a-descriptions-item>
</a-descriptions>
</div>
</div>
...
...
@@ -144,33 +110,44 @@
</a-form-item>
</a-form>
<!-- 操作按钮 -->
<div
class=
"assignee-actions"
>
<a-space>
<a-button
@
click=
"handleCancel"
>
取消
</a-button>
<a-button
type=
"primary"
:loading=
"confirmLoading"
@
click=
"handleConfirm"
:disabled=
"!isValid"
>
确认
</a-button>
<a-button
type=
"primary"
:loading=
"confirmLoading"
@
click=
"handleConfirm"
:disabled=
"!isValid"
>
确认
</a-button>
</a-space>
</div>
</a-card>
<RoleSelectModal
rowKey=
"id"
@
register=
"registerSelRoleModal"
@
getSelectResult=
"onSelectOk"
isRadioSelection
:showButton=
"false"
labelKey=
"roleName"
/>
<UserSelectModal
rowKey=
"id"
@
register=
"registerSelUserModal"
@
getSelectResult=
"onSelectOk"
isRadioSelection
:showButton=
"false"
labelKey=
"realname"
/>
</div>
</template>
<
script
lang=
"ts"
setup
>
import
{
ref
,
computed
,
watch
}
from
'vue'
import
{
message
}
from
'ant-design-vue'
import
{
useModal
}
from
'/@/components/Modal'
import
{
UserOutlined
,
TeamOutlined
,
CloseCircleOutlined
}
from
'@ant-design/icons-vue'
//import { nextWorkflowNode } from '@/api/workflow'
import
UserSelectModal
from
'/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue'
import
RoleSelectModal
from
'/@/components/Form/src/jeecg/components/modal/RoleSelectModal.vue'
interface
AssigneeData
{
userType
:
'user'
|
'role'
...
...
@@ -178,215 +155,113 @@ interface AssigneeData {
userName
?:
string
roleName
?:
string
remark
?:
string
[
key
:
string
]:
any
}
interface
WorkflowParams
{
procDefId
:
string
taskId
:
string
formData
:
any
assignee
?:
AssigneeData
[
key
:
string
]:
any
}
const
props
=
defineProps
({
// 标题
title
:
{
type
:
String
,
default
:
'任务分配'
},
// 流程定义ID
procDefId
:
{
type
:
String
,
required
:
true
},
// 任务ID
taskId
:
{
type
:
String
,
required
:
true
},
// 表单数据
formData
:
{
type
:
Object
,
default
:
()
=>
({})
},
// 初始分配数据
initialAssignee
:
{
type
:
Object
as
()
=>
AssigneeData
|
null
,
default
:
null
},
// 是否必须分配
required
:
{
type
:
Boolean
,
default
:
true
},
// 工作流下一步接口配置
nextApi
:
{
type
:
Function
,
default
:
null
}
title
:
{
type
:
String
,
default
:
'任务分配'
},
procDefId
:
{
type
:
String
,
required
:
true
},
taskId
:
{
type
:
String
,
required
:
true
},
formData
:
{
type
:
Object
,
default
:
()
=>
({})
},
initialAssignee
:
{
type
:
Object
as
()
=>
AssigneeData
|
null
,
default
:
null
},
userType
:
{
type
:
String
,
default
:
'user'
},
required
:
{
type
:
Boolean
,
default
:
true
}
})
const
emit
=
defineEmits
([
'confirm'
,
'cancel'
,
'success'
,
'error'
,
'select-user'
,
// 选择用户事件
'select-role'
// 选择角色事件
])
const
emit
=
defineEmits
([
'confirm'
,
'cancel'
,
'success'
,
'error'
])
const
[
registerSelUserModal
,
{
openModal
:
userOpenModal
}]
=
useModal
()
const
[
registerSelRoleModal
,
{
openModal
:
roleOpenModal
}]
=
useModal
()
// 修复:使用函数初始化,确保能正确读取 props 值
const
getInitialUserType
=
():
'user'
|
'role'
=>
{
// 优先使用 initialAssignee 中的 userType
if
(
props
.
initialAssignee
?.
userType
)
{
return
props
.
initialAssignee
.
userType
}
// 其次使用 props.userType
if
(
props
.
userType
===
'role'
)
{
return
'role'
}
return
'user'
}
// 表单数据
const
formData
=
ref
<
AssigneeData
>
({
userType
:
'user'
,
assignee
:
''
,
userName
:
''
,
roleName
:
''
,
remark
:
''
userType
:
getInitialUserType
()
,
assignee
:
props
.
initialAssignee
?.
assignee
||
''
,
userName
:
props
.
initialAssignee
?.
userName
||
''
,
roleName
:
props
.
initialAssignee
?.
roleName
||
''
,
remark
:
props
.
initialAssignee
?.
remark
||
''
})
// 状态
const
confirmLoading
=
ref
(
false
)
const
selectedItem
=
ref
<
any
>
(
null
)
// 验证状态
const
userValidateStatus
=
computed
(()
=>
{
if
(
!
props
.
required
)
return
''
if
(
formData
.
value
.
userType
===
'user'
&&
!
formData
.
value
.
assignee
)
{
return
'error'
}
return
''
return
formData
.
value
.
userType
===
'user'
&&
!
formData
.
value
.
assignee
?
'error'
:
''
})
const
userValidateHelp
=
computed
(()
=>
{
if
(
userValidateStatus
.
value
===
'error'
)
{
return
'请选择用户'
}
return
''
})
const
userValidateHelp
=
computed
(()
=>
userValidateStatus
.
value
===
'error'
?
'请选择用户'
:
''
)
const
roleValidateStatus
=
computed
(()
=>
{
if
(
!
props
.
required
)
return
''
if
(
formData
.
value
.
userType
===
'role'
&&
!
formData
.
value
.
assignee
)
{
return
'error'
}
return
''
})
const
roleValidateHelp
=
computed
(()
=>
{
if
(
roleValidateStatus
.
value
===
'error'
)
{
return
'请选择角色'
}
return
''
})
// 占位符
const
userPlaceholder
=
computed
(()
=>
{
if
(
formData
.
value
.
assignee
)
{
return
formData
.
value
.
userName
||
'已选择用户'
}
return
'点击"选择"按钮选择用户'
return
formData
.
value
.
userType
===
'role'
&&
!
formData
.
value
.
assignee
?
'error'
:
''
})
const
rolePlaceholder
=
computed
(()
=>
{
if
(
formData
.
value
.
assignee
)
{
return
formData
.
value
.
roleName
||
'已选择角色'
}
return
'点击"选择"按钮选择角色'
})
const
roleValidateHelp
=
computed
(()
=>
roleValidateStatus
.
value
===
'error'
?
'请选择角色'
:
''
)
// 分配状态
const
assigneeStatus
=
computed
(()
=>
{
if
(
!
formData
.
value
.
assignee
)
{
return
{
text
:
'未分配'
,
color
:
'default'
}
}
if
(
!
formData
.
value
.
assignee
)
return
{
text
:
'未分配'
,
color
:
'default'
}
if
(
formData
.
value
.
userType
===
'user'
)
{
return
{
text
:
`已分配用户:
${
formData
.
value
.
userName
}
`
,
color
:
'green'
}
}
return
{
text
:
`已分配角色:
${
formData
.
value
.
roleName
}
`
,
color
:
'blue'
return
{
text
:
`已分配用户:
${
formData
.
value
.
userName
}
`
,
color
:
'green'
}
}
return
{
text
:
`已分配角色:
${
formData
.
value
.
roleName
}
`
,
color
:
'blue'
}
})
// 角色成员(示例数据,实际应从接口获取)
const
roleMembers
=
ref
<
string
[]
>
([])
const
isValid
=
computed
(()
=>
!
props
.
required
||
!!
formData
.
value
.
assignee
)
// 是否有效
const
isValid
=
computed
(()
=>
{
if
(
!
props
.
required
)
return
true
if
(
!
formData
.
value
.
assignee
)
return
false
return
true
})
// 处理用户类型切换
function
handleUserTypeChange
()
{
clearAssignee
()
}
// 处理选择用户(触发父组件事件)
function
handleSelectUser
()
{
emit
(
'select-user'
,
{
currentAssignee
:
formData
.
value
.
assignee
,
onSelect
:
(
user
:
any
)
=>
{
setUserData
(
user
)
}
})
userOpenModal
()
}
// 处理选择角色(触发父组件事件)
function
handleSelectRole
()
{
emit
(
'select-role'
,
{
currentAssignee
:
formData
.
value
.
assignee
,
onSelect
:
(
role
:
any
)
=>
{
setRoleData
(
role
)
}
})
}
// 设置用户数据(供父组件调用)
function
setUserData
(
user
:
any
)
{
formData
.
value
.
assignee
=
user
.
id
formData
.
value
.
userName
=
user
.
name
||
user
.
realName
||
user
.
username
message
.
success
(
`已选择用户:
${
formData
.
value
.
userName
}
`
)
roleOpenModal
()
}
// 设置角色数据(供父组件调用)
async
function
setRoleData
(
role
:
any
)
{
formData
.
value
.
assignee
=
role
.
id
formData
.
value
.
roleName
=
role
.
name
||
role
.
roleName
// 选择回调
function
onSelectOk
(
options
:
any
[],
values
:
any
[])
{
if
(
!
values
||
values
.
length
===
0
)
return
selectedItem
.
value
=
values
[
0
]
const
selectedOption
=
options
[
0
]
// 获取角色成员(可选)
try
{
// const members = await getRoleMembers(role.id)
// roleMembers.value = members
roleMembers
.
value
=
[]
// 示例数据
}
catch
(
error
)
{
console
.
error
(
'获取角色成员失败:'
,
error
)
if
(
formData
.
value
.
userType
===
'user'
)
{
formData
.
value
.
assignee
=
selectedItem
.
value
.
id
formData
.
value
.
userName
=
selectedOption
.
label
message
.
success
(
`已选择用户:
${
formData
.
value
.
userName
}
`
)
}
else
{
formData
.
value
.
assignee
=
selectedItem
.
value
.
id
formData
.
value
.
roleName
=
selectedOption
.
label
message
.
success
(
`已选择角色:
${
formData
.
value
.
roleName
}
`
)
}
message
.
success
(
`已选择角色:
${
formData
.
value
.
roleName
}
`
)
}
// 清空分配
function
clearAssignee
()
{
formData
.
value
.
assignee
=
''
formData
.
value
.
userName
=
''
formData
.
value
.
roleName
=
''
roleMembers
.
value
=
[]
}
// 取消
function
handleCancel
()
{
emit
(
'cancel'
)
}
// 确认并调用工作流下一步
async
function
handleConfirm
()
{
if
(
props
.
required
&&
!
formData
.
value
.
assignee
)
{
message
.
error
(
formData
.
value
.
userType
===
'user'
?
'请选择用户'
:
'请选择角色'
)
...
...
@@ -396,7 +271,6 @@ async function handleConfirm() {
confirmLoading
.
value
=
true
try
{
// 构建分配参数
const
assigneeData
=
{
userType
:
formData
.
value
.
userType
,
assignee
:
formData
.
value
.
assignee
,
...
...
@@ -404,44 +278,17 @@ async function handleConfirm() {
remark
:
formData
.
value
.
remark
}
// 构建工作流参数
const
workflowParams
:
WorkflowParams
=
{
procDefId
:
props
.
procDefId
,
taskId
:
props
.
taskId
,
formData
:
props
.
formData
,
assignee
:
assigneeData
,
completeTime
:
new
Date
().
toISOString
()
}
// 触发确认事件
emit
(
'confirm'
,
assigneeData
)
// 调用工作流下一步接口
let
response
if
(
props
.
nextApi
)
{
response
=
await
props
.
nextApi
(
workflowParams
)
}
else
{
//response = await nextWorkflowNode(workflowParams)
}
if
(
response
&&
response
.
success
!==
false
)
{
message
.
success
(
'任务提交成功'
)
emit
(
'success'
,
response
)
return
response
}
else
{
throw
new
Error
(
response
?.
message
||
'提交失败'
)
}
emit
(
'success'
,
assigneeData
)
message
.
success
(
'任务提交成功'
)
}
catch
(
error
:
any
)
{
console
.
error
(
'提交失败:'
,
error
)
message
.
error
(
error
?.
message
||
'提交失败,请重试'
)
emit
(
'error'
,
error
)
throw
error
}
finally
{
confirmLoading
.
value
=
false
}
}
// 获取分配数据
function
getAssigneeData
()
{
return
{
userType
:
formData
.
value
.
userType
,
...
...
@@ -451,20 +298,6 @@ function getAssigneeData() {
}
}
// 设置分配数据
function
setAssigneeData
(
data
:
AssigneeData
)
{
if
(
data
)
{
formData
.
value
=
{
userType
:
data
.
userType
||
'user'
,
assignee
:
data
.
assignee
||
''
,
userName
:
data
.
userName
||
''
,
roleName
:
data
.
roleName
||
''
,
remark
:
data
.
remark
||
''
}
}
}
// 重置表单
function
resetForm
()
{
formData
.
value
=
{
userType
:
'user'
,
...
...
@@ -473,23 +306,34 @@ function resetForm() {
roleName
:
''
,
remark
:
''
}
roleMembers
.
value
=
[]
}
// 监听
初始数据
// 监听
initialAssignee 变化
watch
(()
=>
props
.
initialAssignee
,
(
newVal
)
=>
{
if
(
newVal
)
{
setAssigneeData
(
newVal
)
formData
.
value
=
{
userType
:
newVal
.
userType
||
getInitialUserType
(),
assignee
:
newVal
.
assignee
||
''
,
userName
:
newVal
.
userName
||
''
,
roleName
:
newVal
.
roleName
||
''
,
remark
:
newVal
.
remark
||
''
}
}
},
{
immediate
:
true
})
},
{
immediate
:
true
,
deep
:
true
})
// 修复:监听 userType prop 变化,确保 radio 能正确响应
watch
(()
=>
props
.
userType
,
(
newVal
)
=>
{
if
(
newVal
===
'role'
||
newVal
===
'user'
)
{
// 只有当当前没有分配人时才自动切换类型
if
(
!
formData
.
value
.
assignee
)
{
formData
.
value
.
userType
=
newVal
}
}
},
{
immediate
:
true
})
// immediate: true 确保立即执行
// 暴露方法
defineExpose
({
getAssigneeData
,
setAssigneeData
,
resetForm
,
setUserData
,
// 暴露设置用户数据的方法
setRoleData
,
// 暴露设置角色数据的方法
validate
:
()
=>
isValid
.
value
})
</
script
>
...
...
@@ -542,11 +386,6 @@ defineExpose({
background-color
:
#fff
;
}
}
.select-btn
{
padding
:
0
8px
;
color
:
#1890ff
;
}
}
.clear-btn
{
...
...
@@ -567,10 +406,6 @@ defineExpose({
background-color
:
#fafbfc
;
width
:
80px
;
}
.ant-descriptions-item-content
{
background-color
:
#fff
;
}
}
}
...
...
@@ -580,13 +415,5 @@ defineExpose({
text-align
:
center
;
border-top
:
1px
solid
#f0f0f0
;
}
:deep
(
.ant-form-item
)
{
margin-bottom
:
20px
;
&
:last-child
{
margin-bottom
:
0
;
}
}
}
</
style
>
\ No newline at end of file
zrch-risk-client-39/src/views/common/WorkFlowFormApprovalDrawer.vue
deleted
100644 → 0
浏览文件 @
354e0b80
<
template
>
<a-drawer
:title=
"drawerTitle"
:visible=
"visible"
:width=
"drawerWidth"
:closable=
"true"
:mask-closable=
"maskClosable"
:header-style=
"
{ backgroundColor: '#f5f7fa', borderBottom: '1px solid #e8eef2' }"
@close="handleClose"
class="workflow-form-drawer"
style="padding: 0px;"
>
<div
class=
"drawer-layout"
:class=
"
{ 'three-columns': isApprovalNode }">
<!-- 左侧:历史节点区域 -->
<HistoryPanel
:readonly-nodes=
"readonlyNodes"
:data-id=
"dataId"
:show-history-form-data=
"showHistoryFormData"
/>
<!-- 中间:当前节点表单区域 -->
<div
class=
"form-wrapper"
>
<CurrentFormPanel
ref=
"currentFormPanelRef"
:editable-node=
"editableNode"
:data-id=
"dataId"
:external-form-data=
"externalFormData"
@
update:form-data=
"handleFormDataUpdate"
@
form-mounted=
"handleFormMounted"
/>
</div>
<!-- 右侧:审核意见区域(仅审核节点显示) -->
<ApprovalPanel
v-if=
"isApprovalNode"
ref=
"approvalPanelRef"
:current-node=
"editableNode"
:is-approval-node=
"isApprovalNode"
:reject-nodes=
"rejectNodes"
:can-select-reject-node=
"canSelectRejectNode"
:current-user=
"currentUser"
:initial-data=
"initialApprovalData"
@
update:approval-data=
"handleApprovalDataUpdate"
/>
</div>
<template
#
footer
>
<div
class=
"drawer-footer"
>
<a-space>
<a-button
@
click=
"handleClose"
>
取消
</a-button>
<a-button
type=
"primary"
:loading=
"submitLoading"
@
click=
"handleSubmit"
>
{{
isApprovalNode
?
'提交审核'
:
'提交'
}}
</a-button>
</a-space>
</div>
</
template
>
</a-drawer>
</template>
<
script
lang=
"ts"
setup
>
import
{
ref
,
computed
,
onMounted
,
watch
,
nextTick
}
from
'vue'
import
{
message
}
from
'ant-design-vue'
import
HistoryPanel
from
'./HistoryPanel.vue'
import
CurrentFormPanel
from
'./CurrentFormPanel.vue'
import
ApprovalPanel
from
'./ApprovalPanel.vue'
interface
WorkflowNode
{
id
:
string
name
:
string
formName
?:
string
formUrl
?:
string
formListUrl
?:
string
procDefId
?:
string
dataId
?:
string
processTime
?:
string
processor
?:
string
comment
?:
string
nodeType
?:
string
// 'form' | 'approval'
[
key
:
string
]:
any
}
const
props
=
defineProps
({
visible
:
{
type
:
Boolean
,
default
:
false
},
title
:
{
type
:
String
,
default
:
'表单处理'
},
width
:
{
type
:
[
Number
,
String
],
default
:
"90%"
},
maskClosable
:
{
type
:
Boolean
,
default
:
false
},
// 当前节点索引(从0开始),这个索引对应的节点是可编辑的
currentNodeIndex
:
{
type
:
Number
,
required
:
true
,
default
:
2
},
workflowNodes
:
{
type
:
Array
as
()
=>
WorkflowNode
[],
required
:
true
,
default
:
()
=>
[]
},
externalFormData
:
{
type
:
Object
as
()
=>
Record
<
string
,
any
>
,
default
:
()
=>
({})
},
procDefId
:
{
type
:
String
,
default
:
''
},
dataId
:
{
type
:
String
,
default
:
''
},
// 是否显示历史节点的表单数据
showHistoryFormData
:
{
type
:
Boolean
,
default
:
false
},
// 当前节点是否为审核节点(如果是审核节点,显示三栏布局)
isApprovalNode
:
{
type
:
Boolean
,
default
:
false
},
// 可退回的节点列表
rejectNodes
:
{
type
:
Array
as
()
=>
WorkflowNode
[],
default
:
()
=>
[]
},
// 是否可以手动选择退回节点
canSelectRejectNode
:
{
type
:
Boolean
,
default
:
true
},
// 当前用户
currentUser
:
{
type
:
String
,
default
:
''
},
// 初始审核数据
initialApprovalData
:
{
type
:
Object
as
()
=>
{
result
?:
string
comment
?:
string
rejectNode
?:
string
},
default
:
()
=>
({})
}
})
const
emit
=
defineEmits
([
'update:visible'
,
'submit'
,
'close'
,
'form-data-update'
])
// 状态
const
submitLoading
=
ref
(
false
)
const
currentFormData
=
ref
<
any
>
({})
const
approvalData
=
ref
<
any
>
({})
const
currentFormPanelRef
=
ref
<
InstanceType
<
typeof
CurrentFormPanel
>
|
null
>
(
null
)
const
approvalPanelRef
=
ref
<
InstanceType
<
typeof
ApprovalPanel
>
|
null
>
(
null
)
// 计算属性
const
drawerTitle
=
computed
(()
=>
props
.
title
)
const
drawerWidth
=
computed
(()
=>
props
.
width
)
// 只读节点:索引小于 currentNodeIndex 的节点
const
readonlyNodes
=
computed
(()
=>
{
if
(
!
props
.
workflowNodes
||
props
.
workflowNodes
.
length
===
0
)
{
return
[]
}
const
idx
=
props
.
currentNodeIndex
if
(
idx
<=
0
)
return
[]
return
props
.
workflowNodes
.
slice
(
0
,
idx
)
})
// 可编辑节点:索引等于 currentNodeIndex 的节点
const
editableNode
=
computed
(()
=>
{
if
(
!
props
.
workflowNodes
||
props
.
workflowNodes
.
length
===
0
)
{
return
null
}
const
idx
=
props
.
currentNodeIndex
if
(
idx
<
0
||
idx
>=
props
.
workflowNodes
.
length
)
{
return
null
}
return
props
.
workflowNodes
[
idx
]
})
// 处理表单数据更新
function
handleFormDataUpdate
(
data
:
any
)
{
currentFormData
.
value
=
data
emit
(
'form-data-update'
,
data
)
}
// 处理审核数据更新
function
handleApprovalDataUpdate
(
data
:
any
)
{
approvalData
.
value
=
data
}
// 处理表单组件挂载
function
handleFormMounted
({
nodeId
,
instance
}:
{
nodeId
:
string
;
instance
:
any
})
{
console
.
log
(
'表单组件已挂载 - 节点:'
,
nodeId
)
}
// 提交处理
async
function
handleSubmit
()
{
if
(
!
editableNode
.
value
)
{
message
.
warning
(
'没有可编辑的表单'
)
return
}
if
(
!
currentFormPanelRef
.
value
)
{
message
.
warning
(
'表单组件未加载'
)
return
}
// 如果是审核节点,验证审核意见
if
(
props
.
isApprovalNode
&&
approvalPanelRef
.
value
)
{
const
isValidApproval
=
await
approvalPanelRef
.
value
.
validate
()
if
(
!
isValidApproval
)
{
message
.
error
(
'请填写完整的审核信息'
)
return
}
}
submitLoading
.
value
=
true
try
{
// 1. 先进行表单验证
const
isValid
=
await
currentFormPanelRef
.
value
.
validateForm
()
if
(
!
isValid
)
{
message
.
error
(
'请完善表单信息'
)
return
}
// 2. 获取表单数据
const
submitData
=
await
currentFormPanelRef
.
value
.
getFormData
()
// 3. 构建提交数据
const
finalSubmitData
:
any
=
{
nodeId
:
editableNode
.
value
.
id
,
nodeName
:
editableNode
.
value
.
name
,
formData
:
submitData
,
procDefId
:
props
.
procDefId
,
formComponent
:
currentFormPanelRef
.
value
.
getFormInstance
()
}
// 如果是审核节点,添加审核数据
if
(
props
.
isApprovalNode
&&
approvalPanelRef
.
value
)
{
const
approval
=
await
approvalPanelRef
.
value
.
getApprovalData
()
finalSubmitData
.
approval
=
approval
}
console
.
log
(
'最终提交数据:'
,
finalSubmitData
)
// 4. 触发提交事件
emit
(
'submit'
,
finalSubmitData
)
message
.
success
(
props
.
isApprovalNode
?
'审核提交成功'
:
'提交成功'
)
handleClose
()
}
catch
(
error
:
any
)
{
console
.
error
(
'提交失败:'
,
error
)
message
.
error
(
error
?.
message
||
'提交失败,请重试'
)
}
finally
{
submitLoading
.
value
=
false
}
}
// 关闭抽屉
function
handleClose
()
{
emit
(
'update:visible'
,
false
)
emit
(
'close'
)
}
// 重置数据
function
resetFormData
()
{
if
(
currentFormPanelRef
.
value
)
{
currentFormPanelRef
.
value
.
resetFormData
()
}
if
(
approvalPanelRef
.
value
)
{
approvalPanelRef
.
value
.
resetForm
()
}
currentFormData
.
value
=
{}
approvalData
.
value
=
{}
}
// 监听抽屉打开
watch
(()
=>
props
.
visible
,
async
(
newVal
)
=>
{
if
(
newVal
)
{
resetFormData
()
// 等待子组件渲染完成后重新加载数据
await
nextTick
()
if
(
currentFormPanelRef
.
value
)
{
await
currentFormPanelRef
.
value
.
reloadFormData
()
}
}
})
// 监听 dataId 变化
watch
(()
=>
props
.
dataId
,
async
()
=>
{
if
(
props
.
visible
&&
currentFormPanelRef
.
value
)
{
await
nextTick
()
await
currentFormPanelRef
.
value
.
reloadFormData
()
}
})
// 监听外部数据变化
watch
(()
=>
props
.
externalFormData
,
(
newData
)
=>
{
if
(
newData
&&
editableNode
.
value
&&
newData
[
editableNode
.
value
.
id
])
{
currentFormData
.
value
=
newData
[
editableNode
.
value
.
id
]
}
},
{
deep
:
true
})
onMounted
(()
=>
{
resetFormData
()
})
defineExpose
({
resetFormData
,
getFormData
:
()
=>
currentFormData
.
value
,
getApprovalData
:
()
=>
approvalData
.
value
,
getCurrentFormData
:
async
()
=>
{
if
(
currentFormPanelRef
.
value
)
{
return
await
currentFormPanelRef
.
value
.
getFormData
()
}
return
currentFormData
.
value
},
validate
:
async
()
=>
{
if
(
currentFormPanelRef
.
value
)
{
const
formValid
=
await
currentFormPanelRef
.
value
.
validateForm
()
if
(
props
.
isApprovalNode
&&
approvalPanelRef
.
value
)
{
const
approvalValid
=
await
approvalPanelRef
.
value
.
validate
()
return
formValid
&&
approvalValid
}
return
formValid
}
return
true
},
submit
:
handleSubmit
})
</
script
>
<
style
scoped
lang=
"scss"
>
.workflow-form-drawer
{
:deep
(
.ant-drawer-header
)
{
background-color
:
#f5f7fa
;
border-bottom
:
1px
solid
#e8eef2
;
padding
:
16px
24px
;
.ant-drawer-title
{
font-size
:
16px
;
font-weight
:
500
;
color
:
#1f2f3d
;
}
.ant-drawer-close
{
color
:
#8c8c8c
;
&
:hover
{
color
:
#1f2f3d
;
}
}
}
:deep
(
.ant-drawer-body
)
{
padding
:
0
;
height
:
100%
;
overflow
:
hidden
;
}
:deep
(
.ant-drawer-footer
)
{
padding
:
12px
24px
;
border-top
:
1px
solid
#e8eef2
;
background-color
:
#fff
;
}
}
.drawer-layout
{
display
:
flex
;
height
:
100%
;
overflow
:
hidden
;
// 三栏布局
&
.three-columns
{
.history-panel
{
width
:
30%
;
}
.form-wrapper
{
width
:
40%
;
}
.approval-panel
{
width
:
30%
;
}
}
// 两栏布局(普通表单节点)
&
:not
(
.three-columns
)
{
.history-panel
{
width
:
40%
;
}
.form-wrapper
{
flex
:
1
;
}
}
}
.form-wrapper
{
overflow
:
hidden
;
display
:
flex
;
flex-direction
:
column
;
}
.drawer-footer
{
display
:
flex
;
justify-content
:
flex-end
;
}
</
style
>
\ No newline at end of file
zrch-risk-client-39/src/views/common/WorkFlowFormDrawer.vue
浏览文件 @
8b5818ac
...
...
@@ -14,7 +14,7 @@
<HistoryPanel
:readonly-nodes=
"readonlyNodes"
:data-id=
"dataId"
:show-history-form-data=
"showHistoryFormData"
:show-history-form-data=
"
props.
showHistoryFormData"
/>
<div
class=
"form-wrapper"
>
<CurrentFormPanel
...
...
@@ -22,6 +22,9 @@
:editable-node=
"editableNode"
:data-id=
"dataId"
:external-form-data=
"externalFormData"
:form-data=
"props.formData"
:form-bpm=
"formBpm"
:disabled=
"showApprovalPanel||false"
@
update:form-data=
"handleFormDataUpdate"
@
form-mounted=
"handleFormMounted"
/>
...
...
@@ -64,6 +67,12 @@ import HistoryPanel from './HistoryPanel.vue'
import
CurrentFormPanel
from
'./CurrentFormPanel.vue'
import
ApprovalPanel
from
'./ApprovalPanel.vue'
const
formBpm
=
ref
(
true
)
const
formDisabled
=
ref
(
false
)
interface
WorkflowNode
{
id
:
string
name
:
string
...
...
@@ -113,6 +122,10 @@ const props = defineProps({
type
:
Object
as
()
=>
Record
<
string
,
any
>
,
default
:
()
=>
({})
},
formData
:
{
type
:
Object
as
()
=>
Record
<
string
,
any
>
,
default
:
()
=>
({})
},
procDefId
:
{
type
:
String
,
default
:
''
...
...
@@ -219,6 +232,7 @@ const approvalPanelRef = ref<InstanceType<typeof ApprovalPanel> | null>(null)
const
drawerTitle
=
computed
(()
=>
props
.
title
)
const
drawerWidth
=
computed
(()
=>
props
.
width
)
// 只读节点:索引小于 currentNodeIndex 的节点
const
readonlyNodes
=
computed
(()
=>
{
if
(
!
props
.
workflowNodes
||
props
.
workflowNodes
.
length
===
0
)
{
...
...
zrch-risk-client-39/src/views/project/problemArchive/StProblemCheckArchive.api.ts
0 → 100644
浏览文件 @
8b5818ac
import
{
defHttp
}
from
'/@/utils/http/axios'
;
import
{
useMessage
}
from
"/@/hooks/web/useMessage"
;
const
{
createConfirm
}
=
useMessage
();
enum
Api
{
list
=
'/problem/stProblemCheckArchive/list'
,
save
=
'/problem/stProblemCheckArchive/add'
,
edit
=
'/problem/stProblemCheckArchive/edit'
,
deleteOne
=
'/problem/stProblemCheckArchive/delete'
,
deleteBatch
=
'/problem/stProblemCheckArchive/deleteBatch'
,
importExcel
=
'/problem/stProblemCheckArchive/importExcel'
,
exportXls
=
'/problem/stProblemCheckArchive/exportXls'
,
}
/**
* 导出api
* @param params
*/
export
const
getExportUrl
=
Api
.
exportXls
;
/**
* 导入api
*/
export
const
getImportUrl
=
Api
.
importExcel
;
/**
* 列表接口
* @param params
*/
export
const
list
=
(
params
)
=>
defHttp
.
get
({
url
:
Api
.
list
,
params
});
/**
* 删除单个
*/
export
const
deleteOne
=
(
params
,
handleSuccess
)
=>
{
return
defHttp
.
delete
({
url
:
Api
.
deleteOne
,
params
},
{
joinParamsToUrl
:
true
}).
then
(()
=>
{
handleSuccess
();
});
}
/**
* 批量删除
* @param params
*/
export
const
batchDelete
=
(
params
,
handleSuccess
)
=>
{
createConfirm
({
iconType
:
'warning'
,
title
:
'确认删除'
,
content
:
'是否删除选中数据'
,
okText
:
'确认'
,
cancelText
:
'取消'
,
onOk
:
()
=>
{
return
defHttp
.
delete
({
url
:
Api
.
deleteBatch
,
data
:
params
},
{
joinParamsToUrl
:
true
}).
then
(()
=>
{
handleSuccess
();
});
}
});
}
/**
* 保存或者更新
* @param params
*/
export
const
saveOrUpdate
=
(
params
,
isUpdate
)
=>
{
let
url
=
isUpdate
?
Api
.
edit
:
Api
.
save
;
return
defHttp
.
post
({
url
:
url
,
params
});
}
zrch-risk-client-39/src/views/project/problemArchive/StProblemCheckArchive.data.ts
0 → 100644
浏览文件 @
8b5818ac
import
{
BasicColumn
}
from
'/@/components/Table'
;
import
{
FormSchema
}
from
'/@/components/Table'
;
import
{
render
}
from
'/@/utils/common/renderUtils'
;
//列表数据
export
const
columns
:
BasicColumn
[]
=
[
{
title
:
'问题编号'
,
align
:
'center'
,
dataIndex
:
'problemNo'
,
resizable
:
true
,
ifShow
:
true
,
width
:
100
,
sorter
:
true
,
},
{
title
:
'项目分类'
,
align
:
'center'
,
dataIndex
:
'projectCategory'
,
resizable
:
true
,
width
:
100
,
sorter
:
true
,
customRender
:
({
text
})
=>
{
return
render
.
renderDict
(
text
,
'project_category'
);
},
},
{
title
:
'问题来源'
,
align
:
'center'
,
dataIndex
:
'problemSource'
,
resizable
:
true
,
width
:
150
,
},
{
title
:
'所属领域'
,
align
:
'center'
,
dataIndex
:
'domain'
,
width
:
150
,
resizable
:
true
,
customRender
:
({
text
})
=>
{
return
render
.
renderDict
(
text
,
'rate_domain'
);
},
sorter
:
true
,
},
{
title
:
'问题描述'
,
align
:
'center'
,
dataIndex
:
'problemDes'
,
resizable
:
true
,
ifShow
:
false
,
},
{
title
:
'风险等级'
,
align
:
'center'
,
dataIndex
:
'riskLevel'
,
width
:
100
,
resizable
:
true
,
customRender
:
({
text
})
=>
{
return
render
.
renderDict
(
text
,
'risk_level'
);
},
},
{
title
:
'整改状态'
,
align
:
'center'
,
dataIndex
:
'bpmStatus'
,
width
:
100
,
resizable
:
true
,
customRender
:
({
text
})
=>
{
return
render
.
renderDict
(
text
,
'bpm_status'
);
},
sorter
:
true
,
},
];
//查询数据
export
const
searchFormSchema
:
FormSchema
[]
=
[
];
//表单数据
export
const
formSchema
:
FormSchema
[]
=
[
{
label
:
'编号'
,
field
:
'problemNo'
,
component
:
'Input'
,
},
{
label
:
'projectCategory'
,
field
:
'projectCategory'
,
component
:
'Input'
,
},
{
label
:
'类别'
,
field
:
'problemItem'
,
component
:
'Input'
,
},
{
label
:
'问题描述'
,
field
:
'problemDes'
,
component
:
'InputTextArea'
,
},
{
label
:
'发现人'
,
field
:
'findUser'
,
component
:
'Input'
,
},
{
label
:
'发现时间'
,
field
:
'findingTime'
,
component
:
'DatePicker'
,
componentProps
:
{
showTime
:
true
,
valueFormat
:
'YYYY-MM-DD HH:mm:ss'
},
},
{
label
:
'问题来源'
,
field
:
'problemSource'
,
component
:
'Input'
,
},
{
label
:
'严重程度;0001 不严重 0002 一般 0003 严重 0004 非常严重'
,
field
:
'severity'
,
component
:
'Input'
,
},
{
label
:
'领域'
,
field
:
'domain'
,
component
:
'Input'
,
},
{
label
:
'负责部门'
,
field
:
'headDepCode'
,
component
:
'Input'
,
},
{
label
:
'负责人'
,
field
:
'headUserId'
,
component
:
'Input'
,
},
{
label
:
'是否整改: 0-否 1-是'
,
field
:
'isRectified'
,
component
:
'Input'
,
},
{
label
:
'整改状态'
,
field
:
'rectifyStatus'
,
component
:
'Input'
,
},
{
label
:
'风险等级'
,
field
:
'riskLevel'
,
component
:
'InputNumber'
,
},
{
label
:
'整改周期'
,
field
:
'rectifyCycle'
,
component
:
'InputNumber'
,
},
{
label
:
'整改方案'
,
field
:
'rectifyPlan'
,
component
:
'InputTextArea'
,
},
{
label
:
'计划开始时间'
,
field
:
'planStartDate'
,
component
:
'DatePicker'
,
componentProps
:
{
valueFormat
:
'YYYY-MM-DD'
},
},
{
label
:
'成因分析'
,
field
:
'causeAnalysis'
,
component
:
'Input'
,
},
{
label
:
'计划结束时间'
,
field
:
'planEndDate'
,
component
:
'DatePicker'
,
componentProps
:
{
valueFormat
:
'YYYY-MM-DD'
},
},
{
label
:
'执行部门'
,
field
:
'execDepCode'
,
component
:
'Input'
,
},
{
label
:
'执行人'
,
field
:
'execUserId'
,
component
:
'Input'
,
},
{
label
:
'整改开始时间'
,
field
:
'execStartDate'
,
component
:
'DatePicker'
,
componentProps
:
{
valueFormat
:
'YYYY-MM-DD'
},
},
{
label
:
'整改结束时间'
,
field
:
'execEndDate'
,
component
:
'DatePicker'
,
componentProps
:
{
valueFormat
:
'YYYY-MM-DD'
},
},
{
label
:
'整改落实情况'
,
field
:
'execRemark'
,
component
:
'InputTextArea'
,
},
{
label
:
'审核意见'
,
field
:
'reviewComment'
,
component
:
'InputTextArea'
,
},
{
label
:
'流程节点顺序号'
,
field
:
'bmpNodeId'
,
component
:
'Input'
,
},
{
label
:
'流程状态'
,
field
:
'bpmStatus'
,
component
:
'Input'
,
},
{
label
:
'部署ID'
,
field
:
'deployId'
,
component
:
'Input'
,
},
{
label
:
'创建人'
,
field
:
'createdUser'
,
component
:
'Input'
,
},
{
label
:
'创建时间'
,
field
:
'createdTime'
,
component
:
'DatePicker'
,
componentProps
:
{
showTime
:
true
,
valueFormat
:
'YYYY-MM-DD HH:mm:ss'
},
},
{
label
:
'更新人'
,
field
:
'updatedUser'
,
component
:
'Input'
,
},
{
label
:
'更新时间'
,
field
:
'updatedTime'
,
component
:
'DatePicker'
,
componentProps
:
{
showTime
:
true
,
valueFormat
:
'YYYY-MM-DD HH:mm:ss'
},
},
{
label
:
'0=未 1=接收'
,
field
:
'isReceive'
,
component
:
'InputNumber'
,
},
{
label
:
'programme'
,
field
:
'programme'
,
component
:
'Input'
,
},
{
label
:
'strategy'
,
field
:
'strategy'
,
component
:
'Input'
,
},
{
label
:
'caNo'
,
field
:
'caNo'
,
component
:
'InputNumber'
,
},
{
label
:
'headUserCode'
,
field
:
'headUserCode'
,
component
:
'Input'
,
},
{
label
:
'receivestatus'
,
field
:
'receivestatus'
,
component
:
'Input'
,
},
// TODO 主键隐藏字段,目前写死为ID
{
label
:
''
,
field
:
'id'
,
component
:
'Input'
,
show
:
false
},
];
// 高级查询数据
export
const
superQuerySchema
=
{
problemNo
:
{
title
:
'编号'
,
order
:
0
,
view
:
'text'
,
type
:
'string'
,},
projectCategory
:
{
title
:
'projectCategory'
,
order
:
1
,
view
:
'text'
,
type
:
'string'
,},
problemItem
:
{
title
:
'类别'
,
order
:
2
,
view
:
'text'
,
type
:
'string'
,},
problemDes
:
{
title
:
'问题描述'
,
order
:
3
,
view
:
'textarea'
,
type
:
'string'
,},
findUser
:
{
title
:
'发现人'
,
order
:
4
,
view
:
'text'
,
type
:
'string'
,},
findingTime
:
{
title
:
'发现时间'
,
order
:
5
,
view
:
'datetime'
,
type
:
'string'
,},
problemSource
:
{
title
:
'问题来源'
,
order
:
6
,
view
:
'text'
,
type
:
'string'
,},
severity
:
{
title
:
'严重程度;0001 不严重 0002 一般 0003 严重 0004 非常严重'
,
order
:
7
,
view
:
'text'
,
type
:
'string'
,},
domain
:
{
title
:
'领域'
,
order
:
8
,
view
:
'text'
,
type
:
'string'
,},
headDepCode
:
{
title
:
'负责部门'
,
order
:
9
,
view
:
'text'
,
type
:
'string'
,},
headUserId
:
{
title
:
'负责人'
,
order
:
10
,
view
:
'text'
,
type
:
'string'
,},
isRectified
:
{
title
:
'是否整改: 0-否 1-是'
,
order
:
11
,
view
:
'text'
,
type
:
'string'
,},
rectifyStatus
:
{
title
:
'整改状态'
,
order
:
12
,
view
:
'text'
,
type
:
'string'
,},
riskLevel
:
{
title
:
'风险等级'
,
order
:
13
,
view
:
'number'
,
type
:
'number'
,},
rectifyCycle
:
{
title
:
'整改周期'
,
order
:
14
,
view
:
'number'
,
type
:
'number'
,},
rectifyPlan
:
{
title
:
'整改方案'
,
order
:
15
,
view
:
'textarea'
,
type
:
'string'
,},
planStartDate
:
{
title
:
'计划开始时间'
,
order
:
16
,
view
:
'date'
,
type
:
'string'
,},
causeAnalysis
:
{
title
:
'成因分析'
,
order
:
17
,
view
:
'text'
,
type
:
'string'
,},
planEndDate
:
{
title
:
'计划结束时间'
,
order
:
18
,
view
:
'date'
,
type
:
'string'
,},
execDepCode
:
{
title
:
'执行部门'
,
order
:
19
,
view
:
'text'
,
type
:
'string'
,},
execUserId
:
{
title
:
'执行人'
,
order
:
20
,
view
:
'text'
,
type
:
'string'
,},
execStartDate
:
{
title
:
'整改开始时间'
,
order
:
21
,
view
:
'date'
,
type
:
'string'
,},
execEndDate
:
{
title
:
'整改结束时间'
,
order
:
22
,
view
:
'date'
,
type
:
'string'
,},
execRemark
:
{
title
:
'整改落实情况'
,
order
:
23
,
view
:
'textarea'
,
type
:
'string'
,},
reviewComment
:
{
title
:
'审核意见'
,
order
:
24
,
view
:
'textarea'
,
type
:
'string'
,},
bmpNodeId
:
{
title
:
'流程节点顺序号'
,
order
:
25
,
view
:
'text'
,
type
:
'string'
,},
bpmStatus
:
{
title
:
'流程状态'
,
order
:
26
,
view
:
'text'
,
type
:
'string'
,},
deployId
:
{
title
:
'部署ID'
,
order
:
27
,
view
:
'text'
,
type
:
'string'
,},
createdUser
:
{
title
:
'创建人'
,
order
:
28
,
view
:
'text'
,
type
:
'string'
,},
createdTime
:
{
title
:
'创建时间'
,
order
:
29
,
view
:
'datetime'
,
type
:
'string'
,},
updatedUser
:
{
title
:
'更新人'
,
order
:
30
,
view
:
'text'
,
type
:
'string'
,},
updatedTime
:
{
title
:
'更新时间'
,
order
:
31
,
view
:
'datetime'
,
type
:
'string'
,},
isReceive
:
{
title
:
'0=未 1=接收'
,
order
:
32
,
view
:
'number'
,
type
:
'number'
,},
programme
:
{
title
:
'programme'
,
order
:
33
,
view
:
'text'
,
type
:
'string'
,},
strategy
:
{
title
:
'strategy'
,
order
:
34
,
view
:
'text'
,
type
:
'string'
,},
caNo
:
{
title
:
'caNo'
,
order
:
35
,
view
:
'number'
,
type
:
'number'
,},
headUserCode
:
{
title
:
'headUserCode'
,
order
:
36
,
view
:
'text'
,
type
:
'string'
,},
receivestatus
:
{
title
:
'receivestatus'
,
order
:
37
,
view
:
'text'
,
type
:
'string'
,},
};
/**
* 流程表单调用这个方法获取formSchema
* @param param
*/
export
function
getBpmFormSchema
(
_formData
):
FormSchema
[]{
// 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
return
formSchema
;
}
\ No newline at end of file
zrch-risk-client-39/src/views/project/problemArchive/StProblemCheckArchiveList.vue
0 → 100644
浏览文件 @
8b5818ac
<
template
>
<div>
<!--引用表格-->
<BasicTable
@
register=
"registerTable"
:rowSelection=
"rowSelection"
>
<!--插槽:table标题-->
<template
#
tableTitle
>
<a-button
type=
"primary"
v-auth=
"'problem:st_problem_check_archive:add'"
@
click=
"handleAdd"
preIcon=
"ant-design:plus-outlined"
>
新增
</a-button>
<a-button
type=
"primary"
v-auth=
"'problem:st_problem_check_archive:exportXls'"
preIcon=
"ant-design:export-outlined"
@
click=
"onExportXls"
>
导出
</a-button>
<j-upload-button
type=
"primary"
v-auth=
"'problem:st_problem_check_archive:importExcel'"
preIcon=
"ant-design:import-outlined"
@
click=
"onImportXls"
>
导入
</j-upload-button>
<a-dropdown
v-if=
"selectedRowKeys.length > 0"
>
<template
#
overlay
>
<a-menu>
<a-menu-item
key=
"1"
@
click=
"batchHandleDelete"
>
<Icon
icon=
"ant-design:delete-outlined"
></Icon>
删除
</a-menu-item>
</a-menu>
</
template
>
<a-button
v-auth=
"'problem:st_problem_check_archive:deleteBatch'"
>
批量操作
<Icon
icon=
"mdi:chevron-down"
></Icon>
</a-button>
</a-dropdown>
<!-- 高级查询 -->
<super-query
:config=
"superQueryConfig"
@
search=
"handleSuperQuery"
/>
</template>
<!--操作栏-->
<
template
#
action=
"{ record }"
>
<TableAction
:actions=
"getTableAction(record)"
:dropDownActions=
"getDropDownAction(record)"
/>
</
template
>
<!--字段回显插槽-->
<
template
v-slot:bodyCell=
"{ column, record, index, text }"
>
</
template
>
</BasicTable>
<!-- 表单区域 -->
<StProblemCheckArchiveModal
@
register=
"registerModal"
@
success=
"handleSuccess"
></StProblemCheckArchiveModal>
<!-- 审批记录 -->
<BpmPictureModal
@
register=
"registerBpmModal"
/>
</div>
</template>
<
script
lang=
"ts"
name=
"problem-stProblemCheckArchive"
setup
>
import
{
ref
,
reactive
,
computed
,
unref
}
from
'vue'
;
import
{
BasicTable
,
useTable
,
TableAction
}
from
'/@/components/Table'
;
import
{
useModal
}
from
'/@/components/Modal'
;
import
{
useListPage
}
from
'/@/hooks/system/useListPage'
import
StProblemCheckArchiveModal
from
'./components/StProblemCheckArchiveModal.vue'
import
{
columns
,
searchFormSchema
,
superQuerySchema
}
from
'./StProblemCheckArchive.data'
;
import
{
list
,
deleteOne
,
batchDelete
,
getImportUrl
,
getExportUrl
}
from
'./StProblemCheckArchive.api'
;
import
{
getDateByPicker
}
from
'/@/utils'
;
//日期个性化选择
const
fieldPickers
=
reactive
({
});
const
[
registerBpmModal
,
{
openModal
:
bpmPicModal
}]
=
useModal
();
const
queryParam
=
reactive
<
any
>
({});
//注册model
const
[
registerModal
,
{
openModal
}]
=
useModal
();
//注册table数据
const
{
prefixCls
,
tableContext
,
onExportXls
,
onImportXls
}
=
useListPage
({
tableProps
:{
title
:
'问题归档'
,
api
:
list
,
columns
,
canResize
:
true
,
formConfig
:
{
//labelWidth: 120,
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[
],
fieldMapToTime
:
[
],
},
actionColumn
:
{
width
:
120
,
fixed
:
'right'
},
beforeFetch
:
(
params
)
=>
{
if
(
params
&&
fieldPickers
)
{
for
(
let
key
in
fieldPickers
)
{
if
(
params
[
key
])
{
params
[
key
]
=
getDateByPicker
(
params
[
key
],
fieldPickers
[
key
]);
}
}
}
return
Object
.
assign
(
params
,
queryParam
);
},
},
exportConfig
:
{
name
:
"问题归档"
,
url
:
getExportUrl
,
params
:
queryParam
,
},
importConfig
:
{
url
:
getImportUrl
,
success
:
handleSuccess
},
})
const
[
registerTable
,
{
reload
},{
rowSelection
,
selectedRowKeys
}]
=
tableContext
// 高级查询配置
const
superQueryConfig
=
reactive
(
superQuerySchema
);
/**
* 高级查询事件
*/
function
handleSuperQuery
(
params
)
{
Object
.
keys
(
params
).
map
((
k
)
=>
{
queryParam
[
k
]
=
params
[
k
];
});
reload
();
}
/**
* 新增事件
*/
function
handleAdd
()
{
openModal
(
true
,
{
isUpdate
:
false
,
showFooter
:
true
,
});
}
/**
* 编辑事件
*/
function
handleEdit
(
record
:
Recordable
)
{
openModal
(
true
,
{
record
,
isUpdate
:
true
,
showFooter
:
true
,
});
}
/**
* 详情
*/
function
handleDetail
(
record
:
Recordable
)
{
openModal
(
true
,
{
record
,
isUpdate
:
true
,
showFooter
:
false
,
});
}
/**
* 删除事件
*/
async
function
handleDelete
(
record
)
{
await
deleteOne
({
id
:
record
.
id
},
handleSuccess
);
}
/**
* 批量删除事件
*/
async
function
batchHandleDelete
()
{
await
batchDelete
({
ids
:
selectedRowKeys
.
value
},
handleSuccess
);
}
/**
* 成功回调
*/
function
handleSuccess
()
{
(
selectedRowKeys
.
value
=
[])
&&
reload
();
}
/**
* 操作栏
*/
function
getTableAction
(
record
){
return
[
{
label
:
'编辑'
,
onClick
:
handleEdit
.
bind
(
null
,
record
),
auth
:
'problem:st_problem_check_archive:edit'
}
]
}
/**
* 下拉操作栏
*/
function
getDropDownAction
(
record
){
let
dropDownAction
=
[
{
label
:
'详情'
,
onClick
:
handleDetail
.
bind
(
null
,
record
),
},
{
label
:
'删除'
,
popConfirm
:
{
title
:
'是否确认删除'
,
confirm
:
handleDelete
.
bind
(
null
,
record
),
placement
:
'topLeft'
,
},
auth
:
'problem:st_problem_check_archive:delete'
},
{
label
:
'审批进度'
,
onClick
:
handlePreviewPic
.
bind
(
null
,
record
),
ifShow
:
!!
record
.
bpmStatus
&&
record
.
bpmStatus
!==
'1'
,
}
];
if
(
record
.
bpmStatus
==
'1'
){
dropDownAction
.
push
({
label
:
'发起流程'
,
popConfirm
:
{
title
:
'确认提交流程吗?'
,
confirm
:
handleProcess
.
bind
(
null
,
record
),
placement
:
'topLeft'
,
}
})
}
return
dropDownAction
;
}
/**
* 提交流程
*/
async
function
handleProcess
(
record
)
{
let
params
=
{
flowCode
:
'dev_st_problem_check_archive_001'
,
id
:
record
.
id
,
formUrl
:
'problem/components/StProblemCheckArchiveForm'
,
formUrlMobile
:
''
}
await
startProcess
(
params
);
handleSuccess
();
}
/**
* 审批进度
*/
async
function
handlePreviewPic
(
record
)
{
bpmPicModal
(
true
,
{
flowCode
:
'dev_st_problem_check_archive_001'
,
dataId
:
record
.
id
,
});
}
</
script
>
<
style
lang=
"less"
scoped
>
:deep(.ant-picker),:deep(.ant-input-number){
width: 100%;
}
</
style
>
\ No newline at end of file
zrch-risk-client-39/src/views/project/problemArchive/components/StProblemCheckArchiveForm.vue
0 → 100644
浏览文件 @
8b5818ac
<
template
>
<div
style=
"min-height: 400px"
>
<BasicForm
@
register=
"registerForm"
></BasicForm>
<div
style=
"width: 100%;text-align: center"
v-if=
"!formDisabled"
>
<a-button
@
click=
"submitForm"
pre-icon=
"ant-design:check"
type=
"primary"
>
提 交
</a-button>
</div>
</div>
</
template
>
<
script
lang=
"ts"
>
import
{
BasicForm
,
useForm
}
from
'/@/components/Form/index'
;
import
{
computed
,
defineComponent
}
from
'vue'
;
import
{
defHttp
}
from
'/@/utils/http/axios'
;
import
{
propTypes
}
from
'/@/utils/propTypes'
;
import
{
getBpmFormSchema
}
from
'../StProblemCheckArchive.data'
;
import
{
saveOrUpdate
}
from
'../StProblemCheckArchive.api'
;
export
default
defineComponent
({
name
:
"StProblemCheckArchiveForm"
,
components
:{
BasicForm
},
props
:{
formData
:
propTypes
.
object
.
def
({}),
formBpm
:
propTypes
.
bool
.
def
(
true
),
},
setup
(
props
){
const
[
registerForm
,
{
setFieldsValue
,
setProps
,
getFieldsValue
}]
=
useForm
({
labelWidth
:
150
,
schemas
:
getBpmFormSchema
(
props
.
formData
),
showActionButtonGroup
:
false
,
baseColProps
:
{
span
:
24
}
});
const
formDisabled
=
computed
(()
=>
{
if
(
props
.
formData
.
disabled
===
false
){
return
false
;
}
return
true
;
});
let
formData
=
{};
const
queryByIdUrl
=
'/problem/stProblemCheckArchive/queryById'
;
async
function
initFormData
(){
let
params
=
{
id
:
props
.
formData
.
dataId
};
const
data
=
await
defHttp
.
get
({
url
:
queryByIdUrl
,
params
});
formData
=
{...
data
}
//设置表单的值
await
setFieldsValue
(
formData
);
//默认是禁用
await
setProps
({
disabled
:
formDisabled
.
value
})
}
async
function
submitForm
()
{
let
data
=
getFieldsValue
();
let
params
=
Object
.
assign
({},
formData
,
data
);
console
.
log
(
'表单数据'
,
params
)
await
saveOrUpdate
(
params
,
true
)
}
initFormData
();
return
{
registerForm
,
formDisabled
,
submitForm
,
}
}
});
</
script
>
\ No newline at end of file
zrch-risk-client-39/src/views/project/problemArchive/components/StProblemCheckArchiveModal.vue
0 → 100644
浏览文件 @
8b5818ac
<
template
>
<BasicModal
v-bind=
"$attrs"
@
register=
"registerModal"
destroyOnClose
:title=
"title"
:maxHeight=
"500"
:width=
"800"
@
ok=
"handleSubmit"
>
<BasicForm
@
register=
"registerForm"
name=
"StProblemCheckArchiveForm"
/>
</BasicModal>
</
template
>
<
script
lang=
"ts"
setup
>
import
{
ref
,
computed
,
unref
,
reactive
}
from
'vue'
;
import
{
BasicModal
,
useModalInner
}
from
'/@/components/Modal'
;
import
{
BasicForm
,
useForm
}
from
'/@/components/Form/index'
;
import
{
formSchema
}
from
'../StProblemCheckArchive.data'
;
import
{
saveOrUpdate
}
from
'../StProblemCheckArchive.api'
;
import
{
useMessage
}
from
'/@/hooks/web/useMessage'
;
import
{
getDateByPicker
}
from
'/@/utils'
;
const
{
createMessage
}
=
useMessage
();
// Emits声明
const
emit
=
defineEmits
([
'register'
,
'success'
]);
const
isUpdate
=
ref
(
true
);
const
isDetail
=
ref
(
false
);
//表单配置
const
[
registerForm
,
{
setProps
,
resetFields
,
setFieldsValue
,
validate
,
scrollToField
}]
=
useForm
({
labelWidth
:
150
,
schemas
:
formSchema
,
showActionButtonGroup
:
false
,
baseColProps
:
{
span
:
24
},
baseRowStyle
:
{
padding
:
"0 20px"
}
});
//表单赋值
const
[
registerModal
,
{
setModalProps
,
closeModal
}]
=
useModalInner
(
async
(
data
)
=>
{
//重置表单
await
resetFields
();
setModalProps
({
confirmLoading
:
false
,
showCancelBtn
:
!!
data
?.
showFooter
,
showOkBtn
:
!!
data
?.
showFooter
});
isUpdate
.
value
=
!!
data
?.
isUpdate
;
isDetail
.
value
=
!!
data
?.
showFooter
;
if
(
unref
(
isUpdate
))
{
//表单赋值
await
setFieldsValue
({
...
data
.
record
,
});
}
// 隐藏底部时禁用整个表单
setProps
({
disabled
:
!
data
?.
showFooter
})
});
//日期个性化选择
const
fieldPickers
=
reactive
({
});
//设置标题
const
title
=
computed
(()
=>
(
!
unref
(
isUpdate
)
?
'新增'
:
!
unref
(
isDetail
)
?
'详情'
:
'编辑'
));
//表单提交事件
async
function
handleSubmit
(
v
)
{
try
{
let
values
=
await
validate
();
// 预处理日期数据
changeDateValue
(
values
);
setModalProps
({
confirmLoading
:
true
});
//提交表单
await
saveOrUpdate
(
values
,
isUpdate
.
value
);
//关闭弹窗
closeModal
();
//刷新列表
emit
(
'success'
);
}
catch
({
errorFields
})
{
if
(
errorFields
)
{
const
firstField
=
errorFields
[
0
];
if
(
firstField
)
{
scrollToField
(
firstField
.
name
,
{
behavior
:
'smooth'
,
block
:
'center'
});
}
}
return
Promise
.
reject
(
errorFields
);
}
finally
{
setModalProps
({
confirmLoading
:
false
});
}
}
/**
* 处理日期值
* @param formData 表单数据
*/
const
changeDateValue
=
(
formData
)
=>
{
if
(
formData
&&
fieldPickers
)
{
for
(
let
key
in
fieldPickers
)
{
if
(
formData
[
key
])
{
formData
[
key
]
=
getDateByPicker
(
formData
[
key
],
fieldPickers
[
key
]);
}
}
}
};
</
script
>
<
style
lang=
"less"
scoped
>
/** 时间和数字输入框样式 */
:deep(.ant-input-number) {
width: 100%;
}
:deep(.ant-calendar-picker) {
width: 100%;
}
</
style
>
\ No newline at end of file
zrch-risk-client-39/src/views/project/problemCheck/StProblemArchiveList.vue
浏览文件 @
8b5818ac
...
...
@@ -22,7 +22,7 @@
import
{
useModal
}
from
'/@/components/Modal'
;
import
{
useListPage
}
from
'/@/hooks/system/useListPage'
;
import
{
columns
,
searchFormSchema
}
from
'./StProblemCheck.data'
;
import
{
list
}
from
'./StProblemCheck.api'
;
import
{
list
,
problemArchive
}
from
'./StProblemCheck.api'
;
import
StProblemCheckExecuteModal
from
'./components/StProblemCheckExecuteModal.vue'
;
const
emit
=
defineEmits
([
'callback'
])
...
...
@@ -52,14 +52,6 @@
api
:
list
,
columns
,
canResize
:
false
,
formConfig
:
{
//labelWidth: 120,
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[],
fieldMapToTime
:
[],
},
beforeFetch
(
params
)
{
params
[
'bmpNodeId'
]
=
props
.
currentFlowNode
.
id
},
...
...
@@ -73,7 +65,7 @@
const
[
registerTable
,
{
reload
},
{
rowSelection
,
selectedRowKeys
}]
=
tableContext
;
function
handleArchive
(
record
:
Recordable
)
{
emit
(
"callback"
,
record
)
problemArchive
({
id
:
record
.
id
,
}).
then
(
handleSuccess
);
}
function
handleSuccess
()
{
...
...
zrch-risk-client-39/src/views/project/problemCheck/StProblemCheck.api.ts
浏览文件 @
8b5818ac
...
...
@@ -11,6 +11,7 @@ enum Api {
deleteBatch
=
'/problem/stProblemCheck/deleteBatch'
,
importExcel
=
'/problem/stProblemCheck/importExcel'
,
exportXls
=
'/problem/stProblemCheck/exportXls'
,
problemArchive
=
'/problem/stProblemCheck/problemArchive'
,
}
/**
* 导出api
...
...
@@ -62,3 +63,13 @@ export const saveOrUpdate = (params, isUpdate) => {
let
url
=
isUpdate
?
Api
.
edit
:
Api
.
save
;
return
defHttp
.
post
({
url
:
url
,
params
});
}
/**
* 保存或者更新
* @param params
*/
export
const
problemArchive
=
(
params
)
=>
{
let
url
=
Api
.
problemArchive
;
return
defHttp
.
post
({
url
:
url
,
params
});
}
zrch-risk-client-39/src/views/project/problemCheck/StProblemCheckList.vue
浏览文件 @
8b5818ac
...
...
@@ -65,13 +65,13 @@
api
:
list
,
columns
,
canResize
:
false
,
formConfig
:
{
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[],
fieldMapToTime
:
[],
},
//
formConfig: {
//
schemas: searchFormSchema,
//
autoSubmitOnEnter: true,
//
showAdvancedButton: true,
//
fieldMapToNumber: [],
//
fieldMapToTime: [],
//
},
beforeFetch
(
params
)
{
params
[
'bmpNodeId'
]
=
props
.
currentFlowNode
.
id
},
...
...
zrch-risk-client-39/src/views/project/problemCheck/StProblemExecApprovalList.vue
浏览文件 @
8b5818ac
...
...
@@ -17,15 +17,15 @@
</template>
<
script
lang=
"ts"
name=
"problem-stProblemCheck"
setup
>
import
{
ref
}
from
'vue'
;
import
{
BasicTable
,
TableAction
}
from
'/@/components/Table'
;
import
{
useModal
}
from
'/@/components/Modal'
;
import
{
useListPage
}
from
'/@/hooks/system/useListPage'
;
import
{
columns
,
searchFormSchema
}
from
'./StProblemCheck.data'
;
import
{
list
}
from
'./StProblemCheck.api'
;
import
{
list
,
saveOrUpdate
}
from
'./StProblemCheck.api'
;
import
StProblemCheckExecuteModal
from
'./components/StProblemCheckExecuteModal.vue'
;
const
emit
=
defineEmits
([
'callback'
])
const
emit
=
defineEmits
([
'callback'
,
'sendWorkFlow'
])
const
props
=
defineProps
({
beforeFlowNode
:
{
...
...
@@ -50,15 +50,7 @@
title
:
'计划执行审批'
,
api
:
list
,
columns
,
canResize
:
false
,
formConfig
:
{
//labelWidth: 120,
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[],
fieldMapToTime
:
[],
},
canResize
:
true
,
beforeFetch
(
params
)
{
params
[
'bmpNodeId'
]
=
props
.
currentFlowNode
.
id
},
...
...
@@ -78,6 +70,10 @@
function
handleSuccess
()
{
(
selectedRowKeys
.
value
=
[])
&&
reload
();
}
function
handleSendNext
(
record
:
Recordable
)
{
emit
(
"sendWorkFlow"
,
record
)
}
function
getTableAction
(
record
)
{
return
[
...
...
@@ -85,9 +81,27 @@
label
:
'整改审核'
,
onClick
:
handleExecuteApproval
.
bind
(
null
,
record
),
},
{
label
:
'提交'
,
onClick
:
handleSendNext
.
bind
(
null
,
record
),
},
];
}
async
function
handleUpdate
(
dataId
)
{
await
saveOrUpdate
({
bmpNodeId
:
props
.
nextFlowNode
.
id
,
id
:
dataId
,
},
true
).
then
(
res
=>
{
handleSuccess
();
})
}
defineExpose
({
handleUpdate
,
})
</
script
>
<
style
scoped
></
style
>
zrch-risk-client-39/src/views/project/problemCheck/StProblemExecList.vue
浏览文件 @
8b5818ac
...
...
@@ -22,10 +22,10 @@
import
{
useModal
}
from
'/@/components/Modal'
;
import
{
useListPage
}
from
'/@/hooks/system/useListPage'
;
import
{
columns
,
searchFormSchema
}
from
'./StProblemCheck.data'
;
import
{
list
}
from
'./StProblemCheck.api'
;
import
{
list
,
saveOrUpdate
}
from
'./StProblemCheck.api'
;
import
StProblemCheckExecuteModal
from
'./components/StProblemCheckExecuteModal.vue'
;
const
emit
=
defineEmits
([
'callback'
])
const
emit
=
defineEmits
([
'callback'
,
'sendWorkFlow'
])
const
props
=
defineProps
({
beforeFlowNode
:
{
...
...
@@ -50,15 +50,7 @@
title
:
'问题整改'
,
api
:
list
,
columns
,
canResize
:
false
,
formConfig
:
{
//labelWidth: 120,
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[],
fieldMapToTime
:
[],
},
canResize
:
true
,
beforeFetch
(
params
)
{
params
[
'bmpNodeId'
]
=
props
.
currentFlowNode
.
id
},
...
...
@@ -78,6 +70,10 @@
function
handleSuccess
()
{
(
selectedRowKeys
.
value
=
[])
&&
reload
();
}
function
handleSendNext
(
record
:
Recordable
)
{
emit
(
"sendWorkFlow"
,
record
)
}
function
getTableAction
(
record
)
{
return
[
...
...
@@ -85,9 +81,28 @@
label
:
'整改执行'
,
onClick
:
handleExecute
.
bind
(
null
,
record
),
},
{
label
:
'提交'
,
onClick
:
handleSendNext
.
bind
(
null
,
record
),
},
];
}
async
function
handleUpdate
(
dataId
)
{
await
saveOrUpdate
({
bmpNodeId
:
props
.
nextFlowNode
.
id
,
id
:
dataId
,
},
true
).
then
(
res
=>
{
handleSuccess
();
})
}
defineExpose
({
handleUpdate
,
})
</
script
>
<
style
scoped
></
style
>
zrch-risk-client-39/src/views/project/problemCheck/StProblemIndex.vue
浏览文件 @
8b5818ac
...
...
@@ -4,6 +4,7 @@
<a-tab-pane
v-for=
"(node, index) in workflowNodes"
:key=
"index + 1"
:tab=
"node.name"
>
<div
v-if=
"node.formListUrl"
class=
"tab-content"
>
<component
:is=
"loadComponent(node.formListUrl)"
:ref=
"(el) => setFormComponentRef(el, index)"
@
startWorkFlow=
"handleDefinitionStart"
@
sendWorkFlow=
"handleDefinitionSend"
:beforeFlowNode=
"workflowNodes[index-1]"
...
...
@@ -25,6 +26,7 @@
:workflow-nodes=
"workflowNodes"
:external-form-data=
"externalFormData"
:proc-def-id=
"currentProcDefId"
:show-history-form-data=
"true"
:data-id=
"dataId"
:show-approval-panel=
"isShowApprovalPanel"
@
submit=
"handleMultiFormSubmit"
...
...
@@ -39,10 +41,16 @@
:task-name=
"taskName"
:proc-def-id=
"procDefId"
:proc-def-name=
"procDefName"
:form-data=
"formData"
:show-task-info=
"true"
:show-form-data=
"true"
@
success=
"handleSuccess"
:assignee-title=
"assigneeTitle"
:user-type=
"userType"
:assignee=
"assignee"
:deploy-id=
"deployId"
:user-type-options=
"userTypeOptions"
:custom-next-api=
"customNextApi"
:form-data=
"formData"
@
success=
"handlSendSuccess"
@
error=
"handleError"
/>
...
...
@@ -61,22 +69,25 @@
const
dataId
=
ref
(
''
);
const
currentNode
=
ref
<
any
>
({});
const
isShowApprovalPanel
=
ref
(
true
);
const
deployId
=
ref
(
''
);
// 改为动态 ref 对象,存储每个节点的组件实例
const
formComponentRefs
=
ref
<
Map
<
number
,
any
>>
(
new
Map
());
// 任务指派抽屉相关状态
const
drawerTaskVisible
=
ref
(
false
);
const
taskId
=
ref
(
'
task_123456
'
)
const
taskName
=
ref
(
'
部门经理审批
'
)
const
procDefId
=
ref
(
'
process_001
'
)
const
procDefName
=
ref
(
'
请假流程
'
)
const
formData
=
ref
({
申请人
:
'张三'
,
请假类型
:
'年假'
,
开始时间
:
'2024-01-15'
,
结束时间
:
'2024-01-20'
,
请假天数
:
5
,
请假事由
:
'家庭旅游'
})
const
taskId
=
ref
(
''
)
const
taskName
=
ref
(
''
)
const
procDefId
=
ref
(
''
)
const
procDefName
=
ref
(
''
)
const
assignee
=
ref
<
any
>
(
""
);
const
assigneeTitle
=
ref
<
any
>
(
""
);
const
userType
=
ref
<
any
>
(
""
);
const
formData
=
ref
<
any
>
({});
const
userTypeOptions
=
ref
<
any
>
([
{
value
:
'user'
,
label
:
'用户'
}
,
{
value
:
'role'
,
label
:
'角色'
}
]);
const
customNextApi
=
ref
<
any
>
(
null
);
// 抽屉相关状态
...
...
@@ -89,6 +100,21 @@
const
componentCache
=
new
Map
();
const
modules
=
import
.
meta
.
glob
(
'@/views/**/*.vue'
);
// 动态设置 ref 的函数
function
setFormComponentRef
(
el
:
any
,
index
:
number
)
{
if
(
el
)
{
formComponentRefs
.
value
.
set
(
index
,
el
);
}
else
{
formComponentRefs
.
value
.
delete
(
index
);
}
}
// 获取当前活动标签页对应的组件实例
function
getCurrentFormComponent
()
{
const
currentIndex
=
activeTab
.
value
-
1
;
return
formComponentRefs
.
value
.
get
(
currentIndex
);
}
function
handleTabChange
(
key
)
{
activeTab
.
value
=
key
;
currentMultiFormIndex
.
value
=
key
-
1
;
...
...
@@ -147,22 +173,33 @@
const
formData
=
{
dataId
:
data
.
id
,
dataName
:
'id'
};
const
startResRaw
=
await
definitionStartByDeployId
(
currentNode
.
value
?.
deployId
||
''
,
formData
);
if
(
startResRaw
?.
data
?.
id
)
{
dataId
.
value
=
startResRaw
.
data
.
id
;
}
}
const
handleDefinitionSend
=
async
(
data
)
=>
{
drawerTaskVisible
.
value
=
true
;
taskId
.
value
=
data
.
taskId
;
taskName
.
value
=
data
.
taskName
;
procDefId
.
value
=
data
.
procDefId
;
procDefName
.
value
=
data
.
procDefName
;
const
handleDefinitionSend
=
async
(
data
)
=>
{
drawerTaskVisible
.
value
=
true
;
const
nextNode
=
workflowNodes
.
value
[
activeTab
.
value
];
if
(
nextNode
?.
assignee
)
{
assignee
.
value
=
nextNode
.
assignee
;
}
else
{
assignee
.
value
=
''
;
}
deployId
.
value
=
nextNode
?.
deployId
||
''
;
const
attributes
=
nextNode
.
value
?.
attributes
||
{};
const
userTypes
=
attributes
.
userType
||
[];
if
(
userTypes
.
length
>
0
)
{
userType
.
value
=
userTypes
[
0
].
value
||
''
;
}
formData
.
value
=
data
;
}
}
const
handleOpenMultiForm
=
(
params
:
{
nodeIndex
?:
number
;
...
...
@@ -234,10 +271,18 @@ const handleDefinitionSend = async (data) => {
});
};
function handleSuccess(response: any) {
console.log('任务处理成功:', response)
// 刷新列表等操作
}
function handlSendSuccess(dataId: any) {
const currentFormComponent = getCurrentFormComponent();
if (currentFormComponent && typeof currentFormComponent.handleUpdate === 'function') {
currentFormComponent.handleUpdate(dataId);
} else {
console.warn('当前组件实例不存在或没有 handleUpdate 方法');
}
}
function handleError(error: any) {
...
...
@@ -276,27 +321,18 @@ const handleDefinitionSend = async (data) => {
function handleCallback(data: any) {
drawerVisible.value = true;
dataId.value = data.id || '';
currentNode.value = workflowNodes.value[currentMultiFormIndex.value];
currentProcDefId.value = currentNode.value.procDefId || '';
const isApprovalNode = JSON.parse(currentNode.value["isApprove"] || 'false');
if(
currentNode.value.name.indexOf('审') > -1
) {
if(
isApprovalNode
) {
isShowApprovalPanel.value = true;
} else {
isShowApprovalPanel.value = false;
}
const userid = currentNode.value?.assignee || '';
const nodeId = currentNode.value?.id
const procDefId = currentNode.value?.procDefId || '';
const attributes = currentNode.value?.attributes || {};
const userType = attributes.userType || [];
if (userType.length > 0) {
data['userType'] = userType[0].value || '';
}
}
</
script
>
...
...
zrch-risk-client-39/src/views/project/problemCheck/StProblemPlanApprovalList.vue
浏览文件 @
8b5818ac
...
...
@@ -22,7 +22,7 @@
import
{
useModal
}
from
'/@/components/Modal'
;
import
{
useListPage
}
from
'/@/hooks/system/useListPage'
;
import
{
columns
,
searchFormSchema
}
from
'./StProblemCheck.data'
;
import
{
list
}
from
'./StProblemCheck.api'
;
import
{
list
,
saveOrUpdate
}
from
'./StProblemCheck.api'
;
import
StProblemCheckExecuteModal
from
'./components/StProblemCheckExecuteModal.vue'
;
const
props
=
defineProps
({
...
...
@@ -40,7 +40,7 @@
}
})
const
emit
=
defineEmits
([
'callback'
])
const
emit
=
defineEmits
([
'callback'
,
'sendWorkFlow'
])
//注册model
const
[
registerExecuteModal
,
{
openModal
:
openExecuteModal
}]
=
useModal
();
...
...
@@ -51,14 +51,6 @@
api
:
list
,
columns
,
canResize
:
false
,
formConfig
:
{
//labelWidth: 120,
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[],
fieldMapToTime
:
[],
},
beforeFetch
(
params
)
{
params
[
'bmpNodeId'
]
=
props
.
currentFlowNode
.
id
},
...
...
@@ -78,6 +70,10 @@
function
handleSuccess
()
{
(
selectedRowKeys
.
value
=
[])
&&
reload
();
}
function
handleSendNext
(
record
:
Recordable
)
{
emit
(
"sendWorkFlow"
,
record
)
}
function
getTableAction
(
record
)
{
return
[
...
...
@@ -85,9 +81,26 @@
label
:
'计划审核'
,
onClick
:
handlePlanApproval
.
bind
(
null
,
record
),
},
{
label
:
'提交'
,
onClick
:
handleSendNext
.
bind
(
null
,
record
),
},
];
}
async
function
handleUpdate
(
dataId
)
{
await
saveOrUpdate
({
bmpNodeId
:
props
.
nextFlowNode
.
id
,
id
:
dataId
,
},
true
).
then
(
res
=>
{
handleSuccess
();
})
}
defineExpose
({
handleUpdate
,
})
</
script
>
<
style
scoped
></
style
>
zrch-risk-client-39/src/views/project/problemCheck/StProblemPlanList.vue
浏览文件 @
8b5818ac
...
...
@@ -22,7 +22,7 @@
import
{
useModal
}
from
'/@/components/Modal'
;
import
{
useListPage
}
from
'/@/hooks/system/useListPage'
;
import
{
columns
,
searchFormSchema
}
from
'./StProblemCheck.data'
;
import
{
list
}
from
'./StProblemCheck.api'
;
import
{
list
,
saveOrUpdate
}
from
'./StProblemCheck.api'
;
import
StProblemCheckExecuteModal
from
'./components/StProblemCheckExecuteModal.vue'
;
const
emit
=
defineEmits
([
'callback'
,
'sendWorkFlow'
])
...
...
@@ -49,14 +49,6 @@
api
:
list
,
columns
,
canResize
:
false
,
formConfig
:
{
//labelWidth: 120,
schemas
:
searchFormSchema
,
autoSubmitOnEnter
:
true
,
showAdvancedButton
:
true
,
fieldMapToNumber
:
[],
fieldMapToTime
:
[],
},
beforeFetch
(
params
)
{
params
[
'bmpNodeId'
]
=
props
.
currentFlowNode
.
id
},
...
...
@@ -94,6 +86,19 @@
];
}
async
function
handleUpdate
(
dataId
)
{
await
saveOrUpdate
({
bmpNodeId
:
props
.
nextFlowNode
.
id
,
id
:
dataId
,
},
true
).
then
(
res
=>
{
handleSuccess
();
})
}
defineExpose
({
handleUpdate
,
})
</
script
>
...
...
zrch-risk-client-39/src/views/project/problemCheck/components/StProblemCheckExecuteForm.vue
浏览文件 @
8b5818ac
...
...
@@ -13,7 +13,7 @@
import
{
defHttp
}
from
'/@/utils/http/axios'
;
import
{
propTypes
}
from
'/@/utils/propTypes'
;
import
{
getExecuteFormSchema
}
from
'../StProblemCheck.data'
;
import
{
saveOrUpdate
}
from
'../StProblemCheck.api'
;
import
{
saveOrUpdate
,
}
from
'../StProblemCheck.api'
;
export
default
defineComponent
({
name
:
'StProblemCheckForm'
,
...
...
@@ -23,6 +23,8 @@
props
:
{
formData
:
propTypes
.
object
.
def
({}),
formBpm
:
propTypes
.
bool
.
def
(
true
),
dataId
:
propTypes
.
string
.
def
(
''
),
disabled
:
propTypes
.
bool
.
def
(
false
),
},
setup
(
props
)
{
const
[
registerForm
,
{
setFieldsValue
,
setProps
,
getFieldsValue
}]
=
useForm
({
...
...
@@ -33,37 +35,33 @@
});
const
formDisabled
=
computed
(()
=>
{
if
(
props
.
formData
.
disabled
===
false
)
{
if
(
props
.
disabled
===
false
)
{
return
false
;
}
return
true
;
});
let
formData
=
{};
const
queryById
Url
=
'/problem/stProblemCheck/queryById'
;
async
function
initFormData
()
{
let
params
=
{
id
:
props
.
formData
.
dataI
d
};
const
data
=
await
defHttp
.
get
({
url
:
queryById
Url
,
params
});
const
queryById
=
'/problem/stProblemCheck/queryById'
;
async
function
initFormData
(
did
)
{
let
params
=
{
id
:
props
.
dataId
||
di
d
};
const
data
=
await
defHttp
.
get
({
url
:
queryById
,
params
});
formData
=
{
...
data
};
//设置表单的值
await
setFieldsValue
(
formData
);
//默认是禁用
await
setProps
({
disabled
:
formDisabled
.
value
});
}
async
function
submitForm
()
{
let
data
=
getFieldsValue
();
let
params
=
Object
.
assign
({},
formData
,
data
);
console
.
log
(
'表单数据'
,
params
);
await
saveOrUpdate
(
params
,
true
);
}
initFormData
();
initFormData
(
props
.
dataId
);
return
{
registerForm
,
formDisabled
,
submitForm
,
initFormData
};
},
});
...
...
zrch-risk-client-39/src/views/project/problemCheck/components/StProblemCheckForm.vue
浏览文件 @
8b5818ac
...
...
@@ -13,7 +13,7 @@
import
{
defHttp
}
from
'/@/utils/http/axios'
;
import
{
propTypes
}
from
'/@/utils/propTypes'
;
import
{
getBpmFormSchema
}
from
'../StProblemCheck.data'
;
import
{
saveOrUpdate
}
from
'../StProblemCheck.api'
;
import
{
saveOrUpdate
,
}
from
'../StProblemCheck.api'
;
export
default
defineComponent
({
name
:
'StProblemCheckForm'
,
...
...
@@ -24,6 +24,7 @@
formData
:
propTypes
.
object
.
def
({}),
formBpm
:
propTypes
.
bool
.
def
(
true
),
dataId
:
propTypes
.
string
.
def
(
''
),
disabled
:
propTypes
.
bool
.
def
(
false
),
},
setup
(
props
)
{
const
[
registerForm
,
{
setFieldsValue
,
setProps
,
getFieldsValue
}]
=
useForm
({
...
...
@@ -34,31 +35,29 @@
});
const
formDisabled
=
computed
(()
=>
{
if
(
props
.
formData
.
disabled
===
false
)
{
if
(
props
.
disabled
===
false
)
{
return
false
;
}
return
true
;
});
let
formData
=
{};
const
queryById
Url
=
'/problem/stProblemCheck/queryById/
'
;
const
queryById
=
'/problem/stProblemCheck/queryById
'
;
async
function
initFormData
(
did
)
{
let
params
=
{
id
:
props
.
dataId
||
did
};
const
data
=
await
defHttp
.
get
({
url
:
queryById
Url
,
params
});
const
data
=
await
defHttp
.
get
({
url
:
queryById
,
params
});
formData
=
{
...
data
};
//设置表单的值
await
setFieldsValue
(
formData
);
//默认是禁用
await
setProps
({
disabled
:
formDisabled
.
value
});
}
async
function
submitForm
()
{
let
data
=
getFieldsValue
();
let
params
=
Object
.
assign
({},
formData
,
data
);
console
.
log
(
'表单数据'
,
params
);
await
saveOrUpdate
(
params
,
true
);
}
initFormData
(
props
.
dataId
);
return
{
registerForm
,
formDisabled
,
...
...
zrch-risk-client-39/src/views/project/problemCheck/components/StProblemCheckPlanForm.vue
浏览文件 @
8b5818ac
...
...
@@ -12,7 +12,7 @@
import
{
computed
,
defineComponent
}
from
'vue'
;
import
{
defHttp
}
from
'/@/utils/http/axios'
;
import
{
propTypes
}
from
'/@/utils/propTypes'
;
import
{
getPlanFormSchema
,
formSchema
}
from
'../StProblemCheck.data'
;
import
{
getPlanFormSchema
}
from
'../StProblemCheck.data'
;
import
{
saveOrUpdate
,
}
from
'../StProblemCheck.api'
;
export
default
defineComponent
({
...
...
@@ -24,17 +24,18 @@
formData
:
propTypes
.
object
.
def
({}),
formBpm
:
propTypes
.
bool
.
def
(
true
),
dataId
:
propTypes
.
string
.
def
(
''
),
disabled
:
propTypes
.
bool
.
def
(
false
),
},
setup
(
props
)
{
const
[
registerForm
,
{
setFieldsValue
,
setProps
,
getFieldsValue
}]
=
useForm
({
labelWidth
:
150
,
schemas
:
formSchema
,
schemas
:
getPlanFormSchema
(
props
.
formData
)
,
showActionButtonGroup
:
false
,
baseColProps
:
{
span
:
24
},
});
const
formDisabled
=
computed
(()
=>
{
if
(
props
.
formData
.
disabled
===
false
)
{
if
(
props
.
disabled
===
false
)
{
return
false
;
}
return
true
;
...
...
@@ -55,6 +56,10 @@
await
saveOrUpdate
(
params
,
true
);
}
initFormData
(
props
.
dataId
);
return
{
registerForm
,
formDisabled
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论