!156 style(bqtakepulse): 具体意见输入框改为整行放大显示

* style(bqtakepulse): 具体意见输入框改为整行放大显示
* refactor(xispeak): 表单操作隐藏添加下级入口
* feat(xispeak): 办理情况反馈新增只读详情弹窗
* fix(components): JSelectUser 补全 toRaw 导入
This commit is contained in:
wsm
2026-08-14 08:32:30 +00:00
parent e530779894
commit 364e220102
7 changed files with 221 additions and 14 deletions
@@ -20,7 +20,7 @@
import { unref } from 'vue'; import { unref } from 'vue';
import UserSelectModal from './modal/UserSelectModal.vue'; import UserSelectModal from './modal/UserSelectModal.vue';
import JSelectBiz from './base/JSelectBiz.vue'; import JSelectBiz from './base/JSelectBiz.vue';
import { defineComponent, ref, reactive, watchEffect, watch, provide } from 'vue'; import { defineComponent, ref, reactive, watchEffect, watch, provide, toRaw } from 'vue';
import { useModal } from '/@/components/Modal'; import { useModal } from '/@/components/Modal';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
import { useRuleFormItem } from '/@/hooks/component/useFormItem'; import { useRuleFormItem } from '/@/hooks/component/useFormItem';
@@ -21,9 +21,9 @@
<a-input v-model:value="mainForm.title" :disabled="mainDisabled" allow-clear /> <a-input v-model:value="mainForm.title" :disabled="mainDisabled" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :xs="24" :md="12"> <a-col :span="24">
<a-form-item label="具体意见" name="content"> <a-form-item label="具体意见" name="content" :labelCol="wideLabelCol" :wrapperCol="wideWrapperCol">
<a-textarea v-model:value="mainForm.content" :auto-size="{ minRows: 1, maxRows: 7 }" :disabled="mainDisabled" allow-clear /> <a-textarea v-model:value="mainForm.content" :auto-size="{ minRows: 3, maxRows: 7 }" :disabled="mainDisabled" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<template v-if="showBaseInfoDetail"> <template v-if="showBaseInfoDetail">
@@ -52,9 +52,17 @@
<a-input v-model:value="formData.title" placeholder="请输入意见主题" allow-clear></a-input> <a-input v-model:value="formData.title" placeholder="请输入意见主题" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :xs="24" :md="12"> <a-col :span="24">
<a-form-item label="具体意见" v-bind="validateInfos.content" id="BgTakepulseForm-content" name="content"> <a-form-item
<a-textarea v-model:value="formData.content" :rows="4" placeholder="请输入具体意见" /> class="full-width-aligned-form-item"
label="具体意见"
v-bind="validateInfos.content"
id="BgTakepulseForm-content"
name="content"
:labelCol="wideLabelCol"
:wrapperCol="wideWrapperCol"
>
<a-textarea v-model:value="formData.content" :rows="6" placeholder="请输入具体意见" />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :xs="24" :md="12"> <a-col :xs="24" :md="12">
+6 -6
View File
@@ -614,12 +614,12 @@ import { PARTY_COMMITTEE_DEPT_ID, SDW_LEADER_ROLE_ID } from '/@/constant/supervi
event: 'detail', event: 'detail',
onClick: handleDetail.bind(null, record), onClick: handleDetail.bind(null, record),
}, },
{ // {
text: '添加下级', // text: '添加下级',
icon: 'ant-design:plus-outlined', // icon: 'ant-design:plus-outlined',
event: 'addSub', // event: 'addSub',
onClick: handleAddSub.bind(null, { pid: record.id }), // onClick: handleAddSub.bind(null, { pid: record.id }),
}, // },
{ {
text: '删除', text: '删除',
icon: 'ant-design:delete-outlined', icon: 'ant-design:delete-outlined',
@@ -0,0 +1,187 @@
<template>
<j-modal
:title="title"
:width="900"
:visible="visible"
:okButtonProps="{ class: { 'jee-hidden': true } }"
@cancel="handleCancel"
cancelText="关闭"
>
<a-spin :spinning="false">
<JFormContainer :disabled="true">
<template #detail>
<a-form ref="formRef" class="antd-modal-form" labelAlign="left" :labelCol="labelCol" :wrapperCol="wrapperCol" name="BgXiSpeakFeedbackDetailForm">
<a-divider orientation="left" plain>基本信息</a-divider>
<a-row :gutter="[16, 0]">
<a-col :span="24">
<a-form-item label="重要讲话指示批示">
<a-textarea :value="mainForm.speakStatus || '-'" :rows="3" disabled />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="时间"><a-input :value="mainForm.time || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="企业负责同志批示情况"><a-input :value="mainForm.elmComment || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="学习传达研究部署"><a-input :value="mainForm.status || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="密级"><a-input :value="mainForm.secretLevel_dictText || mainForm.secretLevel || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="所党委责任领导"><a-input :value="mainForm.responsiblePerson_dictText || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="牵头部门"><a-input :value="mainForm.implDept_dictText || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="贯彻落实措施"><a-input :value="mainForm.implMeasures || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="会议决策数"><a-input :value="mainForm.numberOfResolutions ?? '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="完成状态"><a-input :value="mainForm.completionStatus_dictText || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="截止日期"><a-input :value="mainForm.deadline || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="报告反馈情况"><a-input :value="mainForm.reportFeedbackStatus || '-'" disabled /></a-form-item>
</a-col>
</a-row>
<a-divider orientation="left" plain>反馈详情</a-divider>
<a-row :gutter="[16, 0]">
<a-col :span="12">
<a-form-item label="反馈部门"><a-input :value="fb.responDeptname || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="反馈人"><a-input :value="fb.responPersonname || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="反馈时间"><a-input :value="fb.responTime || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="序号"><a-input :value="fb.num ?? '-'" disabled /></a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="具体措施">
<a-textarea :value="fb.method || '-'" :rows="3" disabled />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="完成状态"><a-input :value="fb.completionStatus_dictText || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="成果形式"><a-input :value="fb.outcomeForm || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="进展情况">
<a-textarea :value="fb.progress || '-'" :rows="3" disabled />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="检查情况(纪检)"><a-input :value="fb.checkStatus || '-'" disabled /></a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="措施数量(纪检)"><a-input :value="fb.measureNum ?? '-'" disabled /></a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="监督意见(纪检)">
<a-textarea :value="fb.inspectionAdvice || '-'" :rows="3" disabled />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="附件">
<SUploadFile v-if="fb.id" class="feedback-detail-attachments" :bussiness-id="fb.id" :disabled="true" :multiple="true" />
<span v-else>-</span>
</a-form-item>
</a-col>
</a-row>
</a-form>
</template>
</JFormContainer>
</a-spin>
</j-modal>
</template>
<script lang="ts" setup>
import { ref, reactive, defineExpose } from 'vue';
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
const visible = ref(false);
const title = ref('反馈详情');
const mainForm = reactive<Record<string, any>>({});
const fb = reactive<Record<string, any>>({});
// 固定 label 宽度,保证一行一个(span24)与一行两个(span12)的输入框左边框对齐
const labelCol = { style: { width: '150px' } };
const wrapperCol = { style: { flex: 1 } };
function open(mainRecord: Recordable, feedbackRecord: Recordable) {
Object.keys(mainForm).forEach((k) => delete mainForm[k]);
Object.keys(fb).forEach((k) => delete fb[k]);
Object.assign(mainForm, mainRecord || {});
Object.assign(fb, feedbackRecord || {});
title.value = '反馈详情';
visible.value = true;
}
function handleCancel() {
visible.value = false;
}
defineExpose({ open });
</script>
<style lang="less" scoped>
.antd-modal-form {
padding: 14px;
:deep(.ant-form-item-label) {
overflow: visible;
white-space: normal;
text-overflow: unset;
text-align: left;
> label {
justify-content: flex-start;
width: 100%;
}
}
}
.feedback-detail-attachments {
min-width: 280px;
:deep(.file-list-wrapper) {
min-height: 36px;
max-height: 130px;
overflow-y: auto;
padding: 4px 8px;
}
:deep(.file-list-header) {
margin-bottom: 6px;
padding-bottom: 6px;
}
:deep(.file-list .file-item) {
padding: 8px;
margin-bottom: 6px;
}
:deep(.ant-empty) {
margin: 0;
padding: 4px 0;
.ant-empty-image {
display: none;
}
}
}
</style>
@@ -174,6 +174,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref, reactive, defineExpose, nextTick, inject, unref } from 'vue'; import { ref, reactive, defineExpose, nextTick, inject, unref } from 'vue';
import { Form } from 'ant-design-vue'; import { Form } from 'ant-design-vue';
const useForm = Form.useForm;
import { defHttp } from '/@/utils/http/axios'; import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { getValueType } from '/@/utils'; import { getValueType } from '/@/utils';
@@ -12,7 +12,8 @@
rowKey="id" rowKey="id"
:canResize="false" :canResize="false"
:showIndexColumn="false" :showIndexColumn="false"
:showActionColumn="false" :showActionColumn="true"
:actionColumn="{ width: 90, align: 'center', fixed: 'right', dataIndex: 'action', slots: { customRender: 'action' } }"
:showTableSetting="false" :showTableSetting="false"
:clickToRowSelect="false" :clickToRowSelect="false"
:columns="columns" :columns="columns"
@@ -21,6 +22,9 @@
:pagination="false" :pagination="false"
:bordered="false" :bordered="false"
> >
<template #action="{ record }">
<a-button type="link" size="small" @click="handleDetail(record)">查看详情</a-button>
</template>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'attachments'"> <template v-if="column.key === 'attachments'">
<SUploadFile <SUploadFile
@@ -34,6 +38,7 @@
</template> </template>
</template> </template>
</BasicTable> </BasicTable>
<BgXiSpeakFeedbackDetailModal ref="detailModalRef" />
</j-modal> </j-modal>
</template> </template>
@@ -43,12 +48,14 @@
import type { BasicColumn } from '/@/components/Table'; import type { BasicColumn } from '/@/components/Table';
import JModal from '/@/components/Modal/src/JModal/JModal.vue'; import JModal from '/@/components/Modal/src/JModal/JModal.vue';
import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue';
import BgXiSpeakFeedbackDetailModal from './BgXiSpeakFeedbackDetailModal.vue';
import { bgXiSpeakFeedbackList } from '../BgXiSpeak.api'; import { bgXiSpeakFeedbackList } from '../BgXiSpeak.api';
const visible = ref(false); const visible = ref(false);
const loading = ref(false); const loading = ref(false);
const feedbackTableData = ref<Recordable[]>([]); const feedbackTableData = ref<Recordable[]>([]);
const currentRecord = ref<Recordable>({}); const currentRecord = ref<Recordable>({});
const detailModalRef = ref();
const columns: BasicColumn[] = [ const columns: BasicColumn[] = [
{ {
@@ -139,6 +146,10 @@
} }
} }
function handleDetail(record: Recordable) {
detailModalRef.value.open(currentRecord.value, record);
}
function handleCancel() { function handleCancel() {
visible.value = false; visible.value = false;
} }