整改提案查看样式

This commit is contained in:
2026-08-20 17:48:53 +08:00
parent 4803c7320e
commit fac819eb00
14 changed files with 597 additions and 172 deletions
@@ -0,0 +1,296 @@
.proposal-view-page {
--proposal-view-primary: #1677ee;
--proposal-view-text: #354255;
--proposal-view-muted: #8a97a8;
min-height: 100%;
padding-bottom: calc(20px + env(safe-area-inset-bottom));
box-sizing: border-box;
color: var(--proposal-view-text);
background: #f3f7fc;
}
.proposal-view-main {
position: relative;
z-index: 2;
padding: 12px 15px 0;
}
.proposal-view-card {
margin-bottom: 11px;
overflow: hidden;
border: 1px solid #e9eff7;
border-radius: 10px;
background: #ffffff;
box-shadow: 0 3px 11px rgba(51, 87, 126, 0.08);
}
.proposal-view-card__title {
position: relative;
margin: 0;
padding: 12px 14px 8px 21px;
color: #354255;
font-size: 15px;
font-weight: 600;
line-height: 22px;
}
.proposal-view-card__title::before {
position: absolute;
top: 15px;
bottom: 11px;
left: 12px;
width: 2px;
border-radius: 2px;
background: var(--proposal-view-primary);
content: "";
}
.proposal-view-card .van-cell-group {
margin: 0;
background: transparent;
}
.proposal-view-card .van-cell {
min-height: 44px;
padding: 10px 14px;
background: transparent;
}
.proposal-view-card .van-cell:not(:last-child)::after {
right: 14px;
left: 14px;
border-color: #eef2f7;
}
.proposal-view-card .van-cell__title {
flex: 0 0 92px;
width: 92px;
color: #596779;
font-size: 14px;
line-height: 24px;
}
.proposal-view-card .van-cell__value {
min-width: 0;
color: #4f5d70;
font-size: 14px;
line-height: 24px;
text-align: left;
overflow-wrap: anywhere;
}
.proposal-view-card .proposal-view-long-cell {
display: block;
}
.proposal-view-card .proposal-view-long-cell .van-cell__title {
width: auto;
max-width: 100%;
}
.proposal-view-card .proposal-view-long-cell .van-cell__value {
margin-top: 7px;
}
.proposal-view-rich-value,
.proposal-view-rich-value * {
max-width: 100%;
white-space: normal;
word-break: break-word;
}
.proposal-view-rich-value img,
.proposal-view-rich-value image {
height: auto;
max-width: 100%;
}
.proposal-view-card .van-tag {
font-size: 14px;
line-height: 18px;
white-space: normal;
}
.proposal-view-merge-cell .van-cell__title {
flex: 1;
width: auto;
}
.proposal-view-merge-cell .van-cell__label {
margin-top: 4px;
color: var(--proposal-view-muted);
font-size: 13px;
line-height: 20px;
white-space: normal;
}
.proposal-flow-card__header {
display: flex;
align-items: center;
justify-content: space-between;
}
.proposal-flow-card__hint {
display: inline-flex;
align-items: center;
padding-right: 14px;
color: var(--proposal-view-muted);
font-size: 13px;
line-height: 22px;
white-space: nowrap;
}
.proposal-flow-card__hint .van-icon {
margin-left: 4px;
color: #7f8da0;
font-size: 17px;
}
.proposal-flow-scroll {
width: 100%;
padding: 4px 14px 15px;
overflow-x: auto;
box-sizing: border-box;
scroll-behavior: smooth;
scroll-snap-type: x proximity;
scrollbar-width: none;
-webkit-overflow-scrolling: touch;
}
.proposal-flow-scroll::-webkit-scrollbar {
display: none;
}
.proposal-flow-track {
position: relative;
display: flex;
width: max-content;
min-width: 100%;
padding-top: 5px;
}
.proposal-flow-track::before {
position: absolute;
top: 24px;
right: 52px;
left: 52px;
height: 2px;
background: #d8e9ff;
content: "";
}
.proposal-flow-node {
position: relative;
z-index: 1;
display: flex;
flex: 0 0 108px;
width: 108px;
padding: 0 6px;
border: 0;
outline: none;
box-sizing: border-box;
align-items: center;
flex-direction: column;
color: var(--proposal-view-text);
background: transparent;
font-family: inherit;
scroll-snap-align: center;
-webkit-tap-highlight-color: transparent;
}
.proposal-flow-node__icon {
display: flex;
width: 38px;
height: 38px;
border: 3px solid #ffffff;
border-radius: 50%;
box-sizing: border-box;
align-items: center;
justify-content: center;
color: #ffffff;
background: var(--proposal-view-primary);
box-shadow: 0 2px 7px rgba(22, 119, 238, 0.22);
transition: box-shadow 0.2s ease, transform 0.2s ease;
}
.proposal-flow-node__icon .van-icon {
font-size: 20px;
}
.proposal-flow-node__title {
display: -webkit-box;
min-height: 40px;
margin-top: 8px;
overflow: hidden;
color: #354255;
font-size: 14px;
font-weight: 600;
line-height: 20px;
text-align: center;
word-break: break-word;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.proposal-flow-node__handler {
display: block;
width: 100%;
margin-top: 1px;
overflow: hidden;
color: var(--proposal-view-muted);
font-size: 13px;
line-height: 20px;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
.proposal-flow-node.is-active .proposal-flow-node__icon {
box-shadow: 0 0 0 5px #e7f2ff, 0 3px 9px rgba(22, 119, 238, 0.28);
transform: scale(1.06);
}
.proposal-flow-node.is-active .proposal-flow-node__title {
color: var(--proposal-view-primary);
}
.proposal-flow-detail__name {
margin: 0;
padding: 4px 14px 10px;
border-bottom: 1px solid #eef2f7;
color: #26364a;
font-size: 16px;
font-weight: 600;
line-height: 24px;
}
.proposal-flow-detail__tip {
padding: 9px 14px 12px;
border-top: 1px solid #eef2f7;
color: var(--proposal-view-muted);
font-size: 13px;
line-height: 20px;
text-align: center;
}
.proposal-view-table-wrap {
width: 100%;
overflow-x: auto;
}
.proposal-view-table-wrap .el-table {
min-width: 560px;
font-size: 16px;
}
.proposal-view-slot:empty {
display: none;
}
@media (min-width: 600px) {
.proposal-view-main {
max-width: 520px;
margin-right: auto;
margin-left: auto;
}
}
@@ -1,183 +1,208 @@
const PROPOSAL_INFO = {
name: "ProposalInfo",
template: /*language=HTML*/ `
<div class="proposal-info-content">
<div class="detail-container">
<van-cell-group title="基本信息">
<van-cell title="提案名称">
<div style="font-weight:bold;">
{{ viewData.name }}
<div class="proposal-info-content proposal-view-page">
<main class="proposal-view-main">
<!-- 编号和名称优先展示,便于手机端进入详情后快速确认当前提案。 -->
<section class="proposal-view-card">
<h2 class="proposal-view-card__title">提案内容</h2>
<van-cell-group :border="false">
<van-cell title="提案编号">{{ viewData.code || '--' }}</van-cell>
<van-cell title="提案名称">{{ viewData.name || '--' }}</van-cell>
<van-cell title="立案编号">{{ viewData.caseFilingCode || '暂无' }}</van-cell>
<van-cell title="立案结果" v-if="viewData.caseFilingResult">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag>
</van-cell>
<van-cell title="立案类型" v-if="viewData.caseFilingType">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="viewData.caseFilingType"></dict-tag>
</van-cell>
<van-cell title="提案类型">{{ viewData.typeName || '--' }}</van-cell>
<van-cell title="提案方式">{{ getDictText(dict.type.PROPOSAL_SOURCE, viewData.source) }}</van-cell>
<van-cell title="代表姓名">{{ viewData.createUserName || '--' }}</van-cell>
<van-cell title="所属教代会">{{ viewData.sessionName || viewData.fullName || '--' }}</van-cell>
<van-cell :title="viewData.committeeName ? '所属委员会' : '所属代表团'">
{{ viewData.committeeName || viewData.delegationName || '--' }}
</van-cell>
<van-cell title="单位">{{ viewData.unitName || '--' }}</van-cell>
<van-cell title="联系电话">{{ viewData.mobile || '--' }}</van-cell>
<van-cell title="提案时间">{{ viewData.createTime || '--' }}</van-cell>
<van-cell title="提案案由" class="proposal-view-long-cell">
<div class="proposal-view-rich-value" v-html="viewData.brief || '--'"></div>
</van-cell>
<van-cell title="建议措施" class="proposal-view-long-cell">
<div class="proposal-view-rich-value" v-html="viewData.measures || '--'"></div>
</van-cell>
<van-cell title="附件" class="proposal-view-long-cell">
<file-preview :files="viewData.files" complete_result></file-preview>
</van-cell>
</van-cell-group>
</section>
<!-- 并案信息仍支持点击切换当前公共详情组件的数据。 -->
<section class="proposal-view-card" v-if="viewData.merges && viewData.merges.length">
<h2 class="proposal-view-card__title">并案信息</h2>
<van-cell-group :border="false">
<van-cell v-for="(merge, index) in viewData.merges"
:key="merge.id"
class="proposal-view-merge-cell"
:title="(index + 1) + '. ' + merge.name"
:label="'提案编号:' + merge.code + '|提案人:' + merge.createUserName + '|类别:' + merge.typeName + '|代表团:' + merge.delegationName"
is-link
@click="openView(merge)">
</van-cell>
</van-cell-group>
</section>
<!-- 每位委员会成员意见独立成卡片,便于手机端逐块阅读。 -->
<section class="proposal-view-card"
v-for="(opinion, index) in viewData.commissionerOpinions || []"
:key="'commissioner-' + index">
<h2 class="proposal-view-card__title">委员会成员意见 {{ index + 1 }}</h2>
<van-cell-group :border="false">
<van-cell title="委员">
{{ opinion.commissionerName || '--' }}<template v-if="opinion.commissionerLoginName">{{ opinion.commissionerLoginName }}</template>
</van-cell>
<van-cell title="立案结果">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="opinion.caseFilingResult"></dict-tag>
</van-cell>
<van-cell title="立案类型" v-if="opinion.caseFilingType">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="opinion.caseFilingType"></dict-tag>
</van-cell>
<van-cell title="意见" v-if="opinion.opinionText" class="proposal-view-long-cell">
<div class="proposal-view-rich-value">{{ opinion.opinionText }}</div>
</van-cell>
<van-cell title="时间" v-if="opinion.opinionTime">{{ opinion.opinionTime }}</van-cell>
</van-cell-group>
</section>
<!-- 已办 WF 任务压缩为横向时间轴,节点仅展示名称和办理人。 -->
<section class="proposal-view-card proposal-flow-card" v-if="doneTasks && doneTasks.length">
<div class="proposal-flow-card__header">
<h2 class="proposal-view-card__title">审批流程</h2>
<span class="proposal-flow-card__hint">
左右滑动查看
<van-icon name="exchange"></van-icon>
</span>
</div>
<div class="proposal-flow-scroll" ref="workflowScroll">
<div class="proposal-flow-track">
<button type="button"
ref="workflowNode"
class="proposal-flow-node"
:class="{'is-active': selectedTask && selectedTask.id === task.id}"
v-for="(task, index) in doneTasks"
:key="task.id"
@click="selectTask(task)">
<span class="proposal-flow-node__icon">
<van-icon :name="getTaskNodeIcon(task, index)"></van-icon>
</span>
<span class="proposal-flow-node__title">{{ task.displayName || '--' }}</span>
<span class="proposal-flow-node__handler">{{ getTaskHandlerName(task) }}</span>
</button>
</div>
</van-cell>
<van-cell title="提案编号">{{ viewData.code }}</van-cell>
<van-cell title="立案编号">{{ viewData.caseFilingCode || '暂无' }}</van-cell>
<van-cell title="提案人">{{ viewData.createUserName }}</van-cell>
<van-cell title="提案时间">{{ viewData.createTime }}</van-cell>
<van-cell title="教代会届次">{{ viewData.fullName }}</van-cell>
<van-cell title="提案人单位">{{ viewData.unitName }}</van-cell>
<van-cell :title="viewData.mannerCode!=='W03'?'代表团名称':'委员会名称'">
{{ viewData.mannerCode !== 'W03' ? viewData.delegationName : viewData.committeeName }}
</van-cell>
<van-cell title="提案类别">
{{viewData.typeName}}
</van-cell>
<!--<van-cell title="建议承办单位">
{{viewData.suggestUnits}}
</van-cell>-->
<van-cell title="立案结果">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag>
</van-cell>
<!--<van-cell title="调研情况" class="direction-column-cell">
<div v-html="viewData.researchFindings"></div>
</van-cell>-->
<van-cell title="提案案由" class="direction-column-cell">
<div v-html="viewData.brief"></div>
</van-cell>
<van-cell title="建议措施" class="direction-column-cell">
<div v-html="viewData.measures"></div>
</van-cell>
<van-cell title="附件" class="direction-column-cell">
<file-preview :files="viewData.files" complete_result></file-preview>
</van-cell>
<!-- <van-cell title="签字">-->
<!-- <div slot="label">-->
<!-- <van-image :src="viewData.signature"-->
<!-- style="width: 100%;height: 150px;border: 1px dashed"></van-image>-->
<!-- </div>-->
<!-- </van-cell>-->
</van-cell-group>
<!--并案信息-->
<van-cell-group title="并案信息" v-if="viewData.merges && viewData.merges.length">
<van-cell v-for="(merge, index) in viewData.merges" :key="merge.id"
:title="(index + 1) + '. ' + merge.name"
:label="'提案编号:' + merge.code + ' | 提案人:' + merge.createUserName + ' | 类别:' + merge.typeName + ' | 代表团:' + merge.delegationName"
is-link
@click="openView(merge)">
</van-cell>
</van-cell-group>
<!--委员会成员意见-->
<template v-if="viewData.commissionerOpinions && viewData.commissionerOpinions.length">
<div class="process-title" style="margin-bottom: 0!important;">
委员会成员意见
</div>
<div v-for="(opinion, index) in viewData.commissionerOpinions" :key="index"
style="margin-bottom: 16px;">
<van-cell :title="opinion.commissionerName + '(' + opinion.commissionerLoginName + ')'"
class="direction-column-cell">
</van-cell>
<van-cell title="立案结果">
<div style="display: flex;justify-content: end;">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="opinion.caseFilingResult"></dict-tag>
<template v-if="opinion.caseFilingType">
(
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="opinion.caseFilingType"></dict-tag>
)
</template>
</div>
</van-cell>
<van-cell title="意见" v-if="opinion.opinionText">
<div>{{ opinion.opinionText }}</div>
</van-cell>
<van-cell title="时间" v-if="opinion.opinionTime">
{{ opinion.opinionTime }}
</van-cell>
</div>
</template>
</section>
<!-- 点击时间轴节点后,只在此处展示该任务原有的完整详情。 -->
<section class="proposal-view-card proposal-flow-detail" v-if="selectedTask">
<h2 class="proposal-view-card__title">节点详情</h2>
<h3 class="proposal-flow-detail__name">{{ selectedTask.displayName || '--' }}</h3>
<van-cell-group :border="false">
<template v-if="selectedTask.ext && selectedTask.ext.isFirstTaskNode">
<van-cell title="申请用户">
{{ selectedTask.ext.initiatorName || '--' }}{{ selectedTask.ext.initiatorAccount || '--' }}
</van-cell>
<van-cell title="申请时间">{{ selectedTask.finishTime || '--' }}</van-cell>
<van-cell title="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="selectedTask.ext.submitType"></dict-tag>
</van-cell>
</template>
<template v-for="task in doneTasks">
<van-cell-group :title="task.displayName" v-if="task.ext.isFirstTaskNode">
<van-cell title="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}})
</van-cell>
<van-cell title="申请时间">{{ task.finishTime }}</van-cell>
<van-cell title="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</van-cell>
</van-cell-group>
<template v-else-if="selectedTask.taskName === 'invite'">
<van-cell title="办理用户">
{{ selectedTask.taskFormData.userName || '--' }}{{ selectedTask.taskFormData.loginName || '--' }}
</van-cell>
<van-cell title="办理时间">{{ selectedTask.finishTime || '--' }}</van-cell>
<van-cell title="附议人" class="proposal-view-long-cell">
<div class="proposal-view-table-wrap">
<el-table :data="selectedTask?.taskFormData?.seconder">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitName" show-overflow-tooltip></el-table-column>
<el-table-column label="分工会" prop="unionName" show-overflow-tooltip></el-table-column>
<el-table-column label="代表团" prop="delegationName" show-overflow-tooltip></el-table-column>
</el-table>
</div>
</van-cell>
</template>
<!--邀请附议人-->
<van-cell-group :title="task.displayName"
v-else-if="task.taskName === 'invite'">
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="附议人" v-if="task.taskName === 'invite'"
class="direction-column-cell">
<el-table :data="task?.taskFormData?.seconder">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitName" show-overflow-tooltip></el-table-column>
<el-table-column label="分工会" prop="unionName"
show-overflow-tooltip></el-table-column>
<el-table-column label="代表团" prop="delegationName"
show-overflow-tooltip></el-table-column>
</el-table>
</van-cell>
</van-cell-group>
<!--提案委员会立案-->
<van-cell-group :title="task.displayName"
v-else-if="task.taskName === 'committee'||task.taskName === 'committeeFilingUnit'">
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="立案结果">
<div style="display: flex;justify-content: center">
<template v-else-if="selectedTask.taskName === 'committee' || selectedTask.taskName === 'committeeFilingUnit'">
<van-cell title="办理用户">
{{ selectedTask.taskFormData.userName || '--' }}{{ selectedTask.taskFormData.loginName || '--' }}
</van-cell>
<van-cell title="办理时间">{{ selectedTask.finishTime || '--' }}</van-cell>
<van-cell title="立案结果">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="task.ext.tf_caseFilingResult"></dict-tag>
<template v-if="task.ext.tf_caseFilingType">
(
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="task.ext.tf_caseFilingType"></dict-tag>
)
:value="selectedTask.ext.tf_caseFilingResult"></dict-tag>
</van-cell>
<van-cell title="立案类型" v-if="selectedTask.ext.tf_caseFilingType">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="selectedTask.ext.tf_caseFilingType"></dict-tag>
</van-cell>
<template v-if="['CONFIRM_FILING', 'SUGGESTION'].includes(selectedTask.ext.tf_caseFilingResult)">
<van-cell v-if="selectedTask.ext.tf_caseFilingResult === 'SUGGESTION'" title="承办单位">
{{ selectedTask?.ext?.tf_masterUnitNameStr || selectedTask?.ext?.tf_slaveUnitNameStr || '--' }}
</van-cell>
<template v-else>
<van-cell title="主办单位">{{ selectedTask?.ext?.tf_masterUnitNameStr || '--' }}</van-cell>
<van-cell title="协办单位">{{ selectedTask?.ext?.tf_slaveUnitNameStr || '--' }}</van-cell>
</template>
</div>
</van-cell>
<template v-if="['CONFIRM_FILING','SUGGESTION'].includes(task.ext.tf_caseFilingResult)">
<van-cell v-if="task.ext.tf_caseFilingResult === 'SUGGESTION'" title="承办单位">{{ task?.ext?.tf_masterUnitNameStr || task?.ext?.tf_slaveUnitNameStr }}</van-cell>
<template v-else>
<van-cell title="主办单位">{{ task?.ext?.tf_masterUnitNameStr }}</van-cell>
<van-cell title="协办单位">{{ task?.ext?.tf_slaveUnitNameStr }}</van-cell>
</template>
<van-cell title="办理意见"
v-if="selectedTask.taskFormData.tf_opinion"
class="proposal-view-long-cell">
<div class="proposal-view-rich-value" v-html="selectedTask.taskFormData.tf_opinion"></div>
</van-cell>
</template>
<template v-else>
<van-cell title="办理单位"
v-if="['opinion_unit_reply', 'unit_reply', 'two_unit_reply', 'master_reply', 'slave_reply'].includes(selectedTask.taskName)">
{{ selectedTask.ext.underTakeName || '--' }}
</van-cell>
<van-cell title="办理用户">
{{ selectedTask.taskFormData.userName || '--' }}{{ selectedTask.taskFormData.loginName || '--' }}
</van-cell>
<van-cell title="办理时间">{{ selectedTask.finishTime || '--' }}</van-cell>
<van-cell title="办理评价" v-if="selectedTask.taskName === 'feedback'">
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
:value="selectedTask.ext.tf_feedback"></dict-tag>
</van-cell>
<van-cell title="办理结果" v-else>
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="selectedTask.ext.submitType"></dict-tag>
</van-cell>
<van-cell title="办理意见"
v-if="selectedTask.taskFormData && selectedTask.taskFormData.tf_opinion"
class="proposal-view-long-cell">
<div class="proposal-view-rich-value" v-html="selectedTask.taskFormData.tf_opinion"></div>
</van-cell>
</template>
<van-cell title="办理意见" v-if="task.taskFormData.tf_opinion" class="direction-column-cell">
<div v-html="task.taskFormData.tf_opinion"></div>
</van-cell>
</van-cell-group>
<div class="proposal-flow-detail__tip">点击其他节点查看详情</div>
</section>
<van-cell-group :title="task.displayName" v-else>
<van-cell title="办理单位" v-if="['opinion_unit_reply','unit_reply','two_unit_reply','master_reply','slave_reply'].includes(task.taskName)">
{{task.ext.underTakeName}}
</van-cell>
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="办理评价" v-if="['feedback'].includes(task.taskName)">
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
:value="task.ext.tf_feedback"></dict-tag>
</van-cell>
<van-cell title="办理结果" v-else>
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</van-cell>
<van-cell title="办理意见" v-if="!task.ext.isFirstTaskNode" class="direction-column-cell">
<div v-html="task.taskFormData.tf_opinion"></div>
</van-cell>
</van-cell-group>
</template>
</div>
<slot></slot>
<!-- 审批、答复等业务页面继续通过原插槽追加表单。 -->
<div class="proposal-view-slot">
<slot></slot>
</div>
</main>
</div>
`,
props: {
@@ -187,11 +212,12 @@ const PROPOSAL_INFO = {
required: true
}
},
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
dicts: ["PROPOSAL_TYPE", "PROPOSAL_SOURCE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
data() {
return {
viewData: {},
doneTasks: [],
selectedTask: null,
currentBizId: ""
}
},
@@ -200,13 +226,72 @@ const PROPOSAL_INFO = {
immediate: true,
handler(value) {
if (!value) return
this.currentBizId = value
this.$set(this, "currentBizId", value)
this.getInfo()
this.getDoneTasks()
}
}
},
methods: {
/**
* 获取字典字段的展示文本。
* options 为 PROPOSAL_SOURCE 等字典数组,value 为业务保存的字典 code;返回名称字符串,无匹配项时返回原值或 --。
*/
getDictText(options, value) {
const option = (options || []).find((item) => String(item.code) === String(value))
return option ? (option.name || option.label || value) : (value || "--")
},
/**
* 获取横向流程节点的办理人名称。
* task 为 doneTasks 接口返回的任务对象;发起节点读取 initiatorName,其他节点读取 taskFormData.userName,返回字符串。
*/
getTaskHandlerName(task) {
if (!task) return "--"
if (task.ext && task.ext.isFirstTaskNode) {
return task.ext.initiatorName || "--"
}
return task.taskFormData && task.taskFormData.userName
? task.taskFormData.userName
: "--"
},
/**
* 根据任务类型返回 Vant 图标名称,只用于区分发起、邀请附议和普通已办节点。
*/
getTaskNodeIcon(task) {
if (task && task.ext && task.ext.isFirstTaskNode) return "manager-o"
if (task && task.taskName === "invite") return "friends-o"
return "passed"
},
/**
* 选中流程节点并展示详情。
* task 为 doneTasks 中的任务对象;该方法无返回值,并把对应节点滚动到横向区域中部。
*/
selectTask(task) {
if (!task) return
this.$set(this, "selectedTask", task)
this.scrollTaskIntoView(task.id)
},
/**
* 将指定任务节点滚动至时间轴可视区域中部。
* taskId 为流程任务主键;节点或滚动容器不存在时直接结束,无返回值。
*/
scrollTaskIntoView(taskId) {
this.$nextTick(() => {
const nodes = this.$refs.workflowNode
const nodeList = Array.isArray(nodes) ? nodes : [nodes]
const taskIndex = this.doneTasks.findIndex((item) => String(item.id) === String(taskId))
const node = nodeList[taskIndex]
const scrollContainer = this.$refs.workflowScroll
if (!node || !scrollContainer) return
const targetLeft = node.offsetLeft - (scrollContainer.clientWidth - node.offsetWidth) / 2
scrollContainer.scrollLeft = Math.max(0, targetLeft)
})
},
/**
* 使用 currentBizId 查询提案详情。
* 接口参数 id 为提案主键;成功响应的 data 为详情对象并写入 viewData。
@@ -214,7 +299,7 @@ const PROPOSAL_INFO = {
getInfo() {
this.$axios.post("/platform/proposal/common/proposalInfo", {id: this.currentBizId}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
this.$set(this, "viewData", res.data)
}
})
},
@@ -222,7 +307,7 @@ const PROPOSAL_INFO = {
// 查看提案
openView(row) {
if (row && typeof row === 'object' && row.id) {
this.currentBizId = row.id
this.$set(this, "currentBizId", row.id)
this.getInfo()
this.getDoneTasks()
}
@@ -233,9 +318,17 @@ const PROPOSAL_INFO = {
* 接口参数 bizId 为提案主键;成功响应的 data 为流程任务数组并写入 doneTasks。
*/
getDoneTasks() {
this.$set(this, "doneTasks", [])
this.$set(this, "selectedTask", null)
this.$axios.post("/flow/common/doneTasks", {bizId: this.currentBizId}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
const taskList = res.data || []
const latestTask = taskList.length ? taskList[taskList.length - 1] : null
this.$set(this, "doneTasks", taskList)
this.$set(this, "selectedTask", latestTask)
if (latestTask) {
this.scrollTaskIntoView(latestTask.id)
}
}
})
},
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="提案信息" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId"></proposal-info>
@@ -1,7 +1,10 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style>
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<style id="style-case-check-info-h5">
.case-check-tip {
margin: 0 16px 10px;
padding: 10px 12px;
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="提案详情" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId"></proposal-info>
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<style>
.proposal-pre-audit-actions {
display: grid;
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" :title="pageTitle" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId">
@@ -1,6 +1,9 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style id="style-proposal-info-h5">
<!--#include("../../common/info.css"){}#-->
</style>
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="提案详情" placeholder fixed></van-nav-bar>
<proposal-info v-if="bizId" :biz-id="bizId"></proposal-info>