!107 style(xispeak): 美化发起落实措施收集流程弹窗

* style(xispeak): 美化发起落实措施收集流程弹窗
* fix(xispeak): 移除督办状态筛选默认值,避免页面初始加载时无数据
* fix(xispeak): 对齐督办状态筛选逻辑,设置默认值"未开始"
This commit is contained in:
wsm
2026-07-22 07:13:47 +00:00
parent 321de68e27
commit 61c6fec92b
3 changed files with 454 additions and 112 deletions
+12 -1
View File
@@ -21,7 +21,7 @@
<!-- </a-col>-->
<a-col :lg="6">
<a-form-item name="bpmStatus" label="督办状态">
<a-select v-model:value="queryParam.bpmStatus" placeholder="请选择" allow-clear @change="searchQuery">
<a-select v-model:value="bpmStatusFilter" placeholder="请选择" allow-clear @change="handleBpmStatusChange">
<a-select-option value="1">未开始</a-select-option>
<a-select-option value="2">督办中</a-select-option>
<a-select-option value="3">已完成</a-select-option>
@@ -167,6 +167,7 @@ import { defHttp } from '/@/utils/http/axios';
const feedbackViewModalRef = ref();
const feedbackRightNowModalRef = ref();
const businessProcessListModalRef = ref();
const bpmStatusFilter = ref();
const currentBusinessId = ref('');
const pendingFeedbackRightNow = ref(0);
const statsData = reactive({ notStarted: 0, inProgress: 0, overdue: 0, completed: 0 });
@@ -880,10 +881,20 @@ import { defHttp } from '/@/utils/http/axios';
function searchReset() {
formRef.value?.resetFields();
clearQueryParams();
bpmStatusFilter.value = undefined;
selectedRowKeys.value = [];
reload({ page: 1 });
}
function handleBpmStatusChange(value) {
if (value != null) {
queryParam.value.bpmStatus = value;
} else {
delete queryParam.value.bpmStatus;
}
reload({ page: 1 });
}
/**
* form点击事件(以逗号分割)
*/
@@ -1,30 +1,79 @@
<template>
<JModal
title="发起落实措施收集流程"
:width="480"
:visible="visible"
<a-modal
:width="520"
:open="visible"
:confirmLoading="confirming"
okText="确认"
cancelText="取消"
@ok="handleOk"
:footer="null"
@cancel="handleCancel"
wrapClassName="feedback-right-now-modal"
>
<a-form :label-col="{ style: { width: '100%' } }">
<a-form-item>
<a-radio-group v-model:value="feedbackRightNow">
<a-space direction="vertical">
<a-radio :value="1">落实措施收集流程结束后需要立即反馈</a-radio>
<a-radio :value="0">无需立即反馈</a-radio>
</a-space>
</a-radio-group>
</a-form-item>
</a-form>
</JModal>
<template #title>
<div class="modal-title">
<Icon icon="ant-design:send-outlined" size="20" color="#1890ff" />
<span>发起落实措施收集流程</span>
</div>
</template>
<div class="modal-content">
<a-alert
message="选择反馈方式"
description="发起流程后,系统将根据所选方式决定是否在流程结束时自动生成反馈任务。"
type="info"
showIcon
style="margin-bottom: 16px"
/>
<a-radio-group v-model:value="feedbackRightNow" class="feedback-radio-group">
<div
class="feedback-option"
:class="{ active: feedbackRightNow === 1 }"
@click="feedbackRightNow = 1"
>
<div class="option-radio">
<a-radio :value="1" />
</div>
<div class="option-body">
<div class="option-title">
<Icon icon="ant-design:notification-outlined" size="18" />
<span>流程结束后需要立即反馈</span>
</div>
<div class="option-desc">
流程审批完成后将自动生成反馈任务通知相关人员及时提交落实反馈适用于需快速跟进的场景
</div>
</div>
</div>
<div
class="feedback-option"
:class="{ active: feedbackRightNow === 0 }"
@click="feedbackRightNow = 0"
>
<div class="option-radio">
<a-radio :value="0" />
</div>
<div class="option-body">
<div class="option-title">
<Icon icon="ant-design:clock-circle-outlined" size="18" />
<span>无需立即反馈</span>
</div>
<div class="option-desc">
仅发起流程不自动生成即时反馈任务后续可在台账中手动发起反馈
</div>
</div>
</div>
</a-radio-group>
</div>
<div class="modal-footer">
<a-button @click="handleCancel">取消</a-button>
<a-button type="primary" :loading="confirming" @click="handleOk">确认发起</a-button>
</div>
</a-modal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
import Icon from '/@/components/Icon/index';
const emit = defineEmits(['confirm']);
@@ -53,3 +102,90 @@
defineExpose({ open });
</script>
<style lang="less" scoped>
.modal-title {
display: flex;
align-items: center;
gap: 8px;
font-size: 16px;
font-weight: 600;
}
.modal-content {
padding: 8px 0;
}
.feedback-radio-group {
display: flex;
flex-direction: column;
gap: 12px;
width: 100%;
}
.feedback-option {
display: flex;
align-items: flex-start;
padding: 14px 16px;
border: 1px solid #e8e8e8;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
&:hover {
border-color: #91d5ff;
background: #f0f8ff;
}
&.active {
border-color: #1890ff;
background: #e6f7ff;
box-shadow: 0 0 0 1px #1890ff inset;
}
}
.option-radio {
margin-top: 2px;
margin-right: 12px;
flex-shrink: 0;
}
.option-body {
flex: 1;
min-width: 0;
}
.option-title {
display: flex;
align-items: center;
gap: 6px;
font-size: 14px;
font-weight: 500;
color: #262626;
margin-bottom: 4px;
}
.option-desc {
font-size: 12px;
color: #8c8c8c;
line-height: 1.6;
padding-left: 24px;
}
.modal-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
padding-top: 16px;
border-top: 1px solid #f0f0f0;
margin-top: 4px;
}
</style>
<style lang="less">
.feedback-right-now-modal {
.ant-modal-body {
padding: 20px 24px;
}
}
</style>